

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

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

两者兼 AWS CloudFormation 而有之 Terraform 的主要原因是云资源的创建和维护。但是云资源到底是什么？ CloudFormation资源和 Terraform 资源是一回事吗？ 答案是... 是的和不是。为了说明这一点，本指南提供了一个示例，说明如何使用 CloudFormation 然后使用 Terraform 创建亚马逊简单存储服务 (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 Prov AWS ider 处理 AWS 资源的典型方式。但是，这个例子显示了一个重要的区别。虽然 CloudFormation 资源是由[CloudFormation资源规范](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-resource-specification.html)严格定义的，但 Terraform 没有这样的要求。在 Terraform 中，资源的概念更加模糊。

尽管在定义单一资源的确切护栏方面，这些工具可能有所不同，但一般而言，*云资源*是指存在于云中的任何特定实体，可以创建、更新或删除。因此，不管涉及多少资源，前面的两个示例都创建了完全相同的东西，其中的设置完全相同 AWS 账户。