前提条件
AutoScalingへの権限
AutoScalingに対してフル権限があること。
AWS CLIのバージョン
以下のバージョンで動作確認済
- AWS CLI 1.11.14
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
デフォルトVPCの存在
デフォルトVPCが存在すること。
SSHを許可するセキュリティグループの存在
存在しない場合は、作成します:
キーペアの存在
存在しない場合は、作成します:
- 準備
=======
0.1. リージョンの決定
export AWS_DEFAULT_REGION='ap-northeast-1'
0.2. 変数の確認
プロファイルが想定のものになっていることを確認します。
aws configure list
結果(例)
Name Value Type Location
---- ----- ---- --------
profile iamFull-prjz-mbp13 env AWS_DEFAULT_PROFILE
access_key ****************XXXX shared-credentials-file
secret_key ****************XXXX shared-credentials-file
region ap-northeast-1 env AWS_DEFAULT_REGION
AssumeRoleを利用している場合はprofileが ''と表示されます。 それ以外のときにprofileが '' と表示される場合は、以下を実行してください。
export AWS_DEFAULT_PROFILE=<IAMユーザ名>
- 事前作業
===========
1.1. 起動設定名の決定
AS_LAUNCH_CONFIG_NAME="handson-$(date +%Y%m%d)" \
&& echo ${AS_LAUNCH_CONFIG_NAME}
同名の起動設定が存在しないことを確認します。
aws autoscaling describe-launch-configurations \
--launch-configuration-names ${AS_LAUNCH_CONFIG_NAME}
結果(例):
{
"LaunchConfigurations": []
}
1.2. セキュリティグループの指定
セキュリティグループの一覧を確認します。
aws ec2 describe-security-groups \
--query 'SecurityGroups[].GroupName'
-
'ec2-http-https-global-inbound'が存在しない場合は、 http://qiita.com/tcsh/items/1d6a499b03b776355ee2 を実施してください。
-
'ec2-ssh-global-inbound'が存在しない場合は、 http://qiita.com/tcsh/items/77f8c9887634fd67f4d8 を実施してください。
HTTP/HTTPS
利用するセキュリティグループ名を指定します。
VPC_SG_NAME='ec2-http-https-global-inbound'
セキュリティグループのIDを取得します。
VPC_SG_ID=$( \
aws ec2 describe-security-groups \
--filter Name=group-name,Values=${VPC_SG_NAME} \
--query 'SecurityGroups[].GroupId' \
--output text \
) \
&& echo ${VPC_SG_ID}
sg-xxxxxxxx
セキュリティグループを配列に入れておきます。
ARRAY_VPC_SG_ID="${VPC_SG_ID} ${ARRAY_VPC_SG_ID}" \
&& echo ${ARRAY_VPC_SG_ID}
SSH
利用するセキュリティグループ名を指定します。
VPC_SG_NAME='ec2-ssh-global-inbound'
セキュリティグループのIDを取得します。
VPC_SG_ID=$( \
aws ec2 describe-security-groups \
--filter Name=group-name,Values=${VPC_SG_NAME} \
--query 'SecurityGroups[].GroupId' \
--output text \
) \
&& echo ${VPC_SG_ID}
sg-xxxxxxxx
セキュリティグループを配列に入れておきます。
ARRAY_VPC_SG_ID="${VPC_SG_ID} ${ARRAY_VPC_SG_ID}" \
&& echo ${ARRAY_VPC_SG_ID}
1.3. キーペアの指定
まず、キーペアの一覧を確認します。
aws ec2 describe-key-pairs \
--query 'KeyPairs[].KeyName'
結果(例):
{
"KeyPairs": [
{
"KeyName": "prjz-ap-northeast-1-ec2",
"KeyFingerprint": "xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"
}
]
}
利用するキーペア名を指定します。
EC2_KEY_PAIR_NAME='<キーペアー名>'
利用するキーペアの秘密鍵ファイルを指定します。
FILE_SSH_KEY="${HOME}/.ssh/<キーペア秘密鍵のファイル名>" \
&& echo ${FILE_SSH_KEY}
秘密鍵が存在することを確認しましょう。
ls ${FILE_SSH_KEY}
1.4. インスタンスタイプの決定
EC2_INSTANCE_TYPE='t2.micro'
1.5. イメージIDの決定
AMIを選択します。
AMZLINUX_VERSION='2016.03.3'
EC2_IMAGE_NAME="amzn-ami-hvm-${AMZLINUX_VERSION}.x86_64-gp2"
EC2_IMAGE_ID=$( \
aws ec2 describe-images \
--filters Name=name,Values="${EC2_IMAGE_NAME}" \
--query 'Images[].ImageId' --output text \
) \
&& echo ${EC2_IMAGE_ID}
結果(例):
ami-XXXXXXXX
1.6. インスタンスプロファイルの指定
aws iam list-instance-profiles \
--query 'InstanceProfiles[].InstanceProfileName'
結果(例):
[
"CodeDeployEC2InstanceProfile"
]
IAM_INSTANCE_PROFILE_NAME='CodeDeployEC2InstanceProfile'
aws iam get-instance-profile \
--instance-profile-name ${IAM_INSTANCE_PROFILE_NAME}
結果(例):
{
"InstanceProfiles": [
{
"InstanceProfileId": "AIPAJRUJIZXNNQU4R6VZM",
"Roles": [
{
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Effect": "Allow",
"Sid": ""
}
]
},
"RoleId": "AROAXXXXXXXXXXXXXXXXX",
"CreateDate": "2016-11-21T01:23:45Z",
"RoleName": "CodeDeployEC2InstanceProfileRole",
"Path": "/",
"Arn": "arn:aws:iam::XXXXXXXXXXXX:role/CodeDeployEC2InstanceProfileRole"
}
],
"CreateDate": "2016-11-21T01:23:45Z",
"InstanceProfileName": "CodeDeployEC2InstanceProfile",
"Path": "/",
"Arn": "arn:aws:iam::XXXXXXXXXXXX:instance-profile/CodeDeployEC2InstanceProfile"
}
]
}
1.7. user dataスクリプトの作成
FILE_EC2_USERDATA='userdata.bash'
cat << EOF > ${FILE_EC2_USERDATA}
#!/bin/bash
yum -y update
yum install -y ruby
yum install -y wget
cd /home/ec2-user
wget https://aws-codedeploy-${AWS_DEFAULT_REGION}.s3.amazonaws.com/latest/install
chmod +x ./install
./install auto
EOF
cat ${FILE_EC2_USERDATA}
- 起動設定の作成
=================
2.1. 起動設定の作成
cat << ETX
AS_LAUNCH_CONFIG_NAME: ${AS_LAUNCH_CONFIG_NAME}
EC2_IMAGE_ID: ${EC2_IMAGE_ID}
ARRAY_VPC_SG_ID: ${ARRAY_VPC_SG_ID}
EC2_INSTANCE_TYPE: ${EC2_INSTANCE_TYPE}
IAM_INSTANCE_PROFILE_NAME: ${IAM_INSTANCE_PROFILE_NAME}
FILE_EC2_USERDATA: ${FILE_EC2_USERDATA}
EC2_KEY_PAIR_NAME: ${EC2_KEY_PAIR_NAME}
ETX
aws autoscaling create-launch-configuration \
--launch-configuration-name ${AS_LAUNCH_CONFIG_NAME} \
--image-id ${EC2_IMAGE_ID} \
--security-groups ${ARRAY_VPC_SG_ID} \
--instance-type ${EC2_INSTANCE_TYPE} \
--iam-instance-profile ${IAM_INSTANCE_PROFILE_NAME} \
--user-data file://${FILE_EC2_USERDATA} \
--key-name ${EC2_KEY_PAIR_NAME}
結果:
(戻り値なし)
- 事後作業
===========
起動設定の確認
aws autoscaling describe-launch-configurations \
--launch-configuration-names ${AS_LAUNCH_CONFIG_NAME}
結果(例):
{
"LaunchConfigurations": [
{
"UserData": "IyEvYmluL2Jhc2gKeXVtIC15IHVwZGF0ZQp5dW0gaW5zdGFsbCAteSBydWJ5Cnl1bSBpbnN0YWxsIC15IHdnZXQKY2QgL2hvbWUvZWMyLXVzZXIKd2dldCBodHRwczovL2F3cy1jb2RlZGVwbG95LXVzLXdlc3QtMi5zMy5hbWF6b25hd3MuY29tL2xhdGVzdC9pbnN0YWxsCmNobW9kICt4IC4vaW5zdGFsbAouL2luc3RhbGwgYXV0bwo=",
"IamInstanceProfile": "CodeDeployEC2InstanceProfile",
"EbsOptimized": false,
"LaunchConfigurationARN": "arn:aws:autoscaling:ap-northeast-1:XXXXXXXXXXXX:launchConfiguration:8d1a40ce-bec5-480c-8ab1-158f9f4a7438:launchConfigurationName/handson-20161121",
"InstanceMonitoring": {
"Enabled": true
},
"ClassicLinkVPCSecurityGroups": [],
"CreatedTime": "2016-11-21T01:23:45.678Z",
"BlockDeviceMappings": [],
"KeyName": "prjz-ap-northeast-1-ec2",
"SecurityGroups": [
"sg-68b42e11"
],
"LaunchConfigurationName": "handson-20161121",
"KernelId": "",
"RamdiskId": "",
"ImageId": "ami-xxxxxxxx",
"InstanceType": "t2.micro"
}
]
}