跨账户访问 DynamoDb 表 C#
Posted
技术标签:
【中文标题】跨账户访问 DynamoDb 表 C#【英文标题】:Cross Account Access to DynamoDb tables C# 【发布时间】:2022-01-06 22:43:24 【问题描述】:我一直在处理这个我无法在任何地方在线找到解决方案的问题。
我有一个连接到 AWS DynmoDb 并在一个或多个表上执行读/写操作的代码。只要我的代码和 DynamoDb 表在同一个 AWS 账户中,这就可以正常工作。该代码还使用附加到 Web 服务器的 IAM 角色。该角色作为分配给它的所有必要权限。
private AmazonDynamoDBClient GetDbClient(int ConnectionTimeOut, int ReadWriteTimeOut, int MaxRetry)
AmazonDynamoDBConfig clientConfig = new AmazonDynamoDBConfig
Timeout = TimeSpan.FromMilliseconds(ConnectionTimeOut),
ReadWriteTimeout = TimeSpan.FromMilliseconds(ReadWriteTimeOut),
MaxErrorRetry = MaxRetry
;
return new AmazonDynamoDBClient(clientConfig);
最近我需要将我的代码移动到不同的 AWS 账户,事情开始变得疯狂。
按照我已经采取的步骤。
在旧 AWS 账户和新 AWS 账户中的 VPC 之间完成了 VPC 对等。 DynamobDb 表的跨账户权限授予新 AWS 账户上的 Web 服务器使用的角色。通过此更改,我看不到任何权限错误,但代码会尝试在新 AWS 账户上查找表。
在代码中很清楚,在创建 AWS DynamoDb 客户端时不会在任何地方使用 AWS AccountId。所以我假设我应该能够告诉代码在哪里寻找 DynamoDb 表。但是 DynamoDb 的 C# SDK 没有任何规定,我可以在创建 DynamoDb 客户端时提供 AWS AccountId。
所以我的问题与连接到 DynamoDb 服务的 C# 代码有关,而不是与 AWS 上的 IAM 角色和权限有关(为此,我可以找到很多解决方案)。
发现这个问题aws cross account dynamodb access with IAM role 有类似的问题,但它不建议在代码中进行修复。
【问题讨论】:
【参考方案1】:一种方法是使用Security Token Service。首先,您需要承担一个角色并获得临时凭据:
Credentials GetCredentials(String roleArn)
using (var stsClient = new AmazonSecurityTokenServiceClient())
try
var response = stsClient.AssumeRole(new AssumeRoleRequest(roleARN));
if (response.HttpStatusCode == System.Net.HttpStatusCode.OK) return response.Credentials;
catch (AmazonSecurityTokenServiceException ex)
return null;
然后您可以使用凭据来启动您的 DynamoDB 客户端。
见另一个例子here。
【讨论】:
【参考方案2】:AWS SDK 和 CLI(无论是在本地运行还是在(例如)EC2 实例上运行)在以下位置查找凭证:
-
命令行选项
环境变量
CLI 凭据文件
CLI 配置文件
容器凭据
实例配置文件凭据
如果您配置了凭据文件,那么,假设我们在默认配置文件下运行,这将通过提供的访问密钥间接定义运行它的帐户。
您还可以定义 AWS 特定的环境变量,例如优先于凭证文件的 AWS_ACCESS_KEY_ID。
https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html
【讨论】:
感谢@Norman 的回答。通过文件或环境变量提供凭据对我来说不是一个选项。应仅从附加到 Web 服务器的角色评估权限...由于 Web 服务器在新的 AWS 帐户中运行,因此开发工具包使用该帐户开始。如果我希望 SDK 连接到不同的 AWS 账户,我必须明确传递不同的账户 ID。我能够为 SQS 成功执行此操作,因为 SQS 的 SDK 类允许设置 AWS AccountID。但是 DynamoDB 类没有这样的东西。 对不起@Chetan,我可能在这里遗漏了一些东西。问题是否纯粹是您需要 DynamoDB 客户端将不同账户中的表引用到运行它的 EC2 实例?理论上,您可以设置 boto3 会话来引用指向另一个帐户的配置文件。这确实需要在本地存储凭据,但是,您可以设置访问权限非常有限的用户以降低泄露风险。 感谢您的回复...我正在为我的应用程序使用 C#。我的应用程序将在 Windows EC2 机器上运行。在 EC2 机器上设置配置文件是我能做的最后一件事(需要从安全和部署的角度对其进行审查)。以上是关于跨账户访问 DynamoDb 表 C#的主要内容,如果未能解决你的问题,请参考以下文章
如何在 AWS lambda 函数中设置 dynamo db 触发器
如何将现有的 dynamo db 与 AWS Amplify 和 graphql 一起使用