У меня есть центральная учетная запись инструментария, которая содержит конвейер развертывания и еще одну учетную запись («этап»), в которой развертывается приложение. Одним из шагов в конвейере является миграция базы данных с помощью лямбда-функции в промежуточной учетной записи. Функция вызывается, но вызывает ошибку, потому что не может получить доступ к кодовой цепочке, и этап в конвейере истекает через ~ 20 минут. Сообщение об ошибке в конвейере предполагает, что лямбда-функция не вызывает PutJobSuccessResult / PutJobFailureResult или функции не разрешено.
Функция вызывает эти функции, но похоже, что у нее нет прав доступа к кодовой строке в учетной записи инструментария.
Это политики, прикрепленные к Lambda и Codepipeline:
Лямбда:
...,{
"Action": [
"codepipeline:PutJobSuccessResult",
"codepipeline:PutJobFailureResult"
],
"Effect": "Allow",
"Resource": [
"*",
"${var.pipelineArn}"
]
},...
И Codepipeline:
..., {
"Effect": "Allow",
"Action": [
"codepipeline:*",
"iam:ListRoles",
"cloudformation:Describe*",
"cloudFormation:List*",
"codecommit:List*",
"codecommit:Get*",
"codecommit:GitPull",
"codecommit:UploadArchive",
"codecommit:CancelUploadArchive",
"codebuild:BatchGetBuilds",
"codebuild:StartBuild",
"cloudformation:CreateStack",
"cloudformation:DeleteStack",
"cloudformation:DescribeStacks",
"cloudformation:UpdateStack",
"cloudformation:CreateChangeSet",
"cloudformation:DeleteChangeSet",
"cloudformation:DescribeChangeSet",
"cloudformation:ExecuteChangeSet",
"cloudformation:SetStackPolicy",
"cloudformation:ValidateTemplate",
"iam:PassRole",
"s3:ListAllMyBuckets",
"s3:GetBucketLocation"
],
"Resource": "*"
}, ...
Есть идеи о том, чего не хватает? Я предполагаю, что мне нужно где-то добавить Принцип, но я не знаю где ...
Возможно, вам придется предположить перекрестная роль в Lambda, чтобы получить доступ к ресурсам Code Pipeline. По сути, это будет выглядеть так, будто лямбда работает в инструментальный счет.
Посмотрите здесь некоторую справочную информацию о том, как это работает и как настроить политики: Доступ к нескольким аккаунтам
Тогда в вашей лямбде вам придется позвонить СТС: AssumeRole для получения учетных данных из другой учетной записи. Например, если вы используете Python, вы можете использовать boto3 sts.assume_role()
вызов.
Надеюсь, это поможет :)
В настоящее время нет возможности предоставить доступ к Codepipeline на основе ресурсов. В моем случае мне пришлось изменить лямбда-функцию внутри промежуточной учетной записи. Функция должна была взять на себя роль учетной записи инструментария, чтобы иметь доступ к кодовой цепочке.