↓の本の「7章 複数のプロバイダを使う」のメモを残します。
前章のメモ
1つのプロバイダを使う
プロバイダとは?
Terraformにはコアとプロバイダの2つから構成されている。
- コア
基本的なTerraformの機能やコマンドを提供している。
プロバイダへの橋渡し的なイメージ。 - プロバイダ
Terraformが他のサービスと連携するためのプラグイン。
AWSなら aws_ といった、固有のプレフィックスを持つ。
プロバイダをインストールする流れ
- 使用するプロバイダーを定義
- terraform initコマンドでプロバイダーをインストール
「1. 使用するプロバイダーを定義」についてもう少し見ていきます。
オフィシャルのプロバイダーであれば、
1 2 3 |
provider "aws" { region = "us-east-2" } |
みたいにproviderブロックを使うのが一番簡単です。
ただ、
- プロバイダーのバージョンを指定したい
- オフィシャルではないプロバイダーを使いたい
といった要件に応えることはできない。
より詳細にプロバイダーを指定するにはterraformブロックのrequired_providersを使う。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
terraform { required_providers { <LOCAL_NAME> = { source = "[<HOSTNAME>/]<NAMESPACE>/<TYPE>" version = "<VERSION>" } } } // 使用例 // AWS terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 5.0" } } } |
<LOCAL_NAME> | providerブロックで指定するための一意なローカルな名前。 AWSならawsなど推奨ローカル名を使うことが多い。 |
source | プロバイダのソースを指定。 AWSであれば、“hashicorp/aws” を指定する |
<HOSTNAME> | プロバイダを提供しているTerraformレジストリのホスト名。 デフォルトがパブリックなTerraformレジストリなので、省略されることが多い。 |
<NAMESPACE> | 組織のネームスペース。 |
<TYPE> | プロバイダが管理するプラットフォーム名。 通常はこのTYPEが推奨ローカル名になる。 |
version | プロバイダのバージョンを指定する。 特定のバージョンを指定したり、”~> 5.0″ のように範囲指定もできる |
では、required_providersを使わず、providerブロックのみの場合はどうなっているのでしょうか?
- HOSTNAMEがパブリックなTerraformレジストリ、NAMESPACEがhashicorp、TYPEが指定したprovider名としてプロバイダをダウンロード。
- つまり、providerブロックでhogeとしたときのsourceは、
registry.terraform.io/hashicorp/hoge となる。
- つまり、providerブロックでhogeとしたときのsourceは、
- バージョンは指定できず、最新バージョンをインストール。
プロバイダをどう使うか
providerブロックで指定できる項目はいくつもあり、それらはコード全体に適用できます。
AWSであれば、操作するリージョンやリソースにつけるタグなどがあります。
詳細は公式のドキュメントを見てみましょう。
同じプロバイダのコピーを複数使う
複数のリージョンを使う
複数のリージョンを使うにはproviderブロックでaliasを使う。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# デフォルトではこちらの値が使われる provider "aws" { region = "ap-northeast-1" } # こちらを指定するには # provider = aws.virginia # と記述する provider "aws" { alias = "virginia" region = "us-east-1" } # 使用例 resource "aws_acm_certificate" "cert" { domain_name = "example.com" validation_method = "DNS" # バージニア北部リージョンを指定したproviderを使用 provider = aws.virginia lifecycle { create_before_destroy = true } } # moduleの場合 module "example" { ... providers = { aws = aws.virginia } } |
CloudFrontようにバージニア北部へACMを作成する必要がある場合などはaliasがとても便利。
↓の記事でやってみました
1つのモジュール=1つのリージョンが理想であったり、複数リージョンの管理が大変になるなどコードとは別のところで考慮することはある。
複数のAWSアカウントを使う
複数アカウントを使う理由
- 分離
- 環境ごとにアカウントを作ることである環境での障害が他へ影響しないよう
- 認証と認可
- 環境ごとのアクセス制限や権限の付与が容易
- 監査
- アカウントごとのコストの計測やセキュリティレベルの把握が容易
Terraform コードではproviderブロックでaliasとassume_roleを使用して実装できる
複数のプロバイダを使えるモジュールを使う
再利用可能なモジュールでproviderブロックを使用するべきではありません。
- providerブロックの豊富なパラメータをモジュールで定義することになる
- 複数のモジュール間でproviderの設定を合わせるのが困難
- providerブロックごとにプロセスが起動して重くなる
では、モジュールで複数プロバイダを扱うにはどうしたらよいでしょうか?
requires_providersブロック内でconfiguration_aliases(設定エイリアス)を使う。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# module側で定義 # 例 terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 5.0" configuration_aliases = [ aws.parent, aws.child ] } } } # moduleへ渡すには module "example" { source = "<PATH>" providers = { aws.parent = aws.parent aws.child = aws.child } } |
異なる複数プロバイダを使う
複数のproviderブロックを使って各プロバイダを定義する。
ただ、リージョンやアカウント同様、1モジュール=1プロバイダが理想
次章のメモ
コメント