AWS入門:Terraformで構築したEC2環境にnginxをインストールする

スポンサーリンク
AWS入門:Terraformで構築したEC2環境にnginxをインストールする 環境構築
AWS入門:Terraformで構築したEC2環境にnginxをインストールする
この記事は約7分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、Terraformで構築したEC2環境にnginxをインストールする方法についてご紹介します。

スポンサーリンク

前提

この記事は下記の記事をベースにしています。

背景

先日、terraformでEC2環境を構築しました。次に、nginxをインストールして、nginxを起動させてみました。

AWSのIAMユーザに、terraformというユーザを作成して、PowerUserAccessのポリシーを許可しています。

修正内容

下記のファイルを更新、もしくは、作成します。下記の各セクションに各ファイルの修正内容を記載しています。

        new file:   userdata.sh
        modified:   ec2.tf
        modified:   security.tf

userdata.sh

下記の内容で新規作成します。

#!/bin/bash

# Install nginx if not installed
nginx -v
if [ "$?" -ne 0 ]; then
  sudo amazon-linux-extras install -y nginx1
  sudo systemctl enable nginx
  sudo systemctl start nginx
fi

ec2.tf

17行目に下記の内容を追記します。

+  user_data                   = file("./userdata.sh")

security.tf

17行目に下記の内容を追記します。

+resource "aws_security_group_rule" "learn_ec2_ingress_http" {
+  type              = "ingress"
+  from_port         = "80"
+  to_port           = "80"
+  protocol          = "tcp"
+  cidr_blocks       = ["0.0.0.0/0"]
+  security_group_id = aws_security_group.learn_ec2_sg.id
+}

EC2環境構築

下記のコマンドを実行します。

# フォーマット
terraform fmt

# バリデーション
terraform validate

上記のコマンドが問題なければ、下記のコマンドを実行します。

# AWSリソースの作成
terraform apply

下記のような出力になっていれば成功です。

Apply complete! Resources: 14 added, 0 changed, 0 destroyed.

Outputs:
ec2_global_ips = [
        "xxx.xxx.xxx.xxx",
    ]
secretsmanager_secret = "xxx"
secretsmanager_secret_version = "xxx"

Nginxの動作確認

ブラウザで「http://xxx.xxx.xxx.xxx」にアクセスして、下記のように表示されていれば成功です。

xxx.xxx.xxx.xxxは、上記の表示されている、ec2_global_ipsの値で読み替えてください。

解説

userdata.sh

このスクリプトは、NGINXウェブサーバーをインストールし、実行中でない場合にNGINXを起動するためのBashスクリプトです。以下にコードの内容を説明します。

  1. #!/bin/bash: これはシェルスクリプトがBashシェルで実行されることを示すシバンです。
  2. nginx -v: nginx -vコマンドは、NGINXが既にインストールされているかどうかを確認するために実行されます。コマンドが成功した場合、戻り値は0になります。
  3. if [ "$?" -ne 0 ]; then: 直前に実行されたコマンドの戻り値を確認します。$?は直前のコマンドの終了ステータスを表す特殊変数で、0以外の値はエラーを示します。この条件式は、「もし直前のコマンドの戻り値が0でない場合」を意味します。つまり、NGINXがまだインストールされていない場合に真となります。
  4. sudo amazon-linux-extras install -y nginx1: NGINXをインストールするコマンドです。このスクリプトはAmazon Linuxを対象にしており、amazon-linux-extrasコマンドを使用してNGINXをインストールします。
  5. sudo systemctl enable nginx: NGINXをシステムの起動時に自動的に起動するように設定します。
  6. sudo systemctl start nginx: NGINXを起動します。

スクリプトの動作は次のようになります:

  • 既にNGINXがインストールされている場合、nginx -vコマンドは成功し、インストール部分がスキップされます。
  • NGINXがインストールされていない場合、nginx -vコマンドはエラーになります。その後、NGINXをインストールし、自動起動を有効にしてから、NGINXを起動します。

ec2.tf

user_data = file("./userdata.sh"): EC2インスタンスの起動時に実行されるユーザーデータを指定しています。file("./userdata.sh")は、userdata.shというファイルの内容を読み込んでいます。

security.tf

このTerraformコードは、AWSのセキュリティグループルールを作成するための設定を示しています。具体的には、EC2インスタンスに対してHTTPトラフィック(ポート80のTCP通信)を許可するセキュリティグループルールを定義しています。以下にコードの内容を詳細に説明します。

  1. resource "aws_security_group_rule" "learn_ec2_ingress_http": これはTerraformでAWSのセキュリティグループルールを作成するためのリソースブロックです。learn_ec2_ingress_httpという名前のセキュリティグループルールリソースを定義しています。
  2. type = "ingress": この行は、セキュリティグループルールのタイプを指定しています。ingressはインバウンドトラフィックを意味します。つまり、このルールはEC2インスタンスへの受信トラフィックを設定しています。
  3. from_port = "80": トラフィックの送信元ポートを指定しています。ここではポート番号80(HTTPのデフォルトポート)を指定しています。
  4. to_port = "80": トラフィックの送信先ポートを指定しています。ここでもポート番号80を指定しているため、送信元ポートと同じくHTTPのデフォルトポートとなります。
  5. protocol = "tcp": 通信プロトコルを指定しています。ここではTCPを使用しています。
  6. cidr_blocks = ["0.0.0.0/0"]: このルールで許可される送信元IPアドレスをCIDR形式で指定しています。0.0.0.0/0は、すべての送信元IPアドレスを許可することを意味します。つまり、インターネット上のどのIPアドレスからでもHTTPトラフィックを受け入れるようになります。
  7. security_group_id = aws_security_group.learn_ec2_sg.id: このルールが適用される対象のセキュリティグループのIDを指定しています。aws_security_group.learn_ec2_sg.idは、learn_ec2_sgという名前のセキュリティグループリソースのIDを取得しています。

このセキュリティグループルールの設定により、対象のEC2インスタンスはポート番号80でのHTTP通信を許可し、どのIPアドレスからでもアクセスを受け付けるようになります。注意しておくべき点として、一般的なセキュリティベストプラクティスでは、セキュリティグループルールのCIDRを必要最小限に制限することが推奨されます。

おわりに

今日は、Terraformで構築したEC2環境にnginxをインストールして、起動確認する方法についてご紹介しました。

本記事でご紹介したソースは、下記のリポジトリにあります。

よっしー
よっしー

何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました