今まではgitlabでソースを管理していたため、gitlab-ciを使い、クラウドサーバー常にneginx-proxyでリバースプロキシーしてWebアプリを作成していたが、よりpublicかつデファクトスタンダードになりつつあるgithubでソースを管理する必要性を感じたため、gitlabからgithubに移行。それに伴いアプリのパイプラインを構築しよとしました。
backlogを使っていた時期もあり、gitlabと同様に任意のサーバーにnginx-proxyをたて、jenkinsなどでデプロイしても良かったが、個人的にいろいろなサービスを使うことは管理が大変になるので避けたかった。
そこで、極力AWSを使い実現する。
また、Netlifyなど無料で静的コンテンツを配信していたが、いかんせんネットワーク周りやドメイン、ルーティング周りがうまくいかないので、AWSに全てをよせRoute53周りで簡単に解決しかったので、対応しました。
まずは、CodePipeline/CodeBuild/ECR/ECS/Fargateのコンテナデプロイ基盤を構築してみました - LCL Engineers' Blog
を参考にコードベースで行なっていたが、やはりポリシーやネットワーク周りがうまくいかず、玄人向け感がすごかったので断念。また、NATゲートウェイとNLBを使って構築していたが、料金が高くなりそうだったので、NATゲートウェイを使わず、ALBで対応。
構成
- dbはローカルに閉じる
- Fargeteでスケーラブルにしておく。
- ALBでサブドメインでルーティングする。
route53でドメインを取得して、証明書を発行する。
下記を参考にすればいける。
AWSのサービスでドメインを取得しALBでSSLで接続出来るようにする - Qiita
VPC周り
VPCとVPCサブネットの作成、EC2とRDSの構築、ELB設定まで | Qrunch(クランチ)
ユーザ:develop-deploy
VPC作成
VPCサブネットを作成
名前タグ:vpc-web-app-subnet-web-a
VPC:上記で作成したVPC
アベイラビリティーゾーン:ap-northeneast-1a
IPv4 CIDR ブロック:10.0.0.0/24
名前タグ:vpc-web-app-subnet-web-c
VPC:上記で作成したVPC
アベイラビリティーゾーン:ap-northeneast-1c
IPv4 CIDR ブロック:10.0.1.0/24
名前タグ:vpc-web-app-subnet-db-a
VPC:上記で作成したVPC
アベイラビリティーゾーン:ap-northeneast-1a
IPv4 CIDR ブロック:10.0.10.0/24
名前タグ:vpc-web-app-subnet-db-c
VPC:上記で作成したVPC
アベイラビリティーゾーン:ap-northeneast-1c
IPv4 CIDR ブロック:10.0.11.0/24
セキュリティグループを追加する
セキュリティグループ名:web-app-lb-sg
説明:ALB
VPC:上記で作成したVPC
※作成後一覧よりNameにセキュリティグループ名を設定
同様に下記設定でも作成する
セキュリティグループ名:web-app-web-sg
説明:ECS-WEB
VPC:上記で作成したVPC
※作成後一覧よりNameにセキュリティグループ名を設定
セキュリティグループ名:web-app-db-sg
説明:DB
VPC:上記で作成したVPC
※作成後一覧よりNameにセキュリティグループ名を設定
セキュリティグループ名:web-app-ssh-sg
説明:ECS-SSH
VPC:上記で作成したVPC
※作成後一覧よりNameにセキュリティグループ名を設定
セキュリティグループにインバウンドルールを追加する。
一覧の下部インバンンドルールのタブより追加する。
web-app-web-sg
タイプ:カスタムTCPルール
プロトコル:TCP
ポート範囲:8080
ソース:カスタム web-app-lb-sgのグループID
web-app-db-sg
タイプ:MYSQL/Aurora
プロトコル:TCP
ポート範囲:3306
ソース:カスタム web-app-web-sgのグループID
web-app-ssh-sg
タイプ:SSH
プロトコル:TCP
ポート範囲:22
ソース:カスタム 0.0.0.0/0, ::/0
※ステップサーバー等を置いている場合はソースに適切なIPを設定してください。
RDS周りの設定(今回のサンプルアプリでは使わない予定)
RDSサブネットグループを作成
Amazon RDSのサイドバーからサブネットグループを選択
名前:web-app-rds-subnet-grp
VPC:上記で作成したVPC
サブネット:vpc-web-app-subnet-db-a、vpc-web-app-subnet-db-c ※サブネットIDしか出てこないのでVPCのサブネットからサブネットIDを確認して設定
RDSインスタンスを作成する
データベースの作成より作成する
エンジンのタイプ:Mysql ※お好きなものを選択してください。
テンプレート:無料利用枠 ※私の場合はこれでOK
DBインスタンス識別子:web-app-db-1 ※適当に設定
ユーザー名とパスワードを入力
VPC:上記で作成したVPC
サブネットグループ:web-app-rds-subnet-grp
パブリックアクセス可能:あり ※適宜設定
VPCセキュリティグループ:既存の選択
VPCのセキュリティーグループ:web-app-db-sg ※defaultも設定しておくが、いらないと思う。
AZ:指定なし
データベースポート:3306
インターネットゲートウェイとルートテーブルの設定
インターネットゲートウェイの作成
VPCのサイドバーからインターネットゲイトウェイを選択し、作成する。
名前タグ:web-app-igw
インターネットゲートウェイをVPCにアタッチする
インターネットゲートウェイの一覧より上記で作成したインターネットゲートウェイを選択し、アクションよりVPCにアタッチする。
VPC:上記で作成したVPC
ルートテーブルを作成する
名前タグ:web-app-rtb-global
VPC:上記で作成したVPC
名前タグ:web-app-rtb-local
VPC:上記で作成したVPC
ルートの設定
作成したルートテーブルを選択し、下部ルートタブより編集で設定
web-app-rtb-global
送信先:0.0.0.0/0
ターゲット:web-app-igw
web-app-rtb-local
送信先:10.0.0.0/16 ※デフォルトで設定されていると思う。
ターゲット:local ※デフォルトで設定されていると思う。
ルートテーブルをサブネットサブネットの関連を設定
作成したルートテーブルを選択し、下部サブネットの関連付けタブより編集で設定
web-app-rtb-global
VPCサブネット:vpc-web-app-subnet-web-a、vpc-web-app-subnet-web-c
web-app-rtb-local
VPCサブネット:vpc-web-app-subnet-db-a、vpc-web-app-subnet-db-c
ターゲットグループの作成(アプリが増えるごとにやる必要がある?)
EC2のサイドバーからターゲットグループを選択し作成する。
ターゲットグループ名:web-app-tg-1
ターゲット種類:IP
プロトコル:HTTP
ポート:80
VPC:上記で作成したVPC
ALBを設定
EC2のサイドバーからロードバランサーを選択し作成する。
ロードバランサーの種類:Application Load Balancer
手順1ロードバランサーの設定
名前:web-app-alb
リスナー(HTTP):プロトコル :HTTP ロードバランサーのポート:80
リスナー(HTTPS):プロトコル :HTTPS ロードバランサーのポート:443
VPC:上記で作成したVPC
アベイラビティーゾーン(ap-northeast-1a): サブネット:vpc-web-app-subnet-web-a
アベイラビティーゾーン(ap-northeast-1c): サブネット:vpc-web-app-subnet-web-c
手順2セキュリティ設定の構成
証明書タイプ:ACMから証明書を選択する
証明書の名前:証明書を選択
※Route53よりドメインを発行し、作成した証明書を選択。証明書の作り方は別途記載しておく。
手順3セキュリティグループの設定
既存のセキュリティグループより「web-app-lb-sg」を選択する。
手順4ルーティングの設定
ターゲットグループ:既存のターゲットグループ
名前:web-app-tg-1
手順5ターゲットの登録
この時点ではECSインスタンスを生成していないので、登録済みのターゲットがないので、設定しない。
ECSで自動でターゲット登録される。