

終止支援通知：將於 2026 年 10 月 7 日 AWS 結束對 的支援 AWS Proton。2026 年 10 月 7 日之後，您將無法再存取 AWS Proton 主控台或 AWS Proton 資源。您部署的基礎設施將保持不變。如需詳細資訊，請參閱[AWS Proton 服務棄用和遷移指南](https://docs.aws.amazon.com/proton/latest/userguide/proton-end-of-support.html)。

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

# Terraform IaC 檔案
<a name="ag-infrastructure-tmp-files-terraform"></a>

了解如何搭配 使用 Terraform 基礎設施做為程式碼 (IaC) 檔案 AWS Proton。[Terraform](https://www.terraform.io/) 是由 [HashiCorp](https://www.hashicorp.com/) 開發的廣泛使用開放原始碼 IaC 引擎。Terraform 模組是以 HashiCorp 的 HCL 語言開發，並支援數個後端基礎設施供應商，包括 Amazon Web Services。

AWS Proton 支援 Terraform IaC [的自我管理佈建](ag-works-prov-methods.md#ag-works-prov-methods-self)。

如需回應提取請求並實作基礎設施佈建的佈建儲存庫完整範例，請參閱 [ GitHub 上適用於 的 Terraform OpenSource GitHub Actions 自動化範本 AWS Proton](https://github.com/aws-samples/aws-proton-terraform-github-actions-sample)。 GitHub

**自我管理佈建如何與 Terraform IaC 範本套件檔案搭配使用：**

1. 當您從 Terraform 範本套件[建立環境](ag-create-env.md)時， 會使用主控台或`spec file`輸入參數 AWS Proton 編譯您的`.tf`檔案。

1. 它提出提取請求，將編譯的 IaC 檔案合併到[您已向 註冊的儲存庫 AWS Proton](ag-create-repo.md)。

1. 如果請求獲得核准， 會 AWS Proton 等待您提供的佈建狀態。

1. 如果請求遭到拒絕，則會取消環境建立。

1. 如果提取請求逾時，則環境建立*未完成*。

**AWS Proton 搭配 Terraform IaC 考量：**
+ AWS Proton 不會管理您的 Terraform 佈建。
+ 您必須在此[儲存庫上向 .makes 提取請求註冊佈建](ag-create-repo.md)儲存庫。 AWS Proton AWS Proton 
+ 您必須[建立 CodeStar 連線](setting-up-for-service.md#setting-up-vcontrol)，才能 AWS Proton 與您的佈建儲存庫連線。
+ 若要從 AWS Proton 編譯的 IaC 檔案佈建，您必須回應 AWS Proton pull request. AWS Proton makes 在環境和服務建立和更新動作之後提取請求。如需詳細資訊，請參閱[AWS Proton 環境](ag-environments.md)及[AWS Proton 服務](ag-services.md)。
+ 若要從 AWS Proton 編譯的 IaC 檔案佈建管道，您必須[建立 CI/CD 管道儲存庫](setting-up-for-service.md#setting-up-pr-repo)。
+ 您的提取請求型佈建自動化必須包含通知 AWS Proton 任何佈建 AWS Proton 資源狀態變更的步驟。您可以使用 AWS Proton [NotifyResourceDeploymentStatusChange API](https://docs.aws.amazon.com/proton/latest/APIReference/API_NotifyResourceDeploymentStatusChange.html)。
+ 您無法將從 CloudFormation IaC 檔案建立的服務、管道和元件部署至從 Terraform IaC 檔案建立的環境。
+ 您無法將從 Terraform IaC 檔案建立的服務、管道和元件部署至從 CloudFormation IaC 檔案建立的環境。

為 準備 Terraform IaC 檔案時 AWS Proton，您可以將命名空間連接至輸入變數，如下列範例所示。如需詳細資訊，請參閱[參數](parameters.md)。

## 範例 1： AWS Proton 環境 Terraform IaC 檔案
<a name="ag-env-tform-example"></a>

```
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.0"
    }
  }
  // This tells terraform to store the state file in s3 at the location
  // s3://terraform-state-bucket/tf-os-sample/terraform.tfstate
  backend "s3" {
    bucket = "terraform-state-bucket"
    key    = "tf-os-sample/terraform.tfstate"
    region = "us-east-1"
  }
}

// Configure the AWS Provider
provider "aws" {
  region = "us-east-1"
  default_tags {
    tags = var.proton_tags
  }
}

resource "aws_ssm_parameter" "my_ssm_parameter" {
  name  = "my_ssm_parameter"
  type  = "String"
  // Use the Proton environment.inputs. namespace
  value = var.environment.inputs.ssm_parameter_value
}
```

## 編譯的基礎設施做為程式碼
<a name="compiled-tform"></a>

當您建立環境或服務時， 會使用主控台或`spec file`輸入將基礎設施 AWS Proton 編譯為程式碼檔案。它會為您的輸入建立 `proton.{{resource-type}}.variables.tf`和 `proton.auto.tfvars.json` 檔案，供 Terraform 使用，如下列範例所示。這些檔案位於與環境或服務執行個體名稱相符的資料夾中指定的儲存庫中。

此範例顯示 如何在變數定義和變數值中 AWS Proton 包含標籤，以及如何將這些 AWS Proton 標籤傳播到佈建的資源。如需詳細資訊，請參閱[將標籤傳播至佈建的資源](resources.md#auto-tags-prop)。

### 範例 2：為名為 "dev" 的環境編譯 IaC 檔案。
<a name="ag-compiled-example"></a>

**dev/environment.tf：**

```
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.0"
    }
  }
  // This tells terraform to store the state file in s3 at the location
  // s3://terraform-state-bucket/tf-os-sample/terraform.tfstate
  backend "s3" {
    bucket = "terraform-state-bucket"
    key    = "tf-os-sample/terraform.tfstate"
    region = "us-east-1"
  }
}

// Configure the AWS Provider
provider "aws" {
  region = "us-east-1"
  default_tags {
    tags = var.proton_tags
  }
}

resource "aws_ssm_parameter" "my_ssm_parameter" {
  name  = "my_ssm_parameter"
  type  = "String"
  // Use the Proton environment.inputs. namespace
  value = var.environment.inputs.ssm_parameter_value
}
```

**dev/proton.environment.variables.tf：**

```
variable "environment" {
  type = object({
    inputs = map(string)
    name = string
  })
}

variable "proton_tags" {
  type = map(string)
  default = null
}
```

**dev/proton.auto.tfvars.json：**

```
{
  "environment": {
    "name": "dev",
    "inputs": {
      "ssm_parameter_value": "MyNewParamValue"
    }
  }

  "proton_tags" : {
    "proton:account" : "123456789012",
    "proton:template" : "arn:aws:proton:us-east-1:123456789012:environment-template/fargate-env",
    "proton:environment" : "arn:aws:proton:us-east-1:123456789012:environment/dev"
  }
}
```

## 儲存庫路徑
<a name="repo-dir"></a>

AWS Proton 使用來自環境或服務建立動作的主控台或規格輸入來尋找儲存庫，以及尋找編譯 IaC 檔案的路徑。輸入值會傳遞至[命名空間輸入參數](parameters.md)。

AWS Proton 支援兩種儲存庫路徑配置。在下列範例中，路徑會以來自兩個環境的命名空間資源參數命名。每個環境都有兩個 服務的服務執行個體，而其中一個服務的服務執行個體具有直接定義的元件。

<a name="limits-table"></a>
<table>
<thead>
  <tr><th>Resource Type (資源類型)</th><th>名稱參數</th><th>=</th><th>資源名稱</th></tr>
</thead>
<tbody>
  <tr><td>Environment</td><td>environment.name</td><td rowspan="10">=</td><td>"env-prod"</td></tr>
  <tr><td>Environment</td><td>environment.name</td><td>"env-staged"</td></tr>
  <tr><td>服務</td><td>service.name</td><td>"service-one"</td></tr>
  <tr><td>  服務執行個體</td><td>service\_instance.name</td><td>"instance-one-prod"</td></tr>
  <tr><td>  服務執行個體</td><td>service\_instance.name</td><td>"instance-one-staged"</td></tr>
  <tr><td>服務</td><td>service.name</td><td>"service-two"</td></tr>
  <tr><td>  服務執行個體</td><td>service\_instance.name</td><td>"instance-two-prod"</td></tr>
  <tr><td>    元件</td><td>service\_instance.components.default.name</td><td>"component-prod"</td></tr>
  <tr><td>  服務執行個體</td><td>service\_instance.name</td><td>"instance-two-staged"</td></tr>
  <tr><td>    元件</td><td>service\_instance.components.default.name</td><td>"component-staged"</td></tr>
</tbody>
</table>


------
#### [ Layout 1 ]

如果 AWS Proton 找到具有 `environments` 資料夾的指定儲存庫，它會建立包含編譯的 IaC 檔案並以 命名的資料夾`environment.name`。

如果 AWS Proton 找到具有資料夾`environments`的指定儲存庫，其中包含與服務執行個體相容環境名稱相符的資料夾名稱，則會建立資料夾，其中包含編譯的執行個體 IaC 檔案，並以 命名`service_instance.name`。

```
/repo
    /environments
        /env-prod                             # environment folder
            main.tf
            proton.environment.variables.tf
            proton.auto.tfvars.json
          
            /service-one-instance-one-prod    # instance folder
                main.tf
                proton.service_instance.variables.tf
                proton.auto.tfvars.json
              
            /service-two-instance-two-prod    # instance folder
                main.tf
                proton.service_instance.variables.tf
                proton.auto.tfvars.json
              
            /component-prod                   # component folder
                main.tf
                proton.component.variables.tf
                proton.auto.tfvars.json
              
        /env-staged                           # environment folder
            main.tf
            proton.variables.tf
            proton.auto.tfvars.json         
          
            /service-one-instance-one-staged  # instance folder
                main.tf
                proton.service_instance.variables.tf
                proton.auto.tfvars.json
              
            /service-two-instance-two-staged  # instance folder
                main.tf
                proton.service_instance.variables.tf
                proton.auto.tfvars.json
              
            /component-staged                 # component folder
                main.tf
                proton.component.variables.tf
                proton.auto.tfvars.json
```

------
#### [ Layout 2 ]

如果 AWS Proton 找到沒有 `environments` 資料夾的指定儲存庫，它會建立資料夾`environment.name`，找到編譯的環境 IaC 檔案。

如果 AWS Proton 找到具有與服務執行個體相容環境名稱相符之資料夾名稱的指定儲存庫，它會建立`service_instance.name`資料夾來尋找編譯的執行個體 IaC 檔案。

```
/repo
    /env-prod                             # environment folder
        main.tf
        proton.environment.variables.tf
        proton.auto.tfvars.json
      
        /service-one-instance-one-prod    # instance folder
            main.tf
            proton.service_instance.variables.tf
            proton.auto.tfvars.json
          
        /service-two-instance-two-prod    # instance folder
            main.tf
            proton.service_instance.variables.tf
            proton.auto.tfvars.json
          
        /component-prod                   # component folder
            main.tf
            proton.component.variables.tf
            proton.auto.tfvars.json
          
    /env-staged                           # environment folder
        main.tf
        proton.variables.tf
        proton.auto.tfvars.json         
      
        /service-one-instance-one-staged  # instance folder
            main.tf
            proton.service_instance.variables.tf
            proton.auto.tfvars.json
          
        /service-two-instance-two-staged  # instance folder
            main.tf
            proton.service_instance.variables.tf
            proton.auto.tfvars.json
          
        /component-staged                 # component folder
            main.tf
            proton.component.variables.tf
            proton.auto.tfvars.json
```

------