如何疑難排解我的 Fargate 任務和其他 AWS 服務之間的連接問題?

4 分的閱讀內容
0

我想疑難排解我的 AWS Fargate 任務和 AWS 服務之間的連線問題。

簡短描述

使用 Amazon Elastic Container Service (Amazon ECS) 在 Fargate 任務內執行的應用程式可能無法存取其他 AWS 服務,原因如下:

  • AWS Identity and Access Management (IAM) 許可不足
  • 不正確的子網路路由
  • 網路存取控制清單 (network 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 任務,請完成以下步驟:

注意: AWS Command Line Interface (AWS CLI) 已在您容器的 amazon/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,並以您的 AWS 區域取代 example-region

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,以您的任務 ID 取代 example-task-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>

**注意:**以您的 AWS 服務端點名稱和 URL 取代 EXAMPLE-ENDPOINT,並以您的 AWS 服務連接埠取代 EXAMPLE-PORT

下列範例輸出顯示可從該容器存取端點:

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。
  • 確認網路存取控制清單 (network ACL) 允許存取 AWS 服務。
  • 檢查安全群組的輸入規則是否已附加至您正嘗試透過 Fargate 任務存取的 AWS 服務。允許所需連接埠的輸入流量。
  • 檢查 Fargate 任務安全群組的輸出規則是否允許所需連接埠的輸出流量連線至 AWS 服務。
AWS 官方
AWS 官方已更新 1 年前