前提条件
CodeDeployへの権限
Code Deployに対してフル権限があること。
AWS CLI
以下のバージョンで動作確認済
- AWS CLI 1.11.5
コマンド
aws --version
結果(例):
aws-cli/1.11.14 Python/2.7.10 Darwin/15.6.0 botocore/1.4.71
バージョンが古い場合は最新版に更新しましょう。
コマンド
sudo -H pip install -U awscli
- 準備
=======
0.1. リージョンの決定
変数の設定
export AWS_DEFAULT_REGION='ap-northeast-1'
0.2. 変数の確認
プロファイルが想定のものになっていることを確認します。
変数の確認
aws configure list
結果(例):
Name Value Type Location
---- ----- ---- --------
profile lambdaFull-handson-mbpr13 env AWS_DEFAULT_PROFILE
access_key ****************XXXX shared-credentials-file
secret_key ****************XXXX shared-credentials-file
region ap-northeast-1 env AWS_DEFAULT_REGION
0.3. IAMロールの指定
変数の設定
IAM_ROLE_NAME='CodeDeployServiceRole'
- アプリケーションの作成
=========================
1.1. アプリケーション名の決定
変数の設定
CODED_APP_NAME="handson-app-$(date +%Y%m%d)" \
&& echo ${CODED_APP_NAME}
1.2. アプリケーションの作成
変数の確認
cat << ETX
CODED_APP_NAME: ${CODED_APP_NAME}
ETX
コマンド
aws deploy create-application \
--application-name ${CODED_APP_NAME}
結果(例):
{
"applicationId": "65ee4ebd-405a-4d60-bac5-e9f3b9291159"
}
コマンド
aws deploy get-application \
--application-name ${CODED_APP_NAME}
結果(例)
{
"application": {
"applicationName": "handson-app-20161121",
"linkedToGitHub": false,
"applicationId": "65ee4ebd-405a-4d60-bac5-e9f3b9291159",
"createTime": 1479717459.603
}
}
- デプロイメントグループの作成
===============================
2.1. デプロイメントグループ名の決定
変数の設定
CODED_DEPLOY_GROUP_NAME="${CODED_APP_NAME}-deployment-group" \
&& echo ${CODED_DEPLOY_GROUP_NAME}
2.2. デプロイメント設定の指定
コマンド
aws deploy list-deployment-configs
結果(例)
{
"deploymentConfigsList": [
"CodeDeployDefault.OneAtATime",
"CodeDeployDefault.AllAtOnce",
"CodeDeployDefault.HalfAtATime"
]
}
変数の設定
CODED_DEPLOY_CONFIG_NAME='CodeDeployDefault.OneAtATime'
2.3. デプロイメントグループの作成
まず、IAMロールのARNを取得します。
コマンド
IAM_ROLE_ARN=$( \
aws iam get-role \
--role-name ${IAM_ROLE_NAME} \
--query 'Role.Arn' \
--output text \
) \
&& echo ${IAM_ROLE_ARN}
結果(例):
arn:aws:iam::XXXXXXXXXXXX:role/CodeDeployServiceRole
変数の確認
cat << ETX
CODED_APP_NAME: ${CODED_APP_NAME}
AS_GROUP_NAME: ${AS_GROUP_NAME}
CODED_DEPLOY_GROUP_NAME: ${CODED_DEPLOY_GROUP_NAME}
CODED_DEPLOY_CONFIG_NAME: ${CODED_DEPLOY_CONFIG_NAME}
IAM_ROLE_ARN: ${IAM_ROLE_ARN}
ETX
コマンド
aws deploy create-deployment-group \
--application-name ${CODED_APP_NAME} \
--auto-scaling-groups ${AS_GROUP_NAME} \
--deployment-group-name ${CODED_DEPLOY_GROUP_NAME} \
--deployment-config-name ${CODED_DEPLOY_CONFIG_NAME} \
--service-role-arn ${IAM_ROLE_ARN}
結果(例)
{
"deploymentGroupId": "4a177a8a-0b39-491a-b043-7ce3854e53dc"
}
- デプロイメントの作成
=======================
3.1. ソースコードの指定
変数の設定
S3_BUCKET_NAME=aws-codedeploy-${AWS_DEFAULT_REGION}
S3_OBJECT_KEY='samples/latest/SampleApp_Linux.zip'
3.2. デプロイメントの作成
変数の確認
cat << ETX
CODED_APP_NAME: ${CODED_APP_NAME}
CODED_DEPLOY_CONFIG_NAME: ${CODED_DEPLOY_CONFIG_NAME}
CODED_DEPLOY_GROUP_NAME: ${CODED_DEPLOY_GROUP_NAME}
S3_BUCKET_NAME: ${S3_BUCKET_NAME}
S3_OBJECT_KEY: ${S3_OBJECT_KEY}
ETX
コマンド
aws deploy create-deployment \
--application-name ${CODED_APP_NAME} \
--deployment-config-name ${CODED_DEPLOY_CONFIG_NAME} \
--deployment-group-name ${CODED_DEPLOY_GROUP_NAME} \
--s3-location bucket=${S3_BUCKET_NAME},bundleType=zip,key=${S3_OBJECT_KEY}
結果(例)
{
"deploymentId": "d-89DOVR11J"
}
コマンド
aws deploy list-deployments \
--application-name ${CODED_APP_NAME} \
--deployment-group-name ${CODED_DEPLOY_GROUP_NAME} \
--query "deployments"
結果(例)
[
"d-xxxxxxxx"
]
変数の設定
CODED_DEPLOYMENT_ID='<上記のdeployment ID>'
コマンド
aws deploy get-deployment \
--deployment-id ${CODED_DEPLOYMENT_ID} \
--query "deploymentInfo.status"
結果(例):
"Succeeded"
- アプリケーションの確認
==
コマンド
ARRAY_EC2_INSTANCES=$( \
aws autoscaling describe-auto-scaling-groups \
--auto-scaling-group-names ${AS_GROUP_NAME} \
--query "AutoScalingGroups[0].Instances[*].InstanceId" \
--output text \
) \
&& echo ${ARRAY_EC2_INSTANCES}
結果(例)
i-08cc559c
コマンド
EC2_INSTANCE_ID=$( \
echo ${ARRAY_EC2_INSTANCES} \
| sed 's/ .*$//' \
) \
&& echo ${EC2_INSTANCE_ID}
コマンド
EC2_INSTANCE_IP=$( \
aws ec2 describe-instances \
--instance-id ${EC2_INSTANCE_ID} \
--query "Reservations[0].Instances[0].PublicIpAddress" \
--output text \
) \
&& echo ${EC2_INSTANCE_IP}
結果(例)
xxx.xxx.xxx.xxx
コマンド
ssh -i ${FILE_SSH_KEY} ec2-user@${EC2_INSTANCE_IP}
コマンド
cat /var/www/html/index.html |grep '<h2>'
結果(例):
<h2>This application was deployed using AWS CodeDeploy.</h2>
完了
参考(appspec.yml)
http://s3-ap-northeast-1.amazonaws.com/aws-codedeploy-ap-northeast-1/samples/latest/SampleApp_Windows.zip をダウンロードして展開してみましょう。
appspec.yml というファイルにdeployで何をやるかが定義されています。