

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 了解 Terraform 資源
<a name="resources"></a>

同時存在 AWS CloudFormation 和 Terraform 的主要原因是雲端資源的建立和維護。但是，什麼是雲端資源？ CloudFormation 資源和 Terraform 資源是否相同？ 答案是...是和否。為了說明這一點，本指南提供使用 CloudFormation 和 Terraform 建立 Amazon Simple Storage Service (Amazon S3) 儲存貯體的範例。

下列 CloudFormation 程式碼範例會建立範例 Amazon S3 儲存貯體。

```
{
    "myS3Bucket": {
        "Type": "AWS::S3::Bucket",
        "Properties": {
            "BucketName": "my-s3-bucket",
            "BucketEncryption": {
                "ServerSideEncryptionConfiguration": [
                    {
                        "ServerSideEncryptionByDefault": {
                            "SSEAlgorithm": "AES256"
                        }
                    }
                ]
            },
            "PublicAccessBlockConfiguration": {
                "BlockPublicAcls": true,
                "BlockPublicPolicy": true,
                "IgnorePublicAcls": true,
                "RestrictPublicBuckets": true
            },
            "VersioningConfiguration": {
                "Status": "Enabled"
            }
        }
    }
}
```

下列 Terraform 程式碼範例會建立相同的 Amazon S3 儲存貯體。

```
resource "aws_s3_bucket" "myS3Bucket" {
  bucket = "my-s3-bucket"
}

resource "aws_s3_bucket_server_side_encryption_configuration" "bucketencryption" {
  bucket = aws_s3_bucket.myS3Bucket.id
  rule {
    apply_server_side_encryption_by_default {
      sse_algorithm = "AES256"
    }
  }
}

resource "aws_s3_bucket_public_access_block" "publicaccess" {
  bucket                  = aws_s3_bucket.myS3Bucket.id
  block_public_acls       = true
  block_public_policy     = true
  ignore_public_acls      = true
  restrict_public_buckets = true
}

resource "aws_s3_bucket_versioning" "versioning" {
  bucket = aws_s3_bucket.myS3Bucket.id
  versioning_configuration {
    status = "Enabled"
  }
}
```

對於 Terraform，供應商會定義資源，然後開發人員宣告並設定這些資源。供應商是本指南在下一節討論的概念。Terraform 範例會為數個 S3 儲存貯體的設定建立完全獨立的資源。為設定建立個別資源不一定是 Terraform AWS 提供者處理 AWS 資源的典型方式。不過，此範例顯示重要的區別。雖然 CloudFormation 資源是由 [CloudFormation 資源規格](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-resource-specification.html)嚴格定義，但 Terraform 沒有這類需求。在 Terraform 中，資源的概念更模糊。

雖然工具在定義單一資源的確切護欄方面可能不同，但通常來說，*雲端資源*是存在於雲端中且可建立、更新或刪除的任何特定實體。因此，無論涉及多少資源，上述兩個範例都會在 內建立完全相同的設定 AWS 帳戶。