AWS Сбой конвейера лямбда-функции на этапе развертывания: Ошибка при выполнении действия Роль ... недопустима или не может быть принята - PullRequest
1 голос
/ 17 марта 2020

Конвейер AWS лямбда-функции, который я только что настроил, следуя официальной документации AWS ( Построение конвейера непрерывной доставки для лямбда-приложения с AWS CodePipeline ), мне не удается на этапе развертывания (этапы как исходного кода, так и этапа сборки выполняются успешно) с этим сообщением:

Action execution failed
Role arn:aws:iam::************:role/service-role/AWSCodePipelineServiceRole-eu-west-1-lambda-pipeline
is invalid or cannot be assumed
(Service: AmazonCloudFormation; Status Code: 400; Error Code: ValidationError; Request ID: ********-****-****-************)

Я попытался отредактировать этап развертывания и изменить указанную роль службы ( WSCodePipelineServiceRole-eu-west-1-lambda- конвейер ), снова запустить конвейер, но безуспешно ... Более того, снова редактируя этап развертывания после повторного запуска конвейера, я вижу, что предыдущая роль снова там ... (решил сам: я не сохранял изменения ... :-()

Это мой template.yml :

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Outputs the time
Resources:
  TimeFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs10.x
      CodeUri: ./
      Events:
        MyTimeApi:
          Type: Api
          Properties:
            Path: /TimeResource
            Method: GET

Это мой buildspe c .yml :

version: 0.2
phases:
  install:
    runtime-versions:
        nodejs: 10
  build:
    commands:
      - npm install
      - export BUCKET=lambda-pipeline-repo-bucket
      - aws cloudformation package --template-file template.yml --s3-bucket $BUCKET --output-template-file outputtemplate.yml
artifacts:
  type: zip
  files:
    - template.yml
    - outputtemplate.yml

Это WSCodePipelineServiceRole-eu-west-1-lambda-pipeline ролевая политика JSON:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "*",
            "Condition": {
                "StringEqualsIfExists": {
                    "iam:PassedToService": [
                        "cloudformation.amazonaws.com",
                        "elasticbeanstalk.amazonaws.com",
                        "ec2.amazonaws.com",
                        "ecs-tasks.amazonaws.com"
                    ]
                }
            }
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "opsworks:DescribeStacks",
                "rds:*",
                "devicefarm:GetRun",
                "cloudformation:CreateChangeSet",
                "autoscaling:*",
                "codebuild:BatchGetBuilds",
                "servicecatalog:ListProvisioningArtifacts",
                "devicefarm:ScheduleRun",
                "devicefarm:ListDevicePools",
                "cloudformation:UpdateStack",
                "servicecatalog:DescribeProvisioningArtifact",
                "cloudformation:DescribeChangeSet",
                "devicefarm:ListProjects",
                "cloudformation:ExecuteChangeSet",
                "sns:*",
                "codedeploy:RegisterApplicationRevision",
                "cloudformation:*",
                "opsworks:DescribeDeployments",
                "devicefarm:CreateUpload",
                "cloudformation:DescribeStacks",
                "codecommit:GetUploadArchiveStatus",
                "cloudwatch:*",
                "opsworks:DescribeInstances",
                "cloudformation:DeleteStack",
                "ecr:DescribeImages",
                "ecs:*",
                "ec2:*",
                "codebuild:StartBuild",
                "opsworks:DescribeApps",
                "opsworks:UpdateStack",
                "cloudformation:ValidateTemplate",
                "codedeploy:CreateDeployment",
                "codedeploy:GetApplicationRevision",
                "codedeploy:GetDeploymentConfig",
                "servicecatalog:CreateProvisioningArtifact",
                "sqs:*",
                "cloudformation:DeleteChangeSet",
                "codecommit:GetCommit",
                "servicecatalog:DeleteProvisioningArtifact",
                "codedeploy:GetApplication",
                "cloudformation:SetStackPolicy",
                "codecommit:UploadArchive",
                "s3:*",
                "elasticloadbalancing:*",
                "codecommit:CancelUploadArchive",
                "devicefarm:GetUpload",
                "elasticbeanstalk:*",
                "opsworks:UpdateApp",
                "opsworks:CreateDeployment",
                "cloudformation:CreateStack",
                "servicecatalog:UpdateProduct",
                "codecommit:GetBranch",
                "lambda:*",
                "codedeploy:GetDeployment",
                "opsworks:DescribeCommands"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": "codestar-connections:UseConnection",
            "Resource": "*"
        }
    ]
}

Пожалуйста, не стесняйтесь спрашивать любую дополнительную информацию ...

* 10 30 * Пожалуйста, дайте мне какое-то направление, я здесь не в своей тарелке ...

ОБНОВЛЕНИЕ 1
После ответа @omuthu я проверил свою конвейерную политику (AWSCodePipelineServiceRole- ес-запад-1-лямбда-трубопровод):

{
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "*",
            "Condition": {
                "StringEqualsIfExists": {
                    "iam:PassedToService": [
                        "cloudformation.amazonaws.com",
                        "elasticbeanstalk.amazonaws.com",
                        "ec2.amazonaws.com",
                        "ecs-tasks.amazonaws.com"
                    ]
                }
            }
        },
        ...
    ],
    "Version": "2012-10-17"
}

и я вижу, что у меня уже есть iam:PassRole ... Это обусловлено услугами "cloudformation.amazon aws .com", "asticbeanstalk .amazon aws .com "," ec2.amazon aws .com "," ecs-tasks.amazon aws .com "... Должен ли я добавить некоторые другие службы? Или лучше удалить условие?

ОБНОВЛЕНИЕ 2 Я действительно пытался удалить условие, без другого результата.

ОБНОВЛЕНИЕ 3 @ shariqm aws: я экспортировал свой конвейер (названный «лямбда-конвейер»); вот оно:

{
    "pipeline": {
        "version": 1,
        "artifactStore": {
            "location": "codepipeline-eu-west-1-##########",
            "type": "S3"
        },
        "roleArn": "arn:aws:iam::##########:role/service-role/AWSCodePipelineServiceRole-eu-west-1-lambda-pipeline",
        "name": "lambda-pipeline",
        "stages": [
            {
                "name": "Source",
                "actions": [
                    {
                        "inputArtifacts": [],
                        "region": "eu-west-1",
                        "name": "Source",
                        "configuration": {
                            "PollForSourceChanges": "true",
                            "BranchName": "master",
                            "RepositoryName": "lambda-pipeline-repo"
                        },
                        "outputArtifacts": [
                            {
                                "name": "SourceArtifact"
                            }
                        ],
                        "runOrder": 1,
                        "actionTypeId": {
                            "provider": "CodeCommit",
                            "owner": "AWS",
                            "version": "1",
                            "category": "Source"
                        }
                    }
                ]
            },
            {
                "name": "Build",
                "actions": [
                    {
                        "inputArtifacts": [
                            {
                                "name": "SourceArtifact"
                            }
                        ],
                        "region": "eu-west-1",
                        "name": "Build",
                        "configuration": {
                            "ProjectName": "lambda-pipeline-build"
                        },
                        "outputArtifacts": [
                            {
                                "name": "BuildArtifact"
                            }
                        ],
                        "runOrder": 1,
                        "actionTypeId": {
                            "provider": "CodeBuild",
                            "owner": "AWS",
                            "version": "1",
                            "category": "Build"
                        }
                    }
                ]
            },
            {
                "name": "Deploy",
                "actions": [
                    {
                        "inputArtifacts": [
                            {
                                "name": "BuildArtifact"
                            }
                        ],
                        "region": "eu-west-1",
                        "name": "Deploy",
                        "configuration": {
                            "TemplatePath": "BuildArtifact::outputtemplate.yml",
                            "ActionMode": "CHANGE_SET_REPLACE",
                            "ChangeSetName": "lambda-pipeline-changeset",
                            "Capabilities": "CAPABILITY_IAM",
                            "RoleArn": "arn:aws:iam::##########:role/service-role/AWSCodePipelineServiceRole-eu-west-1-lambda-pipeline",
                            "StackName": "lambda-pipeline-stack"
                        },
                        "outputArtifacts": [],
                        "runOrder": 1,
                        "actionTypeId": {
                            "provider": "CloudFormation",
                            "owner": "AWS",
                            "version": "1",
                            "category": "Deploy"
                        }
                    }
                ]
            }
        ]
    },
    "metadata": {
        "updated": 1584382274.615,
        "created": 1584382274.615,
        "pipelineArn": "arn:aws:codepipeline:eu-west-1:##########:lambda-pipeline"
    }
}

Можете ли вы найти какие-либо проблемы с этим конвейером? (и спасибо за вашу помощь!)

ОБНОВЛЕНИЕ 4
@Shawn: Я прочитал документ, на который вы указали, и проверил мою конфигурацию ... Я в регионе eu-west-1, и он включен, как я вижу в настройках своего аккаунта: enter image description here

Спасибо за любой комментарий ...

Ответы [ 2 ]

2 голосов
/ 19 марта 2020

Проблема заключается в конфигурации действия CloudFormation 'Deploy':

"configuration": {
    "TemplatePath": "BuildArtifact::outputtemplate.yml",
    "ActionMode": "CHANGE_SET_REPLACE",
    "ChangeSetName": "lambda-pipeline-changeset",
    "Capabilities": "CAPABILITY_IAM",
    "RoleArn": "arn:aws:iam::##########:role/service-role/AWSCodePipelineServiceRole-eu-west-1-lambda-pipeline",
    "StackName": "lambda-pipeline-stack"
},

Вышеуказанный RoleArn - это роль в целевой учетной записи, которую CloudFormation примет для выполнения стека. Думайте об этой роли как о личности, которая фактически будет создавать ресурсы, которые вы определили в шаблоне CloudFormation. Теперь, когда службе CloudFormation необходимо взять на себя эту роль, политика доверия этой роли должна быть для Cloudformation, а не CodePipeline, какой она является в настоящее время.

Правильная политика доверия:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudformation.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

Исправление:

  1. Создание новой роли для службы CloudFormation

enter image description here

Укажите разрешения для этой роли, необходимые для создания ресурсов, определенных в шаблоне.

Обновите действие конвейера «Развернуть» на этапе «Развернуть» и установите RoleARN в свойствах конфигурации этого действия для ARN новой роли вместо "arn: aws: iam :: ##########: role / service-role / AWSCodePipelineServiceRole-eu-west-1-lambda -пайплайн ".

2 голосов
/ 17 марта 2020

Добавьте iam:PassRole к вашей политике codepipeline, поскольку она пытается передать роль (прикрепить роль) к лямбде

Подробнее об этом здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...