Amazon VPCをAWS CLIで構築する手順⑤
はじめに
前回はルートテーブルの作成とルートテーブルの追加を行いました。
今回は、パブリックサブネット内にEC2をAWS CLIで起動し、HTTPアクセス確認を行う手順を書きます。今回も「AWS Hands-on for Beginners」とJAWS-UG CLI専門支部のハンズオンで学んだことを基に書いています。
前回の記事
本記事の作業環境と、前回までの環境作成手順については、前回以前の記事を参照してください。
構成図
アベイラビリティゾーン(以下AZ)ap-northeast-1aのパブリックサブネットに、EC2インスタンスを作成します。作成後は、作業PCのブラウザとCloud9の作業環境からCLIでHTTPアクセスできるようにします。
手順
1.ユーザデータの作成
①ユーザデータ用ディレクトリの作成
ユーザデータファイルを作成するために、作業用ディレクトリ'handson-cli-ec2'を作成します。
ユーザデータ用ディレクトリ
DIR_USER_DATA="${HOME}/environment/handson-cli-ec2"
mkdir コマンドでディレクトリ作成します。
mkdir -p ${DIR_USER_DATA}
②ユーザデータファイルの作成
①で作成したディレクトリにユーザデータファイル'handson-cli-ec2-userdata'を作成します。
ユーザデータファイル名
USER_DATA_NAME='handson-cli-ec2-userdata'
ファイルフルパス
FILE_USER_DATA="${DIR_USER_DATA}/${USER_DATA_NAME}.bash" \
&& echo ${FILE_USER_DATA}
/home/ec2-user/environment/handson-cli-ec2/handson-cli-ec2-userdata.bash
ヒアドキュメントでユーザデータファイルを作成します。
cat << EOF > ${FILE_USER_DATA}
#!/bin/bash
yum -y update
# setup httpd
yum install -y httpd
systemctl start httpd.service
systemctl enable httpd.service
EOF
cat ${FILE_USER_DATA}
を実行し、ファイルに書き込まれたことを確認します。
#!/bin/bash
yum -y update
# setup httpd
yum install -y httpd
systemctl start httpd.service
systemctl enable httpd.service
ファイルが存在することを確認します。
ls ${FILE_USER_DATA}
2.EC2インスタンスの起動
AZ:ap-northeast-1aのパブリックサブネットにインターネットからの接続確認に使うためのWebサーバを作成します。
①リージョンを環境変数に指定
VPCを作成するリージョンを環境変数に指定します。この手順では東京リージョンを指定します。
export AWS_DEFAULT_REGION='ap-northeast-1'
②各種変数の指定
EC2インスタンスタグ名・タグ文字列、AMIイメージID、インスタンスタイプ、サブネットID、ユーザデータファイルを指定します。
EC2インスタンスタグ名
EC2_INSTANCE_TAG_NAME='handson-cli-ec2-httpserver'
EC2インスタンスタグ文字列
STRING_TAG_CONF_INSTANCE="ResourceType=instance,Tags=[{Key=Name,Value=${EC2_INSTANCE_TAG_NAME}}]" \
&& echo ${STRING_TAG_CONF_INSTANCE}
ResourceType=instance,Tags=[{Key=Name,Value=handson-cli-ec2-httpserver}]
イメージID
ここでは最新のAmazon Linux 2のイメージIDを取得します。
EC2_INSTANCE_IMAGE_ID=$( \
aws ec2 describe-images \
--owners amazon \
--filters Name=name,Values=amzn2-ami-hvm-2.0.*-x86_64-gp2 \
Name=state,Values=available \
--query 'reverse(sort_by(Images, &CreationDate))[:1].ImageId' \
--output text \
) \
&& echo ${EC2_INSTANCE_IMAGE_ID}
ami-XXXXXXXXXXXXXXX
インスタンスタイプ
EC2_INSTANCE_TYPE="t3.micro"
VPCタグ名
EC2_VPC_TAG_NAME='handson-cli-vpc'
VPC ID
EC2_VPC_ID=$( \
aws ec2 describe-vpcs \
--filters Name=tag:Name,Values=${EC2_VPC_TAG_NAME} \
--query 'Vpcs[].VpcId' \
--output text \
) \
&& echo ${EC2_VPC_ID}
サブネットタグ名
※ap-northeast-1aのパブリックサブネットのタグ名を指定します。
EC2_SUBNET_TAG_NAME='handson-cli-public-subnet-a'
サブネットID
EC2_SUBNET_ID=$( \
aws ec2 describe-subnets \
--filters Name=vpc-id,Values=${EC2_VPC_ID} \
Name=tag:Name,Values=${EC2_SUBNET_TAG_NAME} \
--query "Subnets[].SubnetId" \
--output text \
) \
&& echo ${EC2_SUBNET_ID}
subnet-XXXXXXXXXXXXXXX
セキュリティグループ
EC2_SECURITY_GROUP_NAME='handson-cli-sg'
セキュリティグループID
EC2_SECURITY_GROUP_ID=$( \
aws ec2 describe-security-groups \
--filters Name=vpc-id,Values=${EC2_VPC_ID} \
Name=group-name,Values=${EC2_SECURITY_GROUP_NAME} \
--query 'SecurityGroups[].GroupId' \
--output text \
) \
&& echo ${EC2_SECURITY_GROUP_ID}
sg-XXXXXXXXXXXXXXX
ユーザデータファイルのフルパス
# ユーザデータ用ディレクトリ
DIR_USER_DATA="${HOME}/environment/handson-cli-ec2"
# ユーザデータファイル名
USER_DATA_NAME='handson-cli-ec2-userdata'
# ファイルフルパス
FILE_USER_DATA="${DIR_USER_DATA}/${USER_DATA_NAME}.bash" \
&& echo ${FILE_USER_DATA}
/home/ec2-user/environment/handson-cli-ec2/handson-cli-ec2-userdata.bash
ここまで来たら、想定通り変数が格納されていることを確認します。
cat << END
# EC2_INSTANCE_IMAGE_ID:"ami-XXXXXXXXXXXXXXXXX"
EC2_INSTANCE_IMAGE_ID="${EC2_INSTANCE_IMAGE_ID}"
# EC2_INSTANCE_TYPE:"t3.micro"
EC2_INSTANCE_TYPE="${EC2_INSTANCE_TYPE}"
# EC2_SUBNET_ID:subnet-XXXXXXXXXXXXXXXXX
EC2_SUBNET_ID=${EC2_SUBNET_ID}
# EC2_SECURITY_GROUP_ID:sg-XXXXXXXXXXXXXXX
EC2_SECURITY_GROUP_ID=${EC2_SECURITY_GROUP_ID}
# STRING_TAG_CONF_INSTANCE:"ResourceType=instance,Tags=[{Key=Name,Value=handson-cli-ec2-httpserver}]"
STRING_TAG_CONF_INSTANCE="${STRING_TAG_CONF_INSTANCE}"
# FILE_USER_DATA:"${HOME}/environment/handson-cli-ec2/handson-cli-ec2-userdata.bash"
FILE_USER_DATA="${FILE_USER_DATA}"
END
③EC2インスタンス起動
以下のコマンドを実行してEC2インスタンスを起動します。
aws ec2 run-instances \
--image-id ${EC2_INSTANCE_IMAGE_ID} \
--instance-type ${EC2_INSTANCE_TYPE} \
--subnet-id ${EC2_SUBNET_ID} \
--security-group-ids ${EC2_SECURITY_GROUP_ID} \
--tag-specifications ${STRING_TAG_CONF_INSTANCE} \
--user-data file://${FILE_USER_DATA} \
--associate-public-ip-address
④インスタンス起動確認
以下のコマンドを実行して、インスタンスタグ名に指定した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
handson-cli-ec2-httpserver
3.接続確認
起動したEC2インスタンスのパブリックIPアドレスを取得し、作業環境のCloud9からCLIでのHTTPアクセス、ブラウザからのHTTPアクセスの2通り接続確認を行います。
①EC2のパブリックIPアドレスの取得
起動したEC2インスタンスのIDを取得します。
ARRAY_EC2_INSTANCE_IDS=$( \
aws ec2 describe-instances \
--filters Name=tag:Name,Values=${EC2_INSTANCE_TAG_NAME} \
Name=instance-state-name,Values=running \
--query Reservations[].Instances[].InstanceId \
--output text \
) \
&& echo ${ARRAY_EC2_INSTANCE_IDS}
EC2インスタンスのパブリックIPアドレスを取得します。
EC2_IP_PUBLIC=$( \
aws ec2 describe-instances \
--filters Name=tag:Name,Values=${EC2_INSTANCE_TAG_NAME} \
--instance-ids ${ARRAY_EC2_INSTANCE_IDS} \
--query "Reservations[].Instances[].PublicIpAddress" \
--output text \
) \
&& echo ${EC2_IP_PUBLIC}
②CLIでのアクセス
curl
コマンドを実行します。
curl <パブリックIPアドレス>
今回はApacheをサーバにインストールしたのみのため、ApacheのテストページHTMLが返されます。ソース内に<title>Test Page for the Apache HTTP Server</title>
が含まれていればOKです。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>Test Page for the Apache HTTP Server</title>
※以下略
③ブラウザからのアクセス
EC2のパブリックIPアドレスを入れてアクセスします。Apacheのテストページが表示されればOKです。
ここまでのまとめ
今回はEC2をパブリックサブネット内に作成して、外部からのHTTPアクセス確認までを行いました。VPCをCLIで作成する手順を書き始めて5回目でやっと疎通確認ができました(汗)
次回は、Hands-on for Beginnersの順番から、
- プライベートサブネットにEC2を起動して、NATゲートウェイ越しにインターネットアクセスする。
になると思います。ただ、
- SystemManagers(SSM)のIAMポリシをアタッチしたIAMロールをCLIで作り、SSMのセッションマネージャーの実行確認をする。
をやってなかったので、そちらにするかもしれません。できた方から書きます。
ここまで読んでいただきありがとうございました!
Discussion