ruby - AWS Lambda 函数未从 ENV 变量获取凭证(安全令牌无效)
问题描述
我有一个用 Ruby 编写的小型 lambda 函数,可以在 AWS 上运行,但可以在ERROR: The security token included in the request is invalid
本地显示。
此函数的目的是从 DynamoDB 表中读取一些内容。以下是该函数的重要部分:
require 'json'
require 'aws-sdk-dynamodb'
def lambda_handler(event:, context:)
p 'AWS_ACCESS_KEY_ID: ' + ENV['AWS_ACCESS_KEY_ID']
p 'AWS_SECRET_ACCESS_KEY: ' + ENV['AWS_SECRET_ACCESS_KEY']
dynamodb = Aws::DynamoDB::Client.new(region: 'eu-north-1')
...
dynamodb.get_item(payload).item
...
end
当我尝试使用本地调用该函数时,sam local start-api
我得到了这个:
START RequestId: 56d1c0f0-cad8-45b8-9a95-344c06f0aea4 Version: $LATEST
"AWS_ACCESS_KEY_ID: AKI**************TPW"
"AWS_SECRET_ACCESS_KEY: 1ew****************************AAn"
Error raised from handler method
{
"errorMessage": "The security token included in the request is invalid",
"errorType": "Function<Aws::DynamoDB::Errors::UnrecognizedClientException>",
"stackTrace": [
"/var/runtime/gems/aws-sdk-core-3.121.0/lib/seahorse/client/plugins/raise_response_errors.rb:17:in `call'",
"/var/runtime/gems/aws-sdk-dynamodb-1.63.0/lib/aws-sdk-dynamodb/plugins/simple_attributes.rb:119:in `call'",
"/var/runtime/gems/aws-sdk-core-3.121.0/lib/aws-sdk-core/plugins/jsonvalue_converter.rb:22:in `call'",
"/var/runtime/gems/aws-sdk-core-3.121.0/lib/aws-sdk-core/plugins/idempotency_token.rb:19:in `call'",
"/var/runtime/gems/aws-sdk-core-3.121.0/lib/aws-sdk-core/plugins/param_converter.rb:26:in `call'",
"/var/runtime/gems/aws-sdk-core-3.121.0/lib/seahorse/client/plugins/request_callback.rb:71:in `call'",
"/var/runtime/gems/aws-sdk-core-3.121.0/lib/aws-sdk-core/plugins/response_paging.rb:12:in `call'",
"/var/runtime/gems/aws-sdk-core-3.121.0/lib/seahorse/client/plugins/response_target.rb:24:in `call'",
"/var/runtime/gems/aws-sdk-core-3.121.0/lib/seahorse/client/request.rb:72:in `send_request'",
"/var/runtime/gems/aws-sdk-dynamodb-1.63.0/lib/aws-sdk-dynamodb/client.rb:3314:in `get_item'",
"/var/task/units.rb:29:in `unit'"
]
}
END RequestId: 56d1c0f0-cad8-45b8-9a95-344c06f0aea4
REPORT RequestId: 56d1c0f0-cad8-45b8-9a95-344c06f0aea4 Init Duration: 0.06 ms Duration: 685.33 ms Billed Duration: 700 ms Memory Size: 128 MB Max Memory Used: 128 MB
Lambda returned empty body!
如您所见ENV
,变量设置正确,因为它们正在打印到控制台。
根据文档,设置这两个变量就足够了,ENV
但看起来我错过了一些东西。
当我从
dynamodb = Aws::DynamoDB::Client.new(region: 'eu-north-1')
至
dynamodb = Aws::DynamoDB::Client.new(region: 'eu-north-1', credentials: Aws::Credentials.new(ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY']))
然后突然之间 lambda 函数连接到 DynamoDB 没有问题。
如何使函数在本地连接到 DynamoDB?假设我不想:credentials
明确传递,因为这会破坏 AWS 上的功能(因为在 AWS 上它使用AmazonDynamoDBFullAccess
策略连接到 dynamodb)
解决方案
你为什么试图通过你的应用程序通过 AK/SK?SAM 使用您的 AWS Cli 配置来连接到 DynamoDB。因此,通常情况下,如果您的本地 AK/SK 有效并且您具有访问 DynamoDB 表的正确 IAM 角色,您的应用程序应该能够连接到 DynamoDB。另一方面,在 aws 上,lambda 需要具有 DynamoDB 访问权限的 IAM 角色,因此不需要 AK/SK 作为环境变量。
推荐阅读
- jquery - 将鼠标悬停在文本上时弹出图像。并同时改变文字颜色
- powershell - 如何找出递归操作工作的确切位置?
- c# - 将安装路径和/或可执行文件链接到已安装应用程序的列表
- c# - Xamarin.Forms 动态更改母版页内容
- ruby-on-rails - Rails 电子商务应用程序中的 RecordNotFound 错误
- python - 打印字符串时删除单引号?
- reactjs - 使用 React.createRef() 打开链接
- python - 将数据迭代到 Pandas 数据框(python)
- unity3d - 为什么在 Unity 中使用 IL2CPP 后端构建会导致更大的 apk 大小
- docker - 有没有办法将绑定到 127.0.0.1 的 docker 容器端口公开给主机?