こちらの記事の続きでECS+ALBを構築していきます、
programming-gogogogo.hatenablog.com
しかし動画の手順を真似しながら進めたものの、なぜかロードバランサーのDNSからECSタスクにアクセスできず失敗に終わっています。
繋がらない理由はまだわからないので、後から勉強していきます。
(追記: 後から気づきましたがヘルスチェックのURLが自分のアプリでは存在しないのも失敗の原因の一つだはず)
座学として理解が深まったので収穫はありでした。
ALB作成したのでECSサービスの作成画面でロードバランサーが選択できるようになっています。
次にcontainer to load balanceの項目でAdd to load balancerをクリックし
80:HTTPでターゲットに事前に作成していたターゲットを設定します
Nextボタンをクリックし、次のオートスケーリングの項目もデフォルトの設定のままNextをクリック
全体の設定に問題がないことを確認しCreate Serviceをクリックしてサービスを作成
これでECSのクラスター、タスク、サービスが作成できました。
サービスを確認してみると、タスク数に2を指定しているのでタスクを起動しようとしていますがRUNNINGにはならず、さらに時間が経つと起動しようとしていたタスクのステータスがSTOPPEDにになっていました。
これはタスクをプライベートサブネットに置いているため、タスクが外部と接続する処理などを実行する時に落ちているようです。
ちなみに自分の場合は以下のように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をクリック
NAT gateway名を入力し(任意)、配置するサブネットはパブリックサブネットを選択する。プライベートサブネットにあるECSタスクの代わりに外部からの通信を受け取るため。
Elastic IPを割り当てる。
Create NAT GatewayをクリックするとNAT Gatewayが正常に作成される
次にルートテーブルを確認する。
プライベートサブネットのルートテーブルの設定を見ると10.0.0.0/16のみなので先ほど作成したNAT Gatewayと通信できるようにEdit Routesをクリックしてルートテーブルを更新する
パブリックサブネットの外部行きの通信(0.0.0.0/0)はNat Gatewayに送るようにTargetを設定しSave Routesをクリックして保存
パブリックサブネットのRoutesを確認すると外部との通信がNat Gatewayを通るよう設定されているためプライベートサブネット内のECSタスクもビルドできるはず
ECSタスクを確認すると先ほどSTOPPEDになっていたタスクがRUNNINGになっていました
次にECSサービスのUpdateをクリックしてセキュリティグループを更新していきます
サービスの設定画面からセキュリティグループをクリックし
そのセキュリティグループのインバウンドルールをALBからの全てのTCP通信を許可するように設定する
ここまで設定するとALBからECSへの通信が繋がるはずなのですが、私の環境ではなぜかALBのヘルスチェックが失敗し、ブラウザでDNS名にアクセスしても503エラーでした。
まあ失敗している原因はわからないものの、ひとつひとつ手順をまとめていったことで理解が深まりましたし、このまま勉強続けていればそのうち今回の失敗の原因もわかると思うので気にせず他の方法試すか同じ動画見直して間違いないか確かめてみようと思います。
ECSタスクはプライベートサブネットに置いてALBからのみ通信可能にする、というインフラ構成が頭に入ったのでけっこう視野が広がりました。