【问题标题】:AWS remove files in S3 using CodeBuild in CodePipelineAWS 使用 CodePipeline 中的 CodeBuild 删除 S3 中的文件
【发布时间】:2019-07-28 05:56:27
【问题描述】:

如何使用 CodeBuildbuildspec.yml 删除 S3 存储桶 中的不需要的文件作为 CodePipeline 中管道的输出文件?

例如:

GitHub repo 的build 文件夹放在指定的 S3 存储桶中,因此该存储桶可以用作静态网站。

我之前将一个文件推送到我不再需要的存储桶中。在将管道的工件推送到存储桶之前,如何使用 buildspec.yml 文件“清理”存储桶?

buildspec.yml 文件示例:

version: 0.2

phases:
  build:
    commands:
      - mkdir build-output
      - find . -type d -name public -exec cp -R {} build-output \;
      - find . -mindepth 1 -name build-output -prune -o -exec rm -rf {} +
  post_build:
    commands:
      - mv build-output/**/* ./
      - mv build-output/* ./
      - rm -R build-output
artifacts:
  files:
    - '**/*'

应命令:

rm -rf *

像这样在build阶段?

build:

commands:
  - aws s3 rm s3://mybucket/ --recursive

我如何引用正确的存储桶而不是硬编码文件中的名称?

【问题讨论】:

  • 您是否需要每次都从存储桶中删除不必要的文件,还是只是一次性操作?
  • 我不必这样做,但如果构建经常更改,我不想在 prod 中留下太多未使用的文件,所以我认为最好在每次人工制品时“清理”存储桶推到它。只是我的想法,我不确定你和其他人是否会这样做。

标签: amazon-web-services amazon-s3 aws-codepipeline aws-codebuild


【解决方案1】:

要删除 S3 存储桶中的文件,您可以使用前面提到的 aws s3 rm --recursive 命令。

您可以将存储桶名称从管道传递到 CodeBuild,方法是在环境变量中设置它。

ArtifactsBucket:
  Type: AWS::S3::Bucket
  Properties:
    BucketName: my-artifacts

CodeBuildProject:
  Type: AWS::CodeBuild::Project
  Properties:
    Environment:
      EnvironmentVariables:
          - Name: ARTIFACTS_BUCKET
            Value: !Ref ArtifactsBucket
            Type: PLAINTEXT

在构建规范中,您可以参考ARTIFACTS_BUCKET env var,例如:

build:
  commands:
    - aws s3 rm --recursive "s3://${ARTIFACTS_BUCKET}/" 

您可以采取的另一种方法是在存储桶上声明lifecycle management。例如,您可以这样说“30 天后删除所有对象”:

ArtifactsBucket:
  Type: AWS::S3::Bucket
  Properties:
    BucketName: my-artifacts
    LifecycleConfiguration:
      Rules:
        - ExpirationInDays: 30
          Id: Expire objects in 30 days
          Status: Enabled

【讨论】:

  • 请注意,您必须在附加到 codebuild 服务角色的策略中提供 s3 访问权限。您需要的最低要求是 s3 读取(列出对象)和写入(删除对象),然后授予它访问 /* (或根据需要某些特定子目录)的权限
  • 这可以在 CodePipeline 控制台中完成吗?我尝试添加!Ref artifactStore,因为这是我在aws codepipeline get-pipeline 的JSON 中看到的名称。但是这个变量是按字面意思传递的,没有翻译。
  • @vampiire 我在同一条船上,您如何附加这些策略以授予写入权限?
猜你喜欢
  • 2018-07-18
  • 2019-12-02
  • 1970-01-01
  • 2020-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-15
相关资源
最近更新 更多