【学習記録】ECS+ALB構築(失敗編)

こちらの記事の続きでECS+ALBを構築していきます、

programming-gogogogo.hatenablog.com

しかし動画の手順を真似しながら進めたものの、なぜかロードバランサーDNSからECSタスクにアクセスできず失敗に終わっています。
繋がらない理由はまだわからないので、後から勉強していきます。 (追記: 後から気づきましたがヘルスチェックのURLが自分のアプリでは存在しないのも失敗の原因の一つだはず)

座学として理解が深まったので収穫はありでした。

ALB作成したのでECSサービスの作成画面でロードバランサーが選択できるようになっています。
f:id:JunpeiNakasone:20210128065123p:plain

次にcontainer to load balanceの項目でAdd to load balancerをクリックし f:id:JunpeiNakasone:20210128065358p:plain

80:HTTPでターゲットに事前に作成していたターゲットを設定します f:id:JunpeiNakasone:20210128065451p:plain

Nextボタンをクリックし、次のオートスケーリングの項目もデフォルトの設定のままNextをクリック
f:id:JunpeiNakasone:20210128065702p:plain

全体の設定に問題がないことを確認しCreate Serviceをクリックしてサービスを作成 f:id:JunpeiNakasone:20210128065801p:plain

f:id:JunpeiNakasone:20210128065903p:plain

これでECSのクラスター、タスク、サービスが作成できました。

サービスを確認してみると、タスク数に2を指定しているのでタスクを起動しようとしていますがRUNNINGにはならず、さらに時間が経つと起動しようとしていたタスクのステータスがSTOPPEDにになっていました。

f:id:JunpeiNakasone:20210128070322p:plain

これはタスクをプライベートサブネットに置いているため、タスクが外部と接続する処理などを実行する時に落ちているようです。

ちなみに自分の場合は以下のようにDockerfileを書いているのでapk updateあたりで落ちているかと推測します。

FROM golang:1.12.0-alpine3.9
RUN mkdir /app
COPY . /app
WORKDIR /app

RUN apk update && apk add git

RUN go build -o main .

EXPOSE 9999

CMD ["go","run","main.go"]

そのためNat Gatewayを作成して、プライベートサブネットから外部への接続を許可しつつ外部からプライベートサブネットには接続できないよう設定します。

VPCのメニューからNAT gatewayを選択しCreate NAT Gatewayをクリック
f:id:JunpeiNakasone:20210128221354p:plain

NAT gateway名を入力し(任意)、配置するサブネットはパブリックサブネットを選択する。プライベートサブネットにあるECSタスクの代わりに外部からの通信を受け取るため。
Elastic IPを割り当てる。

f:id:JunpeiNakasone:20210128221804p:plain

Create NAT GatewayをクリックするとNAT Gatewayが正常に作成される
f:id:JunpeiNakasone:20210128221950p:plain

次にルートテーブルを確認する。

プライベートサブネットのルートテーブルの設定を見ると10.0.0.0/16のみなので先ほど作成したNAT Gatewayと通信できるようにEdit Routesをクリックしてルートテーブルを更新する
f:id:JunpeiNakasone:20210128222300p:plain

パブリックサブネットの外部行きの通信(0.0.0.0/0)はNat Gatewayに送るようにTargetを設定しSave Routesをクリックして保存
f:id:JunpeiNakasone:20210128222526p:plain

パブリックサブネットのRoutesを確認すると外部との通信がNat Gatewayを通るよう設定されているためプライベートサブネット内のECSタスクもビルドできるはず
f:id:JunpeiNakasone:20210128223350p:plain

ECSタスクを確認すると先ほどSTOPPEDになっていたタスクがRUNNINGになっていました
f:id:JunpeiNakasone:20210128224841p:plain

次にECSサービスのUpdateをクリックしてセキュリティグループを更新していきます

サービスの設定画面からセキュリティグループをクリックし f:id:JunpeiNakasone:20210128225240p:plain

そのセキュリティグループのインバウンドルールをALBからの全てのTCP通信を許可するように設定する f:id:JunpeiNakasone:20210128225341p:plain

ここまで設定するとALBからECSへの通信が繋がるはずなのですが、私の環境ではなぜかALBのヘルスチェックが失敗し、ブラウザでDNS名にアクセスしても503エラーでした。
f:id:JunpeiNakasone:20210129064111p:plainf:id:JunpeiNakasone:20210129064132p:plain

まあ失敗している原因はわからないものの、ひとつひとつ手順をまとめていったことで理解が深まりましたし、このまま勉強続けていればそのうち今回の失敗の原因もわかると思うので気にせず他の方法試すか同じ動画見直して間違いないか確かめてみようと思います。

ECSタスクはプライベートサブネットに置いてALBからのみ通信可能にする、というインフラ構成が頭に入ったのでけっこう視野が広がりました。