見出し画像

「JAWS-UG CLI専門支部 #155R EC2入門」に参加したよメモ

aws ec2 create-default-vpc先日のS3入門に引き続き、EC2入門にも参加させていただいたのでそのメモ。毎回ためになるハンズオンありがとうございます。とっても勉強になります!

VPC・サブネット・EC2のインスタンスの作成とか、これまではブラウザからAWSマネージメントコンソールを開いてポチポチUIを操作していたんだけど、UIだと微妙に画面構成が変わっていたり、「あれ?こんな設定前からあったっけ?」って微妙に脳みそパワーを削られてるなーって感じることが結構あったのだけど、CLIだとそうい小さな引っ掛かりみたいなものに煩わされることがないので良いです。

「操作はcli、確認はマネコン」ホントにコレ。

準備

次のコマンドでAWS CLIのコマンドをTabキーで補完(オートコンプリート)できる。(チョー便利!)

$ complete -C aws_completer aws

MacやLinux(Windows WSLのLinuxも)使っている人は設定必須。~/.bashrcに書いちゃおう。

ハンズオンの流れ

今回のハンズオンの流れは以下。

1. デフォルトVPCの構築
2. EC2キーペアの作成
3. ユーザーデーターの作成
4. EC2インスタンスの構築
5. 後片付け

1. デフォルトVPCの構築

VPC = Amazon Virtual Private Cloud 。仮想プライベートクラウド。(あれ?カタカナにしてるだけだww) 複数のサブネット等を含むネットワークの単位。ルートテーブルやネットワークゲートウェイの設定など、仮想ネットワーキング環境を完全に制御できる。

ハンズオンではデフォルトVPCを使った。デフォルトVPCを使用すると以下が自動で設定されるので手軽にネットワーク環境を構築できる。

・各AZ(アベイラビリティゾーン)にデフォルトサブネットが作成される
・インターネットに出ていくためのIGW(Internet Gateway)が作成される
・デフォルトのセキュリティグループが作成される

次のコマンドでデフォルトVPCを作成できる。

$ aws ec2 create-default-vpc

次のコマンドでデフォルトVPCが出来たか確認できる。

$ aws ec2 describe-vpcs \
 --filters "Name=isDefault,Values=true" \
 --query "Vpcs[].CidrBlock" \
 --output text

EC2は他社クラウドに比べてダウンタイムが少なく安定した、クラウド上の仮想サーバー。

ちなみに"--filters"オプションはAPIの向こう(ようするにAWS側)で処理され、"--query"オプションはローカルで処理される。また、"--filters"の中身は何も指定しないとOR。Name=と書くとANDとしてフィルターされる。

デフォルトVPCは初心者がテスト環境として使うのには便利だが、本番環境では使用しないものだそうです。また1つのリージョンに5つまでしかVPCを作成できないので慣れてくるとデフォルトVPCを削除して、普通のVPCに置き換えられてしまうらしい…。

2. EC2キーペアの作成

以下のコマンドで、EC2にSSHでログインする際に必要なキーペア(秘密鍵/公開鍵)を作成する。秘密鍵はローカルに保存する。

$ aws ec2 create-key-pair \
 --key-name ${EC2_KEY_PAIR_NAME} \
 --query 'KeyMaterial' --output text \
> ${FILE_SSH_KEY_SECRET} 

${EC2_KEY_PAIR_NAME}はキーペアの名前、${FILE_SSH_KEY_SECRET}は秘密鍵のファイル名を指定する。キーペアのファイル名にリージョン名を入れておくと、どこのキーペアかわかるのでおすすめ。

このままだと秘密鍵ファイルのアクセス権限が緩いので、以下のコマンドで自分のアカウントでのみ秘密鍵ファイルにアクセスできるよう制限する。(これをしないとEC2サーバーにSSH接続するときに怒られる)

$ chmod 400 ${FILE_SSH_KEY_SECRET}

次のコマンドでAWSにキーペアがあることを確認する。

$ aws ec2 describe-key-pairs

次のコマンドで秘密鍵ファイルができているか確認する。

$ ls ${FILE_SSH_KEY_SECRET}

${FILE_SSH_KEY_SECRET}は秘密鍵ファイルのファイル名。

3. ユーザーデーターの作成

EC2で仮想サーバーが起動するときに実行するスクリプト(?)をユーザーデーターとして記載することができる。(なんでユーザーデーターっていうんだろう???) ここではユーザーデーター用のファイルを作成するところまで。EC2インスタンスを構築するところでこのファイルをし。

まずは、以下を実行してユーザーデーター用のファイルを作成する。

$ 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

うわ。何この技、めっちゃカッコイイ!!

${FILE_USER_DATA}はユーザーデーターのファイル名を、${PORT_SSHD}はSSHのポート名を指定するのだけど、これを実行すると

#!/bin/bash
# configure sshd
cat << EOF >> /etc/ssh/sshd_config
Port 22022
EOF
systemctl restart sshd.service

# yum
yum update -y

っていうファイルができる!!

4. EC2インスタンスの構築

デフォルトVPCのセキュリティグループへのIngressルール追加

このハンズオンではSSHの接続にポート22022を使用するので、セキュリティグループに22022ポートを通過させるためにingress(=進入)ルールを追加する必要がある。セキュリティグループではfrom, toが明示的に記述できるのでよい。

指定方法はこんな感じ。

$ 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}

${EC2_SECURITY_GROUP_NAME}はセキュリティグループ名("default")、${EC2_SECURITY_GROUP_PROTOCOL}はルールを付与するプロトコル名("tcp")、${EC2_SECURITY_GROUP_PORT}はルールを付与するポート番号("22022")、${EC2_SECURITY_GROUP_CIDR}はインバウンドを許可するIP Addr/CIDR("111.222.333.444/32"とかね)。

ちなみに、インターネットにつながっている場合、自アドレスは

$ curl -s http://checkip.amazonaws.com/

でわかる!

EC2インスタンスの構築

次のコマンドで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_IMAGE_ID}…EC2のAMI(Amazon Machine Image) IDを指定する。("ami-xxxxxxxxxxx"みたいなやつ)
${EC2_INSTANCE_TYPE}…起動する仮想マシンのインスタンスタイプ。AWSの無料枠がある人だったら"t2.micro"一択。
${STRING_TAG_CONF}…EC2インスタンスを識別するときに使用するタグを指定する。ハンズオンで指定したのはこんな感じ。"ResourceType=instance,Tags=[{Key=Name,Value=handson-cli-ec2-getting_started-instance}]"
${FILE_USER_DATA} …ユーザーデーターのファイル名をフルパスで指定。
${EC2_KEY_PAIR_NAME}…キーペア名を指定。

これでEC2インスタンスが起動する。

EC2インスタンスへのSSH接続

普通にこんな感じで。

$ ssh ${EC2_PUBLIC_IP} \
 -i ${FILE_SSH_KEY_SECRET} \
 -l ec2-user \
 -p ${PORT_SSHD}

${EC2_PUBLIC_IP}はEC2サーバーのIPアドレス、${FILE_SSH_KEY_SECRET}はキーペアの暗号鍵のファイル、${PORT_SSHD}はSSH接続で使用するポート番号。(ユーザー名は固定で"ec2-user")

5. 後片付け

EC2インスタンスを削除

$ aws ec2 terminate-instances --instance-ids ${ARRAY_EC2_INSTANCE_IDS}

セキュリティグループのルール削除

$ aws ec2 revoke-security-group-ingress \
 --group-name ${EC2_SECURITY_GROUP_NAME} \
 --protocol ${EC2_SECURITY_GROUP_PROTOCOL} \
 --port ${EC2_SECURITY_GROUP_PORT} \
 --cidr ${EC2_SECURITY_GROUP_CIDR}

キーペアの削除

$ aws ec2 delete-key-pair --key-name ${EC2_KEY_PAIR_NAME}

デフォルトVPCの削除

aws ec2 detach-internet-gateway \
 --internet-gateway-id ${EC2_IGW_ID} \
 --vpc-id ${EC2_VPC_ID}

その他

冪等性
ハンズオンの手順書はどこから初めても大丈夫なように冪等性をもたせてあるとのこと。冪等性=同じ操作を何度繰り返しても、同じ結果が得られるという性質。途中を読み飛ばしてどこから初めても大丈夫になっている。プロセスを自動化するときなどに必要な考え方。

ヒアドキュメント
文字列リテラルを、シェルスクリプトやプログラミング言語のソースコード中に埋め込むための方法。ユーザーデーターのファイルを作成するときに使った、

$ 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

こうゆうやつ。シェル変数とかでPORT_SSHDを定義しておけば、コマンドラインで↑を打ち込むと${PORT_SSHD}が置き換わったテキストファイルが${FILE_USER_DATA}として作成される。

EC2のインスタンスタイプ
すでにAWSの無料枠が無い人は、実は最新世代のインスタンスタイプ"t3a.micro"を使用する方がパフォーマンス的にもコスト的にも優れている。これを知らずに普通に"t2.micro"選択してたよ…。

JAWS-UG CLI専門支部のページ
http://jawsug-cli.s3-website-ap-northeast-1.amazonaws.com/
過去のハンズオンの資料があります。

次のVPCのハンズオンも楽しみ!


この記事が気に入ったらサポートをしてみませんか?