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

AWS ECS EC2: TaskCanceledException when calling AWS API (connection timed out)

我已经使用 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 容器实例中检索机密,但不能从已安装的容器中检索机密。

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

The awsvpc network mode does not provide task ENIs with public IP addresses for tasks that use the EC2 launch type. To access the internet, tasks that use the EC2 launch type must be launched in a private subnet that is configured to use a NAT gateway

相反,我已经转向使用 dynamic port mapping 桥接网络(通过使用 Application Load Balancer 实现)。我还为某些特定任务使用了主机网络模式 - 这也很有效。