Initial commit
This commit is contained in:
Executable
+341
@@ -0,0 +1,341 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Скрипт для настройки AWS S3 и CloudFront для хранения изображений
|
||||
# Запустить ПЕРЕД миграцией для настройки инфраструктуры
|
||||
|
||||
set -e # Остановка при ошибке
|
||||
|
||||
# Загрузка конфигурации
|
||||
source "$(dirname "$0")/config.sh"
|
||||
|
||||
log "Начало настройки AWS инфраструктуры..."
|
||||
|
||||
# Проверка зависимостей
|
||||
if ! command -v aws &> /dev/null; then
|
||||
error_log "AWS CLI не установлен. Установите: https://aws.amazon.com/cli/"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! aws sts get-caller-identity &> /dev/null; then
|
||||
error_log "AWS credentials не настроены. Запустите: aws configure"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Получение информации об аккаунте
|
||||
aws_account_id=$(aws sts get-caller-identity --query 'Account' --output text)
|
||||
aws_region=$(aws configure get region || echo "us-east-1")
|
||||
log "AWS Account ID: $aws_account_id"
|
||||
log "AWS Region: $aws_region"
|
||||
|
||||
# 1. Создание S3 bucket
|
||||
log "1. Создание S3 bucket..."
|
||||
|
||||
if aws s3 ls "s3://$S3_BUCKET" &> /dev/null; then
|
||||
log "S3 bucket '$S3_BUCKET' уже существует"
|
||||
else
|
||||
log "Создание S3 bucket: $S3_BUCKET"
|
||||
|
||||
if [ "$aws_region" = "us-east-1" ]; then
|
||||
aws s3 mb "s3://$S3_BUCKET"
|
||||
else
|
||||
aws s3 mb "s3://$S3_BUCKET" --region "$aws_region"
|
||||
fi
|
||||
|
||||
log "S3 bucket создан"
|
||||
fi
|
||||
|
||||
# 2. Настройка политики bucket для публичного чтения
|
||||
log "2. Настройка политики bucket..."
|
||||
|
||||
# Отключение блокировки публичного доступа
|
||||
aws s3api put-public-access-block \
|
||||
--bucket "$S3_BUCKET" \
|
||||
--public-access-block-configuration \
|
||||
"BlockPublicAcls=false,IgnorePublicAcls=false,BlockPublicPolicy=false,RestrictPublicBuckets=false"
|
||||
|
||||
# Политика для публичного чтения изображений
|
||||
cat > "$TEMP_DIR/bucket-policy.json" << EOF
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [
|
||||
{
|
||||
"Sid": "PublicReadGetObject",
|
||||
"Effect": "Allow",
|
||||
"Principal": "*",
|
||||
"Action": "s3:GetObject",
|
||||
"Resource": "arn:aws:s3:::$S3_BUCKET/images/*"
|
||||
}
|
||||
]
|
||||
}
|
||||
EOF
|
||||
|
||||
aws s3api put-bucket-policy --bucket "$S3_BUCKET" --policy file://"$TEMP_DIR/bucket-policy.json"
|
||||
log "Политика bucket настроена"
|
||||
|
||||
# 3. Настройка CORS для браузерного доступа
|
||||
log "3. Настройка CORS..."
|
||||
|
||||
cat > "$TEMP_DIR/cors-config.json" << EOF
|
||||
{
|
||||
"CORSRules": [
|
||||
{
|
||||
"AllowedOrigins": ["*"],
|
||||
"AllowedMethods": ["GET", "HEAD"],
|
||||
"AllowedHeaders": ["*"],
|
||||
"MaxAgeSeconds": 3000
|
||||
}
|
||||
]
|
||||
}
|
||||
EOF
|
||||
|
||||
aws s3api put-bucket-cors --bucket "$S3_BUCKET" --cors-configuration file://"$TEMP_DIR/cors-config.json"
|
||||
log "CORS настроен"
|
||||
|
||||
# 4. Настройка CloudFront CDN (опционально)
|
||||
log "4. Настройка CloudFront CDN..."
|
||||
|
||||
# Проверка существования дистрибуции
|
||||
existing_distribution=$(aws cloudfront list-distributions --query "DistributionList.Items[?Origins.Items[0].DomainName=='$S3_BUCKET.s3.amazonaws.com'].Id" --output text || echo "")
|
||||
|
||||
if [ -n "$existing_distribution" ]; then
|
||||
log "CloudFront дистрибуция уже существует: $existing_distribution"
|
||||
cdn_domain=$(aws cloudfront get-distribution --id "$existing_distribution" --query "Distribution.DomainName" --output text)
|
||||
log "CDN домен: $cdn_domain"
|
||||
else
|
||||
log "Создание CloudFront дистрибуции..."
|
||||
|
||||
# Создание конфигурации CloudFront
|
||||
cat > "$TEMP_DIR/cloudfront-config.json" << EOF
|
||||
{
|
||||
"CallerReference": "ptp-images-$(date +%s)",
|
||||
"Comment": "CDN for PTP website images",
|
||||
"DefaultCacheBehavior": {
|
||||
"TargetOriginId": "S3-$S3_BUCKET",
|
||||
"ViewerProtocolPolicy": "redirect-to-https",
|
||||
"TrustedSigners": {
|
||||
"Enabled": false,
|
||||
"Quantity": 0
|
||||
},
|
||||
"ForwardedValues": {
|
||||
"QueryString": false,
|
||||
"Cookies": {
|
||||
"Forward": "none"
|
||||
}
|
||||
},
|
||||
"MinTTL": 0,
|
||||
"DefaultTTL": 86400,
|
||||
"MaxTTL": 31536000,
|
||||
"Compress": true
|
||||
},
|
||||
"Origins": {
|
||||
"Quantity": 1,
|
||||
"Items": [
|
||||
{
|
||||
"Id": "S3-$S3_BUCKET",
|
||||
"DomainName": "$S3_BUCKET.s3.amazonaws.com",
|
||||
"S3OriginConfig": {
|
||||
"OriginAccessIdentity": ""
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"Enabled": true,
|
||||
"PriceClass": "PriceClass_100"
|
||||
}
|
||||
EOF
|
||||
|
||||
# Создание дистрибуции
|
||||
distribution_id=$(aws cloudfront create-distribution --distribution-config file://"$TEMP_DIR/cloudfront-config.json" --query "Distribution.Id" --output text)
|
||||
|
||||
log "CloudFront дистрибуция создана: $distribution_id"
|
||||
log "Ожидание развертывания CloudFront (это может занять несколько минут)..."
|
||||
|
||||
# Ожидание развертывания
|
||||
aws cloudfront wait distribution-deployed --id "$distribution_id"
|
||||
|
||||
cdn_domain=$(aws cloudfront get-distribution --id "$distribution_id" --query "Distribution.DomainName" --output text)
|
||||
log "CDN домен: $cdn_domain"
|
||||
|
||||
# Обновление конфигурации с CDN URL
|
||||
cdn_url="https://$cdn_domain"
|
||||
sed -i.bak "s|CDN_URL=.*|CDN_URL=\"$cdn_url\"|" "$(dirname "$0")/config.sh"
|
||||
sed -i.bak "s|S3_BASE_URL=.*|S3_BASE_URL=\"$cdn_url\"|" "$(dirname "$0")/config.sh"
|
||||
|
||||
log "Конфигурация обновлена с CDN URL: $cdn_url"
|
||||
fi
|
||||
|
||||
# 5. Создание IAM пользователя для загрузки (опционально)
|
||||
log "5. Создание IAM пользователя для загрузки изображений..."
|
||||
|
||||
iam_user="ptp-images-uploader"
|
||||
if aws iam get-user --user-name "$iam_user" &> /dev/null; then
|
||||
log "IAM пользователь '$iam_user' уже существует"
|
||||
else
|
||||
log "Создание IAM пользователя: $iam_user"
|
||||
aws iam create-user --user-name "$iam_user"
|
||||
|
||||
# Политика для загрузки в S3
|
||||
cat > "$TEMP_DIR/iam-policy.json" << EOF
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [
|
||||
{
|
||||
"Effect": "Allow",
|
||||
"Action": [
|
||||
"s3:PutObject",
|
||||
"s3:PutObjectAcl",
|
||||
"s3:GetObject",
|
||||
"s3:DeleteObject"
|
||||
],
|
||||
"Resource": "arn:aws:s3:::$S3_BUCKET/images/*"
|
||||
},
|
||||
{
|
||||
"Effect": "Allow",
|
||||
"Action": [
|
||||
"s3:ListBucket"
|
||||
],
|
||||
"Resource": "arn:aws:s3:::$S3_BUCKET"
|
||||
}
|
||||
]
|
||||
}
|
||||
EOF
|
||||
|
||||
# Создание политики
|
||||
policy_arn=$(aws iam create-policy --policy-name "PTPImagesUpload" --policy-document file://"$TEMP_DIR/iam-policy.json" --query "Policy.Arn" --output text)
|
||||
|
||||
# Присвоение политики пользователю
|
||||
aws iam attach-user-policy --user-name "$iam_user" --policy-arn "$policy_arn"
|
||||
|
||||
log "IAM пользователь создан и политика назначена"
|
||||
fi
|
||||
|
||||
# 6. Создание тестового изображения
|
||||
log "6. Создание тестового изображения..."
|
||||
|
||||
# Создание простого тестового изображения (SVG)
|
||||
cat > "$TEMP_DIR/test-image.svg" << 'EOF'
|
||||
<svg width="400" height="300" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="100%" height="100%" fill="#f0f0f0"/>
|
||||
<text x="200" y="150" text-anchor="middle" font-family="Arial" font-size="20" fill="#333">
|
||||
Test Image for PTP S3 Migration
|
||||
</text>
|
||||
<text x="200" y="180" text-anchor="middle" font-family="Arial" font-size="14" fill="#666">
|
||||
This image confirms S3 setup is working
|
||||
</text>
|
||||
</svg>
|
||||
EOF
|
||||
|
||||
# Загрузка тестового изображения
|
||||
aws s3 cp "$TEMP_DIR/test-image.svg" "s3://$S3_BUCKET/images/test-image.svg" \
|
||||
--content-type "image/svg+xml" \
|
||||
--cache-control "max-age=3600"
|
||||
|
||||
log "Тестовое изображение загружено"
|
||||
|
||||
# 7. Проверка работы
|
||||
log "7. Проверка работы настроенной инфраструктуры..."
|
||||
|
||||
# Проверка доступности через S3
|
||||
s3_url="https://$S3_BUCKET.s3.amazonaws.com/images/test-image.svg"
|
||||
if curl -s -I "$s3_url" | grep -q "200 OK"; then
|
||||
log "✓ S3 доступен: $s3_url"
|
||||
else
|
||||
error_log "✗ S3 недоступен: $s3_url"
|
||||
fi
|
||||
|
||||
# Проверка доступности через CDN (если настроен)
|
||||
if [ -n "$cdn_domain" ]; then
|
||||
cdn_url="https://$cdn_domain/images/test-image.svg"
|
||||
if curl -s -I "$cdn_url" | grep -q "200 OK"; then
|
||||
log "✓ CDN доступен: $cdn_url"
|
||||
else
|
||||
log "⚠ CDN пока недоступен (может потребоваться время): $cdn_url"
|
||||
fi
|
||||
fi
|
||||
|
||||
# 8. Создание отчета о настройке
|
||||
setup_report="./migration-s3/aws-setup-report.md"
|
||||
{
|
||||
echo "# Отчет о настройке AWS для PTP Images"
|
||||
echo ""
|
||||
echo "**Дата настройки:** $(date)"
|
||||
echo "**AWS Account ID:** $aws_account_id"
|
||||
echo "**AWS Region:** $aws_region"
|
||||
echo ""
|
||||
echo "## Созданные ресурсы"
|
||||
echo ""
|
||||
echo "### S3 Bucket"
|
||||
echo "- **Имя:** $S3_BUCKET"
|
||||
echo "- **Регион:** $aws_region"
|
||||
echo "- **URL:** https://$S3_BUCKET.s3.amazonaws.com"
|
||||
echo "- **Публичный доступ:** Только для папки /images/"
|
||||
echo ""
|
||||
|
||||
if [ -n "$cdn_domain" ]; then
|
||||
echo "### CloudFront CDN"
|
||||
echo "- **Домен:** $cdn_domain"
|
||||
echo "- **URL:** https://$cdn_domain"
|
||||
echo "- **Статус:** Активен"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
echo "### IAM пользователь"
|
||||
echo "- **Имя:** $iam_user"
|
||||
echo "- **Права:** Загрузка в /images/"
|
||||
echo ""
|
||||
echo "## Тестирование"
|
||||
echo ""
|
||||
echo "Тестовое изображение доступно по адресу:"
|
||||
echo "- S3: $s3_url"
|
||||
|
||||
if [ -n "$cdn_domain" ]; then
|
||||
echo "- CDN: https://$cdn_domain/images/test-image.svg"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "## Следующие шаги"
|
||||
echo ""
|
||||
echo "1. Убедитесь, что тестовое изображение доступно"
|
||||
echo "2. Обновите переменные в config.sh при необходимости"
|
||||
echo "3. Запустите миграцию: ./1-upload-to-s3.sh"
|
||||
echo ""
|
||||
echo "## Конфигурация"
|
||||
echo ""
|
||||
echo "Добавьте в config.sh:"
|
||||
echo "\`\`\`bash"
|
||||
echo "S3_BUCKET=\"$S3_BUCKET\""
|
||||
echo "S3_REGION=\"$aws_region\""
|
||||
|
||||
if [ -n "$cdn_domain" ]; then
|
||||
echo "CDN_URL=\"https://$cdn_domain\""
|
||||
echo "S3_BASE_URL=\"https://$cdn_domain\""
|
||||
else
|
||||
echo "S3_BASE_URL=\"https://$S3_BUCKET.s3.amazonaws.com\""
|
||||
fi
|
||||
|
||||
echo "\`\`\`"
|
||||
echo ""
|
||||
echo "---"
|
||||
echo "*Отчет создан автоматически скриптом setup-aws.sh*"
|
||||
|
||||
} > "$setup_report"
|
||||
|
||||
# Финальная информация
|
||||
log ""
|
||||
log "=== НАСТРОЙКА AWS ЗАВЕРШЕНА ==="
|
||||
log "S3 Bucket: $S3_BUCKET"
|
||||
log "Region: $aws_region"
|
||||
|
||||
if [ -n "$cdn_domain" ]; then
|
||||
log "CDN Domain: $cdn_domain"
|
||||
log "Base URL: https://$cdn_domain"
|
||||
else
|
||||
log "Base URL: https://$S3_BUCKET.s3.amazonaws.com"
|
||||
fi
|
||||
|
||||
log "Отчет создан: $setup_report"
|
||||
log ""
|
||||
log "Тестовое изображение:"
|
||||
log " $s3_url"
|
||||
log ""
|
||||
log "Следующий шаг: ./1-upload-to-s3.sh"
|
||||
Reference in New Issue
Block a user