S3に保存したアプリケーションをCodeDeployとCodePipelineを使用してEC2へデプロイする
構成図
前提
- VPC、サブネット等のネットワーク周りが作成済み
- プライベートサブネットへEC2インスタンスが起動済み
- 外部からの通信用に、ALBとターゲットグループが作成済み
作業の流れ
- IAMロール作成
- VPCエンドポイント作成
- S3バケット作成
- EC2インスタンスへCodeDeployエージェントインストール
- CodeDeploy作成
- CodePipeline作成
- EC2インスタンスへデプロイ
1. IAMロール作成
EC2インスタンス用ロール
ポリシーにマネージドポリシーとカスタムポリシーを1つずつアタッチ。
・マネージドポリシー
AmazonEC2RoleforAWSCodeDeploy
・カスタムポリシー
以下のポリシーを記載して保存。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"codedeploy-commands-secure:GetDeploymentSpecification",
"codedeploy-commands-secure:PollHostCommand",
"codedeploy-commands-secure:PutHostCommandAcknowledgement",
"codedeploy-commands-secure:PutHostCommandComplete"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
CodeDeploy用ロール
マネージドポリシーを1つアタッチ。
・マネージドポリシー
AWSCodeDeployRole
ロール作成後、信頼関係が以下となっていることを確認。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "codedeploy.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
2. VPCエンドポイント作成
作成するのは以下となります。
- com.amazonaws.ap-northeast-1.codedeploy
- com.amazonaws.ap-northeast-1.codedeploy-commands-secure
- com.amazonaws.ap-northeast-1.s3
作成の際に、エンドポイントを紐づけるサブネットが選択できるので、
EC2インスタンスが起動しているプライベートサブネットを選択。
3. S3バケット作成
バケットは2種類作成します。
- アプリケーションの保存用
- CodePipelineの入出力データ用
4. EC2インスタンスへCodeDeployエージェントインストール
既に起動済みのインスタンスへ接続し、CodeDeployエージェントをインストールしていく。
詳しいインストール方法は、こちらを参照。
実行するコマンドは以下。
- sudo yum update -y
- sudo yum install ruby -y
- sudo yum install wget -y
- cd /home/ec2-user
- wget https://aws-codedeploy-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/latest/install
- chmod +x ./install
- sudo ./install auto
- sudo service codedeploy-agent status
インストール完了後、VPCエンドポイントを介して動作させる為に以下のファイルを編集する。
- /etc/codedeploy-agent/conf/codedeployagent.yml
ファイル内の末尾に :enable_auth_policy: true を記述して保存
:log_aws_wire: false
:log_dir: '/var/log/aws/codedeploy-agent/'
:pid_dir: '/opt/codedeploy-agent/state/.pid/'
:program_name: codedeploy-agent
:root_dir: '/opt/codedeploy-agent/deployment-root'
:verbose: false
:wait_between_runs: 1
:proxy_uri:
:max_revisions: 5
:enable_auth_policy: true
保存後は念の為、CodeDeployエージェントを再起動しておく。
5. CodeDeploy作成
必要な準備が完了したのでCodeDeployの設定を行っていく。
アプリケーションの作成
- アプリケーション名は任意名
- プラットフォームは今回の構成では【EC2/オンプレミス】を設定する。
デプロイグループの作成
アプリケーション作成後、【デプロイグループの作成】から設定を行う。
- デプロイグループ名は任意名
- サービスロールは最初に作成したCodeDeploy用ロールを選択
- デプロイタイプは今回【インプレース】を選択
- デプロイ対象のEC2の判別に今回はタグを使用する為、「4. EC2インスタンスの設定」でインスタンスに設定したタグと同様のものを設定する。
- CodeDeployエージェントは手動でインストール済みの為、【なし】
- デプロイ設定はシステムの要件に合わせて選択していきます。
- ロードバランサーはALBを選択し、事前に作成したターゲットグループを設定する。
全て入力後、デプロイグループを作成をクリックしてCodeDeployの作成は完了となります。
6. CodePipeline作成
最後にCodePipelineを設定していきます。
- パイプライン名は任意名
- サービスロールは【新しいサービスロール】を選択することで自動で作成してくれます。
- アーティファクトストアはCodePipelineの入出力データを保存するS3バケットを指定する。
今回は事前に作成したバケットを指定します。 - 暗号化キーはAWSのマネージドキーとします。
ソースステージでは、アプリケーションの保存先を指定していきます。
今回の構成では以下を選択。
- ソースプロパイダー:S3
- バケット:手順3で作成したバージョニングが有効化されているバケット
- オブジェクトキー:保存するアプリケーションのファイル名
- 検出オプション:Cloudwatch Events
ビルドステージは今回、Codebuildなどのサービスを使用していない為、スキップ。
デプロイステージは、インスタンスにデプロイする方法を指定します。
今回の構成では、以下を選択。
- デプロイプロパイダー:CodeDeploy
- リージョン:東京
- アプリケーション名:CodeDeployで作成したアプリケーションを選択
- デプロイグループ:CodeDeployで作成したデプロイグループを選択
最後に設定内容の確認があるので、問題なければ作成してCodePipelineの設定は完了です。
7. EC2インスタンスへデプロイ
自動デプロイの準備が出来たので、実際にデプロイしていきます。
S3にアプリケーションをアップロード
アプリケーション保存用のS3バケットの【アップロード】からアプリケーションファイルをアップロードしていきます。
今回は、公式で配布されているサンプルアプリケーションを使用しています。
アプリケーションのアップロードが完了したことをトリガーにCodePipelineが起動して
EC2インスタンスへのデプロイが実行される。
デプロイが完了したらブラウザでALBのDNS名にアクセスしてみます。
Congratulations と書いてあるサンプルページが表示されればデプロイは完了です。
まとめ
今回、業務で触れた経験を自分へのメモ代わりという意味合いも含めて
初めて記事を作成してみましたが、説明の不足や表現のおかしい点などが
ありましたら申し訳ありません。
今後も少しずつ投稿していけたらなと思っていますので
私の経験が誰かのお役に立てれば幸いです。
Discussion