Назад | Перейти на главную страницу

Лямбда-вызов между аккаунтами никогда не завершается успешно

У меня есть центральная учетная запись инструментария, которая содержит конвейер развертывания и еще одну учетную запись («этап»), в которой развертывается приложение. Одним из шагов в конвейере является миграция базы данных с помощью лямбда-функции в промежуточной учетной записи. Функция вызывается, но вызывает ошибку, потому что не может получить доступ к кодовой цепочке, и этап в конвейере истекает через ~ 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 на основе ресурсов. В моем случае мне пришлось изменить лямбда-функцию внутри промежуточной учетной записи. Функция должна была взять на себя роль учетной записи инструментария, чтобы иметь доступ к кодовой цепочке.