首页 > 解决方案 > 为 AWS SAM 应用程序创建 CodePipeline、部署阶段时出现问题

问题描述

我为我的 AWS SAM 应用程序创建了一个有效的 CodePipeline。它仅使用带有以下文件的SourceBuild阶段buildspec.yaml

version: 0.2
phases:
  install:
    runtime-versions:
      python: 3.7
    commands:
      - pip install --user aws-sam-cli
      - USER_BASE_PATH=$(python -m site --user-base)
      - export PATH=$PATH:$USER_BASE_PATH/bin
  build:
    commands:
      - sam build
  post_build:
    commands:
      sam package --s3-bucket deploy-bucket --output-template-file deployment.yaml
    # finally:
    #   sam deploy --template-file deployment.yaml --stack-name MyStackSAM--region us-east-1 --capabilities CAPABILITY_IAM

如您所见,我已注释掉最后两行,因为我想将该操作移至CodePipeline中的部署阶段

我的部署步骤如下所示:

屏幕截图

CloudFormationPipelineServiceRole在这一点上拥有完全的管理员权限,而且我仍然收到以下错误作为执行此阶段的结果。

Action execution failed
Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: XXXXFFFFFXXXX; S3 Extended Request ID: XXXXFFFFFXXXXFFFFFXXXXX=)

我对为什么会收到此错误感到困惑。任何帮助将不胜感激。

标签: amazon-web-servicesamazon-cloudformationaws-code-deployaws-codepipelineaws-sam

解决方案


首先,sam package期望需要通过--template-file标志传递的源模板文件。我在您的代码中的任何地方都看不到该模板文件。您要打包哪个模板文件?

其次,您没有将必要的工件上传到 s3 存储桶。您上传的唯一内容是压缩代码,但正如您从已注释掉的命令中看到的那样:

sam deploy --template-file deployment.yaml --stack-name MyStackSAM--region us-east-1 --capabilities CAPABILITY_IAM

你也需要这个文件deployment.yaml,但你没有在你的代码中指定它。CodeBuild 无法猜测您要保留哪些工件。

您需要在artifacts构建规范文件的底部添加额外的部分并指定这些工件。

artifacts:
  type: zip
  files:
    - template.yaml             # (where do you have this file?)
    - outputtemplate.yaml       # (deployment.yaml in your case)

请注意,该artifacts部分需要与versionphases

version: 0.2
phases:
  ...
artifacts:
  ...

推荐阅读