我无法使用boto3连接到具有以编程方式100%提供的角色arn的S3。
session = boto3.Session(role_arn="arn:aws:iam::****:role/*****",
RoleSessionName="****")
s3_client = boto3.client('s3',
aws_access_key_id="****",
aws_secret_access_key="****")
for b in s3_client.list_buckets()["Buckets"]:
print (b["Name"])
我无法向Session和客户端提供arn信息,并且基于s3的客户端上没有assume_role()。
我找到了一种带有sts临时令牌的方法,但我不喜欢这样。
sess = boto3.Session(aws_access_key_id="*****",
aws_secret_access_key="*****")
sts_connection = sess.client('sts')
assume_role_object = sts_connection.assume_role(RoleArn="arn:aws:iam::***:role/******",
RoleSessionName="**",
DurationSeconds=3600)
session = boto3.Session(
aws_access_key_id=assume_role_object['Credentials']['AccessKeyId'],
aws_secret_access_key=assume_role_object['Credentials']['SecretAccessKey'],
aws_session_token=assume_role_object['Credentials']['SessionToken'])
s3_client = session.client('s3')
for b in s3_client.list_buckets()["Buckets"]:
print (b["Name"])
你有什么主意吗 ?
您需要了解如何创建临时凭证。
首先,您需要使用当前的访问密钥创建客户端。然后,这些凭据用于验证您是否具有调用assume_role的权限,并且有权从IAM角色颁发凭据。
如果有人可以按照你的方式做到这一点,那就会有一个巨大的安全漏洞,其中包含assume_role。必须先验证您的权限,然后才能发布临时凭证。
首先,永远不要在您的代码中放入访问密钥和密钥。始终将凭证存储在~/.aws/credentials
文件中(例如,通过aws configure
)。这可以避免令人尴尬的情况,即您的凭据被意外地发布到世界各地。此外,如果您在Amazon EC2实例上运行,则只需将IAM角色分配给实例,它将自动获取凭据。
在boto3
中承担角色的一种简单方法是使用单独的配置文件将角色详细信息存储在凭证文件中。然后,您可以在创建客户端时引用该配置文件,boto3将代表您自动调用assume-role
。