0

我已经设置了一个带有 EC2 类型容器实例的 AWS ECS 集群。在任务定义中,有一个“SECRETS”环境变量,其值对应于特定的秘密名称。任务定义使用 awsvpc 网络模式。

为了从代码(.net)访问秘密值,使用以下代码(来自aws 片段):

IAmazonSecretsManager client = new AmazonSecretsManagerClient(region);
GetSecretValueRequest request = new GetSecretValueRequest
{
  SecretId = secretName,
  VersionStage = "AWSCURRENT" // VersionStage defaults to AWSCURRENT if unspecified.
};
GetSecretValueResponse response = Task.Run(async () => await client.GetSecretValueAsync(request)).Result;

这与Fargate实例类型完美配合。当切换到EC2容器实例 GetSecretValueAsync() 失败并出现 AggregateException : TaskCanceledException

我尝试从容器内部成功获取 IAM 角色凭证:

curl 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI

我也尝试过直接指定检索到的凭据,但没有运气:

AmazonSecretsManagerClient(awsAccessKeyId, awsSecretAccessKey, region)

此外,我尝试在容器内烘焙 aws cli,并且从内部尝试过aws secretsmanageraws iam get-user并且aws sts get-caller-identity- 仍然挂起而没有响应。我已授予对任务执行角色的完全管理员访问权限 - 仍然没有成功。我能够从 EC2 容器实例中检索机密,但不能从已安装的容器中检索。

4

1 回答 1

0

感谢 AWS 的支持,找到了解决方案。我的配置的关键问题是awsvpc网络模式和容器的EC2 启动类型的组合

awsvpc 网络模式不为使用 EC2 启动类型的任务提供具有公共 IP 地址的任务 ENI。要访问 Internet,必须在配置为使用 NAT 网关的私有子网中启动使用 EC2 启动类型的任务

相反,我转而使用动态端口映射来桥接网络(通过使用 Application Load Balancer 实现)。我还为一些特定任务使用了主机网络模式——这也很有效。

于 2019-06-27T17:40:08.113 回答