こんにちは、SCSKの梅沢です。
AWS CodePipelineとは、完全マネージド型の継続的デリバリーサービスのことです。AWS CodeCommit、AWS CodeBuild、AWS CodeDeployなどと組み合わせて、DevOps パイプラインを作成することができます。
本記事では、CodeCommitにあるテストファイルを、CodeDeployでAmazon Elastic Compute Cloud(Amazon EC2)インスタンスにデプロイする簡単なワークをします。
構成図
CodePipelineを利用して、CodeCommitに配置したファイルをEC2インスタンスに展開します。
なお、EC2インスタンスはプライベートサブネットにある想定です。
CodeDeployでのデプロイは、後述するVPCエンドポイント経由で行います。
準備1:EC2インスタンス側の設定
アタッチするロールの設定
CodeDeploy実行のために、インスタンス用のAWS Identity and Access Management (IAM)ロールを準備します。インスタンス用のIAMロールを作成し、下記のポリシーをアタッチしてください。EC2インスタンスには、作成したIAMロールを設定してください。
CodeDeployエージェントのインストール
AWSの記事に従って、デプロイ対象のインスタンスにCodeDeployエージェントをインストールしてください。コマンドは下記を参照ください。
準備2:VPCエンドポイントに関する設定
VPCエンドポイントの設定と、それに対するセキュリティグループの設定が必要です。今回はEC2インスタンスはプライベートVPCにありますので、CodeDeployの利用は、インターネット経由ではなく、VPCエンドポイント経由で行います。
VPCエンドポイントの設定
下記のVPCエンドポイントを、EC2インスタンスがあるVPCにアタッチします。
・com.amazonaws.ap-northeast-1.codedeploy-commands-secure
※VPC エンドポイントの作成時に VPC コンソールで [プライベート DNS 名を有効にする] を選択します。
VPCエンドポイントへのセキュリティグループの設定
作成したVPCエンドポイントのセキュリティグループに対して、EC2インスタンスからのhttp/httpsのインバウンド接続を許可します。
※ 自分の環境では、EC2インスタンスのセキュリティグループをソースとして指定しました。
EC2インスタンスのIAMロールに対し、下記のポリシーを作成しアタッチする
下記のポリシーを作成し、準備1で作成したEC2インスタンスのIAMロールにアタッチします。
“Statement”: [
{
“Action”: [
“codedeploy-commands-secure:GetDeploymentSpecification”,
“codedeploy-commands-secure:PollHostCommand”,
“codedeploy-commands-secure:PutHostCommandAcknowledgement”,
“codedeploy-commands-secure:PutHostCommandComplete”
],
“Effect”: “Allow”,
“Resource”: “*”
}
]
CodeDeployエージェントの設定ファイルを編集する
EC2インスタンスにログインし、/etc/codedeploy-agent/conf/codedeployagent.yml の最終行に下記を追記します。
最後にCodeDeplyエージェントを再起動します。
実行:CodePipeline実行
最後にCodePipelineを作成して実行し、成功することを確認します。
なお、CodeCommitには配信したいファイルだけでなく、CodeDeployの動作を指定するappspec.ymlを置く必要があります。ファイルをデプロイするEC2インスタンスのディレクトリや、同名のファイルがある場合の挙動などをappspec.ymlで定義します。
(書き方は他のインターネット上の記事をご参考ください。)
補足
今回は、ファイルをデプロイすると記載しましたが、実際はスクリプトを配信したりすることが多いと思います。コンテナを再起動させるスクリプト、Amazon Simple Storage Service(Amazon S3)からデータを引っ張ってくるスクリプト etc.. 。これらも、CodeDeployの動作を指定するappspec.ymlで、スクリプト実行順などの詳細を指定できます。
また、本記事では記載していませんが、CodeBuildを組み合わせて下記の活用もできます。
- CodeCommitにDockerファイルを配置しておく。CodeCommitからCodeBuildにDockerファイルが渡され、イメージがビルドされる。作成したイメージをAmazon ECRにプッシュする。
- AWS CloudFormationでCodePipelineを作成するとき、CloudFormationでの入力値をCodeDeployへ渡すため、CodeDeployの前にCodeBuildをかます。
など考えられます。
#余談ですが、2はCodeDeployで配信するスクリプトの変数を指定したい場合に需要があると思います。そのためには、CodeDeployの前にCodeBuildをわざわざかまし、変数をアーキファクトに書き込むbuildspec.ymlを記載し、それをCodeCommitに置いてあげる必要があります。(ほかにやり方はないのか..)
最後に:ハマったポイント
CodePipeline構築に際し、ハマったポイントを記載します。なぜかCodePipelineが失敗する場合は、こちらを確認してみてください。
EC2インスタンスにIAMロールをアタッチしているか
EC2インスタンスに前述のIAMロールがアタッチされていないと、CodeDeploy が一向に進みません。ご確認ください。
EC2インスタンスにCodedeployエージェントがインストールされているか・起動しているか
確認漏れしてしまうポイントかと思います。CodeDeployエージェントがデプロイ先のEC2インスタンスにインストールされていることを忘れずに確認ください。また、併せてCodeDeploy エージェントが起動していることも併せて確認ください。
EC2インスタンスのCodedeployエージェントのバージョンが1.1.0以上になっているか
もしすでにCodeDeployエージェントがインストールされている場合であっても、バージョンが古いと動作しない場合があります。私のアカウントで1.0.8バージョンを使用していた所、CodeDeployが保留中のまま一向に進まない状態になりました。エージェントをすでに入れている場合は、バージョンを確認してください。(自分の環境では既にエージェントを入れていたため安心してしまい、CodeDeploy が進まない原因がわからず、解決にしばらくかかりました。。) サポートされている最小バージョンは 1.1.0 とのことです(2022/4月時点での確認)。それ以下のバージョンを使用している場合は、バージョンアップをしてください。
CodeDeploy エージェントのバージョンを特定します。 – AWS CodeDeploy (amazon.com)
VPCエンドポイントにセキュリティグループを設定しているか
前述のVPCエンドポイントにセキュリティグループを設定しない場合、VPCエンドポイントを作成してもCodeDeployが成功しません。保留中のままCodeDeploy が一向に進まない状態になりますので、ご確認ください。
・com.amazonaws.ap-northeast-1.codedeploy-commands-secure
以上、ハマったポイントでした。
現場で実装する際に、このハマりポイントで時間を費やして、しんどい思いをしない様に参考にしてください。