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

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:代码做轻量双环境兼容

  1. 本地启动sam时增加自定义环境变量标识本地环境:
LOCAL_ENV=1 sam local start-api
  1. 调整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:48:04