Ответ
В 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) для автоматического удаления или архивации старых артефактов.