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) の子プロセスが孤立するのを防ぐことができます。(オプション) アプリケーションコンテナにスリープコマンドを追加して、指定した期間コンテナを稼働させ続けます。

例:

{
    "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 を使用してアプリケーションコンテナにアクセスできない場合は、Exec を実行してamazon/aws-cli の Docker イメージで実行される新しい Fargate タスクを実行してください。これにより、Fargate タスクと AWS サービス間の通信をテストできます。

: 新しい Fargate タスクには、アプリケーションコンテナと同じネットワーク設定 (サブネット、セキュリティグループなど) が必要です。

amazon/aws-cli Docker イメージを使用して新しい Fargate タスクを実行するには、以下の手順を実行します。

: AWS コマンドラインインターフェイス (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 をサービス名に、example-region を AWS リージョンに置き換えます。

3. Exec を実行してAmazon ECS Fargate タスクコンテナにアクセスし、指定した container-nametask-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 の記事を参照してください (記事_33538 の URL 待ち)。

Fargate タスクと対応する AWS サービス間の接続をテストする

不十分な IAM 権限のトラブルシューティング

Fargate タスクに、対応する AWS サービスに接続するための IAM 権限が十分にあるかどうかを確認します。必要な 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 サービスのサービスエンドポイントとクォータ」を参照してください。

注:telnetdig をアプリケーションコンテナにインストールしていない場合は、apt-get update apt install dnsutilsapt install telnet コマンドを実行してインストールしてください。amazon/aws-cli をベースにしたコンテナの場合は、yum updateyum install telnetyum 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 エンドポイントセキュリティグループのインバウンドルールを確認してください。ポート 443 経由の TCP トラフィックが、ECS セキュリティグループまたは VPC CIDRからのインバウンドルールで許可されていることを確認してください。詳細については、「ゲートウェイおよびインターフェイス VPC エンドポイントを介した接続の問題をトラブルシューティングするにはどうすればよいですか?」を参照してください。

  • リージョンに Amazon VPC エンドポイントが設定されていない場合は、サブネットからインターネットへのルートを確認してください。パブリックサブネットの Fargate タスクの場合、タスクにインターネットゲートウェイへのデフォルトのルートがあることを確認してください。プライベートサブネットの Fargate タスクの場合は、タスクにデフォルトのルートがあることを確認してください。タスクには、NAT ゲートウェイ、AWS PrivateLink、別のインターネット接続ソース、またはローカルと VPC CIDR へのデフォルトルートが必要です。
  • ネットワーク ACL が AWS サービスへのアクセスを許可していることを確認してください。
  • セキュリティグループのインバウンドルールが、Fargate タスクでアクセスしようとしている AWS サービスにアタッチされていることを確認します。必要なポート経由の入力トラフィックを許可します。
  • Fargate タスクセキュリティグループのアウトバウンドルールによって、必要なポートを経由する送信トラフィックの AWS サービスへの接続が許可されていることを確認します。
AWS公式
AWS公式更新しました 1年前