1.5. EC2インスタンスの作成¶
作業の目的 [why]¶
EC2インスタンス"handson-2017-10-09"を作成します。
完了条件/事前条件 [設計者用情報]
完了条件 [after]
主処理は、以下を満たしたときに成功したものとします。
- 完了条件1
- EC2インスタンス"handson-2017-10-09"が存在する。
事前条件 [before]
主処理の実施は、以下の状態であることを前提とします。
- 事前条件1
- EC2インスタンス"handson-2017-10-09"が存在しない。
- 事前条件2
- ユーザデータ"${HOME}/tmp/handson-2017-10-09.sh"が存在する。
- 事前条件3
- VPC"vpc-handson-2017-10-09"が存在する。
- 事前条件4
- VPC"vpc-handson-2017-10-09"にサブネット"public-a"が存在する。
- 事前条件5
- キーペア"<キーペア名>"が存在する。
前提と異なることが判明した場合、直ちに処理を中止します。
課題
(未検証)
作業対象 [what]¶
- EC2サービス
標準時間¶
8分
前提条件¶
作業環境条件 [where]¶
本作業は、以下の作業環境で行います。
作業環境条件1: OSとバージョン
Amazon Linuxの以下のバージョンで動作確認済
コマンド:
cat /etc/issue | head -1
結果(例):
Amazon Linux AMI release 2016.09
作業環境条件2: シェルとバージョン
bashの以下のバージョンで動作確認済
コマンド:
bash --version -v | head -1
結果(例):
GNU bash, バージョン 4.2.46(1)-release (x86_64-redhat-linux-gnu)
作業環境条件3: AWS CLIのバージョン
以下のバージョンで動作確認済
- AWS CLI 1.11.117
コマンド:
aws --version
結果(例):
aws-cli/1.11.166 Python/2.7.12 Linux/4.4.11-23.53.amzn1.x86_64 botocore/1.7.24
バージョンが古い場合は最新版に更新しましょう。
コマンド:
sudo -H pip install -U awscli
開始条件¶
作業に必要なモノ・情報 [resource]¶
作業開始には、以下が全て揃っていることが必要です。
リソース1: EC2インスタンスのタグ名
- 作成するEC2インスタンスのタグ名称です。
- 今回は"handson-2017-10-09"とします。
リソース2: AMIイメージ名
- 作成するEC2インスタンスのAMIイメージ名です。
- 今回は"amzn-ami-hvm-2017.09.0.20170930-x86_64-gp2"とします。
リソース3: EC2インスタンスのインスタンスタイプ
- 作成するEC2インスタンスのインスタンスタイプです。
- 今回は"t2.micro"とします。
リソース4: EC2インスタンスのユーザデータファイル名
- 作成するEC2インスタンスのユーザデータファイル名です。
- 今回は"${HOME}/tmp/handson-2017-10-09.sh"とします。
リソース5: VPCのタグ名
- インスタンスが利用するVPCのタグ名称です。
- 今回は"vpc-handson-2017-10-09"とします。
リソース6: サブネットのタグ名
- 作成するインスタンスが利用するサブネットのタグ名称です。
- 今回は"public-a"とします。
リソース7: セキュリティグループのタグ名
- 作成するインスタンスが利用するセキュリティグループの名称です。
- 今回は"webserver-handson-2017-10-09"とします。
リソース8: キーペア名
- 作成するインスタンスが利用するキーペア名です。
- 今回は"<キーペア名>"とします。
タスクの実施¶
0. パラメータの指定¶
まず変数の確認をします。
変数の確認:
cat << ETX 0.a. AWS_DEFAULT_PROFILE: actual: ${AWS_DEFAULT_PROFILE} expect: <IAMのフル権限を許可されたプロファイル> 0.b. AWS_DEFAULT_REGION: actual: ${AWS_DEFAULT_REGION} expect: ap-northeast-1 0.1. EC2_INSTANCE_TAG_NAME: actual: ${EC2_INSTANCE_TAG_NAME} expect: handson-2017-10-09 0.2. EC2_IMAGE_NAME: actual: ${EC2_IMAGE_NAME} expect: amzn-ami-hvm-2017.09.0.20170930-x86_64-gp2 0.3. EC2_INSTANCE_TYPE: actual: ${EC2_INSTANCE_TYPE} expect: t2.micro 0.4. FILE_USERDATA: actual: ${FILE_USERDATA} expect: ${HOME}/tmp/handson-2017-10-09.sh 0.5. VPC_TAG_NAME: actual: ${VPC_TAG_NAME} expect: vpc-handson-2017-10-09 0.6. VPC_SUBNET_TAG_NAME: actual: ${VPC_SUBNET_TAG_NAME} expect: public-a 0.7. VPC_SG_NAME: actual: ${VPC_SG_NAME} expect: webserver-handson-2017-10-09 0.8. EC2_KEY_PAIR_NAME: actual: ${EC2_KEY_PAIR_NAME} expect: <キーペア名> ETX
変数が入っていない、適切でない場合は、それぞれの手順番号について作業を行います。
0.a. プロファイルの指定¶
プロファイルの一覧を確認します。
コマンド:
cat ~/.aws/credentials \ | grep '\[' \ | sed 's/\[//g' | sed 's/\]//g'
結果(例):
iamFull-prjz-mbpr13 <IAMのフル権限を許可されたプロファイル>
変数の設定:
export AWS_DEFAULT_PROFILE='<IAMのフル権限を許可されたプロファイル>'
0.2: AMIイメージ名¶
作成するEC2インスタンスのAMIイメージ名を指定します。
変数の設定:
EC2_IMAGE_NAME="amzn-ami-hvm-2017.09.0.20170930-x86_64-gp2"
0.4: EC2インスタンスのユーザデータファイル名¶
作成するEC2インスタンスのユーザデータファイル名を指定します。
変数の設定:
FILE_USERDATA="${HOME}/tmp/handson-2017-10-09.sh"
0.7: セキュリティグループ名¶
作成するインスタンスが利用するセキュリティグループ名を指定します。
変数の設定:
VPC_SG_NAME="webserver-handson-2017-10-09"
再確認¶
設定されている変数の内容を再確認します。
変数の確認:
cat << ETX 0.a. AWS_DEFAULT_PROFILE: actual: ${AWS_DEFAULT_PROFILE} expect: <IAMのフル権限を許可されたプロファイル> 0.b. AWS_DEFAULT_REGION: actual: ${AWS_DEFAULT_REGION} expect: ap-northeast-1 0.1. EC2_INSTANCE_TAG_NAME: actual: ${EC2_INSTANCE_TAG_NAME} expect: handson-2017-10-09 0.2. EC2_IMAGE_NAME: actual: ${EC2_IMAGE_NAME} expect: amzn-ami-hvm-2017.09.0.20170930-x86_64-gp2 0.3. EC2_INSTANCE_TYPE: actual: ${EC2_INSTANCE_TYPE} expect: t2.micro 0.4. FILE_USERDATA: actual: ${FILE_USERDATA} expect: ${HOME}/tmp/handson-2017-10-09.sh 0.5. VPC_TAG_NAME: actual: ${VPC_TAG_NAME} expect: vpc-handson-2017-10-09 0.6. VPC_SUBNET_TAG_NAME: actual: ${VPC_SUBNET_TAG_NAME} expect: public-a 0.7. VPC_SG_NAME: actual: ${VPC_SG_NAME} expect: webserver-handson-2017-10-09 0.8. EC2_KEY_PAIR_NAME: actual: ${EC2_KEY_PAIR_NAME} expect: <キーペア名> ETX
1. 前処理¶
1.1. 状態確認に必要な情報の取得¶
sample
1.2. 処理対象の状態確認¶
主処理の実施は、以下の状態であることを前提とします。
前提と異なることが判明した場合、直ちに処理を中止します。
事前条件1: EC2インスタンス"handson-2017-10-09"が存在しない。
「EC2インスタンス"handson-2017-10-09"が存在しない。」ことを確認します。
事前条件2: ユーザデータ"${HOME}/tmp/handson-2017-10-09.sh"が存在する。
「ユーザデータ"${HOME}/tmp/handson-2017-10-09.sh"が存在する。」ことを確認します。
コマンド:
ls -1 ${FILE_USERDATA}
結果(例):
${HOME}/tmp/handson-2017-10-09.sh
事前条件3: VPC"vpc-handson-2017-10-09"が存在する。
「VPC"vpc-handson-2017-10-09"が存在する。」ことを確認します。
変数の設定:
EC2_TAG_KEY='Name'
コマンド:
aws ec2 describe-vpcs \ --filters Name=tag:${EC2_TAG_KEY},Values=${VPC_TAG_NAME} \ --query "Vpcs[].Tags[].Value"
結果(例):
[ "vpc-handson-2017-10-09" ]
VPC IDを取得します。
コマンド:
VPC_ID=$( \ aws ec2 describe-vpcs \ --filters Name=tag:${EC2_TAG_KEY},Values=${VPC_TAG_NAME} \ --query 'Vpcs[].VpcId' \ --output text \ ) \ && echo ${VPC_ID}
結果(例):
vpc-xxxxxxxx
事前条件4: VPC"vpc-handson-2017-10-09"にサブネット"public-a"が存在する。
「VPC"vpc-handson-2017-10-09"にサブネット"public-a"が存在する。」ことを確認します。
変数の設定:
EC2_TAG_KEY='Name'
コマンド:
aws ec2 describe-subnets \ --filters Name=vpc-id,Values=${VPC_ID} \ --filters Name=tag:${EC2_TAG_KEY},Values=${VPC_SUBNET_TAG_NAME} \ --query "Subnets[].Tags[].Value"
結果(例):
[ "public-a" ]
サブネットIDを取得します。
コマンド:
VPC_SUBNET_ID=$( \ aws ec2 describe-subnets \ --filters Name=vpc-id,Values=${VPC_ID} \ --filters Name=tag:${EC2_TAG_KEY},Values=${VPC_SUBNET_TAG_NAME} \ --query "Subnets[].SubnetId" \ --output text \ ) \ && echo ${VPC_SUBNET_ID}
結果(例):
subnet-xxxxxxxx
事前条件5: キーペア"<キーペア名>"が存在する。
「キーペア"<キーペア名>"が存在する。」ことを確認します。
コマンド:
aws ec2 describe-key-pairs \ --key-names ${EC2_KEY_PAIR_NAME}
結果(例):
{ "KeyPairs": [ { "KeyName": "<キーペア名>", "KeyFingerprint": "xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx" } ] }
事前条件6:
変数の設定:
EC2_TAG_KEY='Name'
コマンド:
aws ec2 describe-security-groups \ --filter Name=vpc-id,Values=${VPC_ID} \ Name=group-name,Values=${VPC_SG_NAME} \ --query 'SecurityGroups[].GroupName'
結果(例):
[ "webserver-handson-2017-10-09" ]
セキュリティグループIDを取得します。
コマンド:
VPC_SG_ID=$( \ aws ec2 describe-security-groups \ --filter Name=vpc-id,Values=${VPC_ID} \ Name=group-name,Values=${VPC_SG_NAME} \ --query "SecurityGroups[].GroupId" \ --output text \ ) \ && echo ${VPC_SG_ID}
結果(例):
sg-xxxxxxxx
事前条件7:
イメージIDを取得します。
コマンド:
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.3. 主処理に必要な情報の取得¶
セキュリティグループ
変数の設定:
ARRAY_VPC_SG_IDS="${VPC_SG_ID}" \ && echo ${ARRAY_VPC_SG_IDS}
タグ設定文字列の生成
変数の設定:
STRING_TAG_CONF="ResourceType=instance,Tags=[{Key=${EC2_TAG_KEY},Value=${EC2_INSTANCE_TAG_NAME}}]" \ && echo ${STRING_TAG_CONF}
結果(例):
ResourceType=instance,Tags=[{Key=${Name},Value=${handson-2017-10-09}}
2. 主処理¶
EC2インスタンスの作成¶
変数の確認:
cat << ETX EC2_IMAGE_ID actual: ${EC2_IMAGE_ID} expect: ami-2a69be4c EC2_INSTANCE_TYPE actual: ${EC2_INSTANCE_TYPE} expect: t2.micro VPC_SUBNET_ID actual: ${VPC_SUBNET_ID} expect: subnet-xxxxxxxx ARRAY_VPC_SG_IDS actual: ${ARRAY_VPC_SG_IDS} expect: sg-xxxxxxxx STRING_TAG_CONF actual: ${STRING_TAG_CONF} expect: ResourceType=instance,Tags=[{Key=${Name},Value=${handson-2017-10-09}} FILE_USERDATA actual: ${FILE_USERDATA} expect: ${HOME}/tmp/handson-2017-10-09.sh EC2_KEY_PAIR_NAME actual: ${EC2_KEY_PAIR_NAME} expect: <キーペア名> ETX
コマンド:
aws ec2 run-instances \ --image-id ${EC2_IMAGE_ID} \ --instance-type ${EC2_INSTANCE_TYPE} \ --subnet-id ${VPC_SUBNET_ID} \ --security-group-ids ${ARRAY_VPC_SG_IDS} \ --tag-specifications ${STRING_TAG_CONF} \ --user-data file://${FILE_USERDATA} \ --associate-public-ip-address \ --key-name ${EC2_KEY_PAIR_NAME}
結果(例):
{ "OwnerId": "XXXXXXXXXXXX", "ReservationId": "r-xxxxxxxx", "Groups": [], "Instances": [ { "Monitoring": { "State": "disabled" }, "PublicDnsName": "", "RootDeviceType": "ebs", "State": { "Code": 0, "Name": "pending" }, "EbsOptimized": false, "LaunchTime": "2017-10-09T01:23:45.000Z", "PrivateIpAddress": "xxx.xxx.xxx.xxx", "ProductCodes": [], "VpcId": "vpc-xxxxxxxx", "StateTransitionReason": "", "InstanceId": "i-xxxxxxxx", "ImageId": "ami-xxxxxxxx", "PrivateDnsName": "ip-xxx-xx-xx-xxx.ap-northeast-1.compute.internal", "KeyName": "<キーペア名>", "SecurityGroups": [ { "GroupName": "webserver-handson-2017-10-09", "GroupId": "sg-xxxxxxxx" } ], "ClientToken": "", "SubnetId": "subnet-xxxxxxxx", "InstanceType": "t2.micro", "NetworkInterfaces": [ { "Status": "in-use", "MacAddress": "xx:xx:xx:xx:xx:xx", "SourceDestCheck": true, "VpcId": "vpc-xxxxxxxx", "Description": "", "NetworkInterfaceId": "eni-xxxxxxxx", "PrivateIpAddresses": [ { "PrivateDnsName": "ip-xxx-xx-xx-xxx.ap-northeast-1.compute.internal", "Primary": true, "PrivateIpAddress": "xxx.xxx.xxx.xxx" } ], "PrivateDnsName": "ip-xxx-xx-xx-xxx.ap-northeast-1.compute.internal", "Attachment": { "Status": "attaching", "DeviceIndex": 0, "DeleteOnTermination": true, "AttachmentId": "eni-attach-xxxxxxxx", "AttachTime": "2017-10-09T01:23:45.000Z" }, "Groups": [ { "GroupName": "webserver-handson-2017-10-09", "GroupId": "sg-xxxxxxxx" } ], "SubnetId": "subnet-xxxxxxxx", "OwnerId": "XXXXXXXXXXXX", "PrivateIpAddress": "xxx.xxx.xxx.xxx" } ], "SourceDestCheck": true, "Placement": { "Tenancy": "default", "GroupName": "", "AvailabilityZone": "ap-northeast-1a" }, "Hypervisor": "xen", "BlockDeviceMappings": [], "Architecture": "x86_64", "StateReason": { "Message": "pending", "Code": "<ステータス>" }, "RootDeviceName": "/dev/xvda", "VirtualizationType": "hvm", "AmiLaunchIndex": 0 } ] }
3. 後処理¶
完了条件の確認¶
主処理は、以下を満たしたときに成功したものとします。
完了条件1: EC2インスタンス"handson-2017-10-09"が存在する。
「EC2インスタンス"handson-2017-10-09"が存在する。」ことを確認します。
コマンド:
aws ec2 describe-instances
結果(例):
|yet|
3.3. 後処理に必要な作業¶
後処理に必要な作業があれば実施します。
コマンド:
EC2_PUBLIC_IP=$( \ aws ec2 describe-instances \ --instance-id ${EC2_INSTANCE_ID} \ --query "Reservations[].Instances[].PublicIpAddress" \ --output text \ ) \ && echo ${EC2_PUBLIC_IP}
結果(例):
xxx.xxx.xxx.xxx