AWS 使用 CodePipeline 中的 CodeBuild 删除 S3 中的文件

Vie*_*iet 6 amazon-s3 amazon-web-services aws-codepipeline aws-codebuild

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

例如:

buildGitHub 存储库的文件夹放在指定的 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:
    - '**/*'
Run Code Online (Sandbox Code Playgroud)

应该命令:

rm -rf *
Run Code Online (Sandbox Code Playgroud)

在这样的build阶段?

build:

commands:
  - aws s3 rm s3://mybucket/ --recursive
Run Code Online (Sandbox Code Playgroud)

以及如何引用正确的存储桶而不是对文件中的名称进行硬编码?

Mil*_*mak 12

要删除 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
Run Code Online (Sandbox Code Playgroud)

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

build:
  commands:
    - aws s3 rm --recursive "s3://${ARTIFACTS_BUCKET}/" 
Run Code Online (Sandbox Code Playgroud)

您可以采用的另一种方法是在存储桶上声明生命周期管理。例如,您可以像这样说“30 天后删除所有对象”:

ArtifactsBucket:
  Type: AWS::S3::Bucket
  Properties:
    BucketName: my-artifacts
    LifecycleConfiguration:
      Rules:
        - ExpirationInDays: 30
          Id: Expire objects in 30 days
          Status: Enabled
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您必须在附加到 codebuild 服务角色的策略中提供 s3 访问权限。您至少需要 s3 读取(列出对象)和写入(删除对象),然后授予其访问 <your-bucket>/* (或根据需要某些特定子目录)的权限 (2认同)