基于角色的跨账户 S3 访问
Role-based cross-account S3 access
我有两个 aws 账户,A 和 B。账户 A 有一个 lambda 函数,需要访问账户 B 中的 s3 存储桶。
为了模拟这种情况,我有以下设置:
账户 B(数据源)有一个角色:
arn:aws:iam::${Account_B}:role/jeff-full-s3-access-role
并附有 AmazonS3FullAccess
政策。此角色有一个受信任的实体 arn:aws:iam::${Account_A}:role/jeff-test-lambda-role
同时,arn:aws:iam::${Account_A}:role/jeff-test-lambda-role
驻留在账户 A 中,并且它有一个受信任的实体 lambda.amazonaws.com
。并且我附上了以下内联政策:
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::${Account_B}:role/jeff-full-s3-access-role"
}
}
现在当我调用 lambda 函数时 (python):
import json
from boto3 import client
def lambda_handler(event, context):
conn = client('s3') # again assumes boto.cfg setup, assume AWS S3
for key in conn.list_objects(Bucket='Bucket_in_Account_B')['Contents']:
print(key['Key'])
return {}
但出现以下错误:
{
"errorMessage": "An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied",
"errorType": "ClientError",
"stackTrace": [
" File \"/var/task/lambda_function.py\", line 6, in lambda_handler\n for key in conn.list_objects(Bucket='Bucket_in_Account_B')['Contents']:\n",
" File \"/var/runtime/botocore/client.py\", line 386, in _api_call\n return self._make_api_call(operation_name, kwargs)\n",
" File \"/var/runtime/botocore/client.py\", line 705, in _make_api_call\n raise error_class(parsed_response, operation_name)\n"
]
}
有谁知道这不起作用的原因? 可能有用,但那是几年前的事了。我想知道是否有一种方法可以在不使用存储桶策略的情况下实现这一目标。
谢谢!
满足您要求的最简单方法是在账户 B 的存储桶上添加存储桶策略,允许从账户 A 中的 AWS Lambda 函数使用的 IAM 角色进行访问. 这避免了任何承担角色的要求。
至于您当前的代码,它失败了,因为您的程序需要调用 assume_role()
以从帐户 B 获取凭据。然后它需要使用这些凭据为创建一个新的 boto3.client()
对象在访问账户 B 中的资源时使用。例如,请参见:
我有两个 aws 账户,A 和 B。账户 A 有一个 lambda 函数,需要访问账户 B 中的 s3 存储桶。
为了模拟这种情况,我有以下设置:
账户 B(数据源)有一个角色:
arn:aws:iam::${Account_B}:role/jeff-full-s3-access-role
并附有 AmazonS3FullAccess
政策。此角色有一个受信任的实体 arn:aws:iam::${Account_A}:role/jeff-test-lambda-role
同时,arn:aws:iam::${Account_A}:role/jeff-test-lambda-role
驻留在账户 A 中,并且它有一个受信任的实体 lambda.amazonaws.com
。并且我附上了以下内联政策:
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::${Account_B}:role/jeff-full-s3-access-role"
}
}
现在当我调用 lambda 函数时 (python):
import json
from boto3 import client
def lambda_handler(event, context):
conn = client('s3') # again assumes boto.cfg setup, assume AWS S3
for key in conn.list_objects(Bucket='Bucket_in_Account_B')['Contents']:
print(key['Key'])
return {}
但出现以下错误:
{
"errorMessage": "An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied",
"errorType": "ClientError",
"stackTrace": [
" File \"/var/task/lambda_function.py\", line 6, in lambda_handler\n for key in conn.list_objects(Bucket='Bucket_in_Account_B')['Contents']:\n",
" File \"/var/runtime/botocore/client.py\", line 386, in _api_call\n return self._make_api_call(operation_name, kwargs)\n",
" File \"/var/runtime/botocore/client.py\", line 705, in _make_api_call\n raise error_class(parsed_response, operation_name)\n"
]
}
有谁知道这不起作用的原因?
谢谢!
满足您要求的最简单方法是在账户 B 的存储桶上添加存储桶策略,允许从账户 A 中的 AWS Lambda 函数使用的 IAM 角色进行访问. 这避免了任何承担角色的要求。
至于您当前的代码,它失败了,因为您的程序需要调用 assume_role()
以从帐户 B 获取凭据。然后它需要使用这些凭据为创建一个新的 boto3.client()
对象在访问账户 B 中的资源时使用。例如,请参见: