ググれば
いくらでも情報は出てくるので、それらの情報を参考にしてチュートリアルしてみる。
circleci.com
docs.aws.amazon.com
dev.classmethod.jp
構成
下図のような構成を想定している。
チュートリアルでは以下のような作業を行う。
- CircleCI 用の IAM ユーザー作成
- デプロイ用 S3 バケット作成
- CodeDeploy の設定
- CircleCI の設定
CircleCI 用 IAM User 作成
- デプロイ用 S3 への put 権限と CodeDeploy 用の権限を付与
$ cat oreno-application_user_policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"codedeploy:RegisterApplicationRevision",
"codedeploy:GetApplicationRevision"
],
"Resource": [
"arn:aws:codedeploy:*:*:application:oreno-application"
]
},
{
"Effect": "Allow",
"Action": [
"codedeploy:CreateDeployment",
"codedeploy:GetDeployment"
],
"Resource": [
"arn:aws:codedeploy:*:*:deploymentgroup:oreno-application/*"
]
},
{
"Effect": "Allow",
"Action": [
"codedeploy:GetDeploymentConfig"
],
"Resource": [
"arn:aws:codedeploy:*:*:deploymentconfig:CodeDeployDefault.OneAtATime",
"arn:aws:codedeploy:*:*:deploymentconfig:CodeDeployDefault.HalfAtATime",
"arn:aws:codedeploy:*:*:deploymentconfig:CodeDeployDefault.AllAtOnce"
]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::oreno-application/*"
]
}
]
}
以下を実行してポリシーを作成する。
export _AWS_PROFILE=oreno-profile
export _AWS_REGION=ap-northeast-1
export _POLICY_ARN=$(aws --profile ${_AWS_PROFILE} --region ${_AWS_REGION} \
iam create-policy \
--policy-name oreno-application_user_policy \
--policy-document file://oreno-application_user_policy.json \
--query Policy.Arn \
--output text)
echo ${_POLICY_ARN}
aws --profile ${_AWS_PROFILE} --region ${_AWS_REGION} \
iam create-user \
--user-name oreno-application
aws --profile ${_AWS_PROFILE} --region ${_AWS_REGION} \
iam attach-user-policy \
--user-name oreno-application \
--policy-arn ${_POLICY_ARN}
aws --profile ${_AWS_PROFILE} --region ${_AWS_REGION} \
iam create-access-key \
--user-name oreno-application
以下のように出力されるので AccessKeyId
と SecretAccessKey
を控えておく。
{
"AccessKey": {
"UserName": "oreno-application",
"Status": "Active",
"CreateDate": "2017-06-24T02:34:21.549Z",
"SecretAccessKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"AccessKeyId": "AKXXXXXXXXXXXXXXXXXX"
}
}
デプロイ用 S3 バケット作成
aws --profile ${_AWS_PROFILE} --region ${_AWS_REGION} \
s3 mb s3://oreno-application
aws --profile ${_AWS_PROFILE} --region ${_AWS_REGION} \
s3 ls | grep 'oreno-application'
以下のように出力されることを確認する。
2017-06-24 11:37:37 oreno-application
CodeDeploy 設定
パラメータ |
値 |
備考 |
Service Role Name |
oreno-application-role |
変数: _SERVICE_ROLE_NAME |
Service Role Policy Name |
oreno-application-role-policy |
変数: _SERVICE_ROLE_POLICY_NAME |
Application Name |
oreno-application |
変数: _APPLICATION_NAME |
Deployment Group Name |
oreno-application-group |
変数: _DEPLOYMENT_GROUP_NAME |
Deployment Config Name |
CodeDeployDefault.OneAtATime |
変数: _DEPLOYMENT_CONIG_NAME |
EC2 tag Key |
deploy |
EC2 タグに指定しておく |
EC2 tag Value |
true |
EC2 タグに指定しておく |
ちなみに、Deployment Config には以下のような種類がある。
パラメータ |
ざっくり説明 |
CodeDeployDefault.OneAtATime |
Deploy 対象 1 台ずつに対して Deploy を行う |
CodeDeployDefault.AllAtOnce |
全ての Deploy 対象に対して一度に Deploy を行う |
CodeDeployDefault.HalfAtATime |
Deploy 対象の半分にまず Deploy を行う |
- CodeDeploy に付与する Service Role を作成する
$ cat oreno-application-role.json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": [
"codedeploy.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
以下を実行して Service Role を作成する。
export _SERVICE_ROLE_NAME=oreno-application-role
export _SERVICE_ROLE_ARN=$(aws --profile ${_AWS_PROFILE} --region ${_AWS_REGION} \
iam \
create-role \
--role-name ${_SERVICE_ROLE_NAME} \
--assume-role-policy-document file://oreno-application-role.json \
--query Role.Arn \
--output text)
echo ${_SERVICE_ROLE_ARN}
$ cat oreno-application-role-policy.json
{
"Version": "2008-10-17",
"Statement": [
{
"Effect": "Allow",
"Resource": "*",
"Action": [
"ec2:Describe*"
]
}
]
}
以下を実行して Service Role に Policy を追加する。
export _SERVICE_ROLE_POLICY_NAME=oreno-application-role-policy
aws iam put-role-policy \
--role-name ${_SERVICE_ROLE_NAME} \
--policy-name ${_SERVICE_ROLE_POLICY_NAME} \
--policy-document file://oreno-application-role-policy.json
export _APPLICATION_NAME=oreno-application
aws --profile ${_AWS_PROFILE} --region ${_AWS_REGION} \
deploy create-application \
--application-name ${_APPLICATION_NAME}
以下のように出力される。
{
"applicationId": "12345678-1234-5678-9012-1abcde01a123"
}
export _DEPLOYMENT_GROUP_NAME=oreno-application-group
export _DEPLOYMENT_CONIG_NAME=CodeDeployDefault.OneAtATime
aws --profile ${_AWS_PROFILE} --region ${_AWS_REGION} \
deploy create-deployment-group \
--application-name ${_APPLICATION_NAME} \
--deployment-group-name ${_DEPLOYMENT_GROUP_NAME} \
--deployment-config-name ${_DEPLOYMENT_CONIG_NAME} \
--ec2-tag-filters Key=deploy,Value=true,Type=KEY_AND_VALUE \
--service-role-arn ${_SERVICE_ROLE_ARN}
ここまでで CodeDeploy を利用する準備が出来たはず。
CodeDeploy Agent の導入
今回は CentOS 7 に導入する。
$ cat /etc/system-release
CentOS Linux release 7.3.1611 (Core)
sudo yum -y update
sudo yum -y install ruby wget
wget https://aws-codedeploy-ap-northeast-1.s3.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto
$ sudo service codedeploy-agent status
The AWS CodeDeploy agent is running as PID 2223
$ systemctl list-unit-files | grep codedeploy
codedeploy-agent.service enabled
よし。
サンプルアプリケーションの用意
こちらのサンプルアプリケーションを利用する。
mkdir circleci-tutorial
cd circleci-tutorial
aws s3 cp s3://aws-codedeploy-ap-northeast-1/samples/latest/SampleApp_Linux.zip . --region ap-northeast-1
unzip SampleApp_Linux.zip
rm SampleApp_Linux.zip
事前に GitHub に追加していた circleci-tutorial というリポジトリにサンプルアプリケーションを追加する。
$ tree .
.
├── LICENSE.txt
├── README.md
├── appspec.yml
├── index.html
└── scripts
├── install_dependencies
├── start_server
└── stop_server
1 directory, 8 files
appspec.yml は以下の通り。
$ cat appspec.yml
version: 0.0
os: linux
files:
- source: /index.html
destination: /var/www/html/
hooks:
BeforeInstall:
- location: scripts/install_dependencies
timeout: 300
runas: root
- location: scripts/start_server
timeout: 300
runas: root
ApplicationStop:
- location: scripts/stop_server
timeout: 300
runas: root
CircleCI の設定
ずっと CLI でやりかったけど、ここからは GUI で。
サンプルアプリケーションを追加していた circleci-tutorial をプロジェクトとして追加する。
- AWS アクセスキーとシークレットアクセスキーを追加
控えておいたアクセスキーとシークレットアクセスキーを追加する。
cd circleci-tutorial
cat << EOT >> circle.yml
test:
override:
- echo 'test ok.'
deployment:
staging:
branch: master
codedeploy:
${_APPLICATION_NAME}:
application_root: /
region: ap-northeast-1
revision_location:
revision_type: S3
s3_location:
bucket: ${_APPLICATION_NAME}
key_pattern: ${_APPLICATION_NAME}-{BRANCH}-{SHORT_COMMIT}
deployment_group: ${_DEPLOYMENT_GROUP_NAME}
deployment_config: ${_DEPLOYMENT_CONIG_NAME}
EOT
circle.yml は以下のようになる。
$ cat circle.yml
test:
override:
- echo 'test ok.'
deployment:
staging:
branch: master
codedeploy:
oreno-application:
application_root: /
region: ap-northeast-1
revision_location:
revision_type: S3
s3_location:
bucket: oreno-application
key_pattern: oreno-application-{BRANCH}-{SHORT_COMMIT}
deployment_group: oreno-application-group
deployment_config: CodeDeployDefault.OneAtATime
サンプルアプリケーションをデプロイ
サンプルアプリケーションの index.html を以下のように修正する。
$ git diff index.html
diff --git a/index.html b/index.html
index 4feaaa6..ba32312 100644
--- a/index.html
+++ b/index.html
@@ -26,8 +26,7 @@
</head>
<body>
<div align="center">
- <h1>Congratulations</h1>
+ <h1>俺のアプリケーション</h1>
<h2>This application was deployed using AWS CodeDeploy.</h2>
<p>For next steps, read the <a href="http://aws.amazon.com/documentation/codedeploy">AWS CodeDeploy Documentation</a>.</p>
</div>
git push
をする。
$ git add index.html
$ git commit -m "update"
[master 88c6bea] update
1 file changed, 1 insertion(+), 2 deletions(-)
$ git push
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 320 bytes | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To git@github.com:inokappa/circleci-tutorial.git
29cd755..88c6bea master -> master
CircleCI でデプロイ済み。
以下の通り、俺のアプリケーションがデプロイされた。
ということで
CircleCI 用の IAM ユーザーに付与するポリシーで少しハマったけど、思ったよりも簡単に CircleCI と CodeDeploy を組み合わせることが出来た..気がする。