前提
AWSをTerraformで構成する場合、を前提とした小技を記述します。
リモートステート
何も設定せずにTerraformをデプロイすると、ローカルにtfstate
ファイルが生成されます。
tfstateはデプロイしたクラウドの実リソースの構成情報が記述されています。この手のファイルはプライベートに扱うべきで、Gitで管理するべきではありません。また、複数人でTerraformを管理する場合、このtfstateを複数の作業PCで共有する必要があります。
そこで、クラウド上にリモートステートとしてアップロードし、必要に応じて管理する。という方法が推奨されています。
具体的にはAWS S3がよく利用されます。
また、DynamoDBを追加することで、複数人での同時書き込みによる競合の発生を防ぐこともできます。
terraform
{
backend "s3" {
bucket = "tfstate"
key = "terraform.tfstate"
region = "ap-northeast-1"
}
}
Data Only Module
モジュールは複数のリソースで構成される機能を1つにまとめておくものですが、リソースを含めない用途があります。
Data Only Module では指定した条件(tags="staging"を持つaws_vpc,aws_subnet)に合致するリソースを参照し、出力値としてvpcのidを持つモジュールを定義します。
これにより、柔軟なモジュール実装を可能にします
例では Tags にマッチするものを参照していますが、
他に aws_vpc では state を参照することで、available なVPCのみを参照したりできます。
また、リモートステートやリテラルで参照も可能です。
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パラメータストアを利用することでプロジェクトやリソースをまたいだグローバル変数を扱えます。
resource "aws_ssm_parameter" "main" {
name = "/dev/network/cidrblock"
value = aws_vpc.main.cidrblock
type = "String"
}
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
を参照。
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
で対話式に動作を確認できます。
マルチリージョン
複数のリージョンでリソースを作成する際に、デフォルトのリージョンと明示的に指定した場合のリージョンを設定することができます。
以下ではデフォルトが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"
}