AWSでの環境構築 - EC2インスタンスの作成(5/7)

こんにちは。beaglesoftの真鍋です。

ようやっとEC2インスタンスの作成へたどり着きました。EC2をどのように利用するかは多種多様です。VPSのように常に稼働するサービスとして利用することもあるでしょうし、開発環境として必要なときだけ利用することもあるでしょう。

AWS(にかぎらずクラウドなシステム)では、AWSのインフラをAPI経由でプログラムから制御することが可能です。このことは従来のVPSと大きく違うことです。プログラムから制御可能であるということはざっくりとした制御から細かな制御ができるようになるということで、サービスの幅が一気に広がることを意味します。

例えば営業支援システムは営業日ベースでのみ稼働することによるコスト削減ができます。オンプレミスの場合、システムの有効活用といえば24時間でどれだけのリソースを利用するかが重要でしたが、AWSで利用しないようにすることでいかに費用を抑えるかが重要となってきます。

つまり、時間単位での課金であるからこそ、必要な時間だけ起動する。必要なインスタンスだけ起動する。そういった機動力のあるインフラ管理が求められているように思います。

構築するVPC

今回構築するVPCは以下のイメージとなります。AWSではネットワークなどの構成を表現するルールが決まっています。詳細はAWS シンプルアイコン(全52種類)の覚え方まとめ - Qiitaなどが参考になると思います。

AWS-VPC.png (61.7 kB)

なお、この図はDraw.ioを利用して作成しました。Draw.ioについてはこちらを参考にしてください。

blog.beaglesoft.net

前提

このエントリーはAmazon Web Services パターン別構築・運用ガイドを参考にAWS CLIを利用して以下の環境を構築したときの履歴です。AWSを利用してみたいがよくわからないという方(私もまさにそうでしたが…)には調度良いと思いますのでぜひ購入してみてください。

設定を行うためには、IAMアカウント作成など予めAWSを利用する設定が行われていることを前提としています。

Amazon Web Services パターン別構築・運用ガイド

Amazon Web Services パターン別構築・運用ガイド

EC2インスタンスの作成

前回作成したVPCにEC2インスタンスを作成します。EC2インスタンスではElasticLoadBalancingで動作確認するためApacheのインストールとHTTPでの接続ができることを確認します。

パラメーター情報

EC2インスタンスの作成では以下のパラメータを設定します。

パラメータ名
Name tag
VPC ID vpc-6a97c20f
Availability Zone ap-northeast-1a
CIDR block 10.0.0.0/24
Auto-assign Public IP NO

CLIによる実行

AWS CLIにより設定を行います。実行する手順は以下のとおりとなります。

  1. AWS操作用の公開鍵・秘密鍵の作成
  2. SecurityGroupの作成
  3. EC2の起動
  4. EC2へのログイン
  5. ApacheのインストールとHTTPポートの疎通確認
  6. AMIの作成
  7. ElasticIPの利用

AWS操作用の公開鍵・秘密鍵の作成とインポート

実行ディレクトリにEC2インスタンスへ接続するためのKeyPairを作成します。

# KeyPairの存在確認
╭─ymanabe@Yoichiro-no-MacBook-Pro  ~/aws_work ‹2.2.4›
╰─$ aws ec2 describe-key-pairs
{
    "KeyPairs": [
        {
            "KeyName": "beagleKeyPair",
            "KeyFingerprint": "28:a2:c5:81:16:0c:5d:15:af:e9:de:26:03:ba:45:e6:f1:60:48:17"
        },
        {
            "KeyName": "importKey-ymanabe",
            "KeyFingerprint": "db:68:46:4d:79:2f:f5:57:4e:7f:8b:1a:47:a6:10:c4"
        }
    ]
}

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~/aws_work ‹2.2.4›
╰─$ aws ec2 create-key-pair --key-name beagle-key-pair-demo --query 'KeyMaterial' --output text > beagle-key-pair-demo.pem
╭─ymanabe@Yoichiro-no-MacBook-Pro  ~/aws_work ‹2.2.4›
╰─$ ls -al
total 8
drwxr-xr-x   3 ymanabe  staff   102  4  3 08:31 .
drwxr-xr-x+ 70 ymanabe  staff  2380  4  3 08:31 ..
-rw-r--r--   1 ymanabe  staff  1675  4  3 08:31 beagle-key-pair-demo.pem

次に作成したKeyPairが登録されていることを確認します。

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~/aws_work ‹2.2.4›
╰─$ aws ec2 describe-key-pairs
{
    "KeyPairs": [
        {
            "KeyName": "beagle-key-pair-demo",
            "KeyFingerprint": "c2:12:62:96:e5:50:6f:f8:c9:84:b9:dd:ff:da:cc:58:4e:36:0b:9d"
        },
        {
            "KeyName": "beagleKeyPair",
            "KeyFingerprint": "28:a2:c5:81:16:0c:5d:15:af:e9:de:26:03:ba:45:e6:f1:60:48:17"
        },
        {
            "KeyName": "importKey-ymanabe",
            "KeyFingerprint": "db:68:46:4d:79:2f:f5:57:4e:7f:8b:1a:47:a6:10:c4"
        }
    ]
}

SecurityGroupの作成

EC2に適用するSecurityGroupを作成します。SecurityGroupはSecurityGroupの作成とSecurityGroupの設定をそれぞれ行います。

SecurityGroupの作成

SecurityGroupを作成します。

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~/aws_work ‹2.2.4›
╰─$ aws ec2 create-security-group --group-name beaglesoft-security-group-demo --description "beaglesoft security group for Demo." --vpc-id vpc-6a97c20f
{
    "GroupId": "sg-ac9534c8"
}
接続の設定

EC2インスタンスの接続設定を行います。今回の接続設定は以下のとおりとなります。

接続ポート CIDR
22 xxx.xxx.xxx.xxx/32
80 0.0.0.0./0
╭─ymanabe@Yoichiro-no-MacBook-Pro  ~/aws_work ‹2.2.4›
╰─$ curl http://checkip.amazonaws.com
xxx.xxx.xxx.xxx

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~/aws_work ‹2.2.4›
╰─$ aws ec2 authorize-security-group-ingress --group-id sg-ac9534c8 --protocol tcp --port 22 --cidr xxx.xxx.xxx.xxx/32                                                          255 ↵

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~/aws_work ‹2.2.4›
╰─$ aws ec2 authorize-security-group-ingress --group-id sg-ac9534c8 --protocol tcp --port 80 --cidr 0.0.0.0/0                                                                  255 ↵
╭─ymanabe@Yoichiro-no-MacBook-Pro  ~/aws_work ‹2.2.4›
╰─$ aws ec2 describe-security-groups --group-id sg-ac9534c8 --output text
SECURITYGROUPS  beaglesoft security group for Demo. sg-ac9534c8 beaglesoft-security-group-demo  457499276421  vpc-6a97c20f
IPPERMISSIONS 80  tcp 80
IPRANGES  0.0.0.0/0
IPPERMISSIONS 22  tcp 22
IPRANGES  xxx.xxx.xxx.xxx/32
IPPERMISSIONSEGRESS -1
IPRANGES  0.0.0.0/0

EC2の起動

AWS CLIからEC2を起動します。設定するパラメーター情報は以下のとおりとなります。

パラメータ名
image-id ami-f80e0596
count 1
instance-type t2.micro
key-name beagle-key-pair-demo
security-group-id sg-ac9534c8
subnet-id subnet-5282b225
associate-public-ip-address 有効

上記のパラメーターを指定して実行します。

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~/aws_work ‹2.2.4›
╰─$ aws ec2 run-instances --image-id ami-f80e0596 --count 1 --instance-type t2.micro --key-name beagle-key-pair-demo --security-group-id sg-ac9534c8 --subnet-id subnet-5282b225 --associate-public-ip-address
{
    "OwnerId": "457499276421",
    "ReservationId": "r-f7061a55",
    "Groups": [],
    "Instances": [
        {
            "Monitoring": {
                "State": "disabled"
            },
            "PublicDnsName": "",
            "RootDeviceType": "ebs",
            "State": {
                "Code": 0,
                "Name": "pending"
            },
            "EbsOptimized": false,
            "LaunchTime": "2016-04-02T23:55:03.000Z",
            "PrivateIpAddress": "10.0.0.9",
            "ProductCodes": [],
            "VpcId": "vpc-6a97c20f",
            "StateTransitionReason": "",
            "InstanceId": "i-9a53f705",
            "ImageId": "ami-f80e0596",
            "PrivateDnsName": "ip-10-0-0-9.ap-northeast-1.compute.internal",
            "KeyName": "beagle-key-pair-demo",
            "SecurityGroups": [
                {
                    "GroupName": "beaglesoft-security-group-demo",
                    "GroupId": "sg-ac9534c8"
                }
            ],
            "ClientToken": "",
            "SubnetId": "subnet-5282b225",
            "InstanceType": "t2.micro",
            "NetworkInterfaces": [
                {
                    "Status": "in-use",
                    "MacAddress": "06:d5:95:68:07:c7",
                    "SourceDestCheck": true,
                    "VpcId": "vpc-6a97c20f",
                    "Description": "",
                    "NetworkInterfaceId": "eni-0277374a",
                    "PrivateIpAddresses": [
                        {
                            "PrivateDnsName": "ip-10-0-0-9.ap-northeast-1.compute.internal",
                            "Primary": true,
                            "PrivateIpAddress": "10.0.0.9"
                        }
                    ],
                    "PrivateDnsName": "ip-10-0-0-9.ap-northeast-1.compute.internal",
                    "Attachment": {
                        "Status": "attaching",
                        "DeviceIndex": 0,
                        "DeleteOnTermination": true,
                        "AttachmentId": "eni-attach-05a8f1f6",
                        "AttachTime": "2016-04-02T23:55:03.000Z"
                    },
                    "Groups": [
                        {
                            "GroupName": "beaglesoft-security-group-demo",
                            "GroupId": "sg-ac9534c8"
                        }
                    ],
                    "SubnetId": "subnet-5282b225",
                    "OwnerId": "457499276421",
                    "PrivateIpAddress": "10.0.0.9"
                }
            ],
            "SourceDestCheck": true,
            "Placement": {
                "Tenancy": "default",
                "GroupName": "",
                "AvailabilityZone": "ap-northeast-1a"
            },
            "Hypervisor": "xen",
            "BlockDeviceMappings": [],
            "Architecture": "x86_64",
            "StateReason": {
                "Message": "pending",
                "Code": "pending"
            },
            "RootDeviceName": "/dev/xvda",
            "VirtualizationType": "hvm",
            "AmiLaunchIndex": 0
        }
    ]
}

実行した結果、AWSのインスタンスが作成されていることを確認します。

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ aws ec2 describe-instances --filters "Name=vpc-id,Values=vpc-6a97c20f"
{
    "Reservations": [
        {
            "OwnerId": "457499276421",
            "ReservationId": "r-f7061a55",
            "Groups": [],
            "Instances": [
                {
                    "Monitoring": {
                        "State": "disabled"
                    },
                    "PublicDnsName": "ec2-52-193-159-52.ap-northeast-1.compute.amazonaws.com",
                    "State": {
                        "Code": 16,
                        "Name": "running"
                    },
                    "EbsOptimized": false,
                    "LaunchTime": "2016-04-02T23:55:03.000Z",
                    "PublicIpAddress": "52.193.159.52",
                    "PrivateIpAddress": "10.0.0.9",
                    "ProductCodes": [],
                    "VpcId": "vpc-6a97c20f",
                    "StateTransitionReason": "",
                    "InstanceId": "i-9a53f705",
                    "ImageId": "ami-f80e0596",
                    "PrivateDnsName": "ip-10-0-0-9.ap-northeast-1.compute.internal",
                    "KeyName": "beagle-key-pair-demo",
                    "SecurityGroups": [
                        {
                            "GroupName": "beaglesoft-security-group-demo",
                            "GroupId": "sg-ac9534c8"
                        }
                    ],
                    "ClientToken": "",
                    "SubnetId": "subnet-5282b225",
                    "InstanceType": "t2.micro",
                    "NetworkInterfaces": [
                        {
                            "Status": "in-use",
                            "MacAddress": "06:d5:95:68:07:c7",
                            "SourceDestCheck": true,
                            "VpcId": "vpc-6a97c20f",
                            "Description": "",
                            "Association": {
                                "PublicIp": "52.193.159.52",
                                "PublicDnsName": "ec2-52-193-159-52.ap-northeast-1.compute.amazonaws.com",
                                "IpOwnerId": "amazon"
                            },
                            "NetworkInterfaceId": "eni-0277374a",
                            "PrivateIpAddresses": [
                                {
                                    "PrivateDnsName": "ip-10-0-0-9.ap-northeast-1.compute.internal",
                                    "Association": {
                                        "PublicIp": "52.193.159.52",
                                        "PublicDnsName": "ec2-52-193-159-52.ap-northeast-1.compute.amazonaws.com",
                                        "IpOwnerId": "amazon"
                                    },
                                    "Primary": true,
                                    "PrivateIpAddress": "10.0.0.9"
                                }
                            ],
                            "PrivateDnsName": "ip-10-0-0-9.ap-northeast-1.compute.internal",
                            "Attachment": {
                                "Status": "attached",
                                "DeviceIndex": 0,
                                "DeleteOnTermination": true,
                                "AttachmentId": "eni-attach-05a8f1f6",
                                "AttachTime": "2016-04-02T23:55:03.000Z"
                            },
                            "Groups": [
                                {
                                    "GroupName": "beaglesoft-security-group-demo",
                                    "GroupId": "sg-ac9534c8"
                                }
                            ],
                            "SubnetId": "subnet-5282b225",
                            "OwnerId": "457499276421",
                            "PrivateIpAddress": "10.0.0.9"
                        }
                    ],
                    "SourceDestCheck": true,
                    "Placement": {
                        "Tenancy": "default",
                        "GroupName": "",
                        "AvailabilityZone": "ap-northeast-1a"
                    },
                    "Hypervisor": "xen",
                    "BlockDeviceMappings": [
                        {
                            "DeviceName": "/dev/xvda",
                            "Ebs": {
                                "Status": "attached",
                                "DeleteOnTermination": true,
                                "VolumeId": "vol-3f59b3c1",
                                "AttachTime": "2016-04-02T23:55:04.000Z"
                            }
                        }
                    ],
                    "Architecture": "x86_64",
                    "RootDeviceType": "ebs",
                    "RootDeviceName": "/dev/xvda",
                    "VirtualizationType": "hvm",
                    "AmiLaunchIndex": 0
                }
            ]
        }
    ]
}

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ aws ec2 describe-instance-status --instance-id i-9a53f705
{
    "InstanceStatuses": [
        {
            "InstanceId": "i-9a53f705",
            "InstanceState": {
                "Code": 16,
                "Name": "running"
            },
            "AvailabilityZone": "ap-northeast-1a",
            "SystemStatus": {
                "Status": "ok",
                "Details": [
                    {
                        "Status": "passed",
                        "Name": "reachability"
                    }
                ]
            },
            "InstanceStatus": {
                "Status": "ok",
                "Details": [
                    {
                        "Status": "passed",
                        "Name": "reachability"
                    }
                ]
            }
        }
    ]
}

次にインスタンスにタグを設定します。

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ aws ec2 create-tags --resources i-9a53f705 --tags Key=Name,Value=bs-ec2-demo-demo

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ aws ec2 describe-instances --filters "Name=vpc-id,Values=vpc-6a97c20f" --query "Reservations[].Instances[].Tags"
[
    [
        {
            "Value": "bs-ec2-demo-demo",
            "Key": "Name"
        }
    ]
]

EC2へのログイン

EC2へログインするためpublic DNSの設定を取得します。

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~/aws_work ‹2.2.4›
╰─$ aws ec2 describe-instances | jq '.Reservations[].Instances[] | {PublicDnsName, PublicIpAddress, InstanceId}'aws ec2 describe-instances | jq '.Reservations[].Instances[] | {PublicDnsName, PublicIpAddress, InstanceId}'
{
  "PublicDnsName": "ec2-52-193-159-52.ap-northeast-1.compute.amazonaws.com",
  "PublicIpAddress": "52.193.159.52"
}

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~/aws_work ‹2.2.4›
╰─$ ls
beagle-key-pair-demo.pem
╭─ymanabe@Yoichiro-no-MacBook-Pro  ~/aws_work ‹2.2.4›
╰─$ mv beagle-key-pair-demo.pem ~/.ssh
╭─ymanabe@Yoichiro-no-MacBook-Pro  ~/aws_work ‹2.2.4›
╰─$ cd ~
╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ sudo chmod 600 ~/.ssh/beagle-key-pair-demo.pem
Password:
╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ ssh -i ~/.ssh/beagle-key-pair-demo.pem ec2-user@ec2-52-193-159-52.ap-northeast-1.compute.amazonaws.com
The authenticity of host 'ec2-52-193-159-52.ap-northeast-1.compute.amazonaws.com (52.193.159.52)' can't be established.
RSA key fingerprint is 81:ce:0d:81:81:8b:9b:6a:97:b6:b1:f7:74:ec:ad:8a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'ec2-52-193-159-52.ap-northeast-1.compute.amazonaws.com,52.193.159.52' (RSA) to the list of known hosts.

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2016.03-release-notes/
3 package(s) needed for security, out of 4 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-0-9 ~]$
注意

public DNSの情報を取得できない場合、EC2のインスタンスにAuto-assign Public IPを設定していない可能性があるため設定を見直してください。

ApacheのインストールとHTTPポートの疎通確認

起動したEC2インスタンスにApacheのインストールとHTTPポートの疎通確認を行います。これは最終的にElasticLoadBalancingを利用した接続ができるか確認するために行います。

[ec2-user@ip-10-0-0-9 ~]$ sudo yum install -y httpd
[ec2-user@ip-10-0-0-9 ~]$ sudo vi /var/www/html/index.html
This page is at ec2-52-193-159-52.ap-northeast-1.compute.amazonaws.com.
[ec2-user@ip-10-0-0-9 ~]$ sudo service httpd start
[ec2-user@ip-10-0-0-9 ~]$ sudo chkconfig httpd on

この状態で、http://ec2-52-193-159-52.ap-northeast-1.compute.amazonaws.com/index.htmlへ接続できることをブラウザから確認します。

screencapture-ec2-52-193-159-52-ap-northeast-1-compute-amazonaws-com-index-html-1459643227861.png (102.2 kB)

AMIの作成

AWS CLIよりAMIを作成します。

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ aws ec2 create-image --instance-id i-9a53f705 --name "bs-ec2ami-demo-demo" --description "bs-ec2ami-demo-demo"                                                             130 ↵
{
    "ImageId": "ami-c62031a8"
}

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ aws ec2 describe-images --image-id ami-c62031a8                                                                                                                              2 ↵
{
    "Images": [
        {
            "VirtualizationType": "hvm",
            "Name": "bs-ec2ami-demo-demo",
            "Hypervisor": "xen",
            "SriovNetSupport": "simple",
            "ImageId": "ami-c62031a8",
            "State": "pending",
            "BlockDeviceMappings": [
                {
                    "DeviceName": "/dev/xvda",
                    "Ebs": {
                        "DeleteOnTermination": true,
                        "SnapshotId": "snap-30557008",
                        "VolumeSize": 8,
                        "VolumeType": "gp2",
                        "Encrypted": false
                    }
                }
            ],
            "Architecture": "x86_64",
            "ImageLocation": "457499276421/bs-ec2ami-demo-demo",
            "RootDeviceType": "ebs",
            "OwnerId": "457499276421",
            "RootDeviceName": "/dev/xvda",
            "CreationDate": "2016-04-03T00:39:19.000Z",
            "Public": false,
            "ImageType": "machine",
            "Description": "bs-ec2ami-demo-demo"
        }
    ]
}

ElasticIPの利用

ElasticIP(EIP)をEC2インスタンスに紐付ける設定を行います。EIPは取得してからEC2のインスタンスへ紐付けるため2段階の設定を行います。

EIPを取得するために allocate-address を実行します。

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ aws ec2 allocate-address
{
    "PublicIp": "52.69.244.122",
    "Domain": "vpc",
    "AllocationId": "eipalloc-0bbf2a6e"
}

次に、EC2インスタンスとEIPを関連付けます。

╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ aws ec2 associate-address --instance-id i-9a53f705 --allocation-id eipalloc-0bbf2a6e
{
    "AssociationId": "eipassoc-44df5220"
}
╭─ymanabe@Yoichiro-no-MacBook-Pro  ~ ‹2.2.4›
╰─$ aws ec2 describe-addresses
{
    "Addresses": [
        {
            "Domain": "vpc",
            "InstanceId": "i-9a53f705",
            "NetworkInterfaceId": "eni-0277374a",
            "AssociationId": "eipassoc-44df5220",
            "NetworkInterfaceOwnerId": "457499276421",
            "PublicIp": "52.69.244.122",
            "AllocationId": "eipalloc-0bbf2a6e",
            "PrivateIpAddress": "10.0.0.9"
        }
    ]
}

以上で、EC2インスタンスの作成は完了です。次回は今回作成したAZとは別のAZにEC2インスタンスを起動する設定を行います。

AWSでの環境構築のエントリー全体

AWSでの環境構築は全体で7回に分かれています。このエントリーは5回めになります。

blog.beaglesoft.net

blog.beaglesoft.net

blog.beaglesoft.net

blog.beaglesoft.net

blog.beaglesoft.net

blog.beaglesoft.net

blog.beaglesoft.net