👏

AWS CLIでEC2を立ててNginxを起動する

2021/11/27に公開

AWS CLIの学習のためにEC2を立ててNginxを起動させてみました。またインフラ周りの知識が浅いため、自分が分からなかった用語はメモレベルですが調べて説明をしています。

VPCを作る

Virtual Private Cloud (VPC) を作ります。VPCはAWS上に作れるプライベートな仮想ネットワークです。
VPC内でEC2インスタンスなどを動かします。

VPC作成時にはIPv4 アドレスの範囲を 10.0.0.0/16のような Classless Inter-Domain Routing (CIDR) ブロック形式で指定します。
10.0.0.0/16は、10.0がネットワーク部、0.0がホスト部になります。

CIDRについてはこちらの記事が分かりやすかったです。
https://dev.classmethod.jp/articles/what-is-cidr/

$ aws ec2 create-vpc --cidr-block 10.0.0.0/16 --tag-specification 'ResourceType=vpc, Tags=[{Key=Name,Value=aws-cli-sample}]' --query Vpc.VpcId --output text

vpc-04f3a0e2951d03416

VPCにサブネットを作る

VPCの中にサブネットを作ります。サブネットとは名前の通りで、VPCという大きなネートワークを分割した小さなネットワークです。

$ aws ec2 create-subnet --vpc-id vpc-04f3a0e2951d03416 --cidr-block 10.0.1.0/24 --tag-specification 'ResourceType=subnet, Tags=[{Key=Name,Value=aws-cli-sample}]' --query Subnet.SubnetId --output text

subnet-0e2384c30bc6e3872

VPCがインターネットと通信できるようにするために、まずはインターネットゲートウェイを作ります。

$ aws ec2 create-internet-gateway --tag-specification 'ResourceType=internet-gateway, Tags=[{Key=Name,Value=aws-cli-sample}]' --query InternetGateway.InternetGatewayId --output text

igw-0b225b5cd94c61456

作成したインターネットゲートウェイをVPCにアタッチします。これでインターネットと通信が可能になります。

$ aws ec2 attach-internet-gateway --vpc-id vpc-04f3a0e2951d03416 --internet-gateway-id igw-0b225b5cd94c61456

次にVPCのカスタムルートテーブルを作成します。

$ aws ec2 create-route-table --vpc-id vpc-04f3a0e2951d03416 --tag-specification 'ResourceType=route-table, Tags=[{Key=Name,Value=aws-cli-sample}]' --query RouteTable.RouteTableId --output text

rtb-0ff85814928b51954

0.0.0.0/0 を指定することで全てのトラフィックがインターネットゲートウェイを指すルートを作ります。

$ aws ec2 create-route --route-table-id rtb-0ff85814928b51954 --destination-cidr-block 0.0.0.0/0 --gateway-id igw-0b225b5cd94c61456

associate-route-tableで、カスタムルートテーブルをサブネットと関連づけます。このサブネットのトラフィックはインターネットゲートウェイにルーティングされるようになります。つまりこのサブネットはパブリックサブネットになります。

$ aws ec2 associate-route-table  --subnet-id subnet-0e2384c30bc6e3872 --route-table-id rtb-0ff85814928b51954

次のコマンドを使用するとサブネットに起動されたインスタンスが立ち上がる際に、自動でパブリックIPアドレスが付与されるようになります。
これを使用せずにElastic IPを使っても良いですが、お金が掛かるので今回は行いません。

$ aws ec2 modify-subnet-attribute --subnet-id subnet-0e2384c30bc6e3872 --map-public-ip-on-launch

サブネットにインスタンスを立てる

※キーペアを既に持っている場合はこの手順は不要です。

キーペアを作成して、KeyMaterialをaws-cli-sample.pemに保存します。

$ aws ec2 create-key-pair --key-name aws-cli-sample --query "KeyMaterial" --output text > aws-cli-sample.pem

パーミッションを設定します。所有者に読み取り権限を設定しました。
パーミッション設定がされていないとエラーになるみたいです。

$ chmod 400 aws-cli-sample.pem

セキュリティグループを設定します。

$ aws ec2 create-security-group --group-name WebServerSg --description "Security group for web server" --vpc-id vpc-04f3a0e2951d03416

{
    "GroupId": "sg-0d00f5c8926da142b"
}

セキュリティグループにルールを追加します。SSHとHTTPのアクセスを許可します。
お試しで作るだけなのでSSHアクセスをあらゆるIPアドレスから許可していますが、実際に本番で使用するときはIPアドレスを指定してください。

$ aws ec2 authorize-security-group-ingress --group-id sg-0d00f5c8926da142b --protocol tcp --port 22 --cidr 0.0.0.0/0

$ aws ec2 authorize-security-group-ingress --group-id sg-0d00f5c8926da142b --protocol tcp --port 80 --cidr 0.0.0.0/0

サブネットにEC2インスタンスを立てます。
image-id ami-0404778e217f54308 は現在無料利用枠の対象になっている Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type (64 ビット x86) です。

$ aws ec2 run-instances --image-id ami-0404778e217f54308 --count 1 --instance-type t2.micro --key-name aws-cli-sample --security-group-ids sg-0d00f5c8926da142b --subnet-id subnet-0e2384c30bc6e3872 --tag-specification 'ResourceType=instance, Tags=[{Key=Name,Value=aws-cli-sample}]'

// 以下のような出力(一部抜粋)があると思います。InstanceIdは次のコマンドで使用します。
{
    "Instances": [
        {
            "AmiLaunchIndex": 0,
            "ImageId": "ami-0404778e217f54308",
            "InstanceId": "i-084c51fbf509a453b",
            "InstanceType": "t2.micro",
            "KeyName": "aws-cli-sample",
            "LaunchTime": "2021-11-27T03:05:54+00:00",  
        }
    ],
}

EC2インスタンスにアクセスするためには状態がrunningになっている必要があります。以下のコマンドで状態とIPアドレスを確認します。

$ aws ec2 describe-instances --instance-id i-084c51fbf509a453b --query "Reservations[*].Instances[*].{State:State.Name,Address:PublicIpAddress}"

[
    [
        {
            "State": "running",
            "Address": "35.77.3.5"
        }
    ]
]

SSHでEC2インスタンスにアクセスします。

$ ssh -i "aws-cli-sample.pem" ec2-user@35.77.3.5

Nginxをインストールして起動する

EC2インスタンスでNginxをインストールします。
yumだとインストールできなくて、amazon-linux-extrasというパッケージ管理ツールを使う必要があります。

$ sudo amazon-linux-extras install nginx1 -y
$ nginx -v

nginx version: nginx/1.20.0

インストールが完了したらNginxを起動します。

$ sudo systemctl start nginx.service

(補足1)
ストップと再起動は以下のコマンドで行えます。

$ sudo systemctl stop nginx.service

$ sudo systemctl restart nginx.service

(補足2)
systemctlとは、systemdをコントロールするコマンド。systemdとはLinuxの起動処理やシステム管理を行う仕組みです。
https://dev.classmethod.jp/articles/systemd-getting-started/

話を戻して、今はインスタンスを停止させたら、再度Nginxを起動させる必要がある状態なので、インスタンス起動時にNginxも自動で起動するように設定します。

$ sudo systemctl enable nginx

ステータスを確認します。

$ systemctl status nginx

http://35.77.3.5/http://EC2インスタンスのパブリックIPアドレス) にアクセスするとNginxの画面が表示されます 🚀

この記事で作ったAWSリソースをもう使わない場合は適宜削除してください。

感想

  • 簡単なものですがAWS CLIでEC2を立ててみて、EC2を立てるために必要なものと周辺知識への理解が以前より深まった気がします。これは記事を書いたことによる効果もあるとは思います。
  • コンソールに比べてAWS CLIだと素早くAWSの設定を行うことができました。ただしコンソールの方が学習コストは低いですし、どのような設定があるかを知っていないとCLIだけで作業することは難しそうです。
  • CLIのメリットはコマンドを組み合わせてスクリプトを作成したり、操作の自動化があるようです。

参考

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-subnets-commands-example.html
https://qiita.com/e-onm/items/0814b6c4db395e331df1

Discussion