5/28(木)、JAWS-UG CLI専門支部 #155R EC2入門 に参加しました。 今回も感想とやったことの手順(再構築)を書きます。
目次
- 目次
イベントページ
ハンズオンでやったこと
以下の通りです。事前準備として、Cloud9上にハンズオン環境を構築しました。 ハンズオンでは、Cloud9のターミナルでコマンド実行します。
EC2とは
- Elastic Compute Cloud(EC2)
- EC2インスタンスはVPC内に作られる。
- ネットワークインターフェースにセキュリティグループ(ファイアウォール機能)が紐づけられている。
- 公開鍵はEC2内にて管理されている。ユーザは触ることができない。
- デフォルトVPCの配下にはインターネットゲートウェイとデフォルトサブネットが設定されている。
- 検証環境として使う場合は手早く使える。
- 本番環境の場合は、最初に削除した方が良いもの。仕事で使うのは微妙。
- EC2コマンドの分類は大きく以下の通り(400近くある)
- グローバルインフラストラクチャー情報
- ネットワークとインスタンス共通
- ネットワーク
- EC2 API共通
- インスタンス
- ブロックストレージ
- その他
感想
ハンズオン手順が長くなるので、感想を先に書きます。
前回にも増してボリュームのあるハンズオンでしたが、今回もハンズオンを終わらせて、細かくは後で復習するというスタンスで臨みました。CLIでの作成は初でしたが、CLIで作っていく方がサーバやネットワークを構築しているという感覚になって面白かったです。前回のように復習時にコマンドのことを深掘りして操作することで、何をやっているのかを理解することができてコマンド操作が楽しくなってきました。これを機にLinuxコマンドやシェルについてももっと勉強しようと思いました。SQS入門とSNS入門のハンズオンももう一度復習したくなりました!
次回ハンズオン(6/8 EC2基礎(VPC))も参加します!
ハンズオン手順
事前作業として、IAMロールにIAMポリシ「AmazonEC2FullAccess」をアタッチします。
1.デフォルトVPCの構築
※デフォルトVPCがある場合は、この手順は実行不要です。
①変数[AWS_DEFAULT_REGION]にデフォルトリージョンを指定します。
- 東京リージョンを指定します。
export AWS_DEFAULT_REGION='ap-northeast-1'
②各変数に正しいパラメータ値が格納されていることを確認します。
cat << END
# 0. AWS_DEFAULT_REGION:"ap-northeast-1"
AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}"
END
③デフォルトVPCを作成します。
aws ec2 create-default-vpc
2. EC2キーペアの作成
①変数[AWS_DEFAULT_REGION]にデフォルトリージョンを指定します。
- 東京リージョンを指定します。
export AWS_DEFAULT_REGION='ap-northeast-1'
②変数[EC2_KEY_PAIR_NAME]にEC2キーペア名を指定します。
EC2_KEY_PAIR_NAME="handson-cli-ec2-getting_started-keypair"
③変数[DIR_KEY]に鍵ファイルディレクトリを指定します。
DIR_KEY="${HOME}/.ssh"
④鍵ファイルディレクトリを作成します。
- chmod コマンドでディレクトリのアクセス権限を指定します。
700は、所有者(自分)はフルアクセス許可という意味です。
mkdir -p ${HOME}/.ssh && chmod 700 ${HOME}/.ssh
⑤AWS IDを取得します。
- アカウントIDの取得は、
sts get-caller-identityコマンドを使います。 - オプションをつけないと、UserIDとArnとAccountを表示するため、query オプションを使ってAccountのみを出力します。
AWS_ID=$( \
aws sts get-caller-identity \
--query 'Account' \
--output text \
) \
&& echo ${AWS_ID}
⑥SSH秘密鍵ファイル名を指定します。
FILE_SSH_KEY_SECRET="${DIR_KEY}/${EC2_KEY_PAIR_NAME}-${AWS_ID}-${AWS_DEFAULT_REGION}-ec2.pem" \
&& echo ${FILE_SSH_KEY_SECRET}
⑦EC2キーペアを作成します。
- キーペアは、
create-key-pairコマンドで作成します。 key-nameオプションでキーペア名を指定します。- chmodコマンドの
400は所有者のみに読み取り権限を付与するという意味です。
aws ec2 create-key-pair \
--key-name ${EC2_KEY_PAIR_NAME} \
--query 'KeyMaterial' --output text \
> ${FILE_SSH_KEY_SECRET} \
&& cat ${FILE_SSH_KEY_SECRET} \
&& chmod 400 ${FILE_SSH_KEY_SECRET}
⑧EC2キーペアが存在することを確認します。
- キーペアを確認するためには、
ec2 describe-key-pairsコマンドを使います。
aws ec2 describe-key-pairs \
--query "KeyPairs[?KeyName == \`${EC2_KEY_PAIR_NAME}\`].KeyName" \
--output text
⑨SSH秘密鍵が存在することを確認します。
ls ${FILE_SSH_KEY_SECRET}
3.ユーザーデーターの作成
①変数[DIR_USER_DATA]にユーザデータ用ディレクトリを指定します。
DIR_USER_DATA="${HOME}/environment/conf-handson-cli-ec2-getting_started"
②ディレクトリを作成します。
mkdir -p ${HOME}/environment/conf-handson-cli-ec2-getting_started
③ディレクトリが存在することを確認します。
ls -d ${HOME}/environment/conf-handson-cli-ec2-getting_started
④変数[USER_DATA_NAME]にユーザデータ名を指定します。
USER_DATA_NAME='handson-cli-ec2-getting_started-userdata'
⑤変数[FILE_USER_DATA]にユーザデータファイル名を指定します。
FILE_USER_DATA="${DIR_USER_DATA}/${USER_DATA_NAME}.bash" \
&& echo ${FILE_USER_DATA}
⑥変数[PORT_SSHD]にSSHポート番号'22022'を指定します。
PORT_SSHD='22022'
⑦以下のコマンドを実行して、ユーザデータファイルを作成します。
cat << EOF1 > ${FILE_USER_DATA}
#!/bin/bash
# configure sshd
cat << EOF >> /etc/ssh/sshd_config
Port ${PORT_SSHD}
EOF
systemctl restart sshd.service
# yum
yum update -y
EOF1
- ファイルの中身を確認します。
cat ${FILE_USER_DATA}
⑧ユーザデータが存在することを確認します。
ls ${FILE_USER_DATA}
4.デフォルトVPCセキュリティグループへのIngressルール追加
①リージョンを指定します。
export AWS_DEFAULT_REGION='ap-northeast-1'
②変数[EC2_SECURITY_GROUP_NAME]にセキュリティグループ''default'を指定します。
EC2_SECURITY_GROUP_NAME='default'
③変数[EC2_SECURITY_GROUP_PROTOCOL]にプロトコル'tcp'を指定します。
EC2_SECURITY_GROUP_PROTOCOL='tcp'
④変数[EC2_SECURITY_GROUP_PORT]にSSHポート番号'22022'を指定します。
EC2_SECURITY_GROUP_PORT='22022'
⑤対象となるIPアドレスの範囲を指定します。
IP_ADDR_LOCAL=$( curl -s http://checkip.amazonaws.com/ ) \
&& echo ${IP_ADDR_LOCAL}
- CIDRの値を変数[EC2_SECURITY_GROUP_CIDR]に格納します。
EC2_SECURITY_GROUP_CIDR="${IP_ADDR_LOCAL}/32" \
&& echo ${EC2_SECURITY_GROUP_CIDR}
⑥以下のコマンドを実行して、セキュリティグループにルールを追加します。
- セキュリティグループにルールを追加するには、
ec2 authorize-security-group-ingressコマンドを使います。
aws ec2 authorize-security-group-ingress \
--group-name ${EC2_SECURITY_GROUP_NAME} \
--protocol ${EC2_SECURITY_GROUP_PROTOCOL} \
--port ${EC2_SECURITY_GROUP_PORT} \
--cidr ${EC2_SECURITY_GROUP_CIDR}
5.EC2インスタンスの構築
①リージョンを指定します。
export AWS_DEFAULT_REGION='ap-northeast-1'
②EC2インスタンスのタグ名を指定します。
EC2_INSTANCE_TAG_NAME='handson-cli-ec2-getting_started-instance'
③起動時に利用するAMIイメージ名を指定します。
EC2_IMAGE_NAME="amzn2-ami-hvm-2.0.20190823.1-x86_64-gp2"
④EC2インスタンスのインスタンスタイプを指定します。
EC2_INSTANCE_TYPE="t2.micro"
⑤ユーザデータファイル名を指定します。
DIR_USER_DATA="${HOME}/environment/conf-handson-cli-ec2-getting_started"
USER_DATA_NAME="handson-cli-ec2-getting_started-userdata"
- 変数[FILE_USER_DATA]にユーザデータファイル名を指定します。
FILE_USER_DATA="${DIR_USER_DATA}/${USER_DATA_NAME}.bash" \
&& echo ${FILE_USER_DATA}
⑥キーペア名を指定します。
EC2_KEY_PAIR_NAME="handson-cli-ec2-getting_started-keypair"
⑦イメージIDを取得します。
- イメージIDを取得するためには、
ec2 describe-imagesコマンドを使います。
EC2_IMAGE_ID=$( \
aws ec2 describe-images \
--filters Name=name,Values="${EC2_IMAGE_NAME}" \
--query 'Images[].ImageId' \
--output text \
) \
&& echo ${EC2_IMAGE_ID}
⑧タグキーを生成します。
EC2_TAG_KEY='Name'
⑨タグ文字列を生成します。
STRING_TAG_CONF="ResourceType=instance,Tags=[{Key=${EC2_TAG_KEY},Value=${EC2_INSTANCE_TAG_NAME}}]" \
&& echo ${STRING_TAG_CONF}
⑩以下のコマンドを実行して、EC2インスタンスを作成します。
aws ec2 run-instances \
--image-id ${EC2_IMAGE_ID} \
--instance-type ${EC2_INSTANCE_TYPE} \
--tag-specifications ${STRING_TAG_CONF} \
--user-data file://${FILE_USER_DATA} \
--key-name ${EC2_KEY_PAIR_NAME} \
--associate-public-ip-address
⑪インスタンスの存在確認をします。
- EC2のインスタンス情報を表示させるには、
ec2 describe-instancesコマンドを使います。 - 以下のコマンドを実行して、ステータスが'running'のEC2インスタンスが存在することを確認します。
※インスタンスが作成され、'running'状態になるまで数分程度かかることがあります。
aws ec2 describe-instances \
--filters Name=tag-key,Values=Name \
Name=tag-value,Values=${EC2_INSTANCE_TAG_NAME} \
Name=instance-state-name,Values=running \
--query Reservations[].Instances[].Tags[].Value \
--output text
6.EC2インスタンスへのSSHログイン
①リージョンを指定します。
export AWS_DEFAULT_REGION='ap-northeast-1'
②鍵ファイルディレクトリを指定します。
DIR_KEY="${HOME}/.ssh"
③EC2キーペア名を指定します。
EC2_KEY_PAIR_NAME="handson-cli-ec2-getting_started-keypair"
④AWS IDを取得します。
AWS_ID=$( \
aws sts get-caller-identity \
--query 'Account' \
--output text \
) \
&& echo ${AWS_ID}
⑤SSH秘密鍵ファイル名を取得します。
FILE_SSH_KEY_SECRET="${DIR_KEY}/${EC2_KEY_PAIR_NAME}-${AWS_ID}-${AWS_DEFAULT_REGION}-ec2.pem" \
&& echo ${FILE_SSH_KEY_SECRET}
⑥EC2インスタンス名を指定します。
EC2_INSTANCE_TAG_NAME='handson-cli-ec2-getting_started-instance'
⑦SSHポート番号を22022に指定します。
PORT_SSHD='22022'
⑧EC2インスタンスのグローバルIPアドレスを取得します。
EC2_PUBLIC_IP=$( \
aws ec2 describe-instances \
--filters Name=tag-key,Values=Name \
Name=tag-value,Values=${EC2_INSTANCE_TAG_NAME} \
--instance-ids ${ARRAY_EC2_INSTANCE_IDS} \
--query "Reservations[].Instances[].PublicIpAddress" \
--output text \
) \
&& echo ${EC2_PUBLIC_IP}
ssh ${EC2_PUBLIC_IP} \
-i ${FILE_SSH_KEY_SECRET} \
-l ec2-user \
-p ${PORT_SSHD}
⑩EC2インスタンスにログインしていることを確認します。
curl -q http://169.254.169.254/latest/meta-data/public-ipv4
7.EC2インスタンスメタデータの取得
①IMDSv2で利用するトークンを取得して、ヘッダー形式で変数に格納します。
EC2_METADATA_SECOND='900'
②メタデータトークンを取得します。
curlコマンドの-X(--request)オプションで、HTTPメソッドを変更します(下記コマンドの場合は、PUTメソッドに変更します)。-H(--header)は、カスタムヘッダを追加するオプションです。
EC2_METADATA_TOKEN=$( \
curl -s \
-X PUT "http://169.254.169.254/latest/api/token" \
-H "X-aws-ec2-metadata-token-ttl-seconds: ${EC2_METADATA_SECOND}" \
) \
&& echo ${EC2_METADATA_TOKEN}
③メタデータトークンをヘッダ形式として変数[EC2_METADATA_HEADER]に格納します。
EC2_METADATA_HEADER="X-aws-ec2-metadata-token: ${EC2_METADATA_TOKEN}" \
&& echo ${EC2_METADATA_HEADER}
④EC2インスタンスのメタデータ一覧を取得します。
curl -H "${EC2_METADATA_HEADER}" \
http://169.254.169.254/latest/meta-data/
- 以下の通り表示されます。
ami-id ami-launch-index ami-manifest-path block-device-mapping/ events/ hostname iam/ identity-credentials/ instance-action instance-id instance-type local-hostname local-ipv4 mac metrics/ network/ placement/ profile public-hostname public-ipv4 reservation-id security-groups
⑤以下コマンドの<メタデータ>に、取得したい項目を入れて実行します。
EC2_INSTANCE_TYPE=$( \
curl -s -H "${EC2_METADATA_HEADER}" \
http://169.254.169.254/latest/meta-data/<メタデータ> \
) \
&& echo ${EC2_INSTANCE_TYPE}
- インスタンスタイプを取得したい場合は、以下の通りです。
EC2_INSTANCE_TYPE=$( \
curl -s -H "${EC2_METADATA_HEADER}" \
http://169.254.169.254/latest/meta-data/instance-type \
) \
&& echo ${EC2_INSTANCE_TYPE}
EC2_AZ_NAME=$( \
curl -s -H "${EC2_METADATA_HEADER}" \
http://169.254.169.254/latest/meta-data/placement/availability-zone \
) \
&& echo ${EC2_AZ_NAME}
リージョン情報だけはメタデータから取得できます。取得したい場合は、AZを取得し、末尾の文字を省いて表示させる必要があります。
- AZを取得したら、
sedコマンドにて末尾のa~zを削除して表示させます。
- AZを取得したら、
EC2_REGION_NAME=$( \
curl -s -H "${EC2_METADATA_HEADER}" \
http://169.254.169.254/latest/meta-data/placement/availability-zone \
| sed -e 's/[a-z]*$//' \
) \
&& echo ${EC2_REGION_NAME}
⑥作業が終わったら、EC2インスタンスからログアウトします。
exit
8.後片付け
今回のハンズオン環境が不要になったら、以下の後片付けをします。 自分はまだ残したいため未作業です。以下リンクを参照してください。
- EC2インスタンスの破棄
- デフォルトVPCのセキュリティグループからのIngressルール削除
- EC2キーペアの削除
- デフォルトVPCの破棄(デフォルトVPCが必要な人は作業不要)
- ハンズオンディレクトリの削除
- Cloud9用ロールからのポリシのデタッチ
以上です。最後まで読んでいただき、ありがとうございました。