

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Terraform データソースについて
<a name="data-sources"></a>

デプロイスタックが既存のリソースからのデータに依存するのは非常に一般的です。ほとんどの IaC ツールには、他のプロセスによって作成されたリソースをインポートする方法があります。これらのインポートされたリソースは通常読み取り専用であり ([IAM ロール](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_iam.IRole.html#attachwbrinlinewbrpolicypolicy)は注目すべき例外ですが）、スタック内のリソースに必要なデータにアクセスするために使用します。 ではリソースのインポート AWS CloudFormation が許可されますが、この概念は を確認することでより適切に説明できます AWS Cloud Development Kit (AWS CDK)。

は、デベロッパーが既存のプログラミング言語を使用してテンプレートを生成する AWS CDK CloudFormationのに役立ちます。 AWS CDK オペレーションの最終結果は、 にインポートされたリソースです CloudFormation。ただし、 で使用される構文 AWS CDK により、Terraform との比較が容易になります。を使用してリソースをインポートする例を次に示します AWS CDK。

```
const importedBucket: IBucket = Bucket.fromBucketAttributes(
    scope,
    "imported-bucket",
    {
        bucketName: "My_S3_Bucket"
    }
);
```

インポートされたリソースは通常、同じ種類の新しいリソースを作成するために使用するのと同じクラスの静的メソッドを呼び出すことによって作成されます。を呼び出すと新しいリソースが作成され、を呼び出すと既存のリソースが`Bucket.fromBucketAttributes(...`インポート`new Bucket(...`されます。バケットのプロパティのサブセットを関数に渡すと、 は適切なバケットを見つける AWS CDK ことができます。ただし、もう 1 つの違いは、新しいバケットを作成すると、 `Bucket` クラスのフルインスタンスが返され、その中にすべてのプロパティとメソッドが使用可能になることです。リソースをインポートすると`IBucket`、 が持つ`Bucket`必要があるプロパティのみを含むタイプである が返されます。外部スタックからリソースをインポートすることはできますが、リソースで実行できる操作のオプションは限られています。

Terraform では、[データソース ](https://developer.hashicorp.com/terraform/language/data-sources)を使用して同様の目標を達成します。定義されたほとんどの Terraform リソースには、付随するデータソースがあります。以下は、Terraform S3 バケットリソースとそれに続く対応するデータソースの例です。

```
# S3 Bucket resource:
resource "aws_s3_bucket" "My_S3_Bucket" {
  bucket = "My_S3_Bucket"
}

# S3 Bucket data source:
data "aws_s3_bucket" "My_S3_Bucket" {
  bucket = "My_S3_Bucket"
}
```

これら 2 つの項目の違いは、名前のプレフィックスのみです。データソースの[ドキュメント](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/s3_bucket)に示すように、データソースに渡すことができるパラメータはリソースよりも少なくなります。これは、リソースがこれらのパラメータを使用して新しい S3 バケットのすべてのプロパティを宣言し、データソースには既存のリソースのデータを一意に識別してインポートするための十分な情報が必要なためです。

Terraform リソースとデータソースの構文の類似性は便利ですが、問題になる可能性もあります。初心者の Terraform 開発者が誤ってデータソースを構成で使用しているのは一般的です。Terraform データソースは常に読み取り専用です。これらは、読み取りアクション (別のリソースに ID 名を指定するなど) に対応するリソースの代わりに使用できます。ただし、書き込みアクションに使用することはできません。これにより、基盤となるリソースの一部が根本的に変更されます。このため、Terraform データソースは基盤となるリソースのクローンバージョンと考えることができます。

前の AWS CDK IBucket の例と同様に、データソースは読み取り専用シナリオに役立ちます。既存のリソースからデータを取得する必要があるが、スタック内でそのリソースを維持する必要がない場合は、データソースを使用します。この良い例は、アカウントのデフォルト VPC を使用する Amazon EC2 インスタンスを作成する場合です。その VPC は既に存在するため、必要なのはデータの取得だけです。次のコードサンプルは、データを使用してターゲット VPC を識別する方法を示しています。

```
data "aws_vpc" "default" {
  default = true
}

resource "aws_instance" "instance1" {
  ami           = "ami-123456"
  instance_type = "t2.micro"
  subnet_id     = data.aws_vpc.default.main_route_table_id
}
```