Функция AWS Lambda не получает учетные данные от переменных ENV (недопустимый маркер безопасности)

#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 в качестве переменных среды.