Data Sources(データソース)ってなに?
- Data Sources(データソース)は、外部データソースから情報を取得し、Terraform構成に組み込むための機能
- 公式ドキュメント:Data Sources
- 公式ドキュメント:Data Sources
この記事の目的
- Data Sourceの役割、具体的な使用方法をサンプルコードを用いながら整理する
Data Sourceとは?
- Data Sourceは、外部データソースから情報を取得し、Terraform構成に組み込むための特殊なリソースのこと
- 取得した情報は、Terraform構成内の他のリソースの属性として使用したり、テンプレートファイルに組み込んだりすることができる
取得できるデータ例
- AWSサービスの情報: EC2インスタンス、S3バケット、VPC、IAMロールなど
- 外部APIの情報: GitHubリポジトリ、DNSレコード、OpenWeatherMap天気情報など
- ローカルファイルの情報: テンプレートファイル、JSONファイル、YAMLファイルなど
Data Sourceの利点
- Data Sourceを使用する利点は、以下のようなことが挙げられる
インフラ構成のコードを簡潔に保ち、読みやすくする
- 外部データソースから情報を取得することで、Terraform構成内に詳細な情報記述を必要としなくなり、コードを簡潔に保ち、読みやすくすることができる
インフラ構成を常に最新の状態に保つ
- 外部データソースから情報を定期的に取得することで、Terraform構成を常に最新の状態に保つことができる
複雑なインフラ構成を容易に構築する
- Data Sourceを組み合わせることで、複雑なインフラ構成を容易に構築することができる
Data Sourceの使い方
- Data Sourceを使用するには、以下の手順が必要
- データソースプロバイダを定義する
- Data Sourceを定義する
- 取得した情報を他のリソースで使用する
1. データソースプロバイダの定義
- データソースプロバイダは、Data Sourceが情報を取得する外部データソースの種類を定義する
- Terraformには、様々なデータソースプロバイダが用意されている
- 例えば、AWSサービスの情報であればawsプロバイダ、GitHubリポジトリの情報であればgithubプロバイダなどがある
provider "aws" {
region = "us-east-1"
}
provider "github" {
token = "GITHUB_TOKEN"
}
2. Data Sourceの定義
- Data Sourceは、データソース名とローカル名を指定する
data "aws_ami" "example" {
most_recent = true
owners = ["self"]
tags = {
Name = "app-server"
Tested = "true"
}
}
- 例えば、AWS EC2インスタンスの情報であればaws_instanceリソース、GitHubリポジトリの情報であればgithub_repositoryリソースなど
data "aws_instance" "example" {
id = "i-example"
}
data "github_repository" "example" {
owner = "hashicorp"
repository = "terraform"
}
3. 取得した情報を他のリソースで使用
- Data Sourceで取得した情報は、
data.resource_name.attribute_name
の形式で他のリソースで使用することができる - 例えば、
aws_instance
リソースのami
属性に、data.aws_instance.example.ami
の値を設定することができる
resource "aws_instance" "web" {
ami = data.aws_instance.example.ami
instance_type = "t2.micro"
tags = {
Name = "sample"
}
}
まとめ
- TerraformのData Sourceは、外部データソースから情報を取得し、Terraform構成に組み込むための強力な機能
dataリソースの役割
- 外部データソースから情報を取得
- Terraform構成に情報を組み込む
- インフラ構成を簡潔に保ち、読みやすくする
- インフラ構成を常に最新の状態に保つ
- 複雑なインフラ構成を容易に構築する
所感
Data Sourceは、Terraformをより柔軟かつ強力に活用するための重要な機能だなぁと改めて思いました。
インフラ構築はシステムの要だと思うので、今後もどんどん勉強して使えるようになっていきたいなと思いました。
では!