Для любого доступа к ресурсам в AWS через любой поддерживаемый метод требуется, чтобы запрос был аутентифицирован.Если у вас локально настроен интерфейс командной строки AWS, boto3
знает, как использовать эти учетные данные для аутентификации, и, следовательно, вы можете получить доступ к ресурсам и изменить их.
К сожалению, Lambda не поддерживает учетные данные, если вам нужнорассмотреть другие способы.Наиболее безопасный способ - использовать STS
, чтобы принять роль и получить временные учетные данные.
try:
sts_client = boto3.client('sts')
assumedRoleObject = sts_client.assume_role(
RoleArn="arn:aws:iam::" + "AwsAccountNumber" + ":role/" + "RoleWithSTSPermissions",
RoleSessionName="NameOfTheSession"
)
credentials = assumedRoleObject['Credentials']
_client = boto3.client(
'ec2',
aws_access_key_id=credentials['AccessKeyId'],
aws_secret_access_key=credentials['SecretAccessKey'],
aws_session_token=credentials['SessionToken'],
region_name=_region
)
except Exception as e:
print(e.message)
raise
Идеально, если эти вещи являются переменными, поэтому вы можете динамически изменять их при необходимости.
Пример
import os
import boto3
import logging
AwsAccount = dict(
number=None,
role=None,
region=None
)
def authenticate(_region, _resource):
try:
sts_client = boto3.client('sts')
assumedRoleObject = sts_client.assume_role(
RoleArn="arn:aws:iam::" + AwsAccount['number'] + ":role/" + AwsAccount['role'],
RoleSessionName="LambdaAssumeRoleSession"
)
credentials = assumedRoleObject['Credentials']
_client = boto3.client(
_resource,
aws_access_key_id=credentials['AccessKeyId'],
aws_secret_access_key=credentials['SecretAccessKey'],
aws_session_token=credentials['SessionToken'],
region_name=_region
)
except Exception as e:
log.warn(e.message)
log.warn("Switching to local credentials")
try:
# TODO: Remove failover profile in production
_session = boto3.session.Session(region_name=_region)
_client = _session.client(_resource, region_name=_region)
log.info("Successfully authenticated using local credentials")
except Exception as e:
log.error(e.message)
raise
return _client
def main():
_client = authenticate(AwsAccount['region'], 'ec2')
return
def lambda_handler(event, context):
try:
AwsAccount['number'] = os.environ['AWS_ACCOUNT'].strip()
AwsAccount['region'] = os.environ['AWS_REGION'].strip()
AwsAccount['role'] = os.environ['AWS_LAMBDA_ROLE'].strip()
except Exception as e:
log.error(e)
raise
main()
return
if __name__ == '__main__':
lambda_handler(None, None)
Этот код можно протестировать на локальном и на Lambda, если вы настроили переменную среды как на локальном, так и на Lambda
При созданиилямбда-функция, убедитесь, что в качестве обработчика определен lambda_handler
.