首页 > 解决方案 > 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)

标签: rubyamazon-web-servicesaws-lambdacredentialssam

解决方案


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


推荐阅读