web-dev-qa-db-ja.com

ECSサービスが利用可能なEC2インスタンスをELBに登録できないのはなぜですか?

ECS最適化AMIを構築するEC2起動構成を持っています。自動スケーリンググループを使用して、常に少なくとも2つの使用可能なインスタンスを取得できるようにしています。最後に、私はロードバランサーを持っています。

ロードバランサーのインスタンス間でタスクを分散するECSサービスを作成しようとしています。

ECSロードバランシングのドキュメントを読んだ後、ECSがELBを処理するため、ASGがEC2インスタンスをELBに自動的に登録しないことを理解しています。したがって、私のASGはELBを指定していません。同様に、私のELBにはEC2インスタンスが登録されていません。

ECSサービスを作成するときに、ELBを選択し、ecsServiceRoleも選択します。サービスを作成した後、ECSの[インスタンス]タブに使用可能なインスタンスが表示されません。また、サービスはタスクの開始に失敗し、非常に一般的なエラー...

リソースが見つからなかったため、サービスはタスクを配置できませんでした。

私は約2日間この場所にいて、どの構成設定が適切に構成されていないのか理解できません。これが機能しない原因となっている可能性があることについて誰かが何か考えを持っていますか?

2015年6月25日更新:

これは、ECS_CLUSTERのユーザーデータ設定に関係している可能性があります。

EC2自動スケーリング起動構成で、ユーザーデータ入力を完全に空のままにすると、インスタンスはECS_CLUSTER値が「デフォルト」で作成されます。これが発生すると、「デフォルト」という名前の自動的に作成されたクラスターが表示されます。このデフォルトのクラスターでは、インスタンスが表示され、予想どおりELBにタスクを登録できます。 ELBヘルスチェック(HTTP)は、タスクがELBに登録され、すべてが正常であると合格します。

しかし、ECS_CLUSTER設定をカスタムに変更すると、その名前で作成されたクラスターは表示されません。その名前のクラスターを手動で作成した場合、インスタンスはクラスター内で表示されません。このシナリオでは、タスクをELBに登録できません。

何か案は?

14
Ryan

結局、私のEC2インスタンスにはパブリックIPアドレスが割り当てられていなかったということです。 ECSは各EC2インスタンスと直接通信できる必要があるようですが、これには各インスタンスにパブリックIPが必要です。私はコンテナーインスタンスにパブリックIPアドレスを割り当てていませんでした。パブリックロードバランサーの背後にそれらすべてがあり、各コンテナーインスタンスはプライベートになるからです。

12
Ryan

私は同様の症状がありましたが、ログファイルで答えを見つけました。

/var/log/ecs/ecs-agent.2016-04-06-03:

2016-04-06T03:05:26Z [ERROR] Error registering: AccessDeniedException: User: arn:aws:sts::<removed>:assumed-role/<removed>/<removed is not authorized to perform: ecs:RegisterContainerInstance on resource: arn:aws:ecs:us-west-2:<removed:cluster/MyCluster-PROD
    status code: 400, request id: <removed>

私の場合、リソースは存在しましたがアクセスできませんでした。 OPが存在しない、または表示されないリソースを指しているようです。クラスタとインスタンスは同じリージョンにありますか?ログで詳細を確認する必要があります。

他の投稿への応答:

パブリックIPアドレスは必要ありません。

ECSサービスと通信するためにEC2インスタンスに割り当てられたecsServiceRoleまたは同等のIAMロールが必要です。また、ECSクラスターを指定する必要があります。これは、次のように、インスタンスの起動または起動構成の定義中にユーザーデータを介して実行できます。

#!/bin/bash
echo ECS_CLUSTER=GenericSericeECSClusterPROD >> /etc/ecs/ecs.config

新しく起動したインスタンスでこれを実行できない場合は、インスタンスの起動後にこれを実行して、サービスを再起動できます。

12
MrPaws

また、ECSエージェントが/ var/lib/ecs/dataにクラスター名を格納するファイルを作成する場合もあります。

エージェントが最初に「デフォルト」のクラスター名で起動する場合は、このファイルを削除してからエージェントを再起動する必要があります。

発生する可能性があるもう1つの問題は、適切なポリシーを持つロールを起動構成に割り当てないことです。私の役割にはAmazonEC2ContainerServiceforEC2Roleポリシー(またはそれに含まれるアクセス許可)は ここで指定 として。

2
Nick Spacek

プライベートインスタンスごとにパブリックIPアドレスは必要です必要はありません。これを行うための正しい(そして最も安全な)方法は、NATゲートウェイをセットアップし、そのゲートウェイをプライベートサブネットに接続されているルーティングテーブルに接続することです。

これは、VPCのドキュメント、具体的には シナリオ2:パブリックサブネットとプライベートサブネット(NAT)を使用したVPC で詳細に説明されています。

2
Luke Peterson