#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",
]
}
]
}