对于通过任何支持的方法访问 AWS 的任何资源都需要对请求进行身份验证。如果您在本地配置了 AWS CLI,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 函数时,请确保将 lambda_handler 定义为处理程序。