ハンズオン(簡易版): IAM基礎(インスタンスプロファイル)

3.3. EC2インスタンスの起動 (ユーザーデータ/インスタンスプロファイル/パブリックIP: handson-cli-iam-instance-profile-instance)

手順の目的

EC2インスタンス名"handson-cli-iam-instance-profile-instance"を起動します。

設定値の指定

手順に必要な設定値を変数に格納をします。

0. リージョン

リージョンを指定します。

環境変数の設定:

export AWS_DEFAULT_REGION='ap-northeast-1'

1. EC2インスタンスのタグ名

EC2インスタンスのタグ名の指定します。

変数の設定:

EC2_INSTANCE_TAG_NAME='handson-cli-iam-instance-profile-instance'

2. 起動時に利用するAMIイメージ名

起動時に利用するAMIイメージ名の指定します。

変数の設定:

EC2_INSTANCE_IMAGE_NAME="amzn2-ami-hvm-2.0.20221004.0-x86_64-gp2"

3. VPCのタグ名

VPCのタグ名の指定します。

変数の設定:

EC2_VPC_TAG_NAME='handson-cli-iam-instance-profile-vpc'

4. サブネットのタグ名

サブネットのタグ名の指定します。

変数の設定:

EC2_SUBNET_TAG_NAME='handson-cli-iam-instance-profile-subnet'

5. セキュリティグループ名

セキュリティグループ名の指定します。

変数の設定:

EC2_SECURITY_GROUP_NAME='handson-cli-iam-instance-profile-sg'

6. EC2インスタンスのインスタンスタイプ

EC2インスタンスのインスタンスタイプの指定します。

変数の設定:

EC2_INSTANCE_TYPE="t2.micro"

7. ユーザデータファイル

ユーザデータファイルの指定します。

変数の設定:

USER_DATA_NAME='handson-cli-iam-instance-profile-userdata'

変数の設定:

DIR_USER_DATA="${HOME}/environment/conf-handson-cli-iam-instance-profile"

変数の設定:

FILE_USER_DATA="${DIR_USER_DATA}/${USER_DATA_NAME}.bash" \
  && echo ${FILE_USER_DATA}

結果(例):

${HOME}/environment/conf-handson-cli-iam-instance-profile/handson-cli-iam-instance-profile-userdata.bash

8. インスタンスプロファイル名

インスタンスプロファイル名を指定します。

変数の設定:

IAM_INSTANCE_PROFILE_NAME='handson-cli-iam-instance-profile-instance-profile'

設定値の確認

各変数に正しい設定値が格納されていることを確認します。

変数の確認:

cat << END

  # 0. AWS_DEFAULT_REGION:"ap-northeast-1"
       AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}"

  # 1. EC2_INSTANCE_TAG_NAME:"handson-cli-iam-instance-profile-instance"
       EC2_INSTANCE_TAG_NAME="${EC2_INSTANCE_TAG_NAME}"
  # 2. EC2_INSTANCE_IMAGE_NAME:"amzn2-ami-hvm-2.0.20221004.0-x86_64-gp2"
       EC2_INSTANCE_IMAGE_NAME="${EC2_INSTANCE_IMAGE_NAME}"
  # 3. EC2_VPC_TAG_NAME:"handson-cli-iam-instance-profile-vpc"
       EC2_VPC_TAG_NAME="${EC2_VPC_TAG_NAME}"
  # 4. EC2_SUBNET_TAG_NAME:"handson-cli-iam-instance-profile-subnet"
       EC2_SUBNET_TAG_NAME="${EC2_SUBNET_TAG_NAME}"
  # 5. EC2_SECURITY_GROUP_NAME:"handson-cli-iam-instance-profile-sg"
       EC2_SECURITY_GROUP_NAME="${EC2_SECURITY_GROUP_NAME}"
  # 6. EC2_INSTANCE_TYPE:"t2.micro"
       EC2_INSTANCE_TYPE="${EC2_INSTANCE_TYPE}"
  # 7. FILE_USER_DATA:"${HOME}/environment/conf-handson-cli-iam-instance-profile/handson-cli-iam-instance-profile-userdata.bash"
       FILE_USER_DATA="${FILE_USER_DATA}"
  # 8. IAM_INSTANCE_PROFILE_NAME:"handson-cli-iam-instance-profile-instance-profile"
       IAM_INSTANCE_PROFILE_NAME="${IAM_INSTANCE_PROFILE_NAME}"

END

各変数について、上の行と下の行の値の内容もしくは形式が同じであることを確認します。 もし異なる場合は、それぞれの手順番号に戻って変数の設定を行います。

処理の実行

イメージIDを取得します。

コマンド:

ec2_instance_image_id=$( \
  aws ec2 describe-images \
    --filters Name=name,Values="${EC2_INSTANCE_IMAGE_NAME}" \
    --query 'Images[].ImageId' \
    --output text \
) \
  && echo ${ec2_instance_image_id}

結果(例):

ami-046a961f907758d0d

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}

結果(例):

vpc-xxxxxxxxxxxxxxxxx

サブネット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-xxxxxxxxxxxxxxxxx

セキュリティグループIDを取得します。

コマンド:

ec2_security_group_id=$( \
  aws ec2 describe-security-groups \
    --filter 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-xxxxxxxxxxxxxxxxx

セキュリティグループを配列にして変数に格納します。

変数の設定:

array_ec2_security_group_ids="${ec2_security_group_id}" \
  && echo ${array_ec2_security_group_ids}

結果(例):

sg-xxxxxxxxxxxxxxxxx

タグ設定文字列を生成して変数に格納します。

変数の設定:

EC2_TAG_KEY='Name'

変数の設定:

string_tag_conf_instance="ResourceType=instance,Tags=[{Key=${EC2_TAG_KEY},Value=${EC2_INSTANCE_TAG_NAME}}]" \
  && echo ${string_tag_conf_instance}

結果(例):

ResourceType=instance,Tags=[{Key=Name,Value=handson-cli-iam-instance-profile-instance}]

EC2インスタンスを起動します。

変数の確認:

cat << END

  # ec2_instance_image_id:"ami-046a961f907758d0d"
    ec2_instance_image_id="${ec2_instance_image_id}"
  # EC2_INSTANCE_TYPE:"t2.micro"
    EC2_INSTANCE_TYPE="${EC2_INSTANCE_TYPE}"
  # array_ec2_security_group_ids:"sg-xxxxxxxxxxxxxxxxx"
    array_ec2_security_group_ids="${array_ec2_security_group_ids}"
  # string_tag_conf_instance:"ResourceType=instance,Tags=[{Key=Name,Value=handson-cli-iam-instance-profile-instance}]"
    string_tag_conf_instance="${string_tag_conf_instance}"
  # ec2_subnet_id:"subnet-xxxxxxxxxxxxxxxxx"
    ec2_subnet_id="${ec2_subnet_id}"
  # FILE_USER_DATA:"${HOME}/environment/conf-handson-cli-iam-instance-profile/handson-cli-iam-instance-profile-userdata.bash"
    FILE_USER_DATA="${FILE_USER_DATA}"
  # IAM_INSTANCE_PROFILE_NAME:"handson-cli-iam-instance-profile-instance-profile"
    IAM_INSTANCE_PROFILE_NAME="${IAM_INSTANCE_PROFILE_NAME}"

END

コマンド:

aws ec2 run-instances \
  --image-id ${ec2_instance_image_id} \
  --instance-type ${EC2_INSTANCE_TYPE} \
  --security-group-ids ${array_ec2_security_group_ids} \
  --tag-specifications ${string_tag_conf_instance} \
  --subnet-id ${ec2_subnet_id} \
  --user-data file://${FILE_USER_DATA} \
  --iam-instance-profile Name=${IAM_INSTANCE_PROFILE_NAME} \
  --associate-public-ip-address

結果(例):

{
  "Groups": [],
  "Instances": [
    {
        "AmiLaunchIndex": 0,
        "ImageId": "ami-0ff21806645c5e492",
        "InstanceId": "i-04e4cc1dbde731b6f",
        "InstanceType": "t2.micro",
        "LaunchTime": "2024-03-06T01:23:45.000Z",
        "Monitoring": {
            "State": "disabled"
        },
        "Placement": {
            "AvailabilityZone": "ap-northeast-1a",
            "GroupName": "",
            "Tenancy": "default"
        },
        "PrivateDnsName": "ip-10-8-0-111.ap-northeast-1.compute.internal",
        "PrivateIpAddress": "10.8.0.111",
        "ProductCodes": [],
        "PublicDnsName": "",
        "State": {
            "Code": 0,
            "Name": "pending"
        },
        "StateTransitionReason": "",
        "SubnetId": "subnet-01eea41c7e154dfdf",
        "VpcId": "vpc-04ca4b4b9b85a8601",
        "Architecture": "x86_64",
        "BlockDeviceMappings": [],
        "ClientToken": "15f7916d-a62d-4deb-9d51-ba3dc10bd958",
        "EbsOptimized": false,
        "Hypervisor": "xen",
        "IamInstanceProfile": {
            "Arn": "arn:aws:iam::<AWSアカウントID>:instance-profile/handson-cli-iam-instance-profile",
            "Id": "AIPAVG7QTSKL2ILK4LPFY"
        },
        "NetworkInterfaces": [
            {
                "Attachment": {
                    "AttachTime": "2024-03-06T01:23:45.000Z",
                    "AttachmentId": "eni-attach-0a49c43b1e9333ccd",
                    "DeleteOnTermination": true,
                    "DeviceIndex": 0,
                    "Status": "attaching"
                },
                "Description": "",
                "Groups": [
                    {
                        "GroupName": "public-sg",
                        "GroupId": "sg-0fdc6689f6b239d71"
                    }
                ],
                "Ipv6Addresses": [],
                "MacAddress": "06:47:63:1a:cb:6e",
                "NetworkInterfaceId": "eni-05cf33957979a63ef",
                "OwnerId": "<AWSアカウントID>",
                "PrivateIpAddress": "10.8.0.111",
                "PrivateIpAddresses": [
                    {
                        "Primary": true,
                        "PrivateIpAddress": "10.8.0.111"
                    }
                ],
                "SourceDestCheck": true,
                "Status": "in-use",
                "SubnetId": "subnet-01eea41c7e154dfdf",
                "VpcId": "vpc-04ca4b4b9b85a8601",
                "InterfaceType": "interface"
            }
        ],
        "RootDeviceName": "/dev/xvda",
        "RootDeviceType": "ebs",
        "SecurityGroups": [
            {
                "GroupName": "public-sg",
                "GroupId": "sg-0fdc6689f6b239d71"
            }
        ],
        "SourceDestCheck": true,
        "StateReason": {
            "Code": "pending",
            "Message": "pending"
        },
        "Tags": [
            {
                "Key": "Name",
                "Value": "handson-cli-iam-userdata-instance_profile-instance"
            }
        ],
        "VirtualizationType": "hvm",
        "CpuOptions": {
            "CoreCount": 1,
            "ThreadsPerCore": 1
        },
        "CapacityReservationSpecification": {
            "CapacityReservationPreference": "open"
        },
        "MetadataOptions": {
            "State": "pending",
            "HttpTokens": "optional",
            "HttpPutResponseHopLimit": 1,
            "HttpEndpoint": "enabled"
        }
    }
  ],
  "OwnerId": "<AWSアカウントID>",
  "ReservationId": "r-0b162d03f306dc229"
}

「ステータスが"running"のEC2インスタンス"handson-cli-iam-instance-profile-instance"が存在する。」ことを確認します。

コマンド:

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-iam-instance-profile-instance

注釈

表示されるまで数十秒程度かかります。

手順の完了