概要
AWS Cloudformationでネットワーク周りからEc2サーバ、デプロイ関連まで実装しました。
しかし、TargetgroupのヘルスチェックがUnhealthyのためデプロイが失敗してしまいました。
今回はネットワーク周りのエラーだったので解説します。
原因と解決策
ヘルスチェックがunhealthyを返す、というのは、ターゲット(EC2)へ定期的に行うHTTP GETリクエストに対してレスポンスが帰ってこない場合やそもそもターゲットに到達しない場合に発生するエラーです。
色々な原因が考えられますが、そもそもネットワーク接続に問題がある場合にunhealthyになることがあります。
そして、UnhealthyだとCodedeployでタイムアウトエラーになったりするので後続処理に影響が出ます。
今回の原因はRouteの「明示的なサブネットの関連付け」で、サブネットを関連づけていなかったためでした。
ヘルスチェックは、ルートテーブルがサブネットと正しく関連付けられていることが大前提です。
(もっと言えばインターネットゲートウェイと繋がっているかどうかも)
詳細にいうと、「明示的なサブネットの関連付け」が行われていないと、そのサブネットはメインルートテーブル(デフォルトのルートテーブル)に関連付けられます。ただ、メインルートテーブルのルートが適切に設定されていない場合、そのサブネットからのトラフィックは適切にルーティングされない、ということです。今回はこれが原因でした。
サブネットとルートテーブルを関連付けるためには、Cloudformationで言えばAWS::EC2::SubnetRouteTableAssociation
リソースを以下のように追加してあげればOK。
PublicSubnet1RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnet1
RouteTableId: !Ref RouteTablePublic
PublicSubnet2RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnet2
RouteTableId: !Ref RouteTablePublic
# 他のサブネットとルートテーブルの関連付けも同様に追加
ということで、サブネットとルートテーブルの関連付けを自動化でき、ヘルスチェックエラーが解決できました。