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


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

__目次__
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` ファイルを作成し、モジュールで使用する変数を定義する。例えば、以下のようになります。

```hcl
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リスト
}
```

2. `main.tf` ファイルに、`aws_db_subnet_group` と `aws_db_instance` リソースを定義する。例えば、以下のようになります。

```hcl
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  # インスタンスのタグの名前
  }
}
```

3. モジュールのディレクトリを作成し、`variables.tf` と `main.tf` ファイルを配置する。例えば、以下のようになります。

```
modules/
└── rds-instance
    ├── variables.tf
    └── main.tf
```

4. モジュールを呼び出す `main.tf` ファイルを作成する。例えば、以下のようになります。

```hcl
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リスト
}
```

5. `terraform apply` を実行し、RDSインスタンスを作成する。

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

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

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

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

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

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

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

```hcl
variable "bucket_name" {
  type        = string
  description = "The name of the S3 bucket"
}
```

3. モジュールの設定を定義

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

```hcl
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}/*"
        ]
      }
    ]
  })
}
```

4. モジュールの出力を定義

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

```hcl
output "bucket_arn" {
  value = aws_s3_bucket.s3_bucket.arn
}
```

5. モジュールを呼び出す

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

```hcl
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_arn`を`aws_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