DynamoDB跨账号跨地域访问管理
DynamoDB access management cross-account cross-region
我有这种情况: region X account[=27= 中的 dynamoDB table ] A 和 region 中的 Lambda 函数 Y account B。我想使用 lambda 函数写入 dynamoDB table。
到目前为止我做了什么:
- 使用该 dynamoDB 的策略在帐户 B 中添加角色 table
- 为帐户 B 承担的角色添加信任策略
- 从账户 A 中担任该角色,然后将此角色附加到 lambda 函数。
但仍然无法正常工作,这让我感到震惊 AccessDeniedException
。
我在这里遗漏了什么或者在这种情况下甚至可以做到吗?
以防万一有人遇到同样的问题,现在已经解决了。以下是所需的步骤:
Lambda 函数 – “Lambda_DDBTest” 具有 Lambda 执行角色 < LambdaExecutionRole >
出现在帐户 A 中
DynanmoDB table – “LambdaTest”存在于帐户 B 中
此 Lambda 函数正在尝试从帐户 B 访问 DynamoDB table,以下是步骤
要遵循设置 IAM 配置。
第 1 步:在账户 B 中创建一个角色以提供对 Lambda 函数的访问以承担
帐户 B 的角色。
以目标账户管理员身份登录AWS管理控制台,打开
IAM 控制台。
在左侧导航栏中,选择“角色”,点击“创建新角色”按钮,
输入角色名称并单击“下一步”
在下一页 Select 与“另一个 AWS 账户:属于您或第 3 方”相关的按钮
输入源帐户的帐户 ID 和选项 Select“需要外部 ID”和
给它一个外部 ID 值(例如,我给了“testcrossaccountddb”)。记下外部 ID 值
稍后(我们在 lambda 函数中使用它)。
在下一个 window 中,单击“AmazonDynamoDBFullAccess”复选框,然后单击“下一步”
步骤
检查您的设置并输入角色名称(例如“crossaccount-LambdaDDB”)
查看角色后,选择“创建角色”。
创建角色后,您可以在角色列表中看到它。再次打开角色,添加一个内联策略
从账户 A 添加 lambda 函数执行角色以允许承担角色访问 DynamoDB
table 来自账户 B。
{
"版本": "2012-10-17",
“陈述”: {
"效果": "允许",
“行动”:“sts:AssumeRole”,
“资源”:“arn:aws:iam:::角色/”
}
}
- 复制您的账户 A – Lambda 函数执行角色 ARN 并将其替换为资源中的 ARN
第 2 步 – 在账户 A 中的 Lambda 函数执行角色中进行的配置
转到账户 A - Lambda 函数执行角色 IAM 页面。
提供“AmazonDynamoDBFullAccess”以便您的 Lambda 函数具有
执行 DynamoDB 操作的权限。
将步骤1中创建的账户B的角色添加到Lambda函数执行角色中,添加
内联政策如下:
{
"版本": "2012-10-17",
“陈述”: [
{
"效果": "允许",
“行动”:“sts:AssumeRole”,
“资源”:“arn:aws:iam:::role/crossaccount-LambdaDDB”
}
]
}
完成上述配置后,我在 Lambda 中使用了以下 python boto3 示例代码
函数访问帐户 B 中的 DynamoDB table ‘LambdaTest’。在此示例代码中,我尝试扫描
table 并在 table 中插入一个新项目。
import json
import boto3
import time
from boto3.dynamodb.conditions import Key, Attr
DDB_TABLE = '<Account B Table name>' # this is the table in your account that you want to put data to
regionValue = '<Account B table region>'
def lambda_handler(context, event):
sts_connection = boto3.client('sts')
acct_b = sts_connection.assume_role(
RoleArn="arn:aws:iam::<Account B Number>:role/<Account B Role Created in Step 1 of Documnet>",
RoleSessionName="cross_acct_lambda",
ExternalId="testcrossaccountddb"
)
ACCESS_KEY = acct_b['Credentials']['AccessKeyId']
SECRET_KEY = acct_b['Credentials']['SecretAccessKey']
SESSION_TOKEN = acct_b['Credentials']['SessionToken']
# create service client using the assumed role credentials, e.g. dynamodbddbOne = boto3.client(
'dynamodb',region_name=regionValue,
aws_access_key_id=ACCESS_KEY,
aws_secret_access_key=SECRET_KEY,
aws_session_token=SESSION_TOKEN,
)
ddbOne.put_item(TableName=DDB_TABLE, Item={'Id':{'S':'LambdatoDDB_CrossAccount Successful'}})
print("Let's start scanning")
response=ddbOne.scan(
TableName=DDB_TABLE
)
return response
return "Lambda to DDB Access was Successful"
参考:
https://aws.amazon.com/premiumsupport/knowledge-center/lambda-function-assume-iam-role/
我有这种情况: region X account[=27= 中的 dynamoDB table ] A 和 region 中的 Lambda 函数 Y account B。我想使用 lambda 函数写入 dynamoDB table。 到目前为止我做了什么:
- 使用该 dynamoDB 的策略在帐户 B 中添加角色 table
- 为帐户 B 承担的角色添加信任策略
- 从账户 A 中担任该角色,然后将此角色附加到 lambda 函数。
但仍然无法正常工作,这让我感到震惊 AccessDeniedException
。
我在这里遗漏了什么或者在这种情况下甚至可以做到吗?
以防万一有人遇到同样的问题,现在已经解决了。以下是所需的步骤:
Lambda 函数 – “Lambda_DDBTest” 具有 Lambda 执行角色 < LambdaExecutionRole > 出现在帐户 A 中 DynanmoDB table – “LambdaTest”存在于帐户 B 中 此 Lambda 函数正在尝试从帐户 B 访问 DynamoDB table,以下是步骤 要遵循设置 IAM 配置。
第 1 步:在账户 B 中创建一个角色以提供对 Lambda 函数的访问以承担 帐户 B 的角色。
以目标账户管理员身份登录AWS管理控制台,打开 IAM 控制台。
在左侧导航栏中,选择“角色”,点击“创建新角色”按钮, 输入角色名称并单击“下一步”
在下一页 Select 与“另一个 AWS 账户:属于您或第 3 方”相关的按钮
输入源帐户的帐户 ID 和选项 Select“需要外部 ID”和 给它一个外部 ID 值(例如,我给了“testcrossaccountddb”)。记下外部 ID 值 稍后(我们在 lambda 函数中使用它)。
在下一个 window 中,单击“AmazonDynamoDBFullAccess”复选框,然后单击“下一步” 步骤
检查您的设置并输入角色名称(例如“crossaccount-LambdaDDB”)
查看角色后,选择“创建角色”。 创建角色后,您可以在角色列表中看到它。再次打开角色,添加一个内联策略 从账户 A 添加 lambda 函数执行角色以允许承担角色访问 DynamoDB table 来自账户 B。
{ "版本": "2012-10-17", “陈述”: { "效果": "允许", “行动”:“sts:AssumeRole”, “资源”:“arn:aws:iam:::角色/” } }
- 复制您的账户 A – Lambda 函数执行角色 ARN 并将其替换为资源中的 ARN
第 2 步 – 在账户 A 中的 Lambda 函数执行角色中进行的配置
转到账户 A - Lambda 函数执行角色 IAM 页面。
提供“AmazonDynamoDBFullAccess”以便您的 Lambda 函数具有 执行 DynamoDB 操作的权限。
将步骤1中创建的账户B的角色添加到Lambda函数执行角色中,添加 内联政策如下:
{ "版本": "2012-10-17", “陈述”: [ { "效果": "允许", “行动”:“sts:AssumeRole”, “资源”:“arn:aws:iam:::role/crossaccount-LambdaDDB” } ] }
完成上述配置后,我在 Lambda 中使用了以下 python boto3 示例代码 函数访问帐户 B 中的 DynamoDB table ‘LambdaTest’。在此示例代码中,我尝试扫描 table 并在 table 中插入一个新项目。
import json
import boto3
import time
from boto3.dynamodb.conditions import Key, Attr
DDB_TABLE = '<Account B Table name>' # this is the table in your account that you want to put data to
regionValue = '<Account B table region>'
def lambda_handler(context, event):
sts_connection = boto3.client('sts')
acct_b = sts_connection.assume_role(
RoleArn="arn:aws:iam::<Account B Number>:role/<Account B Role Created in Step 1 of Documnet>",
RoleSessionName="cross_acct_lambda",
ExternalId="testcrossaccountddb"
)
ACCESS_KEY = acct_b['Credentials']['AccessKeyId']
SECRET_KEY = acct_b['Credentials']['SecretAccessKey']
SESSION_TOKEN = acct_b['Credentials']['SessionToken']
# create service client using the assumed role credentials, e.g. dynamodbddbOne = boto3.client(
'dynamodb',region_name=regionValue,
aws_access_key_id=ACCESS_KEY,
aws_secret_access_key=SECRET_KEY,
aws_session_token=SESSION_TOKEN,
)
ddbOne.put_item(TableName=DDB_TABLE, Item={'Id':{'S':'LambdatoDDB_CrossAccount Successful'}})
print("Let's start scanning")
response=ddbOne.scan(
TableName=DDB_TABLE
)
return response
return "Lambda to DDB Access was Successful"
参考:
https://aws.amazon.com/premiumsupport/knowledge-center/lambda-function-assume-iam-role/