amareloのブログ(仮)

IT系勉強会で感じた想いや知見をメインに書いていきます。

JAWS-UG CLI専門支部 #155R EC2入門 参加レポート

5/28(木)、JAWS-UG CLI専門支部 #155R EC2入門 に参加しました。 今回も感想とやったことの手順(再構築)を書きます。

目次

イベントページ

jawsug-cli.connpass.com

ハンズオンでやったこと

以下の通りです。事前準備として、Cloud9上にハンズオン環境を構築しました。 ハンズオンでは、Cloud9のターミナルでコマンド実行します。

EC2とは

  • Elastic Compute Cloud(EC2)
  • EC2インスタンスVPC内に作られる。
  • ネットワークインターフェースにセキュリティグループ(ファイアウォール機能)が紐づけられている。
  • 公開鍵はEC2内にて管理されている。ユーザは触ることができない。
  • デフォルトVPCの配下にはインターネットゲートウェイとデフォルトサブネットが設定されている。
    • 検証環境として使う場合は手早く使える。
    • 本番環境の場合は、最初に削除した方が良いもの。仕事で使うのは微妙。
  • EC2コマンドの分類は大きく以下の通り(400近くある)

感想

ハンズオン手順が長くなるので、感想を先に書きます。

前回にも増してボリュームのあるハンズオンでしたが、今回もハンズオンを終わらせて、細かくは後で復習するというスタンスで臨みました。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を作成します。
  • デフォルトVPCは、create-default-vpcで作成できます。
  • 以下のコマンドを実行して、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アドレスの範囲を指定します。
  • 指定のURLよりIPアドレスを取得し、変数[IP_ADDR_LOCAL]に格納します。
  • curlの -s(--silent)オプションは、ダウンロードの進捗やエラーを表示しないためのオプションです。
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インスタンスを作成します。
  • EC2インスタンスを作成するためには、ec2 run-instancesコマンドを使います。
    • --associate-public-ip-addressでパブリックIPアドレスを有効にします。
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}

⑨EC2インスタンスSSHでログインします。

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を削除して表示させます。
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.後片付け

今回のハンズオン環境が不要になったら、以下の後片付けをします。 自分はまだ残したいため未作業です。以下リンクを参照してください。

以上です。最後まで読んでいただき、ありがとうございました。