

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

# 設定 Beanstalk 叢集環境的聯網
<a name="configuring-cluster-networking"></a>

Beanstalk 叢集會在 Amazon EKS 叢集上執行您的環境。您選取的子網路會執行兩件事：它們決定叢集節點執行的位置，並決定哪個叢集執行環境。如果您未選取任何子網路，Elastic Beanstalk 會使用預設 VPC 的公有子網路。

本主題涵蓋環境的子網路、流量如何從叢集外部到達您的應用程式，以及您的環境如何在叢集內彼此處理。

## 環境子網路
<a name="configuring-cluster-networking-subnets"></a>

將`aws:elasticbeanstalk:eks:environment`命名空間中的 `subnets`選項設定為以逗號分隔的子網路 IDs清單。

由於子網路會選取叢集，因此您會在建立環境時設定它們：

```
$ aws elasticbeanstalk create-environment \
    --application-name {{my-app}} \
    --environment-name {{my-cluster-env}} \
    --option-settings '[{"Namespace":"aws:elasticbeanstalk:eks:environment","OptionName":"subnets","Value":"{{subnet-abc123,subnet-def456}}"}]'
```

設定會寫入 JSON，因為子網路清單包含逗號， AWS CLI 速記形式會視為欄位之間的分隔符號。如需 AWS CLI 接受的表單，請參閱[《》中的使用速記語法 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-shorthand.html)。

Elastic Beanstalk 會依此子網路集將環境分組至叢集，因此相同帳戶中使用相同子網路的環境會在相同叢集上執行，而使用不同集的環境會在不同的叢集上執行。子網路的順序並不重要。如需報告叢集指派的分組規則和事件，請參閱 [環境分組](beanstalk-cluster-concepts.md#beanstalk-cluster-clusters-sharing)。

## 流量如何到達您的應用程式
<a name="configuring-cluster-networking-lb-type"></a>

`aws:elasticbeanstalk:eks:environment` 命名空間中的 `load-balancer-type`選項會選擇流量如何到達您的應用程式。它接受兩個值：
+ `ALB`，預設值。Elastic Beanstalk 會建立並操作環境的 Application Load Balancer。您可以透過 `aws:elasticbeanstalk:eks:alb` 命名空間進行設定，或提供您已擁有的 Application Load Balancer。
+ `None`。 Elastic Beanstalk 不會建立負載平衡器，而且無法透過 Elastic Beanstalk 從叢集外部連線環境。相同叢集上的其他環境仍然可以透過其叢集內地址來連接它。

## 負載平衡器網路設定
<a name="configuring-cluster-networking-alb"></a>

環境的 Application Load Balancer 在 `aws:elasticbeanstalk:eks:alb` 命名空間中具有自己的網路設定。


| 選項 | 預設 | 說明 | 
| --- | --- | --- | 
| subnets | 無 | 以逗號分隔的負載平衡器子網路清單。 | 
| scheme | 從您的子網路衍生 | 負載平衡器是否可從網際網路連線， internet-facing或 internal。如果您未設定，Elastic Beanstalk 會從您選取的子網路衍生：公有子網路會提供面向網際網路的負載平衡器，而私有子網路則提供內部的負載平衡器。 | 
| security-groups | 無 | 以逗號分隔的負載平衡器安全群組清單。 | 
| manage-backend-security-group-rules | true | Elastic Beanstalk 是否管理負載平衡器和應用程式之間的安全群組規則。 | 

## 接聽程式和 HTTPS
<a name="configuring-cluster-networking-listeners"></a>

`aws:elasticbeanstalk:eks:alb` 命名空間中的 `listen-ports`選項會將負載平衡器的接聽程式列為將每個通訊協定映射至連接埠的 JSON 陣列，例如 `[{"HTTPS":443},{"HTTP":80}]`。

Elastic Beanstalk 會確保負載平衡器在某處終止 HTTPS：
+ 如果您未設定 `listen-ports`，Elastic Beanstalk 會在連接埠 443 上設定 HTTPS 接聽程式。
+ 如果您設定 `listen-ports`且已在任何連接埠上包含 HTTPS 接聽程式，Elastic Beanstalk 會保持不變地使用您的組態。
+ 如果您設定 時`listen-ports`沒有 HTTPS 接聽程式，Elastic Beanstalk 會在連接埠 443 上新增一個接聽程式。如果連接埠 443 已由使用另一個通訊協定的接聽程式取得，則請求會失敗，而錯誤會提示您釋放連接埠 443 或在不同的連接埠上新增明確的 HTTPS 接聽程式。

負載平衡器只會開啟其設定的接聽程式。使用預設組態時，即連接埠 443 上的 HTTPS，連接埠 80 上沒有 HTTPS，因此對 的請求`http://`不會連線並等待直到逾時。您環境的 URL `https://`後面接著環境的 CNAME。 `DescribeEnvironments`傳回不含結構描述的 CNAME，因此請在開啟`https://`時新增 。

您不提供憑證讓此 運作。Elastic Beanstalk 會為環境自己的網域建立 AWS Certificate Manager (ACM) 憑證，將其連接到 HTTPS 接聽程式，然後續約它，因此瀏覽器會信任環境的 CNAME，無需任何組態。Elastic Beanstalk 會為每個環境建立一個憑證，並在您終止環境時將其刪除。

若要從您自己的網域提供環境，請將憑證的 ARN 放入 `certificate-arn`選項。除了 Elastic Beanstalk 建立的憑證之外，負載平衡器還會承載您的憑證，而且您仍需負責續約和刪除您的憑證。

若要接受 HTTP 請求，請將 HTTP 接聽程式新增至 ，`listen-ports`並將 `ssl-redirect`設定為 HTTPS 接聽程式的連接埠。Elastic Beanstalk 會將 HTTP 接聽程式上的請求重新導向至 HTTPS 接聽程式。HTTP 接聽程式永遠不會直接提供應用程式流量。 會`ssl-redirect`選取重新導向目標的 HTTPS 連接埠，如果您未設定，Elastic Beanstalk 會使用 HTTPS 接聽程式的連接埠。`listen-ports` 值本身是 JSON 文件，因此請在 檔案中傳遞設定，而不是在命令列寫入設定：

```
$ cat listeners.json
[
  {
    "Namespace": "aws:elasticbeanstalk:eks:alb",
    "OptionName": "listen-ports",
    "Value": "[{\"HTTPS\":443},{\"HTTP\":80}]"
  },
  {
    "Namespace": "aws:elasticbeanstalk:eks:alb",
    "OptionName": "ssl-redirect",
    "Value": "443"
  }
]
$ aws elasticbeanstalk update-environment \
    --environment-name {{my-cluster-env}} \
    --option-settings file://listeners.json
```

當您將 `load-balancer-type`設定為 時`None`，或當您使用 提供自己的負載平衡器時，Elastic Beanstalk 不會新增 HTTPS 接聽程式`arn`。`None` 環境完全沒有負載平衡器，因此沒有接聽程式。當您提供自己的負載平衡器時，其接聽程式組態是您管理的。

## 使用您擁有的負載平衡器
<a name="configuring-cluster-networking-byo-alb"></a>

若要將現有的負載平衡器放在環境前面，請將`aws:elasticbeanstalk:eks:alb`命名空間中的 `arn`選項設定為其 ARN。值必須是 Application Load Balancer。Elastic Beanstalk 拒絕 Network Load Balancer 的 ARN。

當您提供負載平衡器時，您會擁有其組態：其接聽程式、其 TLS 憑證，以及其機制。Elastic Beanstalk 會將您的應用程式註冊為目標，並將負載平衡器報告為環境的負載平衡器，因此 會`DescribeEnvironmentResources`傳回您提供的負載平衡器，而不是 Elastic Beanstalk 建立的負載平衡器。

## 沒有負載平衡器的環境
<a name="configuring-cluster-networking-no-lb"></a>

當您將 `load-balancer-type` 設定為 時`None`，Elastic Beanstalk 不會為環境建立負載平衡器，也不會`DescribeEnvironmentResources`報告負載平衡器。將此用於僅為相同叢集上的其他環境提供服務的環境，例如內部 API 或其發起人直接聯絡的工作者。

要規劃的兩個後果：
+ 負載平衡器運作狀態訊號不適用，因為沒有負載平衡器可報告請求率、錯誤率或延遲。使用容器探查和您的可觀測性後端來判斷應用程式是否正常運作。請參閱 [監控 Beanstalk 叢集環境](monitoring-cluster-environments.md)。
+ 來電者透過其叢集內地址到達環境，如下一節所述。

## 從另一個環境定址
<a name="configuring-cluster-networking-service-discovery"></a>

每個 Beanstalk 叢集環境都可以在其叢集內從環境名稱建置的可預測地址存取：

```
service-{{environment-name}}.eb-{{environment-name}}.svc.cluster.local:{{service-port}}
```

連接埠是環境的 `service-port`。Elastic Beanstalk 會在名為 的 Kubernetes 命名空間中執行每個環境，`eb-`後面接著環境名稱，也就是地址的第二個標籤。使用 `aws:elasticbeanstalk:eks:environment` 命名空間中的 `env-variables`選項，將應用程式所需的地址做為環境變數傳遞：

的值本身`env-variables`是 JSON 文件，因此請在檔案中傳遞選項設定，而不是在命令列。將下列項目儲存為 `options.json`：

```
[
  {
    "Namespace": "aws:elasticbeanstalk:eks:environment",
    "OptionName": "env-variables",
    "Value": "{\"NOTIFIER_URL\":\"http://service-{{my-notifier}}.eb-{{my-notifier}}.svc.cluster.local:8080\"}"
  }
]
```

然後套用它：

```
$ aws elasticbeanstalk update-environment \
    --environment-name {{my-frontend}} \
    --option-settings file://options.json
```

此定址僅適用於在相同叢集上執行的環境，這表示使用相同子網路的環境。解析地址與允許連線的地址不同。Beanstalk 叢集預設會封鎖共用叢集上環境之間的流量，因此名稱會解析，且連線仍會失敗，直到您允許為止。請參閱 [允許環境進行通訊](beanstalk-cluster-multi-tenancy.md#beanstalk-cluster-multi-tenancy-groups)。

**注意**  
由於地址包含環境名稱，您需要先知道環境的名稱，才能讓另一個環境處理它。在建立環境之前，規劃彼此呼叫的一組環境名稱。

## 您在建立時所選擇的設定
<a name="configuring-cluster-networking-immutable"></a>

您無法在建立環境的子網路之後進行變更，因為它們會選取其叢集。這同樣適用於叢集、節點和可觀測性角色。若要在不同子網路中執行應用程式，請使用您想要的子網路建立新的環境，然後交換兩個環境 CNAMEs。請參閱[透過 Elastic Beanstalk 進行藍/綠部署](using-features.CNAMESwap.md)。