AWS ECS EC2:调用AWS API时TaskCanceledException(连接超时)

时间:2019-06-19 18:27:57

标签: .net amazon-web-services amazon-ec2 amazon-ecs aws-secrets-manager

我已经使用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 secretsmanageraws iam get-useraws sts get-caller-identity-仍然挂起而没有响应。 我已授予管理员对任务执行角色的完全访问权限-仍然没有成功。我能够从EC2容器实例中检索机密,但不能从已安装的容器中检索机密。

1 个答案:

答案 0 :(得分:0)

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

  

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

相反,我已经开始使用dynamic port mapping桥接网络(通过使用Application Load Balancer实现)。我还使用主机联网模式执行某些特定任务-效果也很好。