概要
AWS CodeDeploy(以下CodeDepoy)の入門者向けに「CodeDeployが提供しているサンプルアプリケーション」を使って、WebUIベースでCodeDeployの動作を確認します。
公式チュートリアルの内容をさらに簡易化したものですので、実運用の際はIAMロールの設定内容等、適宜ご確認ください。
チュートリアル
CodeDeploy→EC2用ロールの作成
CodeDeployが、デプロイ対象のEC2インスタンスにアクセスできるようにします。
「IAM」→「ロール」→「ロールの作成」から、「AWSサービス」「CodeDeploy」「CodeDeploy」と選択。
「AWSCodeDeployRole」が選択されているのを確認します。
「ロール名」を入力してロールを作成。ここではCodeDeployRole
としました。
作成されたCodeDeployRole
を選択し、「インラインポリシーの追加」から、CodeDeployがEC2へアクセスできるように、インラインポリシーを作成します。1
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ec2:Describe*",
"Resource": "*"
}
]
}
名前を適当につけて保存します。ここではCodeDeployPolicy
としました。
最終的には以下のようになります。ARNは最終的にCodeDeployに設定するので、控えておくと良いかもしれません。
EC2→S3用ロールの作成
EC2インスタンス上のCodeDeploy Agentは基本的にはS3を経由してソースコードを取得するので2、EC2インスタンスからS3へアクセスできるようなロールを設定してやる必要があります。
「IAM」→「ロール」→「ロールの作成」から、「AWSサービス」「EC2」と選択。
S3へのReadOnlyAccess
を設定します。
名前をつけて保存してください。ここでは「EC2Role」という名前にしました。
EC2インスタンスの作成
続いて、デプロイ対象となるEC2インスタンスを作成します。
注意すべきは以下3点です。
- 作成した「EC2→S3用ロール」をIAMロールとして設定すること
- インスタンスに「タグ」を設定すること
- インスタンスに「CodeDeploy Agent」をインストール、起動させておくこと
今回は以下のように作成しました。
- t2.nano
- Amazon Linux AMI 2017.09.1 (HVM) | 64bit
- セキュリティグループでHTTP(80番), SSH(22番)を開放
- サンプルアプリケーションがHTTPポート(80番)を利用するため
- IAMロールに
EC2Role
を設定
タグはデプロイ対象のインスタンスを特定するために後ほど必要になりますが、キー:値は何でもかまいません。
インスタンスが作成できたら、SSHログインして「CodeDeploy Agent」をインストールしましょう。
$ aws s3 cp s3://aws-codedeploy-ap-northeast-1/latest/install . --region ap-northeast-1
download: s3://aws-codedeploy-ap-northeast-1/latest/install to ./install
$ chmod +x ./install
$ sudo ./install auto
I, [2018-04-13T08:45:57.432536 #2692] INFO -- : Starting Ruby version check.
(略)
完了しました!
I, [2018-04-13T08:45:59.421154 #2692] INFO -- : Update check complete.
I, [2018-04-13T08:45:59.421229 #2692] INFO -- : Stopping updater.
$ sudo service codedeploy-agent status
The AWS CodeDeploy agent is running as PID 2738
※aws s3コマンドでcredentialエラーが出る場合、IAMRoleが設定されていない可能性が高いです。ご確認ください。
CodeDeploy アプリケーション作成
ここまでできれば準備完了です。CodeDeployのアプリケーション(ソースコードのデプロイ単位)を作成します。
最初はウィザードが立ち上がりますが、「CodeDeploy」→「アプリケーションの作成」→「カスタムデプロイ」としてください。
続いてアプリケーションを作成します。ここでは
- アプリケーション名:
CodeDeploySampleApplication
- デプロイグループ名:
CodeDeploySampleDeployGroup
- デプロイタイプ:
インプレースデプロイ
- タググループ: EC2に設定したタグ(
deploy=sample
) - サービスロール:
CodeDeployRole
(CodeDeploy->EC2へのアクセス権限を設定したロール)
としました。
デプロイ実行
あとは実際にソースコードをデプロイします。
作成したアプリケーション、デプロイグループを選択し、「アクション」→「新しいリビジョンのデプロイ」と選択。
公式のサンプルアプリケーションをデプロイします。
- リポジトリタイプ:
Amazon S3
- リビジョンの場所:
s3://aws-codedeploy-ap-northeast-1/samples/latest/SampleApp_Linux.zip
「デプロイ」を押下してステータスが成功になれば、デプロイ完了です。
http://{IPアドレス}/ でアクセスし、以下のような画面が表示されることを確認してください。お疲れ様でした。
うまくいかない場合
以下をご確認ください。
- IAMロールの権限は適切に設定されているか?
- デプロイ終了後、EC2インスタンス上で
/var/www/html/index.html
は配置されているか?- 配置されているのにエラーになっている場合は80番ポートが開放されてないとか、appspec.yml経由でのセットアップスクリプトがyum installで失敗しているといった可能性があります
- EC2インスタンス上でcodedeploy-agentはきちんと立ち上がっているか?
-
sudo service codedeploy-agent status
でPIDはきちんと帰ってくるか?
-
-
/var/log/aws/codedeploy-agent/codedeploy-agent.log
のログにエラーが出ていないか?
とくにcodedeploy-agent.logの中味は重要で、例えばEC2にIAMRoleを設定し忘れていた場合、以下のように出力されていました。うまくいかない場合はまずご確認ください。
InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller: Missing credentials - please check if this instance was started with an IAM instance profile
以上、ご参考になれば幸いです。
-
ここではわかりやすさ重視でCodeDeployがどのEC2へもアクセスできるようにしてありますが、実運用される場合は適宜制限をかけてあげるのが良いと思います。 ↩
-
デプロイ時のリポジトリタイプとして「GitHub」を指定した場合は不要だと思われますが、確認していません。 参考: CircleCI+AWS-CodedeployでStaging環境などに自動デプロイさせる - Qiita ↩