AWS Lambda本地运行无法从环境变量获取凭证报安全令牌无效错误
问题根因
你在本地用SAM运行Lambda时,SAM会模拟AWS Lambda的运行时环境,自动注入容器凭证服务相关的环境变量AWS_CONTAINER_CREDENTIALS_RELATIVE_URI。Ruby AWS SDK的默认凭证链会优先从这个容器接口拉取凭证,而SAM本地模拟的这个接口返回的是无实际权限的测试凭证,优先级高于你自己设置的AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY环境变量,所以才会报凭证无效的错误。你显式传入credentials参数时,SDK会跳过默认凭证链的查找逻辑,直接使用你传入的AK/SK,所以能正常运行。
解决方案(均不影响AWS云端运行逻辑)
方案1:无需修改代码,调整SAM启动命令
启动sam本地服务时,清空容器内的AWS_CONTAINER_CREDENTIALS_RELATIVE_URI环境变量,SDK就会自动降级从你设置的AK/SK环境变量读取凭证:
AWS_CONTAINER_CREDENTIALS_RELATIVE_URI="" sam local start-api
如果你本地已经配置过AWS CLI的权限凭证,也可以直接指定profile启动:
sam local start-api --profile 你的AWS配置profile名
方案2:代码做轻量双环境兼容
- 本地启动sam时增加自定义环境变量标识本地环境:
LOCAL_ENV=1 sam local start-api
- 调整DynamoDB客户端初始化代码,仅本地环境显式传入凭证:
require 'json' require 'aws-sdk-dynamodb' def lambda_handler(event:, context:) dynamodb_params = { region: 'eu-north-1' } # 仅本地环境显式传入凭证,云端走IAM角色权限 if ENV['LOCAL_ENV'] dynamodb_params[:credentials] = Aws::Credentials.new(ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY']) end dynamodb = Aws::DynamoDB::Client.new(dynamodb_params) # 剩余业务逻辑保持不变 dynamodb.get_item(payload).item end
内容的提问来源于stack exchange,提问作者Maciej Dobosz
相关产品推荐
相关产品推荐

