自分のIPアドレスのみアクセスを許可するTerraform設定
はじめに
今回、私がこの設定を行いたいと思った理由は、今後さまざまなリソースをTerraformで作成し、システムを構築・検証するためです。特に、検証の段階では自分の端末からのみアクセスができるようにしたいと考えました。
パブリックIPを取得する方法として、ここで記載したスクリプトを使用するよりも、TerraformのHTTPプロバイダを利用する方法のほうが良さそうなので、HTTPプロバイダを利用した方法について以下のリンク先に記載しました。
[Terraformで自分のIPアドレスを取得してSGに設定する方法:HTTPプロバイダーの活用]
https://zenn.dev/shz/articles/c1baf28b1fc222
追記:前提知識
Terraformとは
Terraformは、インフラストラクチャをコードとして管理するツールです。コードを使用してインフラを定義し、バージョン管理を行い、自動的にプロビジョニングやデプロイを行うことができます。
セキュリティグループとは
AWSのセキュリティグループは、インスタンスに対するインバウンドおよびアウトバウンドのトラフィックを制御する仮想ファイアウォールです。ルールを設定することで、どのIPアドレスからのアクセスを許可するかを指定できます。
手順
手順1: 変数をTerraformに設定
まず、Terraformの変数ファイルを設定して、IPアドレスを受け取る準備をします。このファイルは、Terraformプロジェクトのディレクトリに作成します。
-
variables.tf
ファイルを作成または編集
Terraformプロジェクトのルートディレクトリに移動し、variables.tf
ファイルを作成します。このファイルに以下の内容を記述します。
# variables.tf
variable "my_ip" {
description = "My IP address"
type = string
}
手順2: セキュリティグループルールに変数を使用
次に、vpc_sg.tf
ファイルを編集し、my_ip
変数を使用するようにします。このファイルもTerraformプロジェクトのルートディレクトリに作成します。なお、アウトバウンドトラフィックの設定も通常は記載する必要がありますが、今回はインバウンドトラフィックの設定に焦点を当てているため、省略しています。
-
vpc_sg.tf
ファイルを編集
# vpc_sg.tf
resource "aws_security_group" "sg" {
name = "example-sg"
description = "Example security group"
vpc_id = aws_vpc.vpc.id
}
resource "aws_security_group_rule" "ingress_pub_a_22" {
type = "ingress"
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["${var.my_ip}/32"]
security_group_id = aws_security_group.sg.id
}
resource "aws_security_group_rule" "ingress_pub_a_80" {
type = "ingress"
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["${var.my_ip}/32"]
security_group_id = aws_security_group.sg.id
}
resource "aws_security_group_rule" "ingress_alb_web_443" {
type = "ingress"
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["${var.my_ip}/32"]
security_group_id = aws_security_group.sg.id
}
手順3: IPアドレスを取得するスクリプトを作成
次に、現在のIPアドレスを取得し、それを環境変数として設定するシェルスクリプトを作成します。このスクリプトもTerraformプロジェクトのルートディレクトリに作成します。
-
get_my_ip.sh
スクリプトを作成
Terraformプロジェクトのディレクトリに移動し、get_my_ip.sh
という名前のファイルを作成し、以下の内容を記述します。
#!/bin/bash
# 自分の現在のIPアドレスを取得
MY_IP=$(curl -s http://checkip.amazonaws.com)
# Terraformに渡すための環境変数を設定
export TF_VAR_my_ip="$MY_IP"
# 環境変数が正しく設定されたか確認
echo "Your IP address ($MY_IP) has been set as TF_VAR_my_ip"
スクリプトの解説
-
#!/bin/bash
: シェルスクリプトの先頭に置き、使用するシェルを指定します。この場合、Bashシェルを使用します。 -
MY_IP=$(curl -s http://checkip.amazonaws.com)
:curl
コマンドを使用して現在のパブリックIPアドレスを取得し、MY_IP
変数に格納します。 -
export TF_VAR_my_ip="$MY_IP"
: 取得したIPアドレスをTerraformに渡すための環境変数TF_VAR_my_ip
として設定します。 -
echo "Your IP address ($MY_IP) has been set as TF_VAR_my_ip"
: 設定されたIPアドレスを確認するためのメッセージを表示します。
スクリプトに実行権限を付与
スクリプトに実行権限を付与します。
chmod +x get_my_ip.sh
手順4: スクリプトをsourceコマンドで実行
スクリプトをsource
コマンドで実行して、環境変数が現在のシェルセッション内で有効になるようにします。
source ./get_my_ip.sh
スクリプトを実行すると、現在のIPアドレスが取得され、TF_VAR_my_ip
環境変数に設定されます。出力されるメッセージでIPアドレスが正しく設定されたことを確認できます。
手順5: 環境変数の確認
環境変数が正しく設定されているか確認します。
echo $TF_VAR_my_ip
このコマンドがあなたのIPアドレス(例: 27.xx.xx.xx)を出力することを確認します。
手順6: Terraformを実行
環境変数が正しく設定されたことを確認した後、terraform plan
およびterraform apply
を実行します。
terraform plan
terraform apply
まとめ
この手順に従うことで、動的に取得したIPアドレスをTerraformの変数として使用し、セキュリティグループの設定に反映させることができます。これにより、マネジメントコンソールでの「My IP」と同様の設定をTerraformでも実現できます。また、アウトバウンドトラフィックの設定も通常は記載する必要がありますが、今回はインバウンドトラフィックの設定に焦点を当てているため、省略しています。
Discussion
毎回シェルを叩くのも面倒だし、vars に設定して外から与えるのも筋がよくないのでこういう例が。
コメントありがとうございます。
最近学習し始めたのでアドバイスとても参考になります。
教えていただいたやり方試してみます!