#ruby #amazon-web-services #aws-lambda #credentials #sam
Вопрос:
У меня есть небольшая лямбда-функция, написанная на Ruby, которая работает на 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']))
Затем внезапно лямбда-функция подключается к DynamoDB без проблем.
Как заставить функцию подключаться к DynamoDB локально? Предполагая, что я не хочу передавать :credentials
явно, потому что это нарушит функцию на AWS (потому что на AWS она подключается к dynamodb с помощью AmazonDynamoDBFullAccess
политики)
Ответ №1:
Почему вы пытаетесь передать AK/SK через свое приложение ? SAM использует вашу конфигурацию интерфейса командной строки AWS для подключения к DynamoDB. Таким образом, обычно ваше приложение должно иметь возможность подключаться к DynamoDB, если ваш локальный AK/SK действителен и у вас есть правильная роль IAM для доступа к вашей таблице DynamoDB. С другой стороны, в aws lambda требуется роль IAM с доступом к DynamoDB, поэтому нет необходимости в AK/SK в качестве переменных среды.
Комментарии:
1. Я не пытаюсь передать AK/SK в свое приложение, но это единственный способ, который работает для меня при выполнении
sam local start-api
. Если я опущуcredentials
и буду полагаться на CLI для автоматического поиска учетных данных, то внезапно я получуinvalid security token
ошибку, даже если я поставил AK/SK в качестве переменных среды.