AWS удаляет файлы в S3, используя CodeBuild в CodePipeline

Как удалить ненужные файлы из корзины S3 в качестве выходных данных конвейера в CodePipeline, используя файл buildspec.yml CodeBuild?

Например:

Папка build репозитория GitHub помещается в указанную корзину 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

И как мне указать правильное ведро вместо того, чтобы жестко задавать имя в файле?


person Viet    schedule 06.03.2019    source источник
comment
Вам нужно каждый раз удалять ненужные файлы из корзины или это разовая операция?   -  person Milan Cermak    schedule 09.03.2019
comment
Мне это не нужно, но если сборка часто меняется, я не хочу оставлять слишком много неиспользуемых файлов в prod, поэтому я думаю, что лучше очищать корзину каждый раз, когда в нее помещаются артефакты. Просто моя мысль, я не уверен, что ты и другие поступили бы так же.   -  person Viet    schedule 10.03.2019


Ответы (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}/" 

Альтернативный подход — объявить управление жизненным циклом на ведре. Например, вы можете сказать «удалить все объекты через 30 дней» следующим образом:

ArtifactsBucket:
  Type: AWS::S3::Bucket
  Properties:
    BucketName: my-artifacts
    LifecycleConfiguration:
      Rules:
        - ExpirationInDays: 30
          Id: Expire objects in 30 days
          Status: Enabled
person Milan Cermak    schedule 10.03.2019
comment
просто примечание: вы должны предоставить доступ s3 в политике, прикрепленной к роли службы кодовой сборки. минимум, который вам нужен, это чтение s3 (список объектов) и запись (удаление объектов), а затем предоставление ему доступа к ‹your-bucket›/* (или к какому-то конкретному подкаталогу по мере необходимости) - person vampiire; 20.07.2019
comment
Можно ли это сделать в консоли CodePipeline? Я попытался добавить !Ref artifactStore, потому что это имя я вижу в JSON от aws codepipeline get-pipeline. Но эта переменная передается буквально без перевода. - person Elliott B; 30.11.2020
comment
@vampiire Я в той же лодке, как вы прикрепляете эти политики, чтобы дать разрешения на запись? - person Danny22; 19.01.2021