5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ワンランク上のTerraform使いになるための小技

Last updated at Posted at 2021-01-17

前提

AWSをTerraformで構成する場合、を前提とした小技を記述します。

リモートステート

何も設定せずにTerraformをデプロイすると、ローカルにtfstateファイルが生成されます。
tfstateはデプロイしたクラウドの実リソースの構成情報が記述されています。この手のファイルはプライベートに扱うべきで、Gitで管理するべきではありません。また、複数人でTerraformを管理する場合、このtfstateを複数の作業PCで共有する必要があります。
そこで、クラウド上にリモートステートとしてアップロードし、必要に応じて管理する。という方法が推奨されています。
具体的にはAWS S3がよく利用されます。
また、DynamoDBを追加することで、複数人での同時書き込みによる競合の発生を防ぐこともできます。

terraform 
{
backend "s3" {
    bucket = "tfstate"
    key = "terraform.tfstate"
    region = "ap-northeast-1"
    }
}

https://qiita.com/saiya_moebius/items/a8f8aa3683c2347d607c

Data Only Module

モジュールは複数のリソースで構成される機能を1つにまとめておくものですが、リソースを含めない用途があります。
Data Only Module では指定した条件(tags="staging"を持つaws_vpc,aws_subnet)に合致するリソースを参照し、出力値としてvpcのidを持つモジュールを定義します。
これにより、柔軟なモジュール実装を可能にします
例では Tags にマッチするものを参照していますが、
他に aws_vpc では state を参照することで、available なVPCのみを参照したりできます。
また、リモートステートやリテラルで参照も可能です。

DataOnlyModuleを定義
data "aws_vpc" "main" {
    tags = {
        Environment = "Staging"
    }
}
data "aws_subnet" "main" {
    tags = {
        Environment = "Staging"
    }
}
output "vpc_id" {
    id = data.aws_vpc.main.id
}

https://www.terraform.io/docs/modules/composition.html#data-only-modules

SSMパラメータストア

AWSのSSMパラメータストアを利用することでプロジェクトやリソースをまたいだグローバル変数を扱えます。

SSMパラメータストアへ代入
resource "aws_ssm_parameter" "main" {
    name = "/dev/network/cidrblock"
    value = aws_vpc.main.cidrblock
    type = "String"
}
SSMパラメータストアから参照
data "aws_ssm_parameter" "cidr" {
    name = "/dev/network/cidrblock"
}
resource "aws_vpc" "main" {
    cidr_block = data.aws_ssm_parameter.cidr.value
    tags = {
        Name = "test"
    }
}

Count引数

リソースに対しcount引数を与えると、与えた数だけ同じリソースが作成されます。
作成する数に応じて一部パラメータを変える必要があるときはcount.indexを参照。

リソースを3つ複製
resource "aws_vpc" "main" {
    count = 3
    cidr_block = "10.${count.index}.0.0/16"
}

また、三項演算子とcountを組み合わせることでリソースの作成の可否を制御できます。

リソースの作成を制御
resource "aws_vpc" "main" {
    count = var.create_vpc ? 1:0
    cidr_block = "10.0.0.0/16"
}

組み込み関数

Terraformには様々な組み込み関数が用意されています。利用するうえで動作を確認したい場合terraform consoleで対話式に動作を確認できます。

https://www.terraform.io/docs/configuration/functions.html

マルチリージョン

複数のリージョンでリソースを作成する際に、デフォルトのリージョンと明示的に指定した場合のリージョンを設定することができます。
以下ではデフォルトがap-northeast-1で明示的にvirginiaを指定するとus-east-1に作成されます

リージョンを定義
provider "aws" {
    alias = "virginia"
    region = "us-east-1"
}
provider "aws" {
    region = "ap-north-east"
}
リージョンを参照
resource "aws_vpc" "at_virginia" {
    provider = "aws.virginia"
    cidr_block = "10.0.0.0/16"
}
resource "aws_vpc" "at_tokyo" {
    cidr_block = "10.0.0.0/16"
}
5
3
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
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?