我已经使用EC2类型的容器实例设置了一个AWS ECS集群。在任务定义中,指定了“ SECRETS”环境变量,该变量的值对应于特定的机密名称。任务定义使用awsvpc网络模式。
为了从代码(.net)访问机密值,使用了以下代码(来自aws snippet):
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 。
我尝试从容器内部成功get IAM role credentials:
curl 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
我也尝试过直接指定获取的凭据,但是没有运气:
AmazonSecretsManagerClient(awsAccessKeyId, awsSecretAccessKey, region)
此外,我已经尝试在容器内烘烤aws cli,并且从内部尝试了aws secretsmanager
,aws iam get-user
和aws sts get-caller-identity
-仍然挂起而没有响应。
我已授予管理员对任务执行角色的完全访问权限-仍然没有成功。我能够从EC2容器实例中检索机密,但不能从已安装的容器中检索机密。
答案 0 :(得分:0)
感谢AWS支持,找到了解决方案。 我的配置的关键问题是combination的容器为 awsvpc 联网模式和 EC2启动类型:
awsvpc网络模式不为任务ENI提供公共IP 使用EC2启动类型的任务的地址。要访问 互联网,使用EC2启动类型的任务必须在 配置为使用NAT网关的专用子网
相反,我已经开始使用dynamic port mapping桥接网络(通过使用Application Load Balancer实现)。我还使用主机联网模式执行某些特定任务-效果也很好。