CredentialRetrievalError: не удалось обновить учетные данные

#python #amazon-web-services #aws-lambda #boto3

#python #amazon-веб-сервисы #aws-lambda #boto3

Вопрос:

По некоторым причинам я параллельно вызываю лямбда-функцию, для этого я получил метод invoke внутри некоторой функции. Примером является

 import boto3 
import json

def some_function(param1, param2):

    # Example payload
    payload = {
    'body': '{"key1": '   f'"{param1}" , "key2": '   f'"{param2}"'   '}'
    }
    
    # Initialize a lambda client
    lambda_client = boto3.client('lambda')
    
    # Invoke lambda 
    response = lambda_client.invoke(
                FunctionName='my_lambda_func',
                Payload=json.dumps(payload).encode(),
            )
    
    # Retrieve body
    response = json.loads(response["Payload"].read())

    # Some other things 

    return something
    
  

обратите внимание, что это lambda_client происходит внутри функции, поскольку ее нельзя удалить. Затем я вызываю эту функцию параллельно

 import multiprocessing 

# Invoke lambda in parallel
pool = multiprocessing.Pool(multiprocessing.cpu_count())
result = pool.starmap(some_func, zip(list_of_param1, list_of_param2))
  

где размер list_of_param1 и list_of_param2 составляет примерно более 100 тыс. элементов. Я не могу завершить процесс, поскольку он выдает следующую ошибку

 CredentialRetrievalError: Error when retrieving credentials from iam-role: Credential refresh failed, response did not contain: access_key, secret_key, token, expiry_time
  

Ошибка полной трассировки:

 File "/home/miguel/python3/lib/python3.6/site-packages/botocore/client.py", line 337, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/home/miguel/python3/lib/python3.6/site-packages/botocore/client.py", line 643, in _make_api_call
    operation_model, request_dict, request_context)
  File "/home/miguel/python3/lib/python3.6/site-packages/botocore/client.py", line 662, in _make_request
    return self._endpoint.make_request(operation_model, request_dict)
  File "/home/miguel/python3/lib/python3.6/site-packages/botocore/endpoint.py", line 102, in make_request
    return self._send_request(request_dict, operation_model)
  File "/home/miguel/python3/lib/python3.6/site-packages/botocore/endpoint.py", line 132, in _send_request
    request = self.create_request(request_dict, operation_model)
  File "/home/miguel/python3/lib/python3.6/site-packages/botocore/endpoint.py", line 116, in create_request
    operation_name=operation_model.name)
  File "/home/miguel/python3/lib/python3.6/site-packages/botocore/hooks.py", line 356, in emit
    return self._emitter.emit(aliased_event_name, **kwargs)
  File "/home/miguel/python3/lib/python3.6/site-packages/botocore/hooks.py", line 228, in emit
    return self._emit(event_name, kwargs)
  File "/home/miguel/python3/lib/python3.6/site-packages/botocore/hooks.py", line 211, in _emit
    response = handler(**kwargs)
  File "/home/miguel/python3/lib/python3.6/site-packages/botocore/signers.py", line 90, in handler
    return self.sign(operation_name, request)
  File "/home/miguel/python3/lib/python3.6/site-packages/botocore/signers.py", line 152, in sign
    auth = self.get_auth_instance(**kwargs)
  File "/home/miguel/python3/lib/python3.6/site-packages/botocore/signers.py", line 232, in get_auth_instance
    frozen_credentials = self._credentials.get_frozen_credentials()
  File "/home/miguel/python3/lib/python3.6/site-packages/botocore/credentials.py", line 605, in get_frozen_credentials
    self._refresh()
  File "/home/miguel/python3/lib/python3.6/site-packages/botocore/credentials.py", line 500, in _refresh
    self._protected_refresh(is_mandatory=is_mandatory_refresh)
  File "/home/miguel/python3/lib/python3.6/site-packages/botocore/credentials.py", line 531, in _protected_refresh
    self._set_from_data(metadata)
  File "/home/miguel/python3/lib/python3.6/site-packages/botocore/credentials.py", line 560, in _set_from_data
    error_msg=message % ', '.join(missing_keys),
botocore.exceptions.CredentialRetrievalError: Error when retrieving credentials from iam-role: Credential refresh failed, response did not contain: access_key, secret_key, token, expiry_time

  

Ответ №1:

Что сработало для меня, так это установить более длительный срок действия для роли, которую я использую для вызова лямбда-функции. В качестве иллюстрации в приведенном ниже коде я рассматриваю 1 час

 role = boto3.client("sts").assume_role(
            RoleArn="your_role_arn",
            RoleSessionName="lambda_session",
            DurationSeconds=3600
)
  

затем, при инициализации лямбда-клиента, передайте aws_access_key_id ,
aws_secret_access_key и aws_session_token из предполагаемой роли.

 lambda_client = boto3.client('lambda',
            aws_access_key_id=role["Credentials"]["AccessKeyId"],
            aws_secret_access_key=role["Credentials"]["SecretAccessKey"],
            aws_session_token=role["Credentials"]["SessionToken"],
    )
  

наконец, предположим your_role_arn , что добавлено следующее разрешение

 {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "your_role_arn",
                
            ]
        }
    ]
}