AWS CodePipeline - 权限不足无法访问工件错误

tec*_*sun 4 amazon-web-services aws-code-deploy aws-codepipeline

尝试创建并运行从 Github 拉取的 AWS CodePipeline,构建并部署到 EC2 实例。管道如下:

源 (Github) -> 构建 (AWS CodeBuild) -> 部署 (AWS CodeDeploy)

源和构建步骤均成功。但是,部署始终失败,并出现以下错误:


权限不足无法使用位于 Amazon S3 工件存储桶“codepipeline-us-east-1-[redacted]”中的 Amazon S3 对象密钥“[redacted]-2nd-test-pip/BuildArtif/IbiHzen”访问工件。提供的角色没有足够的权限。


以下是 CodeBuild 服务角色策略的 IAM 策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Resource": [
                "arn:aws:logs:us-east-1:362490217134:log-group:/aws/codebuild/[Redacted]-Build-Project",
                "arn:aws:logs:us-east-1:362490217134:log-group:/aws/codebuild/[Redacted]-Build-Project:*"
            ],
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ]
        },
        {
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::codepipeline-us-east-1-*"
            ],
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:GetObjectVersion"
            ]
        },
        {
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::codepipeline-us-east-1-[Redacted]/*"
            ],
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:GetObjectVersion"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

管道向导创建的 CodePipeline 服务角色已分配 S3 完全访问权限:

            "Action": [
                "elasticbeanstalk:*",
                "ec2:*",
                "elasticloadbalancing:*",
                "autoscaling:*",
                "cloudwatch:*",
                "s3:*",
                "sns:*",
                "cloudformation:*",
                "rds:*",
                "sqs:*",
                "ecs:*"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
Run Code Online (Sandbox Code Playgroud)

我已经多次确认管道部署步骤中引用的工件与构建步骤创建的工件相匹配。

如果我去查看引用的路径,则不存在具有该名称的目录或 zip 文件(不确定哪个应该在那里,但两者都不存在)。此外,在构建过程中会生成一个 zip 文件,但它的名称永远不会是部署步骤所期望的名称。

我还进入了构建项目并尝试使用其他工件配置进行构建,但在通过 CodePipeline 运行构建时它们似乎被忽略。

免责声明:我在互联网上和其他地方看到过类似的问题,但每个问题都涉及 ECS 或与我的不同的其他情况。感谢您的帮助

tec*_*sun 9

该问题与角色/策略无关。如前所述,S3 存储桶中不存在预期的 zip 文件。这是由于构建规范中指定的工件文件路径无效。更正后,将创建 zip 文件,并且部署不再因该错误而失败。在我看来,CodePipeline 允许构建报告为已成功完成,而不验证作为工件创建并传递到部署步骤的文件实际上是否已创建,这似乎很奇怪。