LoginSignup
4
2

AWSで、Terraformを利用する方法をまとめてみた(6/10)

Last updated at Posted at 2023-09-28

モジュールを利用する方法

目次
1.モジュール化する方法
2.EC2インスタンスのAMIをモジュール化する方法
3.S3をモジュール化する方法

1.モジュール化する方法

1.モジュールの作成
モジュールを作成します。モジュールを作成するためには、
以下のような構成のディレクトリを作成する必要があります。

module-name/
  ├── main.tf
  ├── variables.tf
  ├── outputs.tf

main.tf ファイルには、リソースの定義が含まれます。 variables.tf ファイルには、入力変数が定義されます。outputs.tf ファイルには、出力変数が定義されます。

2.モジュールの呼び出し
次に、作成したモジュールを呼び出します。呼び出しには、以下のようなコードを記述します。

module "module-name" {
  source = "./module-name"

  variable1 = "value1"
  variable2 = "value2"
}

source パラメータには、モジュールのパスを指定します。上記の例では、ローカルの ./module-name ディレクトリにあるモジュールを呼び出しています。

呼び出し時には、入力変数に値を指定する必要があります。上記の例では、 variable1 と variable2 にそれぞれ値を指定しています。

3.モジュールの出力の利用
モジュールから出力変数を利用するには、以下のようなコードを記述します。

output "output1" {
  value = module.module-name.output1
}

value パラメータには、出力変数の値を指定します。上記の例では、 module.module-name.output1 という形式でモジュールから出力された output1 変数を参照しています。

モジュールを使うことで、リソースの再利用性を高めることができ、コードの保守性を向上させることができます。

2.EC2インスタンスのAMIをモジュール化する方法

AMIをモジュール化することで、コードの再利用性を高め、共通のAMIを使用する複数のEC2インスタンスを作成することができます。以下は、TerraformでEC2インスタンスのAMIをモジュール化する方法の例です。

1.AMIを選択するためのモジュールを作成します。例えば、ami-selectorという名前のモジュールを作成します。

# ami-selector module

variable "ami_name" {}

data "aws_ami" "selected" {
  most_recent = true

  filter {
    name   = "name"
    values = [var.ami_name]
  }
}

output "ami_id" {
  value = data.aws_ami.selected.id
}

上記のコードでは、ami-selectorモジュールを作成し、variableでAMIの名前を受け取り、dataブロックで該当するAMIを検索し、outputでAMI IDを出力しています。

次に、EC2インスタンスを作成するためのコードで、上記で作成したami-selectorモジュールを使用します。

# main.tf

module "my_instance" {
  source = "./modules/ec2-instance"

  ami_id = module.ami_selector.ami_id
  instance_type = "t2.micro"
  # 他の必要な引数をここに追加
}

上記のコードでは、moduleブロックでami-selectorモジュールを呼び出し、ami_idを引数として渡しています。

最後に、上記のコードで使用するec2-instanceモジュール内で、EC2インスタンスを作成するコードを書きます。AMI IDの代わりに、ami-selectorモジュールで出力されたAMI IDを使用します。

このようにして、AMIをモジュール化することで、コードの再利用性を高め、共通のAMIを使用する複数のEC2インスタンスを作成することができます。

TerraformでRDSインスタンスを作成する場合

  1. variables.tf ファイルを作成し、モジュールで使用する変数を定義する。例えば、以下のようになります。
variable "rds_name" {
  type        = string
  description = "The name of the RDS instance."  
# RDSインスタンスの名前
}

variable "rds_engine" {
  type        = string
  description = "The database engine for the RDS instance."  
# RDSインスタンスのデータベースエンジン
}

variable "rds_engine_version" {
  type        = string
  description = "The version of the database engine."  
# データベースエンジンのバージョン
}

variable "rds_instance_class" {
  type        = string
  description = "The instance class for the RDS instance."  
# RDSインスタンスのインスタンスクラス
}

variable "rds_username" {
  type        = string
  description = "The username for the RDS instance."  
# RDSインスタンスのユーザー名
}

variable "rds_password" {
  type        = string
  description = "The password for the RDS instance."  
# RDSインスタンスのパスワード
}

variable "rds_subnet_ids" {
  type        = list(string)
  description = "The list of subnet IDs where the RDS instance will be deployed."  
# RDSインスタンスを展開するサブネットのIDリスト
}
  1. main.tf ファイルに、aws_db_subnet_groupaws_db_instance リソースを定義する。例えば、以下のようになります。
provider "aws" {
  region = "us-west-2"
}
resource "aws_db_subnet_group" "rds_subnet_group" {
  name       = "rds-subnet-group"  # RDSサブネットグループの名前
  subnet_ids = var.rds_subnet_ids  # 使用するサブネットのIDリスト

  tags = {
    Name = "rds-subnet-group"  # タグの名前
  }
}

resource "aws_db_instance" "rds_instance" {
  identifier            = var.rds_name  # RDSインスタンスの識別子
  engine                = var.rds_engine  # 使用するデータベースエンジン
  engine_version        = var.rds_engine_version  # 使用するデータベースエンジンのバージョン
  instance_class        = var.rds_instance_class  # インスタンスタイプ
  allocated_storage     = 20  # 割り当てられるストレージのサイズ
  storage_type          = "gp2"  # ストレージのタイプ
  username              = var.rds_username  # RDSインスタンスのユーザー名
  password              = var.rds_password  # RDSインスタンスのパスワード
  db_subnet_group_name  = aws_db_subnet_group.rds_subnet_group.name  # 使用するRDSサブネットグループの名前

  tags = {
    Name = var.rds_name  # インスタンスのタグの名前
  }
}
  1. モジュールのディレクトリを作成し、variables.tfmain.tf ファイルを配置する。例えば、以下のようになります。
modules/
└── rds-instance
    ├── variables.tf
    └── main.tf
  1. モジュールを呼び出す main.tf ファイルを作成する。例えば、以下のようになります。
provider "aws" {
  region = "us-west-2"
}

module "rds" {
  source              = "./modules/rds-instance"
  rds_name            = "my-rds-instance"  # RDSインスタンスの名前
  rds_engine          = "mysql"  # RDSインスタンスのデータベースエンジン
  rds_engine_version  = "8.0"  # データベースエンジンのバージョン
  rds_instance_class  = "db.t2.micro"  # RDSインスタンスのインスタンスクラス
  rds_username        = "myuser"  # RDSインスタンスのユーザー名
  rds_password        = "mypassword"  # RDSインスタンスのパスワード
  rds_subnet_ids      = var.rds_subnet_ids  # RDSインスタンスを展開するサブネットのIDリスト
}
  1. terraform apply を実行し、RDSインスタンスを作成する。

上記の手順で RDSインスタンス をモジュール化することができます。これにより、同じ構成の RDSインスタンス を複数回作成する際に、コードの再利用性が高くなり、管理が容易になります。

3.S3をモジュール化する方法

TerraformでAWS S3をモジュール化するには、以下の手順に従います。

TerraformでAWS S3をモジュール化する場合は、以下の手順に従ってください。

  1. モジュールのディレクトリを作成

モジュールを作成するために、ディレクトリを作成します。この例では、s3_moduleという名前のディレクトリを作成します。

  1. モジュールの変数を定義

variables.tfファイルを作成して、モジュールで使用する変数を定義します。この例では、S3バケットの名前を指定するbucket_name変数を定義しています。

variable "bucket_name" {
  type        = string
  description = "The name of the S3 bucket"
}
  1. モジュールの設定を定義

main.tfファイルを作成して、モジュールの設定を定義します。この例では、S3バケットを作成し、バケットポリシーを設定しています。

resource "aws_s3_bucket" "s3_bucket" {
  bucket = var.bucket_name

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Sid = "Allow public read access"
        Effect = "Allow"
        Principal = "*"
        Action = [
          "s3:GetObject"
        ]
        Resource = [
          "${aws_s3_bucket.s3_bucket.arn}/*"
        ]
      }
    ]
  })
}
  1. モジュールの出力を定義

outputs.tfファイルを作成して、モジュールの出力を定義します。この例では、S3バケットのARNを出力しています。

output "bucket_arn" {
  value = aws_s3_bucket.s3_bucket.arn
}
  1. モジュールを呼び出す

モジュールを呼び出すために、Terraformコード内で以下のようにmoduleブロックを使用します。

module "s3" {
  source = "./s3_module"
  bucket_name = "my-bucket"
}

resource "aws_s3_bucket_object" "object" {
  bucket = module.s3.bucket_arn
  key    = "example-object"
  source = "/path/to/local/file"
}

上記の例では、moduleブロックを使用してs3モジュールを呼び出し、bucket_name変数にmy-bucketを設定しています。また、S3バケットにオブジェクトをアップロードするために、s3モジュールから出力されたbucket_arnaws_s3_bucket_objectリソースで使用しています。

以上の手順に従うことで、TerraformでAWS S3をモジュール化することができます。

Terraformにおけるdataブロック

S3のTerraformモジュールで、dataブロックを使用すると、既存のS3バケットの情報を取得して、その情報を変数として使用できます。

以下は、S3バケットのリージョン、ARN、およびバケット名を取得する例です。

data "aws_s3_bucket" "example" {
  bucket = "example-bucket"
}

output "bucket_region" {
  value = data.aws_s3_bucket.example.region
}

output "bucket_arn" {
  value = data.aws_s3_bucket.example.arn
}

output "bucket_name" {
  value = data.aws_s3_bucket.example.id
}

この例では、dataブロックで、aws_s3_bucketデータソースを定義し、example-bucketを参照しています。次に、outputブロックで、バケットのリージョン、ARN、およびバケット名を定義しています。

これらの出力は、別のTerraformモジュールやリソースで参照できます。たとえば、EC2インスタンスを作成するモジュールで、このS3バケットのARNを使用して、EC2インスタンスにアクセス許可を付与できます。

AWSで、Terraformを利用する方法をまとめてみた(1/10)
https://qiita.com/kimuni-i/items/ffde2f8df96fe5d9513f
AWSで、Terraformを利用する方法をまとめてみた(2/10)
https://qiita.com/kimuni-i/items/6298ed10adc6ad450488
AWSで、Terraformを利用する方法をまとめてみた(3/10)
https://qiita.com/kimuni-i/items/4d2f90506eb2dd4ee702
AWSで、Terraformを利用する方法をまとめてみた(4/10)
https://qiita.com/kimuni-i/items/b97089a820cc06ed2d9c
AWSで、Terraformを利用する方法をまとめてみた(5/10)
https://qiita.com/kimuni-i/items/11efb60b9a731d212211
AWSで、Terraformを利用する方法をまとめてみた(7/10)
https://qiita.com/kimuni-i/items/b2cc6e1e4b5d5c1a92cb
AWSで、Terraformを利用する方法をまとめてみた(8/10)
https://qiita.com/kimuni-i/items/2934372c385ba0561425
AWSで、Terraformを利用する方法をまとめてみた(9/10)
https://qiita.com/kimuni-i/items/edbdc88f0bca9c0354d2

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2