web-dev-qa-db-ja.com

Terraformではデータソースはどのように使用されますか?

Terraform Data Sources documentation はデータソースとは何かを教えてくれますが、私はそれをよく理解していません。誰かがデータソースのユースケースを教えてもらえますか?それと変数を使用して何かを構成することの違いは何ですか?

14
user389955

データソースはさまざまな理由で使用できます。しかし、彼らの目標は、何かをする、そしてあなたにデータを与えることです。

ドキュメント から例を見てみましょう:

# Find the latest available AMI that is tagged with Component = web
data "aws_AMI" "web" {
  filter {
    name   = "state"
    values = ["available"]
  }

  filter {
    name   = "tag:Component"
    values = ["web"]
  }

  most_recent = true
}

これは aws_AMI データソースを使用します-これはリソースとは異なります!代わりに情報を提供するだけで、何も作成しません。特にこの例では、describe-images AWS API呼び出し、いくつかの--filterオプションを指定し、情報を取得できるオブジェクトを返します-これらを参照してください 属性

  • owner_id
  • 説明
  • image_id

...リストが続きます。私がいた場合、これは本当に便利です。たとえば、常にいくつかのタグに一致する最新のAMIをプルし、それを使用して起動構成を最新に保ちたい場合。常に変数を更新したり、IDをハードコーディングしたりする必要はなく、このデータプロバイダーを使用できます。

データソースは他の理由でも使用できます。私のお気に入りの1つは テンプレートプロバイダー です。

がんばろう!

19
TJ Biddle

データソースは、現在のTerraform構成で管理されていないのエンティティに関する情報を提供します。

これには以下が含まれます:

  • Consulからの構成データ
  • 手動で構成されたインフラストラクチャコンポーネントの状態に関する情報

言い換えると、データソースはread-only構成の外部にある既存のコンポーネントの状態を表示します。

データソースを定義したら、Terraform構成の他の場所でデータを使用できます。

たとえば、新しいAWS EC2インスタンスのTerraform構成を作成するとします。 AWS CLIを使用してJenkinsジョブによって作成およびアップロードされ、Terraformによって管理されないAMIイメージを使用します。 Jenkinsジョブの構成の一部として、このAMIイメージには常に接頭辞app-が付いた名前が付けられます。

この場合、 aws_AMIデータソース を使用して、名前プレフィックスapp-を持つ最新のAMIイメージに関する情報を取得できます。

data "aws_AMI" "app_AMI" {
  most_recent = true
  filter {
    name   = "name"
    values = ["app-*"]
  }
}

データソースは、リソースと同様に属性をエクスポートします。シンタックスdata.TYPE.NAME.ATTRを使用して、これらの属性を補間できます。この例では、AMI IDの値をdata.aws_AMI.app_AMI.idとして補間し、それを aws_instanceリソースAMI引数として渡します。

resource "aws_instance" "app" {
  AMI           = "${data.aws_AMI.app_AMI.id}"
  instance_type = "t2.micro"
}

dynamicエンティティ(プロパティの値が頻繁に変更されるエンティティ)に関する情報を取得する場合、データソースは最も強力です。たとえば、次回Terraformがaws_AMIデータソースのデータをフェッチするときに、エクスポートされる属性の値が異なる場合があります(新しいAMIを構築してプッシュした可能性があります)。

変数はstatic値、アクセスキーやシークレットキーなど、めったに変更されない値、またはサーバーのsudoerの標準リストに使用されます。

13
d4nyll