📚

"AWS Hands-on for Beginners - Network編#1"をAWS CLIで構築する3

2024/05/12に公開

前回
https://zenn.dev/tn_a/articles/7b7628e4932235
今回はIAMロールの作成とEC2インスタンスの起動をAWS CLIで実装していく。

構成図

IAMロール

  • IAMロール名
ROLE_NAME="handson-ssm"
  • IAMロールの作成
aws iam create-role \
  --role-name ${ROLE_NAME} \
  --assume-role-policy-document \
'{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "ec2.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}'
  • ポリシーをロールにアタッチ
aws iam attach-role-policy \
  --role-name ${ROLE_NAME} \
  --policy-arn arn:aws:iam::aws:policy/AmazonSSMFullAccess

インスタンスプロファイル

https://dev.classmethod.jp/articles/do_you_know_iaminstanceprofile/
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html

  • インスタンスプロファイルの作成
INSTANCE_PROFILE_NAME="handson-ssm"
aws iam create-instance-profile \
    --instance-profile-name ${INSTANCE_PROFILE_NAME}
  • インスタンスプロファイルにロールを追加
aws iam add-role-to-instance-profile \
  --instance-profile-name ${INSTANCE_PROFILE_NAME} \
  --role-name ${ROLE_NAME}

セキュリティグループ

  • セキュリティグループ名
SG_TAG_NAME="handson-sg"
  • セキュリティグループの説明
SG_DESCRIPTION="handson Security Group."
  • VPC ID
VPC_ID=$( \
    aws ec2 describe-vpcs \
    --filters Name=tag:Name,Values=handson  \
    --query "Vpcs[].VpcId" \
    --output text \
    )

セキュリティグループの作成

aws ec2 create-security-group \
--group-name ${SG_TAG_NAME} \
--description "${SG_DESCRIPTION}" \
--vpc-id ${VPC_ID}

セキュリティグループにルールを追加

  • ルールを追加するセキュリティグループID
SG_ID=$( \
  aws ec2 describe-security-groups \
    --filters Name=vpc-id,Values=${VPC_ID} \
      Name=group-name,Values=${SG_TAG_NAME} \
    --query "SecurityGroups[].GroupId" \
    --output text
)
  • 許可するトラフィックのプロトコル
PROTOCOL="tcp"
  • 許可するトラフィックのポート
PORT="80"
  • 許可するIPアドレス範囲
CIDR="0.0.0.0/0"
  • セキュリティグループタグ名
SG_TAG_SPECIFICATIONS="ResourceType=security-group-rule,Tags=[{Key=Name,Value=handson-sg-rule}]"

ルールを追加する

aws ec2 authorize-security-group-ingress \
  --group-id ${SG_ID} \
  --protocol ${PROTOCOL} \
  --port ${PORT} \
  --cidr ${CIDR} \
  --tag-specifications ${SG_TAG_SPECIFICATIONS}

EC2

各種変数の設定

  • VPC ID
VPC_TAG_NAME="handson"
VPC_ID=$( \
    aws ec2 describe-vpcs \
    --filters Name=tag:Name,Values=${VPC_TAG_NAME}  \
    --query "Vpcs[].VpcId" \
    --output text \
    )
  • AMI ID
AMI_ID="ami-0ab3794db9457b60a"

  • インスタンスタイプ
INSTANCE_TYPE="t2.micro"

  • サブネットID
SUBNET_TAG_NAME=Public-subnet-a
SUBNET_ID=$( \
  aws ec2 describe-subnets \
    --filters Name=vpc-id,Values=${VPC_ID} \
              Name=tag:Name,Values=${SUBNET_TAG_NAME} \
    --query "Subnets[].SubnetId" \
    --output text \
) 
  • セキュリティグループID
SG_TAG_NAME="handson-sg"
SG_ID=$( \
  aws ec2 describe-security-groups \
    --filters Name=vpc-id,Values=${VPC_ID} \
      Name=group-name,Values=${SG_TAG_NAME} \
    --query "SecurityGroups[].GroupId" \
    --output text
)
  • タグネーム
EC2_TAG_NAME="web"
EC2_TAG_SPECIFICATIONS="ResourceType=instance,Tags=[{Key=Name,Value=${EC2_TAG_NAME}}]"
  • ユーザーデータ
cat << EOF > userdata.bash
#!/bin/bash

yum -y update
yum -y install httpd
systemctl enable httpd.service
systemctl start httpd.service
EOF

EC2インスタンスの起動

aws ec2 run-instances \
    --image-id ${AMI_ID} \
    --instance-type ${INSTANCE_TYPE} \
    --subnet-id ${SUBNET_ID} \
    --security-group-ids ${SG_ID} \
    --tag-specifications ${EC2_TAG_SPECIFICATIONS} \
    --user-data file://userdata.bash \
    --iam-instance-profile Name=${INSTANCE_PROFILE_NAME}  \
    --associate-public-ip-address

EC2が立ち上がったらwebにアクセスできることを確認する。


参考
https://zenn.dev/y_u_t_a/articles/58257348c3754d
https://zenn.dev/amarelo_n24/articles/0703c4807dde4d

Discussion