こんにちは。よっしーです(^^)
今日は、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スクリプトです。以下にコードの内容を説明します。
#!/bin/bash
: これはシェルスクリプトがBashシェルで実行されることを示すシバンです。nginx -v
:nginx -v
コマンドは、NGINXが既にインストールされているかどうかを確認するために実行されます。コマンドが成功した場合、戻り値は0になります。if [ "$?" -ne 0 ]; then
: 直前に実行されたコマンドの戻り値を確認します。$?
は直前のコマンドの終了ステータスを表す特殊変数で、0以外の値はエラーを示します。この条件式は、「もし直前のコマンドの戻り値が0でない場合」を意味します。つまり、NGINXがまだインストールされていない場合に真となります。sudo amazon-linux-extras install -y nginx1
: NGINXをインストールするコマンドです。このスクリプトはAmazon Linuxを対象にしており、amazon-linux-extras
コマンドを使用してNGINXをインストールします。sudo systemctl enable nginx
: NGINXをシステムの起動時に自動的に起動するように設定します。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通信)を許可するセキュリティグループルールを定義しています。以下にコードの内容を詳細に説明します。
resource "aws_security_group_rule" "learn_ec2_ingress_http"
: これはTerraformでAWSのセキュリティグループルールを作成するためのリソースブロックです。learn_ec2_ingress_http
という名前のセキュリティグループルールリソースを定義しています。type = "ingress"
: この行は、セキュリティグループルールのタイプを指定しています。ingress
はインバウンドトラフィックを意味します。つまり、このルールはEC2インスタンスへの受信トラフィックを設定しています。from_port = "80"
: トラフィックの送信元ポートを指定しています。ここではポート番号80(HTTPのデフォルトポート)を指定しています。to_port = "80"
: トラフィックの送信先ポートを指定しています。ここでもポート番号80を指定しているため、送信元ポートと同じくHTTPのデフォルトポートとなります。protocol = "tcp"
: 通信プロトコルを指定しています。ここではTCPを使用しています。cidr_blocks = ["0.0.0.0/0"]
: このルールで許可される送信元IPアドレスをCIDR形式で指定しています。0.0.0.0/0
は、すべての送信元IPアドレスを許可することを意味します。つまり、インターネット上のどのIPアドレスからでもHTTPトラフィックを受け入れるようになります。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をインストールして、起動確認する方法についてご紹介しました。
本記事でご紹介したソースは、下記のリポジトリにあります。
何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント