通过 Secret Manager 在 ECS Fargate 中拒绝 RDS 访问

RDS Access Denied in ECS Fargate through Secret Manager

提问人:Spiral 提问时间:11/14/2023 最后编辑:Spiral 更新时间:11/15/2023 访问量:55

问:

我在 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 获取默认数据库伪造

amazon-rds amazon-ecs aws-application-load-balancer aws-secrets-manager

评论

0赞 Mark B 11/14/2023
我不明白你为什么提到 Secrets Manager,为什么你说你的任务应该是从 secrets manager 那里获取机密。您展示的任何代码或配置中都没有任何内容会与 Secrets Manager 交互。您是否在 ECS 任务定义中定义了密钥?如果是这样,请将任务定义添加到您的问题中。此外,您尚未向 ECS 任务角色提供 Secrets Manager 权限。
0赞 Spiral 11/15/2023
谢谢你@MarkB回复我。是的,我在任务定义中添加了我为 RDS 制作的密钥管理器变量。我还添加了对 ECS 任务角色的权限,我已经在我的问题中添加了您能在我的问题中看到上面的内容吗
0赞 Spiral 11/15/2023
如果您仍然感到困惑,请告诉我,我会解释更多
0赞 Spiral 11/15/2023
@MarkB当我进入并运行命令时,也得到访问被拒绝错误'' SQLSTATE[HY000] [1045] 用户'forge'@'172.31.95.237'的访问被拒绝(使用密码:NO)(SQL:从information_schema.tables中选择*,其中table_schema=产品管理,table_name=迁移,table_type='基表')''但是当我使用此命令清除缓存并再次运行时,迁移成功。但是在新任务中再次出现同样的问题。我对为什么会发生这种情况感到非常困惑。SSHECS TASKphp artisan migratephp artisan config:cachephp artisan migrate
0赞 Mark B 11/15/2023
对不起,您没有将这些详细信息添加到您的问题中。您的问题仍显示原始内容,没有进行任何编辑。您的问题仍然显示有关您使用 Secrets Manager 的信息为零

答: 暂无答案