跨账户访问 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#的主要内容,如果未能解决你的问题,请参考以下文章

扫描Dynamo DB中的特定行

如何在 AWS lambda 函数中设置 dynamo db 触发器

使用排序键的无服务器框架 Dynamo DB 表资源定义

如何将现有的 dynamo db 与 AWS Amplify 和 graphql 一起使用

使用 AWS Appsync 和 GraphQL 查询 Dynamo DB 中的多个表

从 Parse 迁移到 AWS Dynamo DB