#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 Я в той же лодке, как вы прикрепляете эти политики для предоставления разрешений на запись?