AWS удаляет файлы в S3 с помощью CodeBuild в CodePipeline

#amazon-web-services #amazon-s3 #aws-codepipeline #aws-codebuild

#amazon-веб-сервисы #amazon-s3 #aws-codepipeline #aws-codebuild

Вопрос:

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

Например:

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
  

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

Комментарии:

1. Вам нужно каждый раз удалять ненужные файлы из корзины или это просто одноразовая операция?

2. Мне не обязательно, но если сборка часто меняется, я не хочу оставлять слишком много неиспользуемых файлов в prod, поэтому я думаю, что лучше «очищать» корзину каждый раз, когда в нее загружаются артефакты. Просто моя мысль, я не уверен, что вы и другие сделали бы то же самое.

Ответ №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, например:

 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
  

Комментарии:

1. просто обратите внимание, что вы должны предоставить доступ к s3 в политике, прикрепленной к роли службы codebuild. минимум, который вам нужен, это чтение s3 (список объектов) и запись (удаление объектов), а затем предоставление ему доступа к <your-bucket> /* (или некоторому конкретному подкаталогу по мере необходимости)

2. Можно ли это сделать в консоли CodePipeline? Я попытался добавить, !Ref artifactStore потому что это имя я вижу в JSON от aws codepipeline get-pipeline . Но эта переменная передается буквально без перевода.

3. @vampiire Я в той же лодке, как вы прикрепляете эти политики для предоставления разрешений на запись?