如何解决我的 Fargate 任务与其他 AWS 服务之间的连接问题?

3 分钟阅读
0

我想解决我的 AWS Fargate 任务与 AWS 服务之间的连接问题。

简短描述

由于以下原因,使用 Amazon Elastic Container Service (Amazon ECS) 在 Fargate 任务内运行的应用程序可能无法访问其他 AWS 服务:

  • AWS Identity and Access Management (IAM) 权限不足
  • 子网路由不正确
  • 网络访问控制列表(网络 ACL)限制
  • 安全组
  • Amazon Virtual Private Cloud (Amazon VPC) 端点

要解决这些问题,请使用 Amazon ECS Exec 与 Fargate 任务的应用程序容器进行交互。如果在应用程序容器日志中发现连接超时错误,请测试 Fargate 任务与相应的 AWS 服务之间的连接。

解决方法

使用 ECS Exec 与 Fargate 任务的应用程序容器进行交互

1.在使用 Amazon ECS exec 之前,请完成使用 Amazon ECS Exec 的先决条件

2.按照使用 Amazon ECS Exec 中的说明启用该功能。

3.运行 Amazon ECS Exec,以访问您的应用程序容器,并检查容器与 AWS 服务之间的网络和 IAM 连接。

**注意:**在执行 Exec 之前,最佳做法是将参数 initProcessEnabled 设置为 true。这样可以防止 AWS Systems Manager Agent (SSM Agent) 子进程成为孤立进程。(可选)为应用程序容器添加 sleep 命令,以使容器在指定的时间段内保持运行。

示例:

{
    "taskRoleArn": "ecsTaskRole",
    "networkMode": "awsvpc",
    "requiresCompatibilities": [
        "EC2",
        "FARGATE"
        ],
        "executionRoleArn": "ecsTaskExecutionRole",
        "memory": ".5 gb",
        "cpu": ".25 vcpu",
        "containerDefinitions": [
            {
                "name": "application",
                "image": "application:latest",
                "essential": true,
                "command": ["sleep","7200"],
                "linuxParameters": {
                    "initProcessEnabled": true
                }
            }
        ],
        "family": "ecs-exec-task"
}

如果无法使用 Exec 访问您的应用程序容器,请为在 amazon/aws-cli Docker 镜像上运行的一个新 Fargate 任务运行 Exec。这使您可以测试 Fargate 任务与 AWS 服务之间的通信。

注意: 新的 Fargate 任务的网络设置(子网、安全组等)必须与您的应用程序容器的网络设置相同。

要使用 amazon/aws-cli Docker 镜像运行新 Fargate 任务,请完成以下步骤:

注意: 在您的容器的 amazon/aws-cli 镜像上已预先安装 AWS 命令行界面 (AWS CLI)。如果您的应用程序容器上未安装 AWS CLI,请运行以下命令:

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86\_64.zip" -o "awscliv2.zip"

unzip awscliv2.zip

sudo ./aws/install

1.创建一个任务定义,使用 amazon/aws-cli 作为容器的镜像。然后,添加入口点 tail-f 和 /dev/null,使容器处于持续运行状态。

任务定义示例:

{  
    "requiresCompatibilities": \[  
        "FARGATE"  
    \],  
    "family": "aws-cli",  
    "containerDefinitions": \[  
        {  
        "entryPoint": \[  
        "tail",  
        "-f",  
        "/dev/null"  
        \],  
        "name": "cli",  
        "image": "amazon/aws-cli",  
        "essential": true  
        }  
    \],  
    "networkMode": "awsvpc",  
    "memory": "512",  
    "cpu": "256",  
    "executionRoleArn": "arn:aws:iam::123456789012:role/EcsTaskExecutionRole",  
    "taskRoleArn": "arn:aws:iam::123456789012:role/TaskRole"  
}

2.使用新创建的任务定义和与应用程序容器相同的网络配置创建 Amazon ECS 服务:

$ aws ecs create-service --cluster <example-cluster-name> --task-definition <example-task-definition-name> --network-configuration awsvpcConfiguration="{subnets=[example-subnet-XXXXXXX, example-subnet-XXXXXXX],securityGroups=[example-sg-XXXXXXXXXXXX],assignPublicIp=ENABLED}" --enable-execute-command --service-name <example-service-name> --desired-count 1 --launch-type FARGATE --region <example-region>

**注意:**请将 example-cluster-name 替换为您的集群名称;将 example-task-definition-name 替换为您的任务定义名称;将 example-service-name 替换为您的服务名称;将 example-region 替换为您的 AWS 区域。

3.运行 Exec 访问 Amazon ECS Fargate 任务容器,然后针对指定的 container-name 和 task-id运行 /bin/sh 命令:

$ aws ecs execute-command --cluster <example-cluster-name> --task <example-task-id> --container <example-container-name> --interactive --command "/bin/sh" --region <example-region>

**注意:**请将 example-cluster-name 替换为您的集群名称;将 example-task-id 替换为您的任务 ID;将 example-container-name 替换为您的容器名称;将 example-region 替换为您的区域。

如果针对 Fargate 任务使用 ECS Exec 时仍然遇到问题,请参阅“此处为 ISHAN 的文章”(正在等待 article_33538 的 URL)。

测试 Fargate 任务与相应的 AWS 服务之间的连接

解决 IAM 权限不足的问题

检查 Fargate 任务是否有足够的 IAM 权限连接到相应的 AWS 服务。要针对所需的 AWS 服务运行 AWS CLI 命令,请参阅 AWS CLI 命令参考指南。

Fargate 任务和 Amazon Simple Notification Service (Amazon SNS) 之间的连接测试示例:

# aws sns list-topics --region <example-region-name>

如果收到以下错误,请检查 Amazon VPC 端点策略。确保策略允许访问,以对 AWS 服务执行必要的操作。

An error occurred (AuthorizationError) when calling the ListTopics operation: User: arn:aws:sts::123456789012:assumed-role/TaskRole/123456789012 is not authorized to perform: SNS:ListTopics on resource: arn:aws:sns:<region-name>:123456789012:* with an explicit deny in a VPC endpoint policy

如果收到以下错误,请检查 Amazon ECS 任务 IAM 角色的权限。确保 IAM 角色具有对 AWS 服务执行所需操作所需的权限。

An error occurred (AuthorizationError) when calling the ListTopics operation: User: arn:aws:sts::123456789012:assumed-role/TaskRole/123456789012 is not authorized to perform: SNS:ListTopics on resource: arn:aws:sns:<region-name>:123456789012:* because no identity-based policy allows the SNS:ListTopics action

**注意:**如果针对 Fargate 任务运行 AWS CLI 命令时没有出现任何错误,则表示对该 AWS 服务具有所需的 IAM 权限。

排除连接超时错误

1.使用 # telnet 测试从 Fargate 任务到您的 AWS 服务端点的网络连接:

# telnet <EXAMPLE-ENDPOINT> <EXAMPLE-PORT>

**注意:**请将 EXAMPLE-ENDPOINT 替换为您的 AWS 服务端点名称和 URL,并将 EXAMPLE-PORT 替换为您的 AWS 服务端口。

以下示例输出显示可以从容器访问端点:

Trying 10.0.1.169...
Connected to sns.us-east-1.amazonaws.com.
Escape character is '^]'.

# dig <EXAMPLE-ENDPOINT>

# nslookup <EXAMPLE-ENDPOINT>

有关区域 AWS 服务端点的列表,请参阅 AWS 服务的服务端点和限额

**注意:**如果没有在应用程序容器中安装 telnet 和 dig,请运行 apt-get updateapt install dnsutils 和 apt install telnet 命令来安装它们。对于基于 amazon/aws-cli, 的容器,请使用 yum updateyum install telnet 和 yum install bind-utils 命令来安装 telnet 和其他工具。

2.如果在测试与 AWS 服务端点的网络连接后收到连接超时错误,请检查网络配置:

运行 nslookup 命令。如果看到 VPC CIDR IP 范围,则表示流量正在通过 VPC 端点路由:

# nslookup sns.us-east-1.amazonaws.com

Non-authoritative answer:
Name:    sns.us-east-1.amazonaws.com
Address: 10.0.1.169
Name:    sns.us-east-1.amazonaws.com
Address: 10.0.2.248

对于连接超时错误,请检查 VPC 端点安全组的入站规则。确保 ECS 安全组或 VPC CIDR的入站规则中允许通过端口 443 路由的 TCP 流量。有关详细信息,请参阅如何解决通过网关和接口 VPC 端点的连接问题?

  • 如果该区域未配置 Amazon VPC 端点,请检查从您的子网到互联网的路由。对于公有子网中的 Fargate 任务,请确保任务具有通往互联网网关的默认路由。对于私有子网中的 Fargate 任务,请确保任务具有默认路由。您的任务需要指向 NAT 网关、AWS PrivateLink、其他互联网连接来源或本地和 VPC CIDR 的默认路由。
  • 请确保网络 ACL 允许访问 AWS 服务。
  • 检查安全组的入站规则是否附加到您在尝试通过 Fargate 任务访问的 AWS 服务。允许通过所需端口的入口流量。
  • 检查 Fargate 任务安全组的出站规则是否允许通过所需端口的出口流量连接至 AWS 服务。
AWS 官方
AWS 官方已更新 2 年前