Docker容器运行Flask应用时出现AWS安全令牌无效错误
解决Docker容器中Flask应用AWS安全令牌无效问题
本地运行正常的Flask应用,容器化后调用DynamoDB时触发UnrecognizedClientException,提示The security token included in the request is invalid。核心问题是AWS认证凭证在容器内未正确加载,以下是针对性解决方案:
方案1:修正.env文件中的占位符凭证
你的.env文件中AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY为占位符(id/key),替换为真实的AWS密钥:
MEANINGCLOUD_API_KEY=1234567890 FLASK_APP=app.py FLASK_RUN_HOST=0.0.0.0 BUCKETNAME = bucketname UPLOAD_FOLDER = uploads SECRET_KEY=Secret:p DATABASE_URI=sqlite:///users.db AWS_REGION=us-west-2 AWS_ACCESS_KEY_ID=你的真实访问密钥ID AWS_SECRET_ACCESS_KEY=你的真实秘密访问密钥
修改后重新构建镜像,确保容器能读取到有效凭证。
方案2:显式初始化boto3 Session
取消utils.py中注释的Session代码,使用从.env读取的凭证显式创建boto3 Session,避免依赖默认凭证链的不确定性:
# utils.py中更新凭证初始化及DynamoDB资源创建逻辑 import boto3 from decouple import config # 读取环境变量 aws_access_key_id = config('AWS_ACCESS_KEY_ID') aws_secret_access_key = config('AWS_SECRET_ACCESS_KEY') aws_region = config('AWS_REGION') # 初始化全局boto3 Session session = boto3.Session( aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key, region_name=aws_region ) def get_existant_summaries(user_id): # 使用Session创建DynamoDB资源 dynamodb = session.resource('dynamodb') try: table = dynamodb.Table('summaries') summaries = table.scan() except Exception as e: create_dynamodb_table('summaries') summaries = [] return summaries def create_dynamodb_table(name): # 使用Session创建DynamoDB资源 dynamodb = session.resource('dynamodb') table = dynamodb.create_table( TableName=name, KeySchema=[ {'AttributeName': 'user_id', 'KeyType': 'HASH'}, {'AttributeName': 'filename', 'KeyType': 'RANGE'} ], AttributeDefinitions=[ {'AttributeName': 'user_id', 'AttributeType': 'N'}, {'AttributeName': 'filename', 'AttributeType': 'S'} ], ProvisionedThroughput={ 'ReadCapacityUnits': 10, 'WriteCapacityUnits': 10 } ) return table
方案3:修复挂载的AWS凭证文件问题
你通过-v ~/.aws/credentials:/root/.aws/credentials挂载本地凭证,但可能存在以下问题:
- 容器运行用户非root:默认情况下,Python镜像可能以非root用户运行,无法读取
/root/.aws/credentials。修改挂载路径并指定环境变量:docker run -p 5000:5000 \ -v ~/.aws/credentials:/app/.aws/credentials \ -e AWS_SHARED_CREDENTIALS_FILE=/app/.aws/credentials \ sum_up_app - 凭证文件格式错误:确保本地
~/.aws/credentials为标准ini格式:[default] aws_access_key_id=你的密钥ID aws_secret_access_key=你的秘密密钥 - 文件权限不足:容器内无法读取凭证文件,执行
chmod 600 ~/.aws/credentials修改本地文件权限,或添加--user root以root用户运行容器:docker run -p 5000:5000 -v ~/.aws/credentials:/root/.aws/credentials --user root sum_up_app
方案4:通过Docker环境变量传递凭证
避免挂载文件,直接在运行容器时传递环境变量,更安全且规避路径/权限问题:
docker run -p 5000:5000 \ -e AWS_ACCESS_KEY_ID=你的真实密钥ID \ -e AWS_SECRET_ACCESS_KEY=你的真实秘密密钥 \ -e AWS_REGION=us-west-2 \ sum_up_app
该方式会覆盖.env中的对应变量,确保容器使用有效凭证。
验证步骤
修改完成后,重新构建镜像并运行:
docker build -t sum_up_app . docker run -p 5000:5000 sum_up_app
内容的提问来源于stack exchange,提问作者Revolucion for Monica
相关产品推荐
相关产品推荐

