You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 06:32:03