AWS CodeDeploy と Auto Scaling + ALB(Application Load Balancer)を組み合わせる環境の構築手順について解説します。
いろいろ嵌るポイントがありましたので最後にまとめています。
CodeDeploy の解説です。
AWS CodeDeploy
【AWS】DevOps(CI/CD)の導入手順(Angular、Git、CodePipeline、CodeCommit、CodeBuild、CodeDeploy、Auto Scaling、ALB の組み合わせ)
【AWS】DevOps(CI/CD)の導入手順(Spring Tools、Git、CodePipeline、CodeCommit、CodeBuild、CodeDeploy)
【AWS】DevOps(CI/CD)の導入手順(CodePipeline、CodeCommit、CodeBuild、CodeDeploy)
CodeDeploy でデプロイエラーになった場合は以下の記事を参考にしてください。
【AWS】CodePipeline での CodeDeploy でのデプロイでエラーになった場合のトラブル対応手順
構成図
今回構築する構成図です。
パブリックサブネットとプライベートサブネットをそれぞれ2つずつ作ります。
設計
■サブネット
- パブリックサブネット : 10.0.10.0/24、10.0.11.0/24
- プライベートサブネット : 10.0.12.0/24、10.0.13.0/24
■アベイラビリティゾーン
- ap-northeast-1a : 10.0.10.0/24、10.0.12.0/24
- ap-northeast-1c : 10.0.11.0/24、10.0.13.0/24
ALB の設定でパブリックサブネットとプライベートサブネットが同じアベイラビリティゾーンに設定されている必要があります。
もしパブリックサブネットのアベイラビリティゾーンが a,d でプライベートサブネットのアベイラビリティゾーンが c,d の環境では、d のラインだけしか同一ではないので ALB の設定ができなくなります。
S3 バケットの作成と設定
最初にデプロイするソースコード(アーティファクト)を保存する S3 バケットを作成します。
このバケットに index.htmlファイルとappspec.ymlファイルを保存します。
S3 のダッシュボードに移動します。
「バケットを作成」ボタンをクリックします。
バケット名を設定します。
今回は外部からアクセスする要件がないため、「パブリックアクセスをすべてブロック」にチェックが入っていることを確認します。
「バケットのバージョニング」の設定で「有効にする」にチェックを入れます。
設定が完了したら「バケットを作成」ボタンをクリックします。
バケットが作成されていることを確認します。
index.htmlファイルとappspec.ymlファイルを作成して index.zip として圧縮する
S3 バケットを作成したら index.html ファイルと appspec.yml ファイルを作成して index.zip として圧縮します。
■index.html
<html> <meta http-equiv=”content-type” charset=”UTF-8″> |
■appspec.yml
version: 0.0 os: linux files: – source: index.html destination: /var/www/html/ |
appspec.yml の設定の意味ですが
- source: index.html ← デプロイしたいソースを指定します。今回は index.zip ファイルをアップロードしますが、最終的には index.zip の中から index.html ファイルを抽出して展開するので index.html を指定します。
- destination: /var/www/html/ ← index.html ファイルをデプロイする EC2 インスタンスのどこに配置するのかを指定します。最終的には /var/www/html/index.html になります。
上記ファイルを圧縮して index.zip ファイルにして S3 バケットにアップロードします。
EC2インスタンスの構築
次に EC2 インスタンスを構築します。
構築する EC2 インスタンスに CedeDeploy を利用して「index.html」をデプロイします。
以下の構成で EC2 インスタンスを構築します。
- AMI:Amazon Linux2
- インスタンスタイプ:t2.micro
- セキュリティグループ:80/TCPはソース0.0.0.0/0で許可、22/TCPはログインする環境のグローバルIPアドレスで絞ります。
EC2インスタンスが起動したらログインして以下の設定をします。
EC2インスタンスの設定
以下のコマンドを実行して EC2 インスタンスを設定します。
■yum updateで最新化
[root@test01 ~]# yum update |
■Rubyのインストール
[root@test01 ~]# yum install ruby |
■wgetのインストール
※すでに入っていることもあります。
[root@test01 ~]# yum install wget |
■CodeDeploy Agentのパッケージをダウンロード
[root@test01 ~]# wget https://aws-codedeploy-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/latest/install |
■installファイルに実行権限を付与
[root@test01 ~]# chmod +x ./install |
■インストール実行
[root@test01 ~]# ./install auto |
■CodeDeploy Agentが起動されていることを確認
[root@test01 ~]# service codedeploy-agent status |
■Nginxのインストール
[root@test01 ~]# amazon-linux-extras install nginx1 |
■Nginxの起動確認
[root@test01 ~]# systemctl status nginx |
IAMロールの作成
次に EC2インスタンスに割り当てる IAMロールを作成します。
IAMロールのアタッチ
作成した IAM ロールを EC2 インスタンスにアタッチします。
AMI の取得
EC2インスタンスを設定したら AMI を取得します。
EC2インスタンスを停止します。
起動テンプレートの作成
AMIを作成したら起動テンプレートを作成します。
※元の AMI を登録解除すると起動テンプレートも使えなくなるので注意。
Auto Scalingグループを作成する
次に Auto Scaling グループを作成します。
動作確認
Auto Scaling グループを作成後に EC2 インスタンスが自動的に起動していることを確認します。
CodeDeployの実行
CodeDeployを実行します。
アプリケーションの作成
アプリケーションを作成します。
デプロイグループの作成
デプロイグループを作成します。
デプロイの作成
デプロイの作成をします。
デプロイが始まります。
しばらくすると以下のようにステータスが表示されます。
動作確認
ブラウザを起動してサイトにアクセスをします。
注意点・確認事項
- CodeDeployエージェントがインターネットにアクセスできるようにする必要があります。EC2インスタンスをパブリックサブネットに配置する場合は問題ないですが、プライベートサブネットに配置する場合は、NATゲートウェイを導入し、ルートテーブルを設定しインターネットに出れるようにする必要があります。
- S3バケットのバージョニングを有効化する必要があります。
うまくいかなかったこと
以下、うまくいかなかったことで現在調査していることです。
ターゲットグループに追加されない
Auto Scalingグループの設定をしましたが、最初のEC2インスタンスはターゲットグループに追加されましたが、動作確認でその EC2インスタンスを手動で終了(削除)したところ、次の EC2インスタンスが追加されませんでした。現在、調査しています。
最初の Health Check をどうするか悩んだ
最初の Health Check をどうするか悩みました。
Health Check のために /var/www/html/index.html を配置したところ、Health Check は成功しますが、CodeDeploy でindex.zip をデプロイする際にすでに index.html ファイルがあるということでエラーになりました。
その為、ヘルスチェック用に「test.html」ファイルを配置しましたが果たしてこれでいいのか調べています。
EC2 インスタンスに割り当てた IAM ロールが引き継がれない
CodeDeploy 用に EC2 インスタンスに IAM ロールを割り当て、AMI を作成し、AMI から起動テンプレートを作成し、Auto Scaling グループに割り当てましたが、Auto Scaling により EC2インスタンスが起動された後に IAM ロールの設定を確認すると IAM ロールは割り当てされていませんでした。
ちなみに適切な IAM ロールが割り当てられていない、もしくは権限が足りないと以下のようなエラーメッセージが出力されます。
■/var/log/aws/codedeploy-agent/codedeploy-agent.log
2021-09-24 14:28:26 ERROR [codedeploy-agent(2724)]: InstanceAgent::Plugins::CodeDeploysing credentials – please check if this instance was started with an IAM instance prof |
このエラーメッセージは適切なIAMロールを割り当ててOSを再起動すれば消えます。
コメント