この記事では、Terraformで再利用可能なモジュールを作成する方法を説明します。モジュールを使用すると、コードの重複を回避できます。これは、同じコードを使用して同じタイプのリソースを作成できることを意味します。モジュールを使用することで、同じタイプの複数のリソースを作成するためにコードをコピーして貼り付ける必要がありません。
たとえば、コードをTerraformモジュール内に配置し、そのモジュールをステージング環境と本番環境で再利用できます。これにより、両方の環境で同じものを再利用できるようになります。コードを複数回記述する代わりに、同じモジュールからコードを記述します。
この記事では、例としてS3バケットを作成するためのモジュールを作成します。
前提条件
- Terraformの基本的な理解。
- システムにインストールされているTerraform。
- AWSアカウント(アカウントがない場合は作成します)。
- AWSIAMユーザーの「access_key」と「secret_key」。 (AWSで「access_key」と「secret_key」を使用してIAMユーザーを作成する方法については、ここをクリックしてください)
何をするか
- 独自のモジュールを作成する
- Terraformモジュールを使用してS3バケットを作成します。
- TerraformModuleを使用して作成したリソースを削除します。
独自のTerraformモジュールを作成する
テラフォームの「main.tf」ファイルとモジュールを配置できる専用ディレクトリを作成します。
次のコマンドを使用してディレクトリを作成します
mkdir -p modules / aws-s3
modules / aws-s3の下にmain.tfファイルを作成し、S3バケットを作成するためのモジュールとして使用される次のコードブロックをコピーして貼り付けます。
vim modules / aws-s3 / main.tf
resource "aws_s3_bucket" "s3_bucket" {
bucket = var.bucket_name
acl = "public-read"
policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::${var.bucket_name}/*"
]
}
]
}
EOF
website {
index_document = "index.html"
error_document = "error.html"
}
tags = var.tags
}
「modules/aws-s3/variables.tf」で必要な変数を宣言します。必要に応じて、変数にデフォルト値を指定できます。次のコードブロックをコピーして貼り付け、ファイルを作成します。
vim modules / aws-s3 / variables.tf
variable "bucket_name" { description = "Name of the s3 bucket. Must be unique." type = string } variable "tags" { description = "Tags to set on the bucket." type = map(string) default = {} }
次に、上記の手順で定義したモジュールを呼び出す「main.tf」ファイルを作成します。モジュールを呼び出すとは、そのモジュールのコンテンツを、その変数の特定の値とともに構成に含めることを意味します。モジュールは、module
を使用して他のモジュール内から呼び出されます ブロック:
vim main.tf
provider "aws" { region = "${var.region}" access_key = "${var.access_key}" secret_key = "${var.secret_key}" } module "website_s3_bucket" { source = "./modules/aws-s3" bucket_name = "${var.bucket_name}" tags = { Terraform = "true" Environment = "dev" } }
すべてのモジュールにはソース引数が必要です。その値は、モジュールの構成ファイルのローカルディレクトリへのパス、またはTerraformがダウンロードして使用する必要のあるリモートモジュールソースのいずれかです。
複数のモジュールブロックで同じ送信元アドレスを指定して、内部で定義されているリソースの複数のコピーを作成できます。変数の値は異なる場合があります。
変数の定義を含む「variables.tf」を作成します。これは、AWSの「access_key」および「secret_key」とともにモジュールに渡す必要のあるデフォルト値を保持します。
vim variables.tf
variable "access_key" { description = "Access key to AWS console" } variable "secret_key" { description = "Secret key to AWS console" } variable "region" { description = "Region of AWS VPC" } variable "bucket_name" { description = "(Required) Creates a unique bucket name" type = "string" default = "test-bucket-rahul-delete" }
次に、AWSユーザークレデンシャルを保持する「terraform.tfvars」を作成します。次のキーは、IAMユーザーのキーで変更する必要があります。これらのキーを指定する前に、AWSコンソールからキーを作成する必要があり、これらのキーを他の人と共有しないでください。
vim terraform.tfvars
region = "eu-west-3" access_key = "AKIAQ6GAIA5XX54GLLNG" secret_key = "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"
Terraformモジュールを使用してS3バケットを作成する
次のコマンドを実行する前に、有効なaccess_keyとsecret_keyが構成されていることを確認してください。
最初に使用するコマンドは「terraforminit」です。このコマンドは、構成内で使用されるプロバイダーのプラグインをダウンロードしてインストールします。私たちの場合はAWSです。
terraform init
使用する2番目のコマンドは「terraformplan」です。このコマンドは、インフラストラクチャで行われる変更を確認するために使用されます。
テラフォームプラン
'terraform apply'コマンドは、main.tfファイルに記載されているAWSにリソースを作成します。リソースを作成するための入力を入力するように求められます。
テラフォーム適用
上記のコマンドを実行すると、正常に完了すると、1つの新しいリソースが追加され、0が破棄されたことがわかります。
AWS S3コンソールに移動して、S3バケットが作成されているかどうかを確認できます。
Terraformを使用して作成されたS3バケットを削除します
main.tfファイルに記載されている構成を使用して作成したリソースが不要になった場合は、「terraformdestroy」コマンドを使用してこれらのリソースをすべて削除できます。ここで、S3バケットは次のコマンドを実行すると削除されます。
テラフォーム破壊
結論
この記事では、独自のモジュールを作成し、それを使用してS3バケットを作成する手順を説明しました。これで、同じモジュールを使用して複数のS3バケットを作成できるようになりました。そのためには、変数の値を変更して同じモジュールを再利用するだけです。