💻

Amazon VPCをAWS CLIで構築する手順⑤

2022/05/03に公開

はじめに

前回はルートテーブルの作成とルートテーブルの追加を行いました。
今回は、パブリックサブネット内にEC2をAWS CLIで起動し、HTTPアクセス確認を行う手順を書きます。今回も「AWS Hands-on for Beginners」とJAWS-UG CLI専門支部のハンズオンで学んだことを基に書いています。

前回の記事

本記事の作業環境と、前回までの環境作成手順については、前回以前の記事を参照してください。

https://zenn.dev/amarelo_n24/articles/f66a1757344f9e

構成図

アベイラビリティゾーン(以下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通り接続確認を行います。

https://zenn.dev/amarelo_n24/articles/30cb58cad805e8

①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