【AWS】EC2インスタンスにnginxをインストールして起動させるまでの手順
この記事の概要
AWS&インフラ初心者です。
勉強のために、EC2インスタンスを作成し、そこにnginxをインストールして起動させます。
具体的には下記を実施していきます。
- VPC・サブネットの作成
- EC2インスタンスの作成
- EC2にnginxをインストール
- ngixnのデフォルトページをブラウザから確認
構成図
EC2インスタンスとは
- Amazon EC2で立ち上げたサーバー
- 仮想マシン / AzureでいうVMのこと
VPC&サブネットの作成
EC2インスタンスを配置するためのVPCとサブネットを作成します。
AWSのコンソール画面からVPCのページに遷移します。
- 作成するリソース:VPCなど
- サブネット、ルートテーブル、インターネットゲートウェイ、VPCエンドポイントをVPCと同時に作成する方式です
- 関連リソースの作成(各種名前は任意)
- VPC: vpc-001
- サブネット:public-subnet-001
- ルートテーブル:rtb-001
- インターネットゲートウェイ:igw-001
- VPCエンドポイント:vpc-endpoint-001
- IPv4 CIDRブロック:10.0.0.0/24
- サブネットのCIDRブロック:10.0.0.0/26
- AZの数:1
- VPCエンドポイント:なし
- セキュリティの向上は不要のため"なし"を選択
VPCを作成ボタンを押すと、下記のように各種リソースが作成されます。
VPCへインターネットゲートウェイをアタッチ
VPC内のリソースがインターネットと通信を行うためには、VPCにインターネットゲートウェイをアタッチする必要があります。インターネットへ通信する道を用意するイメージでしょうか。
今回はインターネットゲートウェイはVPC作成時に一緒に作成されており、そのタイミングでVPCへのアタッチも完了しています。
サブネットのルートテーブルにインターネットゲートウェイのルートを追加する
今回作成するサブネットは、インターネットからアクセス可能なパブリックサブネットとして作成します。
そのためには、サブネットのルートテーブルにインターネットゲートウェイのルートを追加する必要があります。
具体的には、0.0.0.0/0のルートのターゲットにインターネットゲートウェイを指定し、保存します。
※これもVPC作成時に一緒に実施されたかもしれません...。
10.0.0.0/24 localとは何か
基本的に、同じVPC内に所属するリソースは、相互に通信できます。
デフォルトで設定されている「10.0.0.0/24 : local」は、それを実現するための設定です。10.0.0.0/24 の範囲でIPアドレスを持つリソースは、VPC内の他のリソースとも通信できるということになります。
なお、この設定は削除したり、変更したりはできません。
サブネット間の通信制御
「同じVPC内だけど異なるサブネットからの通信は受け付けたくない」という場合はどうすれば良いでしょうか。
これは、ルートテーブルの設定ではなく、セキュリティグループによって実現します。
ルートテーブルは、トラフィックを許可&拒否するような機能や役割を持ちません。そのため、サブネット間の通信制御はセキュリティグループなど別の機能を使って実現します。
EC2インスタンスの作成
VPC,サブネットの話が長くなりました。
本題のEC2インスタンスを作成していきます。
AWSコンソールでEC2のサービスページに行きます。
- 左メニューのインスタンスを選択
- インスタンスを起動を選択
- 名前
- AMI(Amazonマシンイメージ)を選ぶ
- ここでは、"Amazon Linux 2 Kernel 5.10 AMI 2.0.20230727.0 x86_64 HVM gp2"を選択(無料枠の対象)
- インスタンスタイプを選択
- t2.microを選択(無料枠の対象)
- キーペア
- 新しいキーペアを作成
- キーペア名:sample-accesskey
- キーペアのタイプ:RSA
- プライベートキーファイル形式:.pem
- ネットワーク設定
- 上で作成したVPC&サブネットを指定する
- vpc-001 / public-subnet-001
- セキュリティグループを作成する
- 名前:sg-001
- 任意の場所からのSSHトラフィックを許可する
- 上で作成したVPC&サブネットを指定する
- ストレージを設定
- 8GiB gp2
キーペアについて
キーペアは作成時に自動的にダウンロードされています。作成後にAWSコンソールからダウンロードすることはできませんので、削除したりしないように注意です。
キーを紛失した場合は、「EC2インスタンスを作成し直す」か「SSM(AWS Systems Manager)でEC2に入って、キーを作り直す」必要があります。
EC2に紐づくVPCとサブネット
EC2インスタンスを作成するとき、何も設定しないと、デフォルトのVPCやサブネットが紐づきます。
ただし、デフォルトのVPCは実際の運用ではあまり使いません。デフォルトのVPCを使ってしまうと、そのネットワーク領域に何のリソースが配置されるか分からなくなってしまうため、実際の運用では基本NGと考えた方が良いです。この辺りは詳しい人に聞きました。ちゃんと役割を明確にしたVPCやサブネットを作成するのがベターということですね。
今回は学習用なのでそこまで気にしなくても良いかもしれませんが、実際の運用に倣って、上で作成したVPCとサブネットを指定しています。
EC2インスタンスにSSH接続する
以下の手順でEC2インスタンスにSSH接続します。
- AWSコンソールで作成したEC2インスタンスの詳細画面に遷移します
- 接続 → SSHクライアント
- EC2インスタンス作成時にダウンロードしたキーがある階層で下記を実行します
- EC2のDNS名などは実際の環境に合わせて実施してください
$ chmod 400 sample-accesskey.pem
$ ssh -i "sample-accesskey.pem" ec2-user@ec2-**-**-**-***.ap-northeast-1.compute.amazonaws.com
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'ec2-**-**-**-***.ap-northeast-1.compute.amazonaws.com' (ED25519) to the list of known hosts.
Last login: Sun Aug 6 08:27:38 2023 from 133-32-134-161.east.xps.vectant.ne.jp
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
2 package(s) needed for security, out of 2 available
Run "sudo yum update" to apply all updates.
EC2インスタンスに接続できました。
[ec2-user@ip- ~]$
"sudo yum update"を実行します。
[ec2-user@ip- ~]$ sudo yum update
EC2インスタンスにnginxをインストールして起動させる
そもそもnginxとは
オープンソースのWebサーバ用のソフトウェアです。
特徴として、
- 処理性能重視
- 高い並行処理性能
- メモリ消費量を抑えやすい
などがあります。
インストール手順
yumだとインストールできないため、amazon-linux-extrasを使います。
[ec2-user@ip- ~]$ which amazon-linux-extras
/usr/bin/amazon-linux-extras
nginxをインストールします。
[ec2-user@ip- ~]$ sudo amazon-linux-extras install nginx1
Installing nginx
...
...
総ダウンロード容量: 2.4 M
インストール容量: 6.7 M
Is this ok [y/d/N]: y
...
...
完了しました!
インストールできたか確認します。
[ec2-user@ip- ~]$ nginx -v
nginx version: nginx/1.22.1
nginxを起動する
【補足】systemctlコマンド
CentOSやRedhat7系から利用できる、systemdをコントロールするコマンドです。
ちなみに、systemdは、Unix系のコンピュータのシステムを起動するときにカーネルによって最初に起動されるプログラムのことです。
$ systemctl status サービス名 / systemctl start サービス名
のような感じで使います。
起動手順
起動コマンドを打ちます。
[ec2-user@ip- ~]$ sudo systemctl start nginx
起動したかを確認します。
[ec2-user@ip- ~]$ systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
Active: active (running) since 火 2023-08-08 05:07:28 UTC; 52s ago
Process: 2096 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
Process: 2091 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
Process: 2090 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
Main PID: 2098 (nginx)
CGroup: /system.slice/nginx.service
├─2098 nginx: master process /usr/sbin/nginx
└─2099 nginx: worker process
ブラウザから接続を確認する
http://[EC2のドメイン]にアクセスします。
すると、「このサイトにアクセスできません」の画面が表示されました。
セキュリティグループを確認したところ、80,443のポートは共に開いており、問題なさそうです。
AWSで80ポートを開いてるのに【このサイトにアクセスできません】が出るで同じような現象が紹介されていたので、参考に進めました。
まず、80番ポートが開かれているか確認します。
ちなみに、netstatコマンドはネットワーク関連の情報を確認するときのコマンドです。
$ netstat -tln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp6 0 0 :::111 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
開かれていないようです。
nginxの設定をリロードし、nginxを再起動します。
[ec2-user@ip- ~]$ sudo nginx -s reload
nginx: [error] open() "/run/nginx.pid" failed (2: No such file or directory)
[ec2-user@ip- ~]$ sudo service nginx stop
[ec2-user@ip- ~]$ sudo nginx -t
[ec2-user@ip- ~]$ sudo service nginx start
[ec2-user@ip- ~]$ systemctl status nginx
再度、ポートを確認すると、80番ポートが開かれました。
-- 80ポートが開いた!
[ec2-user@ip- ~]$ netstat -tln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp6 0 0 :::111 :::* LISTEN
tcp6 0 0 :::80 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
再度、http://[EC2のドメイン] にアクセスすると、nginxのデフォルトページが表示されました。
nginxを停止する
[ec2-user@ip- ~]$ sudo nginx -s stop
[ec2-user@ip- ~]$ systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Discussion