首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AWS Lambda函数未从ENV变量获取凭据(安全令牌无效)

AWS Lambda函数未从ENV变量获取凭据(安全令牌无效)
EN

Stack Overflow用户
提问于 2021-09-22 12:44:23
回答 1查看 186关注 0票数 0

我有一个用Ruby语言编写的小的lambda函数,它在亚马逊网络服务上工作,但在本地显示ERROR: The security token included in the request is invalid

此函数的目的是从DynamoDB表中读取内容。以下是该函数的重要部分:

代码语言:javascript
复制
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在本地调用该函数时,我得到的结果是:

代码语言:javascript
复制
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变量被正确设置,因为它们被打印到控制台。

根据documentation的说法,设置这两个ENV变量应该足够了,但是看起来我遗漏了一些东西。

当我将实例化从

代码语言:javascript
复制
dynamodb = Aws::DynamoDB::Client.new(region: 'eu-north-1')

代码语言:javascript
复制
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,因为这会破坏亚马逊网络服务上的函数(因为在亚马逊网络服务上,它使用AmazonDynamoDBFullAccess策略连接到dynamodb )

EN

回答 1

Stack Overflow用户

发布于 2021-09-22 17:33:47

为什么你要通过你的申请通过AK/SK?SAM使用您的AWS Cli配置来连接到DynamoDB。因此,通常情况下,如果本地AK/SK有效,并且您具有访问DynamoDB表的正确IAM角色,则您的应用程序应该能够连接到DynamoDB。另一方面,在亚马逊网络服务上,lambda需要具有DynamoDB访问权限的IAM角色,因此不需要使用AK/SK作为环境变量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69284506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档