提问人:Spiral 提问时间:11/14/2023 最后编辑:Spiral 更新时间:11/15/2023 访问量:55
通过 Secret Manager 在 ECS Fargate 中拒绝 RDS 访问
RDS Access Denied in ECS Fargate through Secret Manager
问:
我在 AWS ECS 上部署 Laravel 应用程序时遇到了问题。部署过程涉及 Jenkins、AWS ECR 和 ECS。新任务已创建,但连接到 RDS 数据库时出现“拒绝访问”错误。
我提供了我的部署文件供参考。
Jenkins文件:
pipeline {
agent any
environment {
AWS_ACCOUNT_ID="794664785634"
AWS_DEFAULT_REGION="us-east-1"
IMAGE_REPO_NAME="product-mangement"
IMAGE_TAG="${BUILD_NUMBER}"
REPOSITORY_URI = "794664785634.dkr.ecr.us-east-1.amazonaws.com/product-mangement"
ECS_CLUSTER = "product-mangement"
ECS_SERVICE = "product-mangement"
}
stages {
stage('Checkout Latest Source') {
steps {
git branch: 'master',
url: 'https://github.com/jhon-123/product-mangement',
credentialsId: 'jenkins_pta'
}
}
stage('Logging into AWS ECR') {
steps {
script {
sh """aws ecr get-login-password --region ${AWS_DEFAULT_REGION} | docker login --username AWS --password-stdin ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com"""
}
}
}
// Building Docker images
stage('Building image') {
steps{
script {
dockerImage = docker.build "${IMAGE_REPO_NAME}:${IMAGE_TAG}"
}
}
}
// Uploading Docker images into AWS ECR
stage('Pushing to ECR') {
steps{
script {
sh """docker tag ${IMAGE_REPO_NAME}:${IMAGE_TAG} ${REPOSITORY_URI}:$IMAGE_TAG"""
sh """docker push ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_REPO_NAME}:${IMAGE_TAG}"""
}
}
}
stage('Deploy to ECS') {
steps {
sh "aws ecs update-service --cluster ${ECS_CLUSTER} --service ${ECS_SERVICE} --force-new-deployment"
}
}
}
}
Docker文件:
# Use the official PHP image as a base
FROM php:8.1-fpm
ENV COMPOSER_ALLOW_SUPERUSER 1
# Arguments defined in docker-compose.yml
ARG user
ARG uid
USER root
# Install system dependencies
RUN apt-get update && apt-get install -y \
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
zip \
unzip
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install PHP extensions
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
# Get latest Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Create system user to run Composer and Artisan Commands
# RUN useradd -G www-data,root -u $uid -d /home/$user $user
# RUN mkdir -p /home/$user/.composer && \
# chown -R $user:$user /home/$user
# Set the working directory
WORKDIR /var/www
# Copy the project files into the container
COPY . /var/www
# Copy .env.example to .env
COPY .env.prod .env
# Install Composer dependencies
RUN composer install
# Cache configuration
RUN php artisan config:clear
RUN php artisan config:cache
# Generate Laravel application key
RUN php artisan key:generate
# Copy the start script into the container
COPY script.sh /var/www/script.sh
# Make the script executable
RUN chmod +x /var/www/script.sh
# Expose port 8000
EXPOSE 8000
# show message
RUN echo "ehllo"
# Run the start script as the CMD
CMD ["/var/www/script.sh"]
script.sh:
#!/bin/sh
# Run Laravel migrations
php artisan migrate
# Seed Database
php artisan db:seed
echo "seeded successfully"
# Start the Laravel application
php artisan serve --host=0.0.0.0 --port=8000
问题:新任务已创建,但连接到 RDS 数据库时出现“拒绝访问”错误。.env.prod 文件包含正确的 RDS 连接详细信息。
.env.prod:=>我已将 .env.prod 文件复制到 Dockerfile 中的 .env 中,并且我确实检查了实时 ECS 任务,它在那里,但 ECS 没有从密钥管理器获取凭据。我很困惑
APP_NAME=Laravel
APP_ENV=prod
APP_KEY=base64:LyxaydSCa8HIgUdaLLQCPehtSK2siVr0o+bT6jcXWmM=
APP_DEBUG=false
APP_URL=http://localhost
LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=product-management.c7ebhtqyydqk.us-east-1.rds.amazonaws.com
DB_PORT=3306
DB_DATABASE=product-management
#DB_USERNAME=laravel
#DB_PASSWORD=secret
BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DRIVER=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
MEMCACHED_HOST=127.0.0.1
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=null
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
问题:
什么原因可能导致部署过程中出现“拒绝访问”错误,如何解决该错误?任何有关故障排除的见解或建议将不胜感激。
首先,我在自定义 VPC 中进行部署,但我认为 VPC 可能存在问题,并且可能是我无法提供适当的安全组和子网,所以我尝试使用默认值,但遇到了同样的错误。
我已经尝试过通过密钥管理器进行RDS连接的RDS,并且在任务定义中,我已将这些权限添加为角色中的任务角色
AmazonEC2ContainerServiceRole
AmazonECS_FullAccess
AmazonECSTaskExecutionRolePolicy
AmazonRDSDataFullAccess
AmazonRDSFullAccess
我已经创建了一个RDS实例,并将用户名和密码保存到Secret Manager中。我在环境变量中将 Secret Manager 密钥用作 ValueFrom 中的 ECS 任务定义,如下所示
arn:aws:secretsmanager:us-east-1:794664117291:secret:product-management-secrets-83qahw::username:
arn:aws:secretsmanager:us-east-1:794664117291:secret:product-management-secrets-83qahw::password:
以及引擎、主机和端口,我已将其添加到 .env.example 文件中,并将其复制到 Dockerfile 中。
我还用 SSH 检查了 ECS 任务,并检查了 .env.example 是否正在复制到 .env 中,但问题是 ECS 没有获取密钥管理器环境变量,并且由于即将到来的访问被拒绝问题和 ECS 从 config/database.php 获取默认数据库伪造
答: 暂无答案
评论
SSH
ECS TASK
php artisan migrate
php artisan config:cache
php artisan migrate