Amazon ECS での、Service Connect に関連する問題をトラブルシューティングする方法を教えてください。

所要時間3分
0

Amazon Elastic Container Service (Amazon ECS) が別のサービスに接続できません。

解決策

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

サービス間通信の問題は、設定ミスやネットワークの問題が原因で発生します。これらの問題を解決するには、次のトラブルシューティング手順を実行します。

Service Connect の設定を確認する

Service Connect が有効であることを確認する

前提条件 Amazon ECS Service Connect を使用するには、Service Connect の要件を満たす必要があります。

Amazon ECS サービスで Service Connect が有効になっているかどうかを確認するには、次の AWS CLI コマンド describe-services を実行します。

aws ecs describe-services --cluster cluster-name --services service-name

注: お使いのものでそれぞれ、cluster-name をクラスター名に、service-name をサービス名に置き換えます。

出力例

"serviceConnectConfiguration": {

"enabled": true,

注: Amazon ECS サービスが他のサービスからのネットワークトラフィックを許可する必要がある場合は、Service Connect の設定をクライアント/サーバーサービスとして設定する必要があります。この構成を確認するには、コマンド出力の serviceConnectionConfigurationservices をレビューします。

サービスの名前空間を確認する

Service Connect を使用するには、Amazon ECS サービスを同じ名前空間で設定する必要があります。クライアントサービスとクライアント/サーバーサービスは、同じ名前空間に配置する必要があります。サービスの名前空間を確認するには、次の describe-services コマンドを実行します。

aws ecs describe-services --cluster cluster-name --services service-name | grep namespace

注: お使いのものでそれぞれ、cluster-name をクラスター名に、service-name をサービス名に置き換えます。

出力で、namespace の値を確認します。サービスの名前空間を更新するには、Amazon ECS コンソールを使用してService Connect の設定を更新します。または、次の update-service コマンドを実行します。

aws ecs update-service --cluster cluster-name --service service-name --service-connect-configuration enabled=true,namespace=Namespace-name --force-new-deployment

注: お使いのものでそれぞれ、cluster-name をクラスター名に、service-name をサービス名に、Namespace-name を名前空間に置き換えます。

クライアントサービスがクライアント/サーバーサービスの DNS を解決できない場合、次のいずれかのエラーメッセージが表示されます。

  • server can't find DNS: NXDOMAIN
  • server can't find example.core.staging.local: NXDOMAIN

この問題を解決するには、次の get-namespace コマンドを実行し、AWS Cloud Map に名前空間が登録済みであることを確認します。

aws servicediscovery get-namespace --id namespace

注: namespace は、実際の名前空間 ID に置き換えます。

コマンドの出力を参照し、AWS アカウントと AWS リージョンで利用可能な名前空間を確認します。

インスタンスの名前空間にタスクが登録済みであることを確認するには、次の手順を実行します。

  1. 名前空間 ID を取得するには、次の list-namespaces コマンドを実行します。

    aws servicediscovery list-namespaces
  2. AWS Cloud Map コンソールまたは AWS CLI を使用して名前空間内のサービスを一覧表示します

  3. サービスの登録済みインスタンスを確認するには、次の list-instances コマンドを実行します。

    aws servicediscovery list-instances --service-id srv-serviceID

    注: serviceID は、実際のサービス ID に置き換えます。

  4. インスタンスが登録済みではない場合は、次の update-service コマンドを実行してタスクを再デプロイします。

    aws ecs update-service --cluster cluster-name --service service-name --region region-name --force-new-deployment

    注: お使いのものでそれぞれ、cluster-name をクラスター名に、service-name をサービス名に、region-name をリージョンに置き換えます。
    または、Amazon ECS コンソールを使用してサービスを更新し、[新しいデプロイの強制] を選択します。

ポートマッピング名を確認する

タスク定義にポートマッピング名を設定していない場合、次のエラーメッセージが表示されます。

No port aliases found.Select a different task definition family and revision that has port mappings configured to use client and server mode. (ポートのエイリアスがありません。クライアントモードとサーバーモードを使用するようにポートマッピングを設定した、別のタスク定義ファミリーとリビジョンを選択してください)

この問題を解決するには、タスク定義を更新し、portMappingsname パラメータの値を追加します。

タスク定義の例

"portMappings": [ { "name": "portmappingnameexample", "containerPort": 3000, "hostPort": 3000, "protocol": "tcp" }

ネットワーク ACL とセキュリティグループの設定を確認する

ネットワークアクセスコントロールリスト (ネットワーク ACL) とセキュリティグループには、次の設定を使用する必要があります。

  • クライアントサービスは、クライアント/サーバーサービスのセキュリティグループが使用するポートへのアウトバウンドトラフィックを許可している。
  • クライアント/サーバーサービスのセキュリティグループは、クライアントサービスが使用するポートでインバウンドトラフィックを許可している。
  • 仮想プライベートネットワーク (VPC) のネットワークACLは、containerPort および ingressPortOverride のポートでトラフィックを許可している。
  • サービスタスクを別々の VPC で実行する場合、VPC ピアリング接続またはトランジットゲートウェイでその VPC 間のトラフィックを許可する必要があります。

サービスタスク間の接続を確認する

次の手順を実行します。

  1. AWS Fargate でタスクを実行する場合は、ECS Exec を有効にします。Amazon Elastic Compute Cloud (Amazon EC2) でタスクを実行する場合は、ステップ 3 に進んでください。

  2. 次の execute-command コマンドを実行し、コンテナーにリモート接続します。

    aws ecs execute-command --cluster cluster-name \
    --task task-id \
    --container container-name \
    --interactive \
    --command "/bin/sh"

    注: 実際のものでそれぞれ、cluster-name をクラスター名に、task-id をタスク ID に、container-name をコンテナインスタンスに置き換えます。

  3. 接続で Service Connect プロキシを使用していることを確認するには、次のコマンドを実行します。

    curl -I http://$IPaddress:portnumber/healthcheck

    注: 実際のものでそれぞれ、IPaddress をタスクのプライベート IP アドレスに、portnumber をコンテナインスタンスのポートに、healthcheck をコンテナヘルスチェックのパスに置き換えます。

    server: envoy ヘッダーのコマンド出力を参照し、接続がプロキシを使用していることを確認します。接続がプロキシを使用していない場合は、Service Connect が正しく設定されていることを確認してください。

  4. /etc/hosts ファイルを開くには、次のコマンドを実行します。

    cat /etc/hosts

    コマンドの出力を参照し、他のサービスのエンドポイントが表示されることを確認します。サービスのエンドポイントが表示されない場合は、Service Connect が正しく設定されていることを確認してください。

  5. Service Connect の設定を変更する場合は、次の update-service コマンドを実行してタスクを再デプロイします。

    aws ecs update-service --cluster cluster-name --service service-name --region region-name --force-new-deployment

    注: お使いのものでそれぞれ、cluster-name をクラスター名に、service-name をサービス名に、region-name をリージョンに置き換えます。
    または、Amazon ECS コンソールを使用してサービスを更新し、[新しいデプロイの強制] を選択します。

クライアントサービスのタスクを再デプロイする

Could not resolve host というエラーメッセージが表示された場合、タスクがサービスエンドポイントを解決できないことを示しています。代わりに、ping: bad address 'DNS' というエラーメッセージが表示される場合もあります。

これらの問題を解決するには、既存のクライアントサービスタスクを再デプロイします。

アプリケーションログをレビューする

アプリケーションログに接続エラーやランタイムエラーがないか確認します。Amazon ECS は、ログドライバーに応じてログを別個の宛先にエクスポートします。awslogs ドライバーを使用する場合は、Amazon ECS はログを Amazon CloudWatch にエクスポートします。

関連情報

Amazon ECS Service Connect のコンポーネント

AWS公式
AWS公式更新しました 3ヶ月前
コメントはありません