Как организовать доставку артефактов (кода) в S3 bucket?

«Как организовать доставку артефактов (кода) в S3 bucket?» — вопрос из категории Облачные платформы, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В DevOps-практиках доставка в S3 — это этап пайплайна. Я настраивал это как часть CI/CD для хранения билд-артефактов, статики или конфигураций.

1. Использование AWS CLI в скриптах сборки: Самый частый способ в bash-скриптах Jenkins/GitLab CI.

   # Синхронизация директории (добавляет/обновляет только изменённые файлы)
   aws s3 sync ./dist/ s3://my-app-bucket/static/ --delete
   # Копирование конкретного файла с настройкой прав
   aws s3 cp app.tar.gz s3://backup-bucket/ 
     --storage-class STANDARD_IA 
     --acl bucket-owner-full-control

2. Интеграция в пайплайн как код (Terraform): Для загрузки конфигурационных или стартовых файлов при создании инфраструктуры.

   resource "aws_s3_object" "web_app" {
     bucket = aws_s3_bucket.app.id
     key    = "app.zip"
     source = "${path.module}/build/app.zip"
     etag   = filemd5("${path.module}/build/app.zip")
   }

3. Использование SDK в кастомных шагах сборки (Python пример):

   import boto3
   from botocore.exceptions import ClientError

   s3 = boto3.client('s3', region_name='us-east-1')
   try:
       s3.upload_file(
           'target/app.jar',
           'my-deployment-bucket',
           'artifacts/app-latest.jar',
           ExtraArgs={'ServerSideEncryption': 'AES256'}
       )
   except ClientError as e:
       print(f"Upload failed: {e}")

4. Прямая интеграция с CI/CD системами:

  • GitHub Actions: Использует официальный action aws-actions/configure-aws-credentials и затем aws s3 sync.
  • Jenkins: Плагин "AWS Steps" или просто вызов AWS CLI из shell-шага.

Безопасность и best practices:

  • Доступ через IAM-роли (для EC2/ECS) или временные credentials для CI-серверов.
  • Включаем versioning на bucket для артефактов.
  • Настраиваем политики жизненного цикла (Lifecycle Policies) для автоматического удаления или архивации старых артефактов.