

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

# 運算
<a name="compute-pattern-list"></a>

**Topics**
+ [容器與微服務](containersandmicroservices-pattern-list.md)
+ [無伺服器](serverless-pattern-list.md)
+ [聯網](networking-pattern-list.md)
+ [內容交付](contentdelivery-pattern-list.md)

# 容器與微服務
<a name="containersandmicroservices-pattern-list"></a>

**Topics**
+ [從 Amazon EKS 容器存取 Amazon Neptune 資料庫](access-amazon-neptune-database-from-amazon-eks-container.md)
+ [使用 AWS PrivateLink 和 Network Load Balancer 在 Amazon ECS 上私下存取容器應用程式](access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer.md)
+ [使用 AWS Fargate、AWS PrivateLink 和 Network Load Balancer，在 Amazon ECS 上私下存取容器應用程式](access-container-applications-privately-on-amazon-ecs-by-using-aws-fargate-aws-privatelink-and-a-network-load-balancer.md)
+ [使用 AWS PrivateLink 和 Network Load Balancer 在 Amazon EKS 上私下存取容器應用程式](access-container-applications-privately-on-amazon-eks-using-aws-privatelink-and-a-network-load-balancer.md)
+ [使用 AWS Batch 自動化 Amazon RDS for PostgreSQL 資料庫執行個體的備份](automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch.md)
+ [使用 CI/CD 管道在 Amazon EKS 中自動化節點終止處理常式的部署](automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline.md)
+ [使用 CI/CD 管道自動建置 Java 應用程式並將其部署到 Amazon EKS](automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline.md)
+ [跨 AWS 帳戶 和 複製 Amazon ECR 容器映像 AWS 區域](copy-ecr-container-images-across-accounts-regions.md)
+ [使用 Amazon EFS 在 EC2 執行個體上建立 Amazon ECS 任務定義並掛載檔案系統](create-an-amazon-ecs-task-definition-and-mount-a-file-system-on-ec2-instances-using-amazon-efs.md)
+ [使用容器映像部署 Lambda 函數](deploy-lambda-functions-with-container-images.md)
+ [使用 AWS Fargate 在 Amazon ECS 上部署 Java 微服務](deploy-java-microservices-on-amazon-ecs-using-aws-fargate.md)
+ [在 Amazon S3 中使用 Amazon EKS 和 Helm Chart 儲存庫部署 Kubernetes 資源和套件](deploy-kubernetes-resources-and-packages-using-amazon-eks-and-a-helm-chart-repository-in-amazon-s3.md)
+ [使用 Terraform 在 Amazon EKS 中部署 CockroachDB 叢集](deploy-cockroachdb-on-eks-using-terraform.md)
+ [在 Amazon EKS 上部署範例 Java 微服務，並使用 Application Load Balancer 公開微服務](deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer.md)
+ [在 Amazon EKS 叢集上部署以 gRPC 為基礎的應用程式，並使用 Application Load Balancer 存取它](deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer.md)
+ [在做為 Docker 容器 AWS IoT Greengrass V2 執行時部署容器化應用程式](deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.md)
+ [使用 Elastic Beanstalk 部署容器](deploy-containers-by-using-elastic-beanstalk.md)
+ [使用 Lambda 函數、Amazon VPC 和無伺服器架構產生靜態傳出 IP 地址](generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture.md)
+ [遷移至 Amazon ECR 儲存庫時，自動識別重複的容器映像](identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository.md)
+ [使用 Kubernetes DaemonSet 在 Amazon EKS 工作者節點上安裝 SSM Agent](install-ssm-agent-on-amazon-eks-worker-nodes-by-using-kubernetes-daemonset.md)
+ [使用 preBootstrapCommands 在 Amazon EKS 工作者節點上安裝 SSM 代理程式和 CloudWatch 代理程式](install-the-ssm-agent-and-cloudwatch-agent-on-amazon-eks-worker-nodes-using-prebootstrapcommands.md)
+ [啟用 Amazon EKS Auto 模式時遷移 NGINX 傳入控制器](migrate-nginx-ingress-controller-eks-auto-mode.md)
+ [將您的容器工作負載從 Azure Red Hat OpenShift (ARO) 遷移至 Red Hat OpenShift Service on AWS (ROSA)](migrate-container-workloads-from-aro-to-rosa.md)
+ [使用 Amazon ECS Anywhere 在 Amazon WorkSpaces 上執行 Amazon ECS 任務 Amazon ECS Anywhere](run-amazon-ecs-tasks-on-amazon-workspaces-with-amazon-ecs-anywhere.md)
+ [在 Amazon EC2 Linux 執行個體上執行 ASP.NET Core Web API Docker 容器](run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance.md)
+ [使用 Amazon EFS on Amazon EKS 搭配 AWS Fargate，以持久性資料儲存來執行具狀態工作負載](run-stateful-workloads-with-persistent-data-storage-by-using-amazon-efs-on-amazon-eks-with-aws-fargate.md)
+ [使用 Amazon EKS Pod Identity 和 KEDA 在 Amazon EKS 中設定事件驅動的自動擴展](event-driven-auto-scaling-with-eks-pod-identity-and-keda.md)
+ [使用 PGO 在 Amazon EKS 上簡化 PostgreSQL 部署](streamline-postgresql-deployments-amazon-eks-pgo.md)
+ [使用 Application Load Balancer 在 Amazon ECS 中使用交互 TLS 簡化應用程式身分驗證](simplify-application-authentication-with-mutual-tls-in-amazon-ecs.md)
+ [更多模式](containersandmicroservices-more-patterns-pattern-list.md)

# 從 Amazon EKS 容器存取 Amazon Neptune 資料庫
<a name="access-amazon-neptune-database-from-amazon-eks-container"></a>

*Ramakrishnan Palaninathan，Amazon Web Services*

## 總結
<a name="access-amazon-neptune-database-from-amazon-eks-container-summary"></a>

此模式會在全受管圖形資料庫 Amazon Neptune 與容器協同運作服務 Amazon Elastic Kubernetes Service (Amazon EKS) 之間建立連線，以存取 Neptune 資料庫。Neptune 資料庫叢集受限於虛擬私有雲端 (VPC) AWS。因此，存取 Neptune 需要仔細設定 VPC 才能啟用連線。

與 PostgreSQL 的 Amazon Relational Database Service (Amazon RDS) 不同，Neptune 不依賴一般資料庫存取憑證。而是使用 AWS Identity and Access Management (IAM) 角色進行身分驗證。因此，從 Amazon EKS 連線至 Neptune 需要設定具有存取 Neptune 必要許可的 IAM 角色。

此外，Neptune 端點只能在叢集所在的 VPC 內存取。這表示您必須設定網路設定，以促進 Amazon EKS 和 Neptune 之間的通訊。根據您的特定需求和聯網偏好設定，[有多種方法來設定 VPC](https://docs.aws.amazon.com/neptune/latest/userguide/get-started-vpc.html)，以啟用 Neptune 和 Amazon EKS 之間的無縫連線。每個方法都有不同的優點和考量，可讓您靈活地設計資料庫架構，以符合應用程式的需求。

## 先決條件和限制
<a name="access-amazon-neptune-database-from-amazon-eks-container-prereqs"></a>

**先決條件 **
+ 安裝最新版本的 **kubectl** （請參閱[說明](https://kubernetes.io/docs/tasks/tools/#kubectl))。若要檢查您的版本，請執行：

  ```
  kubectl version --short
  ```
+ 安裝最新版本的 **eksctl** （請參閱[說明](https://eksctl.io/installation/))。若要檢查您的版本，請執行：

  ```
  eksctl info
  ```
+ 安裝最新版本的 AWS Command Line Interface (AWS CLI) 第 2 版 （請參閱[說明](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html))。若要檢查您的版本，請執行：

  ```
  aws --version
  ```
+ 建立 Neptune 資料庫叢集 （請參閱[說明](https://docs.aws.amazon.com/neptune/latest/userguide/get-started-cfn-create.html))。請務必透過 VPC [對等互連、 或其他方法，在叢集的 VPC](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html) 和 Amazon EKS 之間建立通訊。 [AWS Transit Gateway](https://docs.aws.amazon.com/vpc/latest/tgw/tgw-getting-started.html)此外，請確定叢集的狀態為「可用」，且其對安全群組的連接埠 8182 具有傳入規則。
+ 在現有的 Amazon EKS 叢集上設定 IAM OpenID Connect (OIDC) 供應商 （請參閱[說明](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html))。

**產品版本**
+ [Amazon EKS 1.27](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)
+ [Amazon Neptune 引擎版本 1.3.0.0 (2023-11-15)](https://docs.aws.amazon.com/neptune/latest/userguide/engine-releases-1.3.0.0.html)

## Architecture
<a name="access-amazon-neptune-database-from-amazon-eks-container-architecture"></a>

下圖顯示 Amazon EKS 叢集中的 Kubernetes Pod 與 Neptune 之間的連線，以提供 Neptune 資料庫的存取權。

![\[使用 Amazon Neptune 連接 Kubernetes 節點中的 Pod。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/2fcf9e00-1664-462a-825e-b0fdd962f478/images/86da67e5-340e-4b29-acc6-2da416ce57eb.png)


**自動化和擴展**

您可以使用 Amazon EKS [Horizontal Pod Autoscaler ](https://docs.aws.amazon.com/eks/latest/userguide/horizontal-pod-autoscaler.html)來擴展此解決方案。

## 工具
<a name="access-amazon-neptune-database-from-amazon-eks-container-tools"></a>

**服務**
+ [Amazon Elastic Kubernetes Service (Amazon EKS)](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) 可協助您在 上執行 Kubernetes， AWS 而無需安裝或維護您自己的 Kubernetes 控制平面或節點。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 透過控制已驗證並獲授權使用的人員，協助您安全地管理對 AWS 資源的存取。
+ [Amazon Neptune](https://docs.aws.amazon.com/neptune/latest/userguide/intro.html) 是一種圖形資料庫服務，可協助您建置和執行使用高度連線資料集的應用程式。

## 最佳實務
<a name="access-amazon-neptune-database-from-amazon-eks-container-best-practices"></a>

如需最佳實務，請參閱《*Amazon EKS 最佳實務指南*》中的 [Identity and Access Management](https://aws.github.io/aws-eks-best-practices/security/docs/iam/)。

## 史詩
<a name="access-amazon-neptune-database-from-amazon-eks-container-epics"></a>

### 設定環境變數
<a name="set-environment-variables"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 驗證叢集內容。 | 使用 Helm 或其他命令列工具與 Amazon EKS 叢集互動之前，您必須定義封裝叢集詳細資訊的環境變數。這些變數用於後續命令，以確保它們以正確的叢集和資源為目標。首先，確認您是在正確的叢集內容中操作。這可確保任何後續命令都傳送至預期的 Kubernetes 叢集。若要驗證目前的內容，請執行下列命令。<pre>kubectl config current-context</pre> | AWS 管理員、雲端管理員 | 
| 定義 `CLUSTER_NAME`變數。 | 定義 Amazon EKS 叢集`CLUSTER_NAME`的環境變數。在下列命令中，將範例值取代 AWS 區域 為您的叢集`us-west-2`的正確 。將範例值取代`eks-workshop`為您現有的叢集名稱。<pre>export CLUSTER_NAME=$(aws eks describe-cluster --region us-west-2 --name eks-workshop --query "cluster.name" --output text)</pre> | AWS 管理員、雲端管理員 | 
| 驗證輸出。 | 若要驗證變數是否已正確設定，請執行下列命令。<pre>echo $CLUSTER_NAME</pre>確認此命令的輸出符合您在上一個步驟中指定的輸入。 | AWS 管理員、雲端管理員 | 

### 建立 IAM 角色並將其與 Kubernetes 建立關聯
<a name="create-iam-role-and-associate-it-with-kubernetes"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 服務帳戶。 | 您可以使用[服務帳戶的 IAM 角色](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html?sc_channel=el&sc_campaign=appswave&sc_content=eks-integrate-secrets-manager&sc_geo=mult&sc_country=mult&sc_outcome=acq)，將 Kubernetes 服務帳戶映射至 IAM 角色，為在 Amazon EKS 上執行的應用程式啟用精細的許可管理。您可以使用 [eksctl](https://eksctl.io/) 來建立 IAM 角色，並將其與 Amazon EKS 叢集中的特定 Kubernetes 服務帳戶建立關聯。 AWS 受管政策`NeptuneFullAccess`允許寫入和讀取您指定的 Neptune 叢集。您必須先有與叢集相關聯的 [OIDC 端點](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html?sc_channel=el&sc_campaign=appswave&sc_content=eks-integrate-secrets-manager&sc_geo=mult&sc_country=mult&sc_outcome=acq)，才能執行這些命令。建立您要與名為 的 AWS 受管政策建立關聯的服務帳戶`NeptuneFullAccess`。<pre>eksctl create iamserviceaccount --name eks-neptune-sa --namespace default --cluster $CLUSTER_NAME --attach-policy-arn arn:aws:iam::aws:policy/NeptuneFullAccess --approve --override-existing-serviceaccounts</pre>其中 `eks-neptune-sa `是您要建立的服務帳戶名稱。完成後，此命令會顯示下列回應：<pre>2024-02-07 01:12:39 [ℹ] created serviceaccount "default/eks-neptune-sa"</pre> | AWS 管理員、雲端管理員 | 
| 確認帳戶已正確設定。 | 請確定已在叢集的預設命名空間中正確設定`eks-neptune-sa`服務帳戶。<pre>kubectl get sa eks-neptune-sa -o yaml</pre>輸出應如下所示：<pre>apiVersion: v1<br />kind: ServiceAccount<br />metadata:<br />  annotations:<br />    eks.amazonaws.com/role-arn: arn:aws:iam::123456789123:role/eksctl-eks-workshop-addon-iamserviceaccount-d-Role1-Q35yKgdQOlmM<br />  creationTimestamp: "2024-02-07T01:12:39Z"<br />  labels:<br />    app.kubernetes.io/managed-by: eksctl<br />  name: eks-neptune-sa<br />  namespace: default<br />  resourceVersion: "5174750"<br />  uid: cd6ba2f7-a0f5-40e1-a6f4-4081e0042316</pre> | AWS 管理員、雲端管理員 | 
| 檢查連線能力。 | 部署名為 的範例 Pod，`pod-util`並檢查與 Neptune 的連線。<pre>apiVersion: v1<br />kind: Pod<br />metadata:<br />  name: pod-util<br />  namespace: default<br />spec:<br />  serviceAccountName: eks-neptune-sa<br />  containers:<br />  - name: pod-util<br />    image: public.ecr.aws/patrickc/troubleshoot-util<br />    command:<br />      - sleep<br />      - "3600"<br />    imagePullPolicy: IfNotPresent</pre><pre>kubectl apply -f pod-util.yaml</pre><pre>kubectl exec --stdin --tty pod-util -- /bin/bash<br />bash-5.1# curl -X POST -d '{"gremlin":"g.V().limit(1)"}' https://db-neptune-1.cluster-xxxxxxxxxxxx.us-west-2.neptune.amazonaws.com:8182/gremlin<br />{"requestId":"a4964f2d-12b1-4ed3-8a14-eff511431a0e","status":{"message":"","code":200,"attributes":{"@type":"g:Map","@value":[]}},"result":{"data":{"@type":"g:List","@value":[]},"meta":{"@type":"g:Map","@value":[]}}}<br />bash-5.1# exit<br />exit</pre> | AWS 管理員、雲端管理員 | 

### 驗證連線活動
<a name="validate-connection-activity"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 啟用 IAM 資料庫身分驗證。 | 根據預設，當您建立 Neptune 資料庫叢集時，IAM 資料庫身分驗證會停用。您可以使用 啟用或停用 IAM 資料庫身分驗證 AWS 管理主控台。請依照 AWS 文件中的步驟，在 [Neptune 中啟用 IAM 資料庫身分驗證](https://docs.aws.amazon.com/neptune/latest/userguide/iam-auth-enable.html)。 | AWS 管理員、雲端管理員 | 
| 驗證連線。 | 在此步驟中，您會與已處於執行狀態的`pod-util`容器互動，以安裝 **awscurl **並驗證連線。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/access-amazon-neptune-database-from-amazon-eks-container.html) | AWS 管理員、雲端管理員 | 

## 疑難排解
<a name="access-amazon-neptune-database-from-amazon-eks-container-troubleshooting"></a>


| 問題 | 解決方案 | 
| --- | --- | 
| 無法存取 Neptune 資料庫。 | 檢閱連接至服務帳戶的 IAM 政策。請確定它允許您要執行之操作的必要動作 （例如 `neptune:Connec,neptune:DescribeDBInstances`)。 | 

## 相關資源
<a name="access-amazon-neptune-database-from-amazon-eks-container-resources"></a>
+ [AWS 使用 Kubernetes 服務帳戶授予 Kubernetes 工作負載對 的存取權](https://docs.aws.amazon.com/eks/latest/userguide/service-accounts.html) (Amazon EKS 文件）
+ [服務帳戶的 IAM 角色](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html) (Amazon EKS 文件）
+ [建立新的 Neptune 資料庫叢集 ](https://docs.aws.amazon.com/neptune/latest/userguide/get-started-create-cluster.html)(Amazon Neptune 文件）

# 使用 AWS PrivateLink 和 Network Load Balancer 在 Amazon ECS 上私下存取容器應用程式
<a name="access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer"></a>

*Kirankumar Chandrashekar，Amazon Web Services*

## 總結
<a name="access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer-summary"></a>

此模式說明如何在 Network Load Balancer 後方的 Amazon Elastic Container Service (Amazon ECS) 上私有託管 Docker 容器應用程式，並使用 AWS PrivateLink 存取應用程式。然後，您可以使用私有網路安全地存取 Amazon Web Services (AWS) 雲端上的服務。Amazon Relational Database Service (Amazon RDS) 以高可用性 (HA) 託管在 Amazon ECS 上執行之應用程式的關聯式資料庫。如果應用程式需要持久性儲存，則會使用 Amazon Elastic File System (Amazon EFS)。

執行 Docker 應用程式的 Amazon ECS 服務與前端的 Network Load Balancer 可以與虛擬私有雲端 (VPC) 端點建立關聯，以便透過 AWS PrivateLink 存取。然後，您可以使用 VPC 端點與其他 VPCs 共用此 VPC 端點服務。

您也可以使用 [AWS Fargate](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/AWS_Fargate.html) 而非 Amazon EC2 Auto Scaling 群組。如需詳細資訊，請參閱[使用 AWS Fargate、AWS PrivateLink 和 Network Load Balancer 在 Amazon ECS 上私下存取容器應用程式](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-fargate-aws-privatelink-and-a-network-load-balancer.html?did=pg_card)。

## 先決條件和限制
<a name="access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer-prereqs"></a>

**先決條件**
+ 作用中的 AWS 帳戶
+ [在 Linux、macOS 或 Windows 上安裝和設定 AWS Command Line Interface (AWS CLI) 第 2 版](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) macOS
+ 在 Linux、macOS 或 Windows 上安裝和設定 [Docker](https://www.docker.com/)
+ 在 Docker 上執行的應用程式

## Architecture
<a name="access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer-architecture"></a>

![\[使用 AWS PrivateLink 存取 Network Load Balancer 後方 Amazon ECS 上的容器應用程式。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/a316bf46-24db-4514-957d-abc60f8f6962/images/573951ed-74bb-4023-9d9c-43e77e4f8eda.png)


 

**技術堆疊**
+ Amazon CloudWatch
+ Amazon Elastic Compute Cloud (Amazon EC2)
+ Amazon EC2 Auto Scaling
+ Amazon Elastic Container Registry (Amazon ECR)
+ Amazon ECS
+ Amazon RDS
+ Amazon Simple Storage Service (Amazon S3)
+ AWS Lambda
+ AWS PrivateLink
+ AWS Secrets Manager
+ Application Load Balancer
+ Network Load Balancer
+ VPC

*自動化和擴展*
+ 您可以使用 [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) 建立此模式，方法是使用[基礎設施做為程式碼](https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/infrastructure-as-code.html)。

## 工具
<a name="access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer-tools"></a>
+ [Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts.html) – Amazon Elastic Compute Cloud (Amazon EC2) 在 AWS 雲端中提供可擴展的運算容量。
+ [Amazon EC2 Auto Scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/what-is-amazon-ec2-auto-scaling.html) – Amazon EC2 Auto Scaling 可協助您確保有正確數量的 Amazon EC2 執行個體可用於處理應用程式的負載。
+ [Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html) – Amazon Elastic Container Service (Amazon ECS) 是一種高度可擴展、快速的容器管理服務，可讓您輕鬆執行、停止和管理叢集上的容器。
+ [Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) – Amazon Elastic Container Registry (Amazon ECR) 是安全、可擴展且可靠的受管 AWS 容器映像登錄服務。
+ [Amazon EFS](https://docs.aws.amazon.com/efs/latest/ug/whatisefs.html) – Amazon Elastic File System (Amazon EFS) 提供簡單、可擴展、全受管的彈性 NFS 檔案系統，可與 AWS 雲端服務和內部部署資源搭配使用。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) – Lambda 是一種運算服務，可在不佈建或管理伺服器的情況下執行程式碼。
+ [Amazon RDS](https://docs.aws.amazon.com/rds/) – Amazon Relational Database Service (Amazon RDS) 是一種 Web 服務，可讓您更輕鬆地在 AWS 雲端中設定、操作和擴展關聯式資料庫。
+ [Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) – Amazon Simple Storage Service (Amazon S3) 是網際網路的儲存體。此服務旨在降低開發人員進行網路規模運算的難度。
+ [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) – Secrets Manager 透過向 Secrets Manager 提供 API 呼叫以程式設計方式擷取秘密，協助您取代程式碼中的硬式編碼登入資料，包括密碼。
+ [Amazon VPC](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) – Amazon Virtual Private Cloud (Amazon VPC) 可協助您在已定義的虛擬網路中啟動 AWS 資源。
+ [Elastic Load Balancing](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html) – Elastic Load Balancing 會將傳入的應用程式或網路流量分散到多個可用區域中的多個目標，例如 Amazon EC2 執行個體、容器和 IP 地址。
+ [Docker](https://www.docker.com/) – Docker 可協助開發人員封裝、運送和執行任何應用程式，做為輕量、可攜式且自給自足的容器。

## 史詩
<a name="access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer-epics"></a>

### 建立網路元件
<a name="create-networking-components"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 VPC。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer.html) | 雲端管理員 | 

### 建立負載平衡器
<a name="create-the-load-balancers"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 Network Load Balancer。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer.html) | 雲端管理員 | 
| 建立 Application Load Balancer。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer.html) | 雲端管理員 | 

### 建立 Amazon EFS 檔案系統
<a name="create-an-amazon-efs-file-system"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 Amazon EFS 檔案系統。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer.html) | 雲端管理員 | 
| 為子網路掛載目標。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer.html) | 雲端管理員 | 
| 確認子網路已掛載為目標。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer.html) | 雲端管理員 | 

### 建立 S3 儲存貯體
<a name="create-an-s3-bucket"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 S3 儲存貯體。 | 開啟 Amazon S3 主控台，並視需要建立 S3 儲存貯體來存放應用程式的靜態資產。 | 雲端管理員 | 

### 建立 Secrets Manager 秘密
<a name="create-a-secrets-manager-secret"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 AWS KMS 金鑰來加密 Secrets Manager 秘密。 | 開啟 AWS Key Management Service (AWS KMS) 主控台並建立 KMS 金鑰。 | 雲端管理員 | 
|  建立 Secrets Manager 秘密以存放 Amazon RDS 密碼。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer.html) | 雲端管理員  | 

### 建立 Amazon RDS 執行個體
<a name="create-an-amazon-rds-instance"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立資料庫子網路群組。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer.html) | 雲端管理員 | 
| 建立 Amazon RDS 執行個體。 | 在私有子網路內建立和設定 Amazon RDS 執行個體。確定已針對 HA 開啟**異地**同步備份。 | 雲端管理員 | 
| 將資料載入 Amazon RDS 執行個體。 | 將應用程式所需的關聯式資料載入 Amazon RDS 執行個體。此程序會根據應用程式的需求，以及資料庫結構描述的定義和設計方式而有所不同。 | 雲端管理員，DBA | 

### 建立 Amazon ECS 元件
<a name="create-the-amazon-ecs-components"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 ECS 叢集。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer.html) | 雲端管理員 | 
| 建立 Docker 影像。 | 遵循*相關資源*區段中的指示建立 Docker 映像。 | 雲端管理員 | 
| 建立 Amazon ECR 儲存庫。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer.html) | 雲端管理員、DevOps 工程師 | 
| 驗證 Amazon ECR 儲存庫的 Docker 用戶端。 | 若要驗證 Amazon ECR 儲存庫的 Docker 用戶端，請在 AWS CLI 中執行「`aws ecr get-login-password`命令。 | 雲端管理員 | 
| 將 Docker 映像推送至 Amazon ECR 儲存庫。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer.html) | 雲端管理員 | 
| 建立 Amazon ECS 任務定義。 | 在 Amazon ECS 中執行 Docker 容器所需的任務定義。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer.html)如需設定任務定義的協助，請參閱*相關資源*區段中的「建立任務定義」。請務必提供您推送到 Amazon ECR 的 Docker 映像。 | 雲端管理員 | 
| 建立 Amazon ECS 服務。 | 使用您先前建立的 ECS 叢集來建立 Amazon ECS 服務。請務必選擇 Amazon EC2 做為啟動類型，然後選擇在上一個步驟中建立的任務定義，以及 Application Load Balancer 的目標群組。 | 雲端管理員 | 

### 建立 Amazon EC2 Auto Scaling 群組
<a name="create-an-amazon-ec2-auto-scaling-group"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立啟動組態。 | 開啟 Amazon EC2 主控台，並建立啟動組態。確定使用者資料具有允許 EC2 執行個體加入所需 ECS 叢集的程式碼。如需所需程式碼的範例，請參閱*相關資源*一節。 | 雲端管理員 | 
| 建立 Amazon EC2 Auto Scaling 群組。 | 返回 Amazon EC2 主控台，然後在 **Auto Scaling** 下，選擇 **Auto Scaling 群組**。設定 Amazon EC2 Auto Scaling 群組。請務必選擇先前建立的私有子網路和啟動組態。 | 雲端管理員 | 

### 設定 AWS PrivateLink
<a name="set-up-aws-privatelink"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定 AWS PrivateLink 端點。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer.html)如需詳細資訊，請參閱*相關資源*一節。 | 雲端管理員 | 

### 建立 VPC 端點
<a name="create-a-vpc-endpoint"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 VPC 端點。 | 為您先前建立的 AWS PrivateLink 端點建立 VPC 端點。VPC 端點完整網域名稱 (FQDN) 會指向 AWS PrivateLink 端點 FQDN。這會為 DNS 端點可存取的 VPC 端點服務建立彈性網路界面。 | 雲端管理員 | 

### 建立 Lambda 函式
<a name="create-the-lambda-function"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 Lambda 函數。 | 在 AWS Lambda 主控台上，建立 Lambda 函數，將 Application Load Balancer IP 地址更新為 Network Load Balancer 的目標。如需詳細資訊，請參閱[使用 AWS Lambda 為 Application Load Balancer 啟用靜態 IP 地址](https://aws.amazon.com/blogs/networking-and-content-delivery/using-aws-lambda-to-enable-static-ip-addresses-for-application-load-balancers/)部落格文章。 | 應用程式開發人員 | 

## 相關資源
<a name="access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer-resources"></a>

**建立負載平衡器：**
+ [使用適用於 Amazon ECS 的 Network Load Balancer ](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/nlb.html)
+ [建立 Network Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/create-network-load-balancer.html)
+ [使用適用於 Amazon ECS 的 Application Load Balancer ](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/alb.html)
+ [建立 Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/create-application-load-balancer.html)

**建立 Amazon EFS 檔案系統：**
+ [建立 Amazon EFS 檔案系統](https://docs.aws.amazon.com/efs/latest/ug/creating-using-create-fs.html)
+ [在 Amazon EFS 中建立掛載目標](https://docs.aws.amazon.com/efs/latest/ug/accessing-fs.html)

**建立 S3 儲存貯體：**
+ [建立 S3 儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/userguide/GetStartedWithS3.html#creating-bucket)

**建立 Secrets Manager 秘密：**
+ [在 AWS KMS 中建立金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)
+ [在 AWS Secrets Manager 中建立秘密](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)

**建立 Amazon RDS 執行個體：**
+ [建立 Amazon RDS 資料庫執行個體](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateDBInstance.html)

**建立 Amazon ECS 元件：**
+ [建立 Amazon ECS 叢集](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-ec2-cluster-console-v2.html)
+ [建立 Docker 映像](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-container-image.html)
+ [建立 Amazon ECR 儲存庫](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)
+ [使用 Amazon ECR 儲存庫驗證 Docker](https://docs.aws.amazon.com/AmazonECR/latest/userguide/Registries.html#registry_auth)
+ [將映像推送至 Amazon ECR 儲存庫](https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-push-ecr-image.html)
+ [建立 Amazon ECS 任務定義](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definitions.html)
+ [建立 Amazon ECS 服務](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-service-console-v2.html)

**建立 Amazon EC2 Auto Scaling 群組：**
+ [建立啟動組態](https://docs.aws.amazon.com/autoscaling/ec2/userguide/create-launch-config.html)
+ [使用啟動組態建立 Auto Scaling 群組](https://docs.aws.amazon.com/autoscaling/ec2/userguide/create-asg.html)
+ [使用 Amazon EC2 使用者資料引導容器執行個體](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/bootstrap_container_instance.html)

**設定 AWS PrivateLink：**
+ [VPC 端點服務 (AWS PrivateLink)](https://docs.aws.amazon.com/vpc/latest/privatelink/privatelink-share-your-services.html)

**建立 VPC 端點：**
+ [介面 VPC 端點 (AWS PrivateLink)](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html)

**建立 Lambda 函數：**
+ [建立 Lambda 函數](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html)

**其他資源：**
+ [使用 Application Load Balancer 的靜態 IP 地址](https://aws.amazon.com/blogs/networking-and-content-delivery/using-static-ip-addresses-for-application-load-balancers/)
+ [透過 AWS PrivateLink 安全地存取服務](https://d1.awsstatic.com/whitepapers/aws-privatelink.pdf)

# 使用 AWS Fargate、AWS PrivateLink 和 Network Load Balancer，在 Amazon ECS 上私下存取容器應用程式
<a name="access-container-applications-privately-on-amazon-ecs-by-using-aws-fargate-aws-privatelink-and-a-network-load-balancer"></a>

*Kirankumar Chandrashekar，Amazon Web Services*

## 總結
<a name="access-container-applications-privately-on-amazon-ecs-by-using-aws-fargate-aws-privatelink-and-a-network-load-balancer-summary"></a>

此模式說明如何使用 Amazon Elastic Container Service (Amazon ECS) 搭配 AWS Fargate 啟動類型，在 Network Load Balancer 後方私下託管 Amazon Web Services (AWS) 雲端上的 Docker 容器應用程式，並使用 AWS PrivateLink 存取應用程式。Amazon Relational Database Service (Amazon RDS) 以高可用性 (HA) 託管在 Amazon ECS 上執行之應用程式的關聯式資料庫。如果應用程式需要持久性儲存，您可以使用 Amazon Elastic File System (Amazon EFS)。

此模式針對執行 Docker 應用程式的 Amazon ECS 服務使用 [Fargate 啟動類型](https://docs.aws.amazon.com/AmazonECS/latest/userguide/launch_types.html)，並在前端使用 Network Load Balancer。然後，它可以與虛擬私有雲端 (VPC) 端點建立關聯，以便透過 AWS PrivateLink 進行存取。然後，您可以使用 VPC 端點與其他 VPCs 共用此 VPC 端點服務。

您可以使用 Fargate 搭配 Amazon ECS 執行容器，而不必管理 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體的伺服器或叢集。您也可以使用 Amazon EC2 Auto Scaling 群組，而非 Fargate。如需詳細資訊，請參閱[使用 AWS PrivateLink 和 Network Load Balancer 在 Amazon ECS 上私下存取容器應用程式](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer.html?did=pg_card&trk=pg_card)。

## 先決條件和限制
<a name="access-container-applications-privately-on-amazon-ecs-by-using-aws-fargate-aws-privatelink-and-a-network-load-balancer-prereqs"></a>

**先決條件**
+ 作用中的 AWS 帳戶
+ [在 Linux、macOS 或 Windows 上安裝和設定 AWS Command Line Interface (AWS CLI) 第 2 版](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) macOS
+ 在 Linux、macOS 或 Windows 上安裝和設定 [Docker](https://www.docker.com/)
+ 在 Docker 上執行的應用程式

## Architecture
<a name="access-container-applications-privately-on-amazon-ecs-by-using-aws-fargate-aws-privatelink-and-a-network-load-balancer-architecture"></a>

![\[使用 PrivateLink 以 AWS Fargate 啟動類型存取 Amazon ECS 上的容器應用程式。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/31cca5e2-8d8b-45ec-b872-a06b0dd97007/images/57cc9995-45f4-4039-a0bf-2d2b3d6a05de.png)


**技術堆疊**
+ Amazon CloudWatch
+ Amazon Elastic Container Registry (Amazon ECR)
+ Amazon ECS
+ Amazon EFS
+ Amazon RDS
+ Amazon Simple Storage Service (Amazon S3)
+ AWS Fargate
+ AWS PrivateLink
+ AWS Secrets Manager
+ Application Load Balancer
+ Network Load Balancer
+ VPC

**自動化和擴展**
+ 您可以使用 [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) 建立此模式，方法是使用[基礎設施做為程式碼](https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/infrastructure-as-code.html)。

## 工具
<a name="access-container-applications-privately-on-amazon-ecs-by-using-aws-fargate-aws-privatelink-and-a-network-load-balancer-tools"></a>

**AWS 服務**
+ [Amazon Elastic Container Registry (Amazon ECR)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) 是安全、可擴展且可靠的受管 AWS 容器映像登錄服務。
+ [Amazon Elastic Container Service (Amazon ECS)](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html) 是一種高度可擴展、快速的容器管理服務，可讓您輕鬆地執行、停止和管理叢集上的容器。
+ [Amazon Elastic File System (Amazon EFS)](https://docs.aws.amazon.com/efs/latest/ug/whatisefs.html) 提供簡單、可擴展、全受管的彈性 NFS 檔案系統，可與 AWS 雲端服務和內部部署資源搭配使用。
+ [AWS Fargate](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/AWS_Fargate.html) 是一項技術，您可以與 Amazon ECS 搭配使用來執行容器，而無需管理 Amazon EC2 執行個體的伺服器或叢集。
+ [Amazon Relational Database Service (Amazon RDS)](https://docs.aws.amazon.com/rds/index.html) 是一種 Web 服務，可讓您更輕鬆地在 中設定、操作和擴展關聯式資料庫 AWS 雲端。
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) 是網際網路的儲存體。此服務旨在降低開發人員進行網路規模運算的難度。
+ [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/) 可協助您將程式碼中的硬式編碼憑證 (包括密碼) 取代為 Secrets Manager 的 API 呼叫，以便透過程式設計方法來擷取機密。
+ [Amazon Virtual Private Cloud (Amazon VPC)](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) 可協助您在已定義的虛擬網路中啟動 AWS 資源。
+ [Elastic Load Balancing (ELB)](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html) 會將傳入的應用程式或網路流量分配到多個可用區域中的多個目標，例如 EC2 執行個體、容器和 IP 地址。

**其他工具**
+ [Docker](https://www.docker.com/) 可協助開發人員輕鬆封裝、運送和執行任何應用程式，做為輕量、可攜式且自給自足的容器。

## 史詩
<a name="access-container-applications-privately-on-amazon-ecs-by-using-aws-fargate-aws-privatelink-and-a-network-load-balancer-epics"></a>

### 建立網路元件
<a name="create-networking-components"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 VPC。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-fargate-aws-privatelink-and-a-network-load-balancer.html) | 雲端管理員 | 

### 建立負載平衡器
<a name="create-the-load-balancers"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 Network Load Balancer。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-fargate-aws-privatelink-and-a-network-load-balancer.html)如需此案例和其他案例的協助，請參閱*相關資源*一節。 | 雲端管理員 | 
| 建立 Application Load Balancer。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-fargate-aws-privatelink-and-a-network-load-balancer.html) | 雲端管理員 | 

### 建立 Amazon EFS 檔案系統
<a name="create-an-amazon-efs-file-system"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 Amazon EFS 檔案系統。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-fargate-aws-privatelink-and-a-network-load-balancer.html) | 雲端管理員 | 
| 為子網路掛載目標。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-fargate-aws-privatelink-and-a-network-load-balancer.html) | 雲端管理員 | 
| 確認子網路已掛載為目標。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-fargate-aws-privatelink-and-a-network-load-balancer.html) | 雲端管理員 | 

### 建立 S3 儲存貯體
<a name="create-an-s3-bucket"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 S3 儲存貯體。 | 開啟 Amazon S3 主控台，並視需要[建立 S3 儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/userguide/GetStartedWithS3.html#creating-bucket)來存放應用程式的靜態資產。 | 雲端管理員 | 

### 建立 Secrets Manager 秘密
<a name="create-a-secrets-manager-secret"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
|  建立 AWS KMS 金鑰來加密 Secrets Manager 秘密。 | 開啟 AWS Key Management Service (AWS KMS) 主控台並建立 KMS 金鑰。 | 雲端管理員 | 
|  建立 Secrets Manager 秘密以存放 Amazon RDS 密碼。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-fargate-aws-privatelink-and-a-network-load-balancer.html) | 雲端管理員 | 

### 建立 Amazon RDS 執行個體
<a name="create-an-amazon-rds-instance"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立資料庫子網路群組。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-fargate-aws-privatelink-and-a-network-load-balancer.html) | 雲端管理員 | 
| 建立 Amazon RDS 執行個體。 | 在私有子網路內建立和設定 Amazon RDS 執行個體。確保已開啟**異地**同步備份以實現高可用性 (HA)。 | 雲端管理員 | 
| 將資料載入 Amazon RDS 執行個體。 | 將應用程式所需的關聯式資料載入 Amazon RDS 執行個體。此程序會根據應用程式的需求，以及資料庫結構描述的定義和設計方式而有所不同。 | DBA | 

### 建立 Amazon ECS 元件
<a name="create-the-amazon-ecs-components"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 ECS 叢集。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-fargate-aws-privatelink-and-a-network-load-balancer.html) | 雲端管理員 | 
| 建立 Docker 映像。 | 遵循 [AWS 文件](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-container-image.html)中的指示建立 Docker 映像。 | 雲端管理員 | 
| 建立 Amazon ECR 儲存庫。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-fargate-aws-privatelink-and-a-network-load-balancer.html) | 雲端管理員、DevOps 工程師 | 
| 將 Docker 映像推送至 Amazon ECR 儲存庫。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-fargate-aws-privatelink-and-a-network-load-balancer.html) | 雲端管理員 | 
| 建立 Amazon ECS 任務定義。 | 在 Amazon ECS 中執行 Docker 容器所需的任務定義。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-fargate-aws-privatelink-and-a-network-load-balancer.html)如需設定任務定義的協助，請參閱*相關資源*區段中的「建立任務定義」。請務必提供您推送到 Amazon ECR 的 Docker 映像。 | 雲端管理員 | 
| 建立 ECS 服務，然後選擇 Fargate 作為啟動類型。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-fargate-aws-privatelink-and-a-network-load-balancer.html) | 雲端管理員 | 

### 設定 AWS PrivateLink
<a name="set-up-aws-privatelink"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定 AWS PrivateLink 端點。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-fargate-aws-privatelink-and-a-network-load-balancer.html) | 雲端管理員 | 

### 建立 VPC 端點
<a name="create-a-vpc-endpoint"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 VPC 端點。 | 為您先前建立的 AWS PrivateLink [端點建立 VPC](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html) 端點。VPC 端點完整網域名稱 (FQDN) 會指向 AWS PrivateLink 端點 FQDN。這會為網域名稱服務端點可存取的 VPC 端點服務建立彈性網路界面。 | 雲端管理員 | 

### 設定目標
<a name="set-the-target"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 新增 Application Load Balancer 做為目標。 | 若要將 Application Load Balancer 新增為 Network Load Balancer 的目標，請遵循 [AWS 文件](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/application-load-balancer-target.html)中的指示。 | 應用程式開發人員 | 

## 相關資源
<a name="access-container-applications-privately-on-amazon-ecs-by-using-aws-fargate-aws-privatelink-and-a-network-load-balancer-resources"></a>

**建立負載平衡器：**
+ [使用適用於 Amazon ECS 的 Network Load Balancer ](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/nlb.html)
+ [建立 Network Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/create-network-load-balancer.html)
+ [使用適用於 Amazon ECS 的 Application Load Balancer ](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/alb.html)
+ [建立 Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/create-application-load-balancer.html)

**建立 Amazon EFS 檔案系統：**
+ [建立 Amazon EFS 檔案系統](https://docs.aws.amazon.com/efs/latest/ug/creating-using-create-fs.html)
+ [在 Amazon EFS 中建立掛載目標](https://docs.aws.amazon.com/efs/latest/ug/accessing-fs.html)

**建立 Secrets Manager 秘密：**
+ [在 AWS KMS 中建立金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)
+ [在 AWS Secrets Manager 中建立秘密](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html)

**建立 Amazon RDS 執行個體：**
+ [建立 Amazon RDS 資料庫執行個體](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateDBInstance.html)

**建立 Amazon ECS 元件**
+ [建立 Amazon ECR 儲存庫](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)
+ [使用 Amazon ECR 儲存庫驗證 Docker](https://docs.aws.amazon.com/AmazonECR/latest/userguide/Registries.html#registry_auth)
+ [將映像推送至 Amazon ECR 儲存庫](https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-push-ecr-image.html)
+ [建立 Amazon ECS 任務定義](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definitions.html)
+ [建立 Amazon ECS 服務](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-service-console-v2.html)

**其他資源：**
+ [透過 AWS PrivateLink 安全地存取服務](https://d1.awsstatic.com/whitepapers/aws-privatelink.pdf)

# 使用 AWS PrivateLink 和 Network Load Balancer 在 Amazon EKS 上私下存取容器應用程式
<a name="access-container-applications-privately-on-amazon-eks-using-aws-privatelink-and-a-network-load-balancer"></a>

*Kirankumar Chandrashekar，Amazon Web Services*

## 總結
<a name="access-container-applications-privately-on-amazon-eks-using-aws-privatelink-and-a-network-load-balancer-summary"></a>

此模式說明如何在 Network Load Balancer 後方的 Amazon Elastic Kubernetes Service (Amazon EKS) 上私有託管 Docker 容器應用程式，並使用 AWS PrivateLink 存取應用程式。然後，您可以使用私有網路安全地存取 Amazon Web Services (AWS) 雲端上的服務。 

執行 Docker 應用程式的 Amazon EKS 叢集與前端的 Network Load Balancer 可以與虛擬私有雲端 (VPC) 端點建立關聯，以便透過 AWS PrivateLink 存取。然後，您可以使用 VPC 端點與其他 VPCs 共用此 VPC 端點服務。

此模式描述的設定是在 VPCs 和 AWS 帳戶之間共用應用程式存取權的安全方式。它不需要特殊的連線或路由組態，因為消費者和提供者帳戶之間的連線位於全球 AWS 骨幹，而且不會周遊公有網際網路。

## 先決條件和限制
<a name="access-container-applications-privately-on-amazon-eks-using-aws-privatelink-and-a-network-load-balancer-prereqs"></a>

**先決條件**
+ 在 Linux、macOS 或 Windows 上安裝和設定 [Docker](https://www.docker.com/)。
+ 在 Docker 上執行的應用程式。
+ 作用中的 AWS 帳戶
+ [在 Linux、macOS 或 Windows 上安裝和設定 AWS Command Line Interface (AWS CLI) 第 2 版](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)。 macOS
+ 具有標記私有子網路並設定為託管應用程式的現有 Amazon EKS 叢集。如需詳細資訊，請參閱 Amazon EKS 文件中的[子網路標記](https://docs.aws.amazon.com/eks/latest/userguide/network_reqs.html#vpc-subnet-tagging)。 
+ Kubectl，已安裝並設定為存取 Amazon EKS 叢集上的資源。如需詳細資訊，請參閱 Amazon EKS 文件中的[安裝 kubectl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)。 

## Architecture
<a name="access-container-applications-privately-on-amazon-eks-using-aws-privatelink-and-a-network-load-balancer-architecture"></a>

![\[使用 PrivateLink 和 Network Load Balancer 存取 Amazon EKS 容器中的應用程式。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/ce977924-012c-4fb6-8e51-94d6e5c829a6/images/378456a3-f4d1-4a57-bb36-879c240cabfb.png)


**技術堆疊**
+ Amazon EKS
+ AWS PrivateLink
+ Network Load Balancer

**自動化和擴展**
+ 您可以在 Git 型儲存庫上追蹤和管理 Kubernetes 資訊清單，並在 AWS CodePipeline 中使用持續整合和持續交付 (CI/CD) 部署。 
+ 您可以使用 AWS CloudFormation 建立此模式，方法是使用基礎設施做為程式碼 (IaC)。

## 工具
<a name="access-container-applications-privately-on-amazon-eks-using-aws-privatelink-and-a-network-load-balancer-tools"></a>
+ [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) – AWS 命令列界面 (AWS CLI) 是一種開放原始碼工具，可讓您使用命令列 Shell 中的命令與 AWS 服務互動。
+ [Elastic Load Balancing](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html) – Elastic Load Balancing 會將傳入的應用程式或網路流量分散到一或多個可用區域中的多個目標，例如 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體、容器和 IP 地址。
+ [Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) – Amazon Elastic Kubernetes Service (Amazon EKS) 是一項受管服務，可讓您在 AWS 上執行 Kubernetes，而無需安裝、操作和維護您自己的 Kubernetes 控制平面或節點。
+ [Amazon VPC](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) – Amazon Virtual Private Cloud (Amazon VPC) 可協助您在已定義的虛擬網路中啟動 AWS 資源。
+ [Kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) – Kubectl 是針對 Kubernetes 叢集執行命令的命令列公用程式。

## 史詩
<a name="access-container-applications-privately-on-amazon-eks-using-aws-privatelink-and-a-network-load-balancer-epics"></a>

### 部署 Kubernetes 部署和服務資訊清單檔案
<a name="deploy-the-kubernetes-deployment-and-service-manifest-files"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
|  建立 Kubernetes 部署資訊清單檔案。 | 根據您的需求修改下列範例檔案，以建立部署資訊清單檔案。<pre>apiVersion: apps/v1<br />kind: Deployment<br />metadata:<br />  name: sample-app<br />spec:<br />  replicas: 3<br />  selector:<br />    matchLabels:<br />      app: nginx<br />  template:<br />    metadata:<br />      labels:<br />        app: nginx<br />    spec:<br />      containers:<br />        - name: nginx<br />          image: public.ecr.aws/z9d2n7e1/nginx:1.19.5<br />          ports:<br />            - name: http<br />              containerPort: 80</pre>這是使用 NGINX Docker 映像部署的 NGINX 範例組態檔案。如需詳細資訊，請參閱 [Docker 文件中的如何使用官方 NGINX Docker 映像](https://www.docker.com/blog/how-to-use-the-official-nginx-docker-image/)。 | DevOps 工程師 | 
| 部署 Kubernetes 部署資訊清單檔案。 | 執行下列命令，將部署資訊清單檔案套用至您的 Amazon EKS 叢集：`kubectl apply –f <your_deployment_file_name> ` | DevOps 工程師 | 
|  建立 Kubernetes 服務資訊清單檔案。 | 根據您的需求修改下列範例檔案，以建立服務資訊清單檔案。<pre>apiVersion: v1<br />kind: Service<br />metadata:<br />  name: sample-service<br />  annotations:<br />    service.beta.kubernetes.io/aws-load-balancer-type: nlb<br />    service.beta.kubernetes.io/aws-load-balancer-internal: "true"<br />spec:<br />  ports:<br />    - port: 80<br />      targetPort: 80<br />      protocol: TCP<br />  type: LoadBalancer<br />  selector:<br />    app: nginx</pre>請確定您已包含下列項目`annotations`來定義內部 Network Load Balancer：<pre>service.beta.kubernetes.io/aws-load-balancer-type: nlb<br />service.beta.kubernetes.io/aws-load-balancer-internal: "true"</pre> | DevOps 工程師 | 
| 部署 Kubernetes 服務資訊清單檔案。 | 執行下列命令，將服務資訊清單檔案套用至您的 Amazon EKS 叢集：`kubectl apply -f <your_service_file_name>` | DevOps 工程師 | 

### 建立端點
<a name="create-the-endpoints"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 記錄 Network Load Balancer 的名稱。 | 執行下列命令來擷取 Network Load Balancer 的名稱：`kubectl get svc sample-service -o wide`記錄 Network Load Balancer 的名稱，這是建立 AWS PrivateLink 端點的必要項目。 | DevOps 工程師 | 
| 建立 AWS PrivateLink 端點。 | 登入 AWS 管理主控台，開啟 Amazon VPC 主控台，然後建立 AWS PrivateLink 端點。將此端點與 Network Load Balancer 建立關聯，這可讓客戶私下使用應用程式。如需詳細資訊，請參閱 Amazon [VPC 文件中的 VPC 端點服務 (AWS PrivateLink)](https://docs.aws.amazon.com/vpc/latest/userguide/endpoint-service.html)。如果消費者帳戶需要存取應用程式，則必須將消費者帳戶的 [AWS 帳戶 ID](https://docs.aws.amazon.com/IAM/latest/UserGuide/console_account-alias.html) 新增至 AWS PrivateLink 端點組態的允許主體清單。如需詳細資訊，請參閱 Amazon VPC 文件中的[新增和移除端點服務的許可](https://docs.aws.amazon.com/vpc/latest/userguide/add-endpoint-service-permissions.html)。 | 雲端管理員  | 
| 建立 VPC 端點。 | 在 Amazon VPC 主控台上，選擇**端點服務**，然後選擇**建立端點服務**。為 AWS PrivateLink 端點建立 VPC 端點。VPC 端點的完整網域名稱 (FQDN) 會指向 AWS PrivateLink 端點的 FQDN。這會為 DNS 端點可存取的 VPC 端點服務建立彈性網路界面。  | 雲端管理員 | 

## 相關資源
<a name="access-container-applications-privately-on-amazon-eks-using-aws-privatelink-and-a-network-load-balancer-resources"></a>
+ [使用官方 NGINX Docker 映像](https://www.docker.com/blog/how-to-use-the-official-nginx-docker-image/)
+ [Amazon EKS 上的網路負載平衡](https://docs.aws.amazon.com/eks/latest/userguide/load-balancing.html) 
+ [建立 VPC 端點服務 (AWS PrivateLink)](https://docs.aws.amazon.com/vpc/latest/userguide/endpoint-service.html) 
+ [新增和移除端點服務的許可 ](https://docs.aws.amazon.com/vpc/latest/userguide/add-endpoint-service-permissions.html)

# 使用 AWS Batch 自動化 Amazon RDS for PostgreSQL 資料庫執行個體的備份
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch"></a>

*Kirankumar Chandrashekar，Amazon Web Services*

## 總結
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-summary"></a>

備份 PostgreSQL 資料庫是一項重要的任務，通常可以使用 [pg\$1dump 公用程式](https://www.postgresql.org/docs/current/app-pgdump.html)完成，該公用程式預設使用 COPY 命令來建立 PostgreSQL 資料庫的結構描述和資料傾印。不過，如果您需要定期備份多個 PostgreSQL 資料庫，此程序可能會變得重複。如果您的 PostgreSQL 資料庫託管在雲端，您也可以利用 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 提供的[自動備份](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithAutomatedBackups.html)功能。此模式說明如何使用 pg\$1dump 公用程式自動化 Amazon RDS for PostgreSQL 資料庫執行個體的定期備份。

注意：指示假設您使用的是 Amazon RDS。不過，您也可以針對在 Amazon RDS 外部託管的 PostgreSQL 資料庫使用此方法。若要進行備份，AWS Lambda 函數必須能夠存取您的資料庫。

以時間為基礎的 Amazon CloudWatch Events 事件會啟動 Lambda 函數，以搜尋[套用至 Amazon RDS 上 PostgreSQL 資料庫執行個體中繼資料的特定備份標籤](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Tagging.html)。 PostgreSQL 如果 PostgreSQL 資料庫執行個體具有 **bkp：AutomatedDBDump = Active** 標籤和其他必要的備份標籤，Lambda 函數會將每個資料庫備份的個別任務提交至 AWS Batch。 

AWS Batch 會處理這些任務，並將備份資料上傳至 Amazon Simple Storage Service (Amazon S3) 儲存貯體。此模式使用 Dockerfile 和 entrypoint.sh 檔案來建置 Docker 容器映像，用於在 AWS Batch 任務中進行備份。備份程序完成後，AWS Batch 會將備份詳細資訊記錄到 Amazon DynamoDB 上的清查資料表。此外，CloudWatch Events 事件會在 AWS Batch 中的任務失敗時啟動 Amazon Simple Notification Service (Amazon SNS) 通知。 

## 先決條件和限制
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-prereqs"></a>

**先決條件**
+ 作用中的 AWS 帳戶
+ 現有的受管或未受管運算環境。如需詳細資訊，請參閱 AWS Batch 文件中的[受管和未受管運算環境](https://docs.aws.amazon.com/batch/latest/userguide/compute_environments.html)。 
+ 安裝和設定 [AWS Command Line Interface (CLI) 第 2 版 Docker 映像](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-docker.html)。
+ 現有的 Amazon RDS for PostgreSQL 資料庫執行個體。 
+ 現有的 S3 儲存貯體。 
+ 在 Linux、macOS 或 Windows 上安裝和設定 [Docker](https://www.docker.com/)。
+ 熟悉 Lambda 中的編碼。 

## Architecture
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-architecture"></a>

![\[使用 pg_dump 公用程式備份 Amazon RDS for PostgreSQL 資料庫執行個體的架構。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/3283f739-980b-43d4-aca0-9d77a2ce3b85/images/352e2eab-1b7d-44ec-840a-a772a175e873.png)


 

**技術堆疊**
+ Amazon CloudWatch Events
+ Amazon DynamoDB
+ Amazon Elastic Container Registry (Amazon ECR)
+ Amazon RDS
+ Amazon SNS
+ Amazon S3
+ AWS Batch
+ AWS Key Management Service (AWS KMS)
+ AWS Lambda
+ AWS Secrets Manager
+ Docker

## 工具
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-tools"></a>
+ [Amazon CloudWatch Events](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/WhatIsCloudWatchEvents.html) – CloudWatch Events 提供近乎即時的系統事件串流，說明 AWS 資源的變更。
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) – DynamoDB 是全受管的 NoSQL 資料庫服務，可提供快速且可預測的效能和無縫的可擴展性。
+ [Amazon ECR](https://docs.aws.amazon.com/ecr/index.html) – Amazon Elastic Container Registry (Amazon ECR) 是安全、可擴展且可靠的受管 AWS 容器映像登錄服務。
+ [Amazon RDS](https://docs.aws.amazon.com/rds/index.html) – Amazon Relational Database Service (Amazon RDS) 是一種 Web 服務，可讓您更輕鬆地在 AWS 雲端中設定、操作和擴展關聯式資料庫。
+ [Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/welcome.html) – Amazon Simple Notification Service (Amazon SNS) 是一種受管服務，可將訊息從發佈者交付給訂閱者。
+ [Amazon S3](https://docs.aws.amazon.com/s3/index.html) – Amazon Simple Storage Service (Amazon S3) 是網際網路的儲存體。
+ [AWS Batch](https://docs.aws.amazon.com/batch/index.html) – AWS Batch 可協助您在 AWS 雲端上執行批次運算工作負載。
+ [AWS KMS](https://docs.aws.amazon.com/kms/index.html) – AWS Key Management Service (AWS KMS) 是一種受管服務，可讓您輕鬆地建立和控制用於加密資料的加密金鑰。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/index.html) – Lambda 是一種運算服務，可協助您執行程式碼，而無需佈建或管理伺服器。
+ [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/index.html) – Secrets Manager 可協助您以 API 呼叫 Secrets Manager，以程式設計方式擷取秘密，取代程式碼中的硬式編碼登入資料，包括密碼。
+ [Docker](https://www.docker.com/) – Docker 可協助開發人員輕鬆封裝、運送和執行任何應用程式，做為輕量、可攜式且自給自足的容器。

Amazon RDS 上的 PostgreSQL 資料庫執行個體必須將[標籤套用至其中繼資料](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Tagging.html)。Lambda 函數會搜尋標籤以識別應備份的資料庫執行個體，並通常會使用下列標籤。


| 
| 
| Tag | Description | 
| --- |--- |
| bkp：AutomatedDBDump = 作用中 | 將 Amazon RDS 資料庫執行個體識別為備份的候選項目。 | 
| bkp：AutomatedBackupSecret = <secret\$1name > | 識別包含 Amazon RDS 登入憑證的 Secrets Manager 秘密。 | 
| bkp：AutomatedDBDumpS3Bucket = <s3\$1bucket\$1name> | 識別要傳送備份的 S3 儲存貯體。 | 
| bkp：AutomatedDBDumpFrequencybkp：AutomatedDBDumpTime | 識別應備份資料庫的頻率和時間。  | 
| bkp：pgdumpcommand = <pgdump\$1command> | 識別需要備份的資料庫。 | 

## 史詩
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-epics"></a>

### 在 DynamoDB 中建立清查資料表
<a name="create-an-inventory-table-in-dynamodb"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 在 DynamoDB 中建立資料表。 | 登入 AWS 管理主控台，開啟 Amazon DynamoDB 主控台，然後建立資料表。如需此案例和其他案例的協助，請參閱*相關資源*一節。 | 雲端管理員、資料庫管理員 | 
| 確認資料表已建立。 | 執行 `aws dynamodb describe-table --table-name <table-name> \| grep TableStatus` 命令。如果資料表存在，命令會傳回`"TableStatus": "ACTIVE",`結果。 | 雲端管理員、資料庫管理員 | 

### 在 AWS Batch 中為失敗的任務事件建立 SNS 主題
<a name="create-an-sns-topic-for-failed-job-events-in-aws-batch"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 SNS 主題。 | 開啟 Amazon SNS 主控台，選擇**主題**，然後使用名稱 建立 SNS 主題`JobFailedAlert`。訂閱作用中的電子郵件地址至主題，並檢查您的電子郵件收件匣，以確認來自 AWS Notifications 的 SNS 訂閱電子郵件。 | 雲端管理員 | 
| 為 AWS Batch 建立失敗的任務事件規則。 | 開啟 Amazon CloudWatch 主控台，選擇**事件**，然後選擇**建立規則**。選擇**顯示進階選項**，然後選擇**編輯**。對於**建立模式以選取事件供目標處理**，請將現有文字取代為*其他資訊*區段中的「任務事件失敗」程式碼。此程式碼定義了 CloudWatch Events 規則，會在 AWS Batch 有`Failed`事件時啟動。 | 雲端管理員 | 
| 新增事件規則目標。 | 在**目標**中，選擇**新增目標**，然後選擇 `JobFailedAlert` SNS 主題。設定其餘詳細資訊並建立 Cloudwatch Events 規則。 | 雲端管理員 | 

### 建置 Docker 映像並將其推送至 Amazon ECR 儲存庫
<a name="build-a-docker-image-and-push-it-to-an-amazon-ecr-repository"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 Amazon ECR 儲存庫。 | 開啟 Amazon ECR 主控台，然後選擇您要在其中建立儲存庫的 AWS 區域。選擇**儲存庫**，然後選擇**建立儲存庫**。根據您的需求設定儲存庫。 | 雲端管理員 | 
| 撰寫 Dockerfile。 | 登入 Docker，並使用*其他資訊*區段中的「範例 Dockerfile」和「範例 entrypoint.sh 檔案」來建置 Dockerfile。 | DevOps 工程師 | 
| 建立 Docker 映像並將其推送至 Amazon ECR 儲存庫。 | 將 Dockerfile 建置至 Docker 映像檔，並將其推送至 Amazon ECR 儲存庫。如需此案例的說明，請參閱*相關資源*一節。 | DevOps 工程師 | 

### 建立 AWS Batch 元件
<a name="create-the-aws-batch-components"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 AWS Batch 任務定義。 | 開啟 AWS Batch 主控台，並建立任務定義，其中包含 Amazon ECR 儲存庫的統一資源識別符 (URI) 做為 屬性 `Image`。 | 雲端管理員 | 
| 設定 AWS Batch 任務佇列。 | 在 AWS Batch 主控台上，選擇**任務佇列**，然後選擇**建立佇列**。建立任務佇列來存放任務，直到 AWS Batch 在運算環境中的資源上執行任務為止。重要：請務必為 AWS Batch 編寫邏輯，將備份詳細資訊記錄到 DynamoDB 清查資料表。 | 雲端管理員 | 

### 建立和排程 Lambda 函數
<a name="create-and-schedule-a-lambda-function"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 Lambda 函數以搜尋標籤。 | 建立 Lambda 函數，在 PostgreSQL 資料庫執行個體上搜尋標籤並識別備份候選項目。確保您的 Lambda 函數可以識別`bkp:AutomatedDBDump = Active`標籤和所有其他必要的標籤。重要：Lambda 函數也必須能夠將任務新增至 AWS Batch 任務佇列。 | DevOps 工程師 | 
| 建立以時間為基礎的 CloudWatch Events 事件。 | 開啟 Amazon CloudWatch 主控台並建立 CloudWatch Events 事件，該事件使用 Cron 表達式定期執行 Lambda 函數。重要：所有排程事件都使用 UTC 時區。 | 雲端管理員 | 

### 測試備份自動化
<a name="test-the-backup-automation"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 Amazon KMS 金鑰。 | 開啟 Amazon KMS 主控台並建立 KMS 金鑰，可用來加密存放在 AWS Secrets Manager 中的 Amazon RDS 登入資料。 | 雲端管理員 | 
| 建立 AWS Secrets Manager 秘密。 | 開啟 AWS Secrets Manager 主控台，並將 Amazon RDS for PostgreSQL 資料庫登入資料儲存為秘密。 | 雲端管理員 | 
| 將必要的標籤新增至 PostgreSQL 資料庫執行個體。 | 開啟 Amazon RDS 主控台，並將標籤新增至您要自動備份的 PostgreSQL 資料庫執行個體。您可以在*工具*區段中使用資料表中的標籤。如果您需要來自相同 Amazon RDS 執行個體內多個 PostgreSQL 資料庫的備份，請使用 `-d test:-d test1`做為`bkp:pgdumpcommand`標籤的值。 `test`和 `test1`是資料庫名稱。請確定冒號 (：) 後方沒有空格。 | 雲端管理員 | 
| 驗證備份自動化。 | 若要驗證備份自動化，您可以叫用 Lambda 函數或等待備份排程開始。備份程序完成後，請檢查 DynamoDB 清查資料表是否有 PostgreSQL 資料庫執行個體的有效備份項目。如果它們相符，則備份自動化程序會成功。 | 雲端管理員 | 

## 相關資源
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-resources"></a>

**在 DynamoDB 中建立清查資料表**
+ [建立 Amazon DynamoDB 資料表](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html)

 

**在 AWS Batch 中為失敗的任務事件建立 SNS 主題**
+ [建立 Amazon SNS 主題](https://docs.aws.amazon.com/sns/latest/dg/sns-tutorial-create-topic.html)
+ [針對 AWS Batch 中的失敗任務事件傳送 SNS 提醒](https://docs.aws.amazon.com/batch/latest/userguide/batch_sns_tutorial.html)

 

**建置 Docker 映像並將其推送至 Amazon ECR 儲存庫**
+ [建立 Amazon ECR 儲存庫](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)    
+ [撰寫 Dockerfile、建立 Docker 映像，然後將其推送至 Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html)

 

**建立 AWS Batch 元件**
+ [建立 AWS Batch 任務定義](https://docs.aws.amazon.com/batch/latest/userguide/Batch_GetStarted.html#first-run-step-1)    
+ [設定您的運算環境和 AWS Batch 任務佇列](https://docs.aws.amazon.com/batch/latest/userguide/Batch_GetStarted.html#first-run-step-2)   
+ [在 AWS Batch 中建立任務佇列](https://docs.aws.amazon.com/batch/latest/userguide/create-job-queue.html)

 

**建立 Lambda 函數**
+ [建立 Lambda 函數和寫入程式碼](https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html)
+ [搭配 DynamoDB 使用 Lambda](https://docs.aws.amazon.com/lambda/latest/dg/with-ddb.html)

 

**建立 CloudWatch Events 事件**
+ [建立以時間為基礎的 CloudWatch Events 事件](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/Create-CloudWatch-Events-Scheduled-Rule.html)   
+ [在 Cloudwatch Events 中使用 Cron 表達式](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html)

 

**測試備份自動化**
+ [建立 Amazon KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)    
+ [建立 Secrets Manager 秘密](https://docs.aws.amazon.com/secretsmanager/latest/userguide/tutorials_basic.html)
+ [將標籤新增至 Amazon RDS 執行個體](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Tagging.html)

## 其他資訊
<a name="automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch-additional"></a>

**失敗的任務事件：**

```
{
  "detail-type": [
    "Batch Job State Change"
  ],
  "source": [
    "aws.batch"
  ],
  "detail": {
    "status": [
      "FAILED"
    ]
  }
}
```

**Dockerfile 範例：**

```
FROM alpine:latest
RUN apk --update add py-pip postgresql-client jq bash && \
pip install awscli && \
rm -rf /var/cache/apk/*
ADD entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
```

**範例 entrypoint.sh 檔案：**

```
 #!/bin/bash
set -e
DATETIME=`date +"%Y-%m-%d_%H_%M"`
FILENAME=RDS_PostGres_dump_${RDS_INSTANCE_NAME}
FILE=${FILENAME}_${DATETIME}

aws configure --profile new-profile set role_arn arn:aws:iam::${TargetAccountId}:role/${TargetAccountRoleName}
aws configure --profile new-profile set credential_source EcsContainer

echo "Central Account access provider IAM role is: "
aws sts get-caller-identity

echo "Target Customer Account access provider IAM role is: "
aws sts get-caller-identity --profile new-profile

securestring=$(aws secretsmanager get-secret-value --secret-id $SECRETID --output json --query 'SecretString' --region=$REGION --profile new-profile)

if [[ ${securestring} ]]; then
    echo "successfully accessed secrets manager and got the credentials"
    export PGPASSWORD=$(echo $securestring | jq --raw-output | jq -r '.DB_PASSWORD')
    PGSQL_USER=$(echo $securestring | jq --raw-output | jq -r '.DB_USERNAME')
    echo "Executing pg_dump for the PostGres endpoint ${PGSQL_HOST}"
    # pg_dump -h $PGSQL_HOST -U $PGSQL_USER -n dms_sample | gzip -9 -c  | aws s3 cp - --region=$REGION  --profile new-profile s3://$BUCKET/$FILE
    # in="-n public:-n private"
    IFS=':' list=($EXECUTE_COMMAND);
    for command in "${list[@]}";
      do
        echo $command;
        pg_dump -h $PGSQL_HOST -U $PGSQL_USER ${command} | gzip -9 -c  | aws s3 cp - --region=$REGION --profile new-profile s3://${BUCKET}/${FILE}-${command}".sql.gz"
        echo $?;
        if  [[ $? -ne 0 ]]; then
            echo "Error occurred in database backup process. Exiting now....."
            exit 1
        else
            echo "Postgresql dump was successfully taken for the RDS endpoint ${PGSQL_HOST} and is uploaded to the following S3 location s3://${BUCKET}/${FILE}-${command}.sql.gz"
            #write the details into the inventory table in central account
            echo "Writing to DynamoDB inventory table"
            aws dynamodb put-item --table-name ${RDS_POSTGRES_DUMP_INVENTORY_TABLE} --region=$REGION --item '{ "accountId": { "S": "'"${TargetAccountId}"'" }, "dumpFileUrl": {"S": "'"s3://${BUCKET}/${FILE}-${command}.sql.gz"'" }, "DumpAvailableTime": {"S": "'"`date +"%Y-%m-%d::%H::%M::%S"` UTC"'"}}'
            echo $?
            if  [[ $? -ne 0 ]]; then
                echo "Error occurred while putting item to DynamoDb Inventory Table. Exiting now....."
                exit 1
            else
                echo "Successfully written to DynamoDb Inventory Table ${RDS_POSTGRES_DUMP_INVENTORY_TABLE}"
            fi
        fi
      done;
else
    echo "Something went wrong {$?}"
    exit 1
fi

exec "$@"
```

# 使用 CI/CD 管道在 Amazon EKS 中自動化節點終止處理常式的部署
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline"></a>

*Sandip Gangapadhyay、Sandeep Gawande、Vyoma Sachdeva、Pragtideep Singh 和 John Vargas，Amazon Web Services*

## 總結
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-summary"></a>

**請注意**：新客戶不再使用 AWS CodeCommit。AWS CodeCommit 的現有客戶可以繼續正常使用服務。[進一步了解](https://aws.amazon.com/blogs/devops/how-to-migrate-your-aws-codecommit-repository-to-another-git-provider/)

在 Amazon Web Services (AWS) 雲端上，您可以使用開放原始碼專案 [AWS Node Termination Handler](https://github.com/aws/aws-node-termination-handler)，正常處理 Kubernetes 內的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體關閉。AWS Node Termination Handler 有助於確保 Kubernetes 控制平面適當回應可能導致 EC2 執行個體無法使用的事件。這類事件包括下列項目：
+ [EC2 執行個體排程維護](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-instances-status-check_sched.html)
+ [Amazon EC2 Spot 執行個體中斷](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-interruptions.html)
+ [Auto Scaling 群組縮減](https://docs.aws.amazon.com/autoscaling/ec2/userguide/AutoScalingGroupLifecycle.html#as-lifecycle-scale-in)
+ 跨可用區域[重新平衡 Auto Scaling 群組](https://docs.aws.amazon.com/autoscaling/ec2/userguide/auto-scaling-benefits.html#AutoScalingBehavior.InstanceUsage) 
+ 透過 API 或 AWS 管理主控台終止 EC2 執行個體

如果未處理事件，您的應用程式程式碼可能無法正常停止。復原完整可用性也可能需要更長的時間，或者可能會意外地將工作排程到正在停機的節點。`aws-node-termination-handler` (NTH) 可以兩種不同的模式運作：執行個體中繼資料服務 (IMDS) 或佇列處理器。如需這兩種模式的詳細資訊，請參閱[讀我檔案](https://github.com/aws/aws-node-termination-handler#readme)。

此模式使用 AWS CodeCommit，並透過持續整合和持續交付 (CI/CD) 管道，使用佇列處理器自動化 NTH 的部署。

**注意**  
如果您使用的是 [EKS 受管節點群組](https://docs.aws.amazon.com/eks/latest/userguide/managed-node-groups.html)，則不需要 `aws-node-termination-handler`。

## 先決條件和限制
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-prereqs"></a>

**先決條件**
+ 作用中的 AWS 帳戶
+ 支援搭配 AWS 管理主控台使用的 Web 瀏覽器。請參閱[支援的瀏覽器清單](https://aws.amazon.com/premiumsupport/knowledge-center/browsers-management-console/)。
+ [已安裝](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_install) AWS 雲端開發套件 (AWS CDK)。
+ `kubectl`已安裝 Kubernetes 命令列工具[https://kubernetes.io/docs/tasks/tools/](https://kubernetes.io/docs/tasks/tools/)。
+ `eksctl`已安裝適用於 Amazon Elastic Kubernetes Service (Amazon EKS) 的 AWS Command Line Interface (AWS CLI)[https://docs.aws.amazon.com/eks/latest/userguide/eksctl.html](https://docs.aws.amazon.com/eks/latest/userguide/eksctl.html)。
+ 執行 1.20 版或更新版本的 EKS 叢集。
+ 連接至 EKS 叢集的自我管理節點群組。若要使用自我管理節點群組建立 Amazon EKS 叢集，請執行下列命令。

  ```
  eksctl create cluster --managed=false --region <region> --name <cluster_name>
  ```

  如需 的詳細資訊`eksctl`，請參閱 [eksctl 文件](https://eksctl.io/usage/creating-and-managing-clusters/)。
+ 叢集的 AWS Identity and Access Management (IAM) OpenID Connect (OIDC) 提供者。如需詳細資訊，請參閱[為您的叢集建立 IAM OIDC 提供者](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html)。

**限制**
+ 您必須使用支援 Amazon EKS 服務的 AWS 區域。

**產品版本**
+ Kubernetes 1.20 版或更新版本
+ `eksctl` 0.107.0 版或更新版本
+ AWS CDK 2.27.0 版或更新版本

## Architecture
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-architecture"></a>

**目標技術堆疊**
+ 虛擬私有雲端 (VPC)
+ EKS 叢集
+ Amazon Simple Queue Service (Amazon SQS)
+ IAM
+ Kubernetes

**目標架構******

下圖顯示節點終止開始時end-to-end步驟的高階檢視。

![\[具有 Auto Scaling 群組的 VPC、具有 Node Termination Handler 的 EKS 叢集，以及 SQS 佇列。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/970dfb73-9526-4942-a974-e8eef6416596/images/9e0125ae-d55b-49dd-ae70-ccaedf03832a.png)


圖表中顯示的工作流程包含下列高階步驟：

1. 自動擴展 EC2 執行個體終止事件會傳送至 SQS 佇列。

1. NTH Pod 會監控 SQS 佇列中的新訊息。

1. NTH Pod 會收到新訊息並執行下列動作：
   + 繫結節點，讓新的 Pod 不會在節點上執行。
   + 耗盡節點，以清空現有的 Pod
   + 將生命週期掛鉤訊號傳送至 Auto Scaling 群組，以便終止節點。

**自動化和擴展**
+ 程式碼由 AWS CDK 管理和部署，並由 AWS CloudFormation 巢狀堆疊提供支援。
+ [Amazon EKS 控制平面](https://docs.aws.amazon.com/eks/latest/userguide/disaster-recovery-resiliency.html)跨多個可用區域執行，以確保高可用性。
+ 對於[自動擴展](https://docs.aws.amazon.com/eks/latest/userguide/autoscaling.html)，Amazon EKS 支援 Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler) 和 [Karpenter](https://karpenter.sh/)。

## 工具
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-tools"></a>

**AWS 服務**
+ [AWS 雲端開發套件 (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html) 是一種軟體開發架構，可協助您在程式碼中定義和佈建 AWS 雲端基礎設施。
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) 是一項全受管建置服務，可協助您編譯原始程式碼、執行單元測試，並產生準備好部署的成品。
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) 是一種版本控制服務，可協助您私下存放和管理 Git 儲存庫，而無需管理您自己的來源控制系統。
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) 可協助您快速建模和設定軟體版本的不同階段，並自動化持續發行軟體變更所需的步驟。
+ [Amazon Elastic Kubernetes Service (Amazon EKS)](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) 可協助您在 AWS 上執行 Kubernetes，而無需安裝或維護您自己的 Kubernetes 控制平面或節點。
+ [Amazon EC2 Auto Scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/what-is-amazon-ec2-auto-scaling.html) 可協助您維持應用程式的可用性，並可讓您根據您定義的條件自動新增或移除 Amazon EC2 執行個體。
+ [Amazon Simple Queue Service (Amazon SQS)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html) 提供安全、耐用且可用的託管佇列，可協助您整合和分離分散式軟體系統和元件。

**其他工具**
+ [kubectl](https://kubernetes.io/docs/reference/kubectl/kubectl/) 是針對 Kubernetes 叢集執行命令的 Kubernetes 命令列工具。您可以使用 kubectl 來部署應用程式、檢查和管理叢集資源，以及檢視日誌。

**Code**

此模式的程式碼可在 GitHub.com 的 [deploy-nth-to-eks](https://github.com/aws-samples/deploy-nth-to-eks) 儲存庫中取得。 GitHub.com. 程式碼儲存庫包含下列檔案和資料夾。
+ `nth folder` – 用於掃描和部署節點終止處理常式之 AWS CloudFormation 範本的 Helm Chart、值檔案和指令碼。
+ `config/config.json` – 應用程式的組態參數檔案。此檔案包含部署 CDK 所需的所有參數。
+ `cdk` – AWS CDK 原始碼。
+ `setup.sh` – 用來部署 AWS CDK 應用程式的指令碼，用來建立必要的 CI/CD 管道和其他必要的資源。
+ `uninstall.sh` – 用來清除資源的指令碼。

若要使用範例程式碼，請遵循 *Epics* 區段中的指示。

## 最佳實務
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-best-practices"></a>

如需自動化 AWS Node Termination Handler 時的最佳實務，請參閱下列各項：
+ [EKS 最佳實務指南](https://aws.github.io/aws-eks-best-practices/)
+ [節點終止處理常式 - 組態](https://github.com/aws/aws-node-termination-handler/tree/main/config/helm/aws-node-termination-handler)

## 史詩
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-epics"></a>

### 設定您的環境
<a name="set-up-your-environment"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 複製儲存庫。 | 若要使用 SSH （安全殼層） 複製儲存庫，請執行下列命令。<pre>git clone git@github.com:aws-samples/deploy-nth-to-eks.git</pre>若要使用 HTTPS 複製儲存庫，請執行下列命令。<pre>git clone https://github.com/aws-samples/deploy-nth-to-eks.git</pre>複製儲存庫會建立名為 的資料夾`deploy-nth-to-eks`。變更為該目錄。<pre>cd deploy-nth-to-eks</pre> | 應用程式開發人員、AWS DevOps、DevOps 工程師 | 
| 設定 kubeconfig 檔案。 | 在終端機中設定您的 AWS 登入資料，並確認您有權擔任叢集角色。您可以使用下列範例程式碼。<pre>aws eks update-kubeconfig --name <Cluster_Name> --region <region>--role-arn <Role_ARN></pre> | AWS DevOps、DevOps 工程師、應用程式開發人員 | 

### 部署 CI/CD 管道
<a name="deploy-the-ci-cd-pipeline"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定參數。 | 在 `config/config.json`檔案中，設定下列必要參數。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline.html) | 應用程式開發人員、AWS DevOps、DevOps 工程師 | 
| 建立 CI/CD 管道以部署 NTH。 | 執行 setup.sh 指令碼。<pre>./setup.sh</pre>指令碼將部署 AWS CDK 應用程式，該應用程式將根據`config/config.json`檔案中的使用者輸入參數，使用範例程式碼、管道和 CodeBuild 專案來建立 CodeCommit 儲存庫。此指令碼會在使用 sudo 命令安裝 npm 套件時要求密碼。 | 應用程式開發人員、AWS DevOps、DevOps 工程師 | 
| 檢閱 CI/CD 管道。 | 開啟 AWS 管理主控台，並檢閱在堆疊中建立的下列資源。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline.html)管道成功執行後，Helm Release `aws-node-termination-handler` 會安裝在 EKS 叢集中。此外，名為 的 Pod `aws-node-termination-handler` 正在叢集的`kube-system`命名空間中執行。 | 應用程式開發人員、AWS DevOps、DevOps 工程師 | 

### 測試 NTH 部署
<a name="test-nth-deployment"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 模擬 Auto Scaling 群組縮減事件。 | 若要模擬自動擴展縮減事件，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline.html) |  | 
| 檢閱日誌。 | 在縮減事件期間，NTH Pod 會封鎖並耗盡對應的工作者節點 （將在縮減事件中終止的 EC2 執行個體）。若要檢查日誌，請使用*其他資訊*區段中的程式碼。 | 應用程式開發人員、AWS DevOps、DevOps 工程師 | 

### 清除
<a name="clean-up"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 清除所有 AWS 資源。 | 若要清除此模式建立的資源，請執行下列命令。<pre>./uninstall.sh</pre>這將透過刪除 CloudFormation 堆疊來清除在此模式中建立的所有資源。 | DevOps 工程師 | 

## 疑難排解
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-troubleshooting"></a>


| 問題 | 解決方案 | 
| --- | --- | 
| npm 登錄檔設定不正確。 | 在此解決方案的安裝期間，指令碼會安裝 npm 安裝以下載所有必要的套件。如果在安裝期間，您看到一則訊息，指出「找不到模組」npm 登錄檔可能設定不正確。若要查看目前的登錄設定，請執行下列命令。<pre>npm config get registry</pre>若要使用 設定登錄檔`https://registry.npmjs.org/`，請執行下列命令。<pre>npm config set registry https://registry.npmjs.org</pre> | 
| 延遲 SQS 訊息傳遞。 | 在疑難排解過程中，如果您想要延遲 SQS 訊息交付至 NTH Pod，您可以調整 SQS 交付延遲參數。如需詳細資訊，請參閱 [Amazon SQS 延遲佇列](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-delay-queues.html)。 | 

## 相關資源
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-resources"></a>
+ [AWS 節點終止處理常式原始碼](https://github.com/aws/aws-node-termination-handler)
+ [EC2 研討會](https://ec2spotworkshops.com/using_ec2_spot_instances_with_eks/070_selfmanagednodegroupswithspot/deployhandler.html)
+ [AWS CodePipeline](https://aws.amazon.com/codepipeline/)
+ [Amazon Elastic Kubernetes Service (Amazon EKS)](https://aws.amazon.com/eks/)
+ [AWS 雲端開發套件](https://aws.amazon.com/cdk/)
+ [AWS CloudFormation](https://aws.amazon.com/cloudformation/)

## 其他資訊
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-additional"></a>

1. 尋找 NTH Pod 名稱。

```
kubectl get pods -n kube-system |grep aws-node-termination-handler
aws-node-termination-handler-65445555-kbqc7   1/1     Running   0          26m
kubectl get pods -n kube-system |grep aws-node-termination-handler
aws-node-termination-handler-65445555-kbqc7   1/1     Running   0          26m
```

2. 檢查日誌。範例日誌如下所示。它顯示節點已在傳送 Auto Scaling 群組生命週期掛鉤完成訊號之前封鎖並耗盡。

```
kubectl -n kube-system logs aws-node-termination-handler-65445555-kbqc7
022/07/17 20:20:43 INF Adding new event to the event store event={"AutoScalingGroupName":"eksctl-my-cluster-target-nodegroup-ng-10d99c89-NodeGroup-ZME36IGAP7O1","Description":"ASG Lifecycle Termination event received. Instance will be interrupted at 2022-07-17 20:20:42.702 +0000 UTC \n","EndTime":"0001-01-01T00:00:00Z","EventID":"asg-lifecycle-term-33383831316538382d353564362d343332362d613931352d383430666165636334333564","InProgress":false,"InstanceID":"i-0409f2a9d3085b80e","IsManaged":true,"Kind":"SQS_TERMINATE","NodeLabels":null,"NodeName":"ip-192-168-75-60.us-east-2.compute.internal","NodeProcessed":false,"Pods":null,"ProviderID":"aws:///us-east-2c/i-0409f2a9d3085b80e","StartTime":"2022-07-17T20:20:42.702Z","State":""}
2022/07/17 20:20:44 INF Requesting instance drain event-id=asg-lifecycle-term-33383831316538382d353564362d343332362d613931352d383430666165636334333564 instance-id=i-0409f2a9d3085b80e kind=SQS_TERMINATE node-name=ip-192-168-75-60.us-east-2.compute.internal provider-id=aws:///us-east-2c/i-0409f2a9d3085b80e
2022/07/17 20:20:44 INF Pods on node node_name=ip-192-168-75-60.us-east-2.compute.internal pod_names=["aws-node-qchsw","aws-node-termination-handler-65445555-kbqc7","kube-proxy-mz5x5"]
2022/07/17 20:20:44 INF Draining the node
2022/07/17 20:20:44 ??? WARNING: ignoring DaemonSet-managed Pods: kube-system/aws-node-qchsw, kube-system/kube-proxy-mz5x5
2022/07/17 20:20:44 INF Node successfully cordoned and drained node_name=ip-192-168-75-60.us-east-2.compute.internal reason="ASG Lifecycle Termination event received. Instance will be interrupted at 2022-07-17 20:20:42.702 +0000 UTC \n"
2022/07/17 20:20:44 INF Completed ASG Lifecycle Hook (NTH-K8S-TERM-HOOK) for instance i-0409f2a9d3085b80e
```

# 使用 CI/CD 管道自動建置 Java 應用程式並將其部署到 Amazon EKS
<a name="automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline"></a>

*MAHESH RAGHUNANDANAN、Jomcy Pappachen 和 Amazon Web Services 的 James Radtke*

## 總結
<a name="automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline-summary"></a>

此模式說明如何建立持續整合和持續交付 (CI/CD) 管道，以使用建議的 DevSecOps 實務自動建置和部署 Java 應用程式至 上的 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集 AWS 雲端。此模式使用使用 Spring Boot Java 架構開發並使用 Apache Maven 的問候語應用程式。

您可以使用此模式的方法來建置 Java 應用程式的程式碼、將應用程式成品封裝為 Docker 映像、安全性掃描映像，以及將映像上傳為 Amazon EKS 上的工作負載容器。如果您想要從緊密耦合的單體架構遷移到微服務架構，此模式的方法很有用。此方法也可協助您監控和管理 Java 應用程式的整個生命週期，確保更高層級的自動化，並協助避免錯誤。

## 先決條件和限制
<a name="automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline-prereqs"></a>

**先決條件**
+ 作用中 AWS 帳戶。
+ AWS Command Line Interface (AWS CLI) 第 2 版，已安裝並設定。如需詳細資訊，請參閱 AWS CLI 文件中的[安裝或更新至最新版本的 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)。

  AWS CLI 第 2 版必須使用建立 Amazon EKS 叢集的相同 AWS Identity and Access Management (IAM) 角色進行設定，因為只有該角色有權將其他 IAM 角色新增至 `aws-auth` `ConfigMap`。如需設定的資訊和步驟 AWS CLI，請參閱 AWS CLI 文件中的[設定設定](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html)。
+ 具有完整存取權的 IAM 角色和許可 AWS CloudFormation。如需詳細資訊，請參閱 CloudFormation 文件中的[使用 IAM 控制存取](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-iam-template.html)。
+ 現有的 Amazon EKS 叢集，其中包含 IAM 角色名稱的詳細資訊，以及 EKS 叢集中工作者節點的 IAM 角色 Amazon Resource Name (ARN)。
+ 在 Amazon EKS 叢集中安裝和設定 Kubernetes Cluster Autoscaler。如需詳細資訊，請參閱 Amazon EKS 文件中的[使用 Karpenter 和 Cluster Autoscaler 擴展叢集運算](https://docs.aws.amazon.com/eks/latest/userguide/cluster-autoscaler.html)。 
+ 存取 GitHub 儲存庫中的程式碼。

**重要**  
AWS Security Hub CSPM 會啟用 做為範本的一部分，這些 CloudFormation 範本包含在此模式的程式碼中。根據預設，Security Hub CSPM 啟用後，會隨附 30 天的免費試用。試用之後，會產生與此相關的成本 AWS 服務。如需定價的詳細資訊，請參閱 [AWS Security Hub CSPM 定價](https://aws.amazon.com/security-hub/pricing/)。

**產品版本**
+ Helm 3.4.2 版或更新版本
+ Apache Maven 3.6.3 版或更新版本
+ BridgeCrew Checkov 2.2 版或更新版本
+ Aqua Security Trivy 0.37 版或更新版本

## Architecture
<a name="automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline-architecture"></a>

**技術堆疊**
+ AWS CodeBuild
+ AWS CodeCommit
+ Amazon CodeGuru
+ AWS CodePipeline
+ Amazon Elastic Container Registry (Amazon ECR)
+ Amazon EKS
+ Amazon EventBridge
+ AWS Security Hub CSPM
+ Amazon Simple Notification Service (Amazon SNS)

**目標架構**

![\[將 Java 應用程式部署至 Amazon EKS 的工作流程。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/95a5b5c2-d7fb-41eb-9089-455318c0d585/images/4f5fd8c2-2b6d-4945-aa64-fcf317521711.png)


該圖顯示以下工作流程：

1. 開發人員會更新 CodeCommit 儲存庫基本分支中的 Java 應用程式程式碼，這會建立提取請求 (PR)。

1. 提交 PR 後，Amazon CodeGuru Reviewer 會自動檢閱程式碼、根據 Java 的最佳實務進行分析，並向開發人員提供建議。

1. 將 PR 合併至基本分支後，會建立 Amazon EventBridge 事件。

1. EventBridge 事件會啟動啟動的 CodePipeline 管道。

1. CodePipeline 執行 CodeSecurity Scan 階段 （持續安全性）。

1. AWS CodeBuild 會啟動安全掃描程序，其中使用 Checkov 掃描 Dockerfile 和 Kubernetes 部署 Helm 檔案，並根據增量程式碼變更掃描應用程式原始碼。應用程式原始碼掃描是由 [CodeGuru Reviewer Command Line Interface (CLI) 包裝函式](https://github.com/aws/aws-codeguru-cli)執行。
**注意**  
自 2025 年 11 月 7 日起，您無法在 Amazon CodeGuru Reviewer 中建立新的儲存庫關聯。若要了解具有類似 CodeGuru Reviewer 功能的服務，請參閱 [ CodeGuru Reviewer 文件中的 Amazon CodeGuru Reviewer 可用性變更](https://docs.aws.amazon.com/codeguru/latest/reviewer-ug/codeguru-reviewer-availability-change.html)。 CodeGuru 

1. 如果安全掃描階段成功，則會啟動建置階段 （持續整合）。

1. 在建置階段，CodeBuild 會建置成品、將成品封裝至 Docker 映像、使用 Aqua Security Trivy 掃描映像是否有安全漏洞，並將映像存放在 Amazon ECR 中。

1. 從步驟 8 偵測到的漏洞會上傳至 Security Hub CSPM，供開發人員或工程師進一步分析。Security Hub CSPM 提供修復漏洞的概觀和建議。

1. CodePipeline 管道中循序階段的電子郵件通知會透過 Amazon SNS 傳送。

1. 持續整合階段完成後，CodePipeline 會進入部署階段 （持續交付）。

1. Docker 映像會使用 Helm Chart 以容器工作負載 (Pod) 部署至 Amazon EKS。

1. 應用程式 Pod 是使用 Amazon CodeGuru Profiler 代理程式設定，會將應用程式的分析資料 (CPU、堆積用量和延遲） 傳送至 CodeGuru Profiler，協助開發人員了解應用程式的行為。

## 工具
<a name="automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline-tools"></a>

**AWS 服務**
+ [CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) 可協助您設定 AWS 資源、快速一致地佈建資源，以及在整個 AWS 帳戶 和 區域的生命週期中管理資源。
+  [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) 是一種全受管建置服務，可協助您編譯原始程式碼、執行單元測試，並產生準備好部署的成品。
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) 是一種版本控制服務，可協助您私下存放和管理 Git 儲存庫，而無需管理您自己的來源控制系統。
+ [Amazon CodeGuru Profiler](https://docs.aws.amazon.com/codeguru/latest/profiler-ug/what-is-codeguru-profiler.html) 會從即時應用程式收集執行時間效能資料，並提供可協助您微調應用程式效能的建議。
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) 可協助您快速建模和設定軟體版本的不同階段，並自動化持續發行軟體變更所需的步驟。
+ [Amazon Elastic Container Registry (Amazon ECR)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) 是一種受管容器映像登錄服務，安全、可擴展且可靠。
+ [Amazon Elastic Kubernetes Service (Amazon EKS)](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) 可協助您在 上執行 Kubernetes， AWS 而無需安裝或維護您自己的 Kubernetes 控制平面或節點。
+ [Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html) 是一種無伺服器事件匯流排服務，可協助您將應用程式與各種來源的即時資料連線，包括 AWS Lambda 函數、使用 API 目的地的 HTTP 呼叫端點，或其他事件匯流排 AWS 帳戶。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 透過控制已驗證並獲授權使用的人員，協助您安全地管理對 AWS 資源的存取。
+ [AWS Security Hub CSPM](https://docs.aws.amazon.com/securityhub/latest/userguide/what-is-securityhub.html) 提供安全狀態的完整檢視 AWS。它還可協助您根據安全產業標準和最佳實務來檢查 AWS 環境。
+ [Amazon Simple Notification Service (Amazon SNS)](https://docs.aws.amazon.com/sns/latest/dg/welcome.html) 可協助您協調和管理發佈者和用戶端之間的訊息交換，包括 Web 伺服器和電子郵件地址。
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) 是一種雲端型物件儲存服務，可協助您儲存、保護和擷取任何數量的資料。

**其他服務**
+ [Helm](https://helm.sh/docs/) 是 Kubernetes 的開放原始碼套件管理員。
+ [Apache Maven](https://maven.apache.org/) 是軟體專案管理和理解工具。
+ [BridgeCrew Checkov](https://www.checkov.io/1.Welcome/What%20is%20Checkov.html) 是一種靜態程式碼分析工具，可將基礎設施掃描為程式碼 (IaC) 檔案，以找出可能導致安全或合規問題的錯誤組態。
+ [Aqua Security Trivy](https://github.com/aquasecurity/trivy) 是全方位的掃描器，除了組態問題之外，還可找出容器映像、檔案系統和 Git 儲存庫中的漏洞。

**Code**

此模式的程式碼可在 GitHub [aws-codepipeline-devsecops-amazoneks](https://github.com/aws-samples/aws-codepipeline-devsecops-amazoneks) 儲存庫中使用。

## 最佳實務
<a name="automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline-best-practices"></a>
+ 此模式遵循 [IAM 安全最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)，以在解決方案的所有階段套用 IAM 實體的最低權限原則。如果您想要使用其他 AWS 服務 或第三方工具擴展解決方案，建議您檢閱在 IAM 文件中[套用最低權限許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)的章節。
+ 如果您有多個 Java 應用程式，建議您為每個應用程式建立個別的 CI/CD 管道。
+ 如果您有整體應用程式，我們建議您盡可能將應用程式分成微型服務。微服務更具彈性，可讓您更輕鬆地將應用程式部署為容器，而且可讓您更清楚地了解應用程式的整體建置和部署。

## 史詩
<a name="automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline-epics"></a>

### 設定環境
<a name="set-up-the-environment"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 複製 GitHub 儲存庫。 | 若要複製儲存庫，請執行下列命令。<pre>git clone https://github.com/aws-samples/aws-codepipeline-devsecops-amazoneks</pre> | 應用程式開發人員、DevOps 工程師 | 
| 建立 S3 儲存貯體並上傳程式碼。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline.html) | AWS DevOps、雲端管理員、DevOps 工程師 | 
| 建立 CloudFormation 堆疊。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline.html) | AWS DevOps，DevOps 工程師 | 
| 驗證 CloudFormation 堆疊部署。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline.html) | AWS DevOps，DevOps 工程師 | 
| 刪除 S3 儲存貯體。 | 清空並刪除您先前建立的 S3 儲存貯體。如需詳細資訊，請參閱 Amazon S3 文件中的[刪除儲存貯](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-bucket.html)體。 | AWS DevOps，DevOps 工程師 | 

### 設定 Helm Chart
<a name="configure-the-helm-charts"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定 Java 應用程式的 Helm Chart。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline.html) | DevOps 工程師 | 
| 驗證 Helm Chart 是否有語法錯誤。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline.html) | DevOps 工程師 | 

### 設定 Java CI/CD 管道
<a name="set-up-the-java-ci-cd-pipeline"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 CI/CD 管道。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline.html) | AWS DevOps | 

### 啟用 Security Hub CSPM 和 Aqua Security 之間的整合
<a name="activate-integration-between-ash-and-aqua-security"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 開啟 Aqua Security 整合。 | 將 Trivy 報告的 Docker 映像漏洞調查結果上傳到 Security Hub CSPM 時需要此步驟。由於 CloudFormation 不支援 Security Hub CSPM 整合，此程序必須手動完成。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline.html) | AWS 管理員、DevOps 工程師 | 

### 設定 CodeBuild 以執行 Helm 或 kubectl 命令
<a name="configure-acb-to-run-helm-or-kubectl-commands"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 允許 CodeBuild 在 Amazon EKS 叢集中執行 Helm 或 kubectl 命令。 | 若要讓 CodeBuild 進行身分驗證以搭配 Amazon EKS 叢集使用 Helm 或`kubectl`命令，您必須將 IAM 角色新增至 `aws-auth` `ConfigMap`。在此情況下，請新增 IAM 角色 的 ARN`EksCodeBuildkubeRoleARN`，這是為 CodeBuild 服務建立的 IAM 角色，以存取 Amazon EKS 叢集並在其中部署工作負載。這是一次性的活動。下列程序必須在 CodePipeline 中的部署核准階段之前完成。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline.html)`aws_auth` `ConfigMap` 已設定 ，並授予存取權。 | DevOps | 

### 驗證 CI/CD 管道
<a name="validate-the-ci-cd-pipeline"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 確認 CI/CD 管道會自動啟動。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline.html)如需使用 CodePipeline 啟動管道的詳細資訊，請參閱 CodePipeline 文件中的在 CodePipeline [中啟動管道](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-about-starting.html)、[手動啟動管道](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-rerun-manually.html)，以及[依排程啟動管道](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-trigger-source-schedule.html)。 CodePipeline  | DevOps | 
| 核准部署。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline.html) | DevOps | 
| 驗證應用程式分析。 | 部署完成且應用程式 Pod 部署在 Amazon EKS 之後，在應用程式中設定的 Amazon CodeGuru Profiler 代理程式會嘗試將應用程式的分析資料 (CPU、堆積摘要、延遲和瓶頸） 傳送至 CodeGuru Profiler。對於應用程式的初始部署，CodeGuru Profiler 大約需要 15 分鐘才能視覺化分析資料。 | AWS DevOps | 

## 相關資源
<a name="automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline-resources"></a>
+ [AWS CodePipeline 文件](https://docs.aws.amazon.com/codepipeline/index.html)
+ [在 中使用 Trivy 掃描影像 AWS CodePipeline](https://aws.amazon.com/blogs/containers/scanning-images-with-trivy-in-an-aws-codepipeline/)(AWS 部落格文章）
+ [使用 Amazon CodeGuru Profiler 改善 Java 應用程式](https://aws.amazon.com/blogs/devops/improving-your-java-applications-using-amazon-codeguru-profiler) (AWS 部落格文章）
+ [AWS 安全調查結果格式 (ASFF) 語法](https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-findings-format-syntax.html)
+ [Amazon EventBridge 事件模式](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-patterns.html)
+ [Helm 升級](https://helm.sh/docs/helm/helm_upgrade/)

## 其他資訊
<a name="automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline-additional"></a>
+ CodeGuru Profiler 在功能 AWS X-Ray 方面不應與服務混淆。我們建議您使用 CodeGuru Profiler 來識別可能導致瓶頸或安全問題的最昂貴程式碼行，並在它們成為潛在風險之前對其進行修正。X-Ray 服務用於應用程式效能監控。
+ 在此模式中，事件規則會與預設事件匯流排相關聯。如有需要，您可以擴展模式以使用自訂事件匯流排。
+ 此模式使用 CodeGuru Reviewer 作為應用程式碼的靜態應用程式安全測試 (SAST) 工具。您也可以將此管道用於其他工具，例如 SonarQube 或 Checkmarx。您可以將任何這些工具的掃描設定指示新增至 ，`buildspec/buildspec_secscan.yaml`以取代 CodeGuru 掃描指示。
**注意**  
自 2025 年 11 月 7 日起，您無法在 Amazon CodeGuru Reviewer 中建立新的儲存庫關聯。若要了解具有類似 CodeGuru Reviewer 功能的服務，請參閱 [ CodeGuru Reviewer 文件中的 Amazon CodeGuru Reviewer 可用性變更](https://docs.aws.amazon.com/codeguru/latest/reviewer-ug/codeguru-reviewer-availability-change.html)。 CodeGuru 

# 跨 AWS 帳戶 和 複製 Amazon ECR 容器映像 AWS 區域
<a name="copy-ecr-container-images-across-accounts-regions"></a>

*Faisal Shahdad，Amazon Web Services*

## 總結
<a name="copy-ecr-container-images-across-accounts-regions-summary"></a>

此模式說明如何使用無伺服器方法，將現有 Amazon Elastic Container Registry (Amazon ECR) 儲存庫中的標記影像複寫至其他 AWS 帳戶 和 AWS 區域。解決方案使用 AWS Step Functions 來管理複寫工作流程，並使用 AWS Lambda 函數來複製大型容器映像。

Amazon ECR 使用原生[跨區域](https://docs.aws.amazon.com/AmazonECR/latest/userguide/registry-settings-examples.html#registry-settings-examples-crr-single)和[跨帳戶](https://docs.aws.amazon.com/AmazonECR/latest/userguide/registry-settings-examples.html#registry-settings-examples-crossaccount)複寫功能，跨區域和帳戶複寫容器映像。但這些功能只會從開啟複寫的那一刻開始複寫映像。沒有可在不同區域和帳戶中複寫現有映像的機制。

此模式可協助人工智慧 (AI) 團隊將容器化機器學習 (ML) 模型、架構 （例如 PyTorch、TensorFlow 和 Hugging Face) 和相依性分發給其他帳戶和區域。這可協助您克服服務限制並最佳化 GPU 運算資源。您也可以選擇性地從特定來源帳戶和區域複寫 Amazon ECR 儲存庫。如需詳細資訊，請參閱 [Amazon ECR 中的跨區域複寫已登陸](https://aws.amazon.com/blogs/containers/cross-region-replication-in-amazon-ecr-has-landed/)。

## 先決條件和限制
<a name="copy-ecr-container-images-across-accounts-regions-prereqs"></a>

**先決條件**
+ 兩個或多個作用中 AWS 帳戶 （一個來源帳戶和一個目的地帳戶，至少）
+ 所有帳戶中的適當 AWS Identity and Access Management (IAM) 許可
+ 用於建置 Lambda 容器映像的 Docker
+ AWS Command Line Interface 為所有帳戶設定的 (AWS CLI)

**限制**
+ **未標記的映像排除 –** 解決方案只會複製具有明確標籤的容器映像。它會略過與`SHA256`摘要一起存在的未標記影像。
+ **Lambda 執行逾時限制 –** AWS Lambda 限制為最長 15 分鐘的執行逾時，這可能不足以複製大型容器映像或儲存庫。
+ **手動容器映像管理 –** `crane-app.py` Python 程式碼需要重建和重新部署 Lambda 容器映像。
+ **有限的平行處理容量 –** `MaxConcurrency` 狀態設定會限制您可以同時複製的儲存庫數量。不過，您可以在來源帳戶的 AWS CloudFormation 範本中修改此設定。請注意，較高的並行值可能會導致您超過服務速率限制和帳戶層級的 Lambda 執行配額。

## Architecture
<a name="copy-ecr-container-images-across-accounts-regions-architecture"></a>

**目標堆疊**

模式有四個主要元件：
+ **來源帳戶基礎設施 –** 建立協同運作元件的 CloudFormation 範本
+ **目的地帳戶基礎設施 –** 建立跨帳戶存取角色的 CloudFormation 範本
+ **Lambda 函數 –** 使用 Crane 進行高效率映像複製的 Python 函數
+ **容器映像 –** 使用必要工具封裝 Lambda 函數的 Docker 容器

**目標架構**

![\[alt text not found\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/787185e7-664b-4ed8-b30f-1d9507f13377/images/cc7d9823-3dc8-4090-a203-910b1ac4447c.png)


**Step Functions 工作流程**

Step Functions 狀態機器會協調下列項目，如下圖所示：
+ `PopulateRepositoryList`** –** 掃描 Amazon ECR 儲存庫並填入 Amazon DynamoDB
+ `GetRepositoryList`** –** 從 DynamoDB 擷取唯一儲存庫清單
+ `DeduplicateRepositories`** –** 確保沒有重複的處理
+ `CopyRepositories`** –** 處理儲存庫的平行複製
+ `NotifySuccess`/`NotifyFailure`** –** 根據執行結果的 Amazon Simple Notification Service (Amazon SNS) 通知

![\[alt text not found\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/787185e7-664b-4ed8-b30f-1d9507f13377/images/1b740084-ba2b-4956-aa12-ebbf52be5e7d.png)


## 工具
<a name="copy-ecr-container-images-across-accounts-regions-tools"></a>

**Amazon 工具**
+ [Amazon CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html) 可協助您 AWS 即時監控 AWS 資源的指標，以及您在 上執行的應用程式。
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) 是一項全受管 NoSQL 資料庫服務，可提供快速、可預期且可擴展的效能。
+ [Amazon Simple Notification Service (Amazon SNS)](https://docs.aws.amazon.com/sns/latest/dg/welcome.html) 可協助您協調和管理發佈者和用戶端之間的訊息交換，包括 Web 伺服器和電子郵件地址。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 透過控制已驗證並獲授權使用的人員，協助您安全地管理對 AWS 資源的存取。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一項運算服務，可協助您執行程式碼，無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展，因此您只需按使用的運算時間付費。
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html) 是一種無伺服器協同運作服務，可協助您結合 Lambda 函數和其他 AWS 服務 來建置業務關鍵應用程式。

**其他工具**
+ [Crane](https://michaelsauter.github.io/crane/index.html) 是 Docker 協同運作工具。它類似於 Docker Compose，但有其他功能。
+ [Docker](https://www.docker.com/) 是一組平台即服務 (PaaS) 產品，可在作業系統層級使用虛擬化在容器中交付軟體。

**程式碼儲存庫**
+ 此模式的程式碼可在 GitHub [sample-ecr-copy 儲存庫](https://github.com/aws-samples/sample-ecr-copy)中使用。您可以從儲存庫使用 CloudFormation 範本來建立基礎資源。

## 最佳實務
<a name="copy-ecr-container-images-across-accounts-regions-best-practices"></a>

遵循最低權限原則，並授予執行任務所需的最低許可。如需詳細資訊，請參閱 IAM 文件中的[授予最低權限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#grant-least-priv)和[安全最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

## 史詩
<a name="copy-ecr-container-images-across-accounts-regions-epics"></a>

### 準備您的環境
<a name="prepare-your-environment"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定 AWS CLI 設定檔。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/copy-ecr-container-images-across-accounts-regions.html) | DevOps 工程師、資料工程師、ML 工程師 | 
| 收集必要資訊。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/copy-ecr-container-images-across-accounts-regions.html) | DevOps 工程師、資料工程師、ML 工程師 | 
| 複製儲存庫。 | 將模式的儲存庫複製到本機工作站：<pre>git clone https://github.com/aws-samples/sample-ecr-copy</pre> | DevOps 工程師、資料工程師、ML 工程師 | 

### 部署目的地帳戶的基礎設施
<a name="deploy-infrastructure-for-the-destination-account"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 驗證範本。 | 驗證 CloudFormation 範本：<pre>aws cloudformation validate-template \<br />  --template-body file://"Destination Account cf_template.yml" \<br />  --profile destination-account</pre> | DevOps 工程師、ML 工程師、資料工程師 | 
| 部署目的地基礎設施。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/copy-ecr-container-images-across-accounts-regions.html) | 資料工程師、ML 工程師、DevOps 工程師 | 
| 驗證部署。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/copy-ecr-container-images-across-accounts-regions.html) | DevOps 工程師、ML 工程師、資料工程師 | 

### 建置和部署 Lambda 容器映像
<a name="build-and-deploy-the-lam-container-image"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 準備容器建置。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/copy-ecr-container-images-across-accounts-regions.html) | 資料工程師、ML 工程師、DevOps 工程師 | 
| 建置容器映像。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/copy-ecr-container-images-across-accounts-regions.html) | 資料工程師、ML 工程師、DevOps 工程師 | 
| 建立儲存庫並上傳映像。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/copy-ecr-container-images-across-accounts-regions.html) | 資料工程師、ML 工程師、DevOps 工程師 | 
| 驗證映像。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/copy-ecr-container-images-across-accounts-regions.html) | 資料工程師、ML 工程師、DevOps 工程師 | 

### 部署來源帳戶基礎設施
<a name="deploy-the-source-account-infrastructure"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 準備部署參數。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/copy-ecr-container-images-across-accounts-regions.html) | 資料工程師、DevOps 工程師、ML 工程師 | 
| 驗證來源範本。 | 驗證來源 CloudFormation 範本：<pre>aws cloudformation validate-template \<br />  --template-body file://"Source Account Cf template.yml" \<br />  --profile source-account</pre> | 資料工程師、ML 工程師、DevOps 工程師 | 
| 部署來源基礎設施。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/copy-ecr-container-images-across-accounts-regions.html) | 資料工程師、ML 工程師、DevOps 工程師 | 
| 驗證部署並收集輸出。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/copy-ecr-container-images-across-accounts-regions.html) | DevOps 工程師、ML 工程師、資料工程師 | 
| 確認您的電子郵件訂閱。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/copy-ecr-container-images-across-accounts-regions.html) | 資料工程師、ML 工程師、DevOps 工程師 | 

### 執行和監控複製程序
<a name="run-and-monitor-the-copy-process"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 執行並監控複製程序。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/copy-ecr-container-images-across-accounts-regions.html) | DevOps 工程師、ML 工程師、資料工程師 | 
| 執行步驟函數。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/copy-ecr-container-images-across-accounts-regions.html) | DevOps 工程師、ML 工程師、資料工程師 | 
| 監控進度。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/copy-ecr-container-images-across-accounts-regions.html) | DevOps 工程師、ML 工程師、資料工程師 | 
| 檢查結果。 | 等待程序完成 （每 30 秒更新一次）：<pre>while true; do<br />  STATUS=$(aws stepfunctions describe-execution \<br />    --execution-arn $EXECUTION_ARN \<br />    --profile source-account \<br />    --region $SOURCE_REGION \<br />    --query 'status' \<br />    --output text)<br />  <br />  echo "Current status: $STATUS"<br />  <br />  if [[ "$STATUS" == "SUCCEEDED" || "$STATUS" == "FAILED" || "$STATUS" == "TIMED_OUT" || "$STATUS" == "ABORTED" ]]; then<br />    break<br />  fi<br />  <br />  sleep 30<br />done<br /><br />echo "Final execution status: $STATUS"</pre> | DevOps 工程師、ML 工程師、資料工程師 | 
| 驗證映像。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/copy-ecr-container-images-across-accounts-regions.html) | DevOps 工程師、資料工程師、ML 工程師 | 

## 疑難排解
<a name="copy-ecr-container-images-across-accounts-regions-troubleshooting"></a>


| 問題 | 解決方案 | 
| --- | --- | 
| 步驟函數無法執行。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/copy-ecr-container-images-across-accounts-regions.html) | 

## 相關資源
<a name="copy-ecr-container-images-across-accounts-regions-resources"></a>
+ [Crane 文件](https://github.com/google/go-containerregistry/blob/main/cmd/crane/doc/crane.md)
+ [什麼是 Amazon Elastic Container Registry？](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html)
+ [什麼是 AWS Lambda？](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)
+ [什麼是 Step Functions？](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html)

## 其他資訊
<a name="copy-ecr-container-images-across-accounts-regions-additional"></a>

**組態參數**


| 
| 
| 參數 | 描述 | 範例 | 
| --- |--- |--- |
| `SourceAccountId` | 來源 AWS 帳戶 ID | `11111111111` | 
| `DestinationAccountId` | 目的地 AWS 帳戶 ID | `22222222222` | 
| `DestinationRegion` | 目標 AWS 區域 | `us-east-2` | 
| `SourceRegion` | 來源 AWS 區域 | `us-east-1` | 
| `NotificationEmail` | 通知的電子郵件 | `abc@xyz.com` | 
| `RepositoryList` | 要複製的儲存庫 | `repo1,repo2,repo3` | 
| `LambdaImageUri` | Lambda 容器映像 URI | `${ACCOUNT}.dkr.ecr.${REGION}.amazonaws.com/ecr-copy-lambda:latest` | 

# 使用 Amazon EFS 在 EC2 執行個體上建立 Amazon ECS 任務定義並掛載檔案系統
<a name="create-an-amazon-ecs-task-definition-and-mount-a-file-system-on-ec2-instances-using-amazon-efs"></a>

*Durga Prasad Cheepuri，Amazon Web Services*

## 總結
<a name="create-an-amazon-ecs-task-definition-and-mount-a-file-system-on-ec2-instances-using-amazon-efs-summary"></a>

此模式提供程式碼範例和步驟，以建立在 Amazon Web Services (AWS) Cloud 中 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體上執行的 Amazon Elastic Container Service (Amazon ECS) 任務定義，同時使用 Amazon Elastic File System (Amazon EFS) 在這些 EC2 執行個體上掛載檔案系統。使用 Amazon EFS 的 Amazon ECS 任務會自動掛載您在任務定義中指定的檔案系統，並將這些檔案系統提供給 AWS 區域中所有可用區域中的任務容器。

為了滿足您的持久性儲存和共用儲存需求，您可以同時使用 Amazon ECS 和 Amazon EFS。例如，您可以使用 Amazon EFS，透過在不同可用區域中執行的作用中和待命 ECS 容器對來存放應用程式的持久性使用者資料和應用程式資料，以獲得高可用性。您也可以使用 Amazon EFS 來存放共用資料，以供 ECS 容器和分散式任務工作負載平行存取。

若要將 Amazon EFS 與 Amazon ECS 搭配使用，您可以將一或多個磁碟區定義新增至任務定義。磁碟區定義包含 Amazon EFS 檔案系統 ID、存取點 ID，以及傳輸中 AWS Identity and Access Management (IAM) 授權或 Transport Layer Security (TLS) 加密的組態。您可以使用任務定義中的容器定義來指定在容器執行時掛載的任務定義磁碟區。當使用 Amazon EFS 檔案系統的任務執行時，Amazon ECS 會確保檔案系統已掛載，並可供需要存取的容器使用。

## 先決條件和限制
<a name="create-an-amazon-ecs-task-definition-and-mount-a-file-system-on-ec2-instances-using-amazon-efs-prereqs"></a>

**先決條件**
+ 作用中的 AWS 帳戶
+ 具有虛擬私有網路 (VPN) 端點或路由器的虛擬私有雲端 (VPC)
+ （建議） [Amazon ECS 容器代理程式 1.38.0 或更新版本](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-versions.html)，以與 Amazon EFS 存取點和 IAM 授權功能相容 （如需詳細資訊，請參閱 AWS 部落格文章 [New for Amazon EFS – IAM Authorization and Access Points](https://aws.amazon.com/blogs/aws/new-for-amazon-efs-iam-authorization-and-access-points/)。)

**限制**
+ 1.35.0 之前的 Amazon ECS 容器代理程式版本不支援使用 EC2 啟動類型的任務使用 Amazon EFS 檔案系統。

## Architecture
<a name="create-an-amazon-ecs-task-definition-and-mount-a-file-system-on-ec2-instances-using-amazon-efs-architecture"></a>

下圖顯示使用 Amazon ECS 在 ECS 容器中的 EC2 執行個體上建立任務定義和掛載 Amazon EFS 檔案系統的應用程式範例。

![\[Amazon ECS architecture with task definition, ECS service, containers, and EFS file system integration.\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/090a3f03-a4c6-47e3-b1ae-b0eb5c5b269c/images/343e0f1d-44ee-4ec2-8392-aeddc0e48b83.png)


該圖顯示以下工作流程：

1. 建立 Amazon EFS 檔案系統。

1. 使用容器建立任務定義。

1. 設定容器執行個體以掛載 Amazon EFS 檔案系統。任務定義參考磁碟區掛載，因此容器執行個體可以使用 Amazon EFS 檔案系統。ECS 任務可存取相同的 Amazon EFS 檔案系統，無論這些任務是在哪個容器執行個體上建立。

1. 使用任務定義的三個執行個體建立 Amazon ECS 服務。

**技術堆疊**
+ Amazon EC2
+ Amazon ECS
+ Amazon EFS

## 工具
<a name="create-an-amazon-ecs-task-definition-and-mount-a-file-system-on-ec2-instances-using-amazon-efs-tools"></a>
+ [Amazon EC2](https://docs.aws.amazon.com/ec2/?id=docs_gateway) – Amazon Elastic Compute Cloud (Amazon EC2) 在 AWS 雲端中提供可擴展的運算容量。您可以使用 Amazon EC2 視需要啟動任意數量或任意數量的虛擬伺服器，也可以向外擴展或向內擴展。
+ [Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html) – Amazon Elastic Container Service (Amazon ECS) 是一種高度可擴展的快速容器管理服務，用於執行、停止和管理叢集上的容器。您可以在 AWS Fargate 管理的無伺服器基礎設施上執行任務和服務。或者，若要進一步控制您的基礎設施，您可以在您管理的 EC2 執行個體叢集上執行任務和服務。
+ [Amazon EFS](https://docs.aws.amazon.com/efs/latest/ug/whatisefs.html) – Amazon Elastic File System (Amazon EFS) 提供簡單、可擴展、全受管的彈性 NFS 檔案系統，可與 AWS 雲端服務和內部部署資源搭配使用。
+ [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) – AWS 命令列界面 (AWS CLI) 是一種開放原始碼工具，可透過命令列 shell 中的命令與 AWS 服務互動。透過最少的組態，您可以從命令提示中執行 AWS CLI 命令，該命令會實作相當於瀏覽器型 AWS 管理主控台所提供功能的功能。

## 史詩
<a name="create-an-amazon-ecs-task-definition-and-mount-a-file-system-on-ec2-instances-using-amazon-efs-epics"></a>

### 建立 Amazon EFS 檔案系統
<a name="create-an-amazon-efs-file-system"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 使用 AWS 管理主控台建立 Amazon EFS 檔案系統。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-an-amazon-ecs-task-definition-and-mount-a-file-system-on-ec2-instances-using-amazon-efs.html) | AWS DevOps | 

### 使用 Amazon EFS 檔案系統或 AWS CLI 建立 Amazon ECS 任務定義
<a name="create-an-amazon-ecs-task-definition-by-using-either-an-amazon-efs-file-system-or-the-aws-cli"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 使用 Amazon EFS 檔案系統建立任務定義。 | 使用以下組態，使用[新的 Amazon ECS 主控台](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-task-definition.html)或[傳統 Amazon ECS 主控台](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-task-definition-classic.html)建立任務定義：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-an-amazon-ecs-task-definition-and-mount-a-file-system-on-ec2-instances-using-amazon-efs.html) | AWS DevOps | 
| 使用 AWS CLI 建立任務定義。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-an-amazon-ecs-task-definition-and-mount-a-file-system-on-ec2-instances-using-amazon-efs.html) | AWS DevOps | 

## 相關資源
<a name="create-an-amazon-ecs-task-definition-and-mount-a-file-system-on-ec2-instances-using-amazon-efs-resources"></a>
+ [Amazon ECS 任務定義](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definitions.html)
+ [Amazon EFS 磁碟區](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/efs-volumes.html)

## 附件
<a name="attachments-090a3f03-a4c6-47e3-b1ae-b0eb5c5b269c"></a>

若要存取與本文件相關聯的其他內容，請解壓縮下列檔案： [attachment.zip](samples/p-attach/090a3f03-a4c6-47e3-b1ae-b0eb5c5b269c/attachments/attachment.zip)

# 使用容器映像部署 Lambda 函數
<a name="deploy-lambda-functions-with-container-images"></a>

*Ram Kandaswamy，Amazon Web Services*

## 總結
<a name="deploy-lambda-functions-with-container-images-summary"></a>

AWS Lambda 支援容器映像做為部署模型。此模式說明如何透過容器映像部署 Lambda 函數。 

Lambda 是一種無伺服器、事件驅動的運算服務，您可以用來為幾乎任何類型的應用程式或後端服務執行程式碼，而無需佈建或管理伺服器。透過 Lambda 函數的容器映像支援，您可以為應用程式成品獲得高達 10 GB 的儲存空間，以及使用熟悉的容器映像開發工具的能力。

此模式中的範例使用 Python 做為基礎程式設計語言，但您可以使用其他語言，例如 Java、Node.js 或 Go。對於來源，請考慮 Git 型系統，例如 GitHub、GitLab 或 Bitbucket，或使用 Amazon Simple Storage Service (Amazon S3)。

## 先決條件和限制
<a name="deploy-lambda-functions-with-container-images-prereqs"></a>

**先決條件**
+ 已啟用 Amazon Elastic Container Registry (Amazon ECR)
+ 應用程式碼
+ 具有執行時間介面用戶端和最新版本 Python 的 Docker 映像
+ Git 的工作知識

**限制**
+ 支援的影像大小上限為 10 GB。
+ Lambda 型容器部署的執行時間上限為 15 分鐘。

## Architecture
<a name="deploy-lambda-functions-with-container-images-architecture"></a>

**目標架構**

![\[建立 Lambda 函數的四步驟程序。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/e421cc58-d33e-493d-b0bb-c3ffe39c2eb9/images/7f36d3d8-d161-497a-b036-26d886a16c69.png)


 

1. 您可以建立 Git 儲存庫，並將應用程式程式碼遞交至儲存庫。

1.  AWS CodeBuild 專案由遞交變更觸發。

1. CodeBuild 專案會建立 Docker 映像，並將建置的映像發佈至 Amazon ECR。

1. 您可以使用 Amazon ECR 中的映像建立 Lambda 函數。

**自動化和擴展**

此模式可以透過使用 SDK 中的 AWS CloudFormation AWS Cloud Development Kit (AWS CDK)或 API 操作來自動化。Lambda 可以根據請求數量自動擴展，您可以使用並行參數進行調整。如需詳細資訊，請參閱 [Lambda 文件](https://docs.aws.amazon.com/lambda/latest/dg/lambda-concurrency.html)。

## 工具
<a name="deploy-lambda-functions-with-container-images-tools"></a>

**AWS 服務**
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) AWS CloudFormationhelps設定 AWS 資源、快速且一致地佈建資源，以及在整個 AWS 帳戶 和 生命週期進行管理 AWS 區域。此模式使用 [AWS CloudFormation Application Composer](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/app-composer-for-cloudformation.html)，可協助您以視覺化方式檢視和編輯 CloudFormation 範本。
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) 是一種全受管建置服務，可協助您編譯原始程式碼、執行單元測試，並產生準備好部署的成品。
+ [Amazon Elastic Container Registry (Amazon ECR)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) 是一種受管容器映像登錄服務，安全、可擴展且可靠。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一項運算服務，可協助您執行程式碼，無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展，因此您只需支付使用的運算時間。

**其他工具**
+ [Docker](https://www.docker.com/) 是一組平台即服務 (PaaS) 產品，可在作業系統層級使用虛擬化在容器中交付軟體。
+ [GitHub](https://docs.github.com/en/repositories/creating-and-managing-repositories/quickstart-for-repositories)、[GitLab](https://docs.gitlab.com/ee/user/get_started/get_started_projects.html) 和 [Bitbucket](https://support.atlassian.com/bitbucket-cloud/docs/tutorial-learn-bitbucket-with-git/) 是一些常用的 Git 型來源控制系統，用於追蹤來源碼變更。

## 最佳實務
<a name="deploy-lambda-functions-with-container-images-best-practices"></a>
+ 讓您的函數盡可能有效率且小，以避免載入不必要的檔案。
+ 努力在 Docker 檔案清單中提高靜態層，並放置更頻繁地降低變更的層。這可改善快取，進而改善效能。
+ 映像擁有者負責更新和修補映像。將更新節奏新增至您的操作程序。如需詳細資訊，請參閱 [AWS Lambda 文件](https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html#function-code)。

## 史詩
<a name="deploy-lambda-functions-with-container-images-epics"></a>

### 在 CodeBuild 中建立專案
<a name="create-a-project-in-codebuild"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 Git 儲存庫。 | 建立包含應用程式原始碼、Dockerfile 和 `buildspec.yaml` 檔案的 Git 儲存庫。 | 開發人員 | 
| 建立 CodeBuild 專案。 | 若要使用 CodeBuild 專案建立自訂 Lambda 映像，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-lambda-functions-with-container-images.html) | 開發人員 | 
| 編輯 Dockerfile。 | Dockerfile 應位於您要開發應用程式的頂層目錄中。Python 程式碼應該位於 `src` 資料夾中。當您建立映像時，請使用[官方的 Lambda 支援映像](https://gallery.ecr.aws/lambda?page=1)。否則會發生引導錯誤，使封裝程序更困難。如需詳細資訊，請參閱[其他資訊](#deploy-lambda-functions-with-container-images-additional)一節。 | 開發人員 | 
| 在 Amazon ECR 中建立儲存庫。 | 在 Amazon ECR 中建立容器儲存庫。在下列範例命令中，建立的儲存庫名稱為 `cf-demo`：<pre>aws ecr create-repository --cf-demo </pre>儲存庫將在 `buildspec.yaml` 檔案中參考。 | AWS 管理員、開發人員 | 
| 將映像推送至 Amazon ECR。 | 您可以使用 CodeBuild 來執行映像建置程序。CodeBuild 需要與 Amazon ECR 互動和使用 S3 的許可。在此程序中，會建置 Docker 映像並推送至 Amazon ECR 登錄檔。如需範本和程式碼的詳細資訊，請參閱[其他資訊](#deploy-lambda-functions-with-container-images-additional)一節。 | 開發人員 | 
| 確認映像位於儲存庫中。 | 若要驗證映像是否在儲存庫中，請在 Amazon ECR 主控台上選擇**儲存庫**。如果已在 Amazon ECR 設定中開啟該功能，則應使用標籤和漏洞掃描報告的結果列出映像。 如需詳細資訊，請參閱 [AWS 文件](https://docs.aws.amazon.com/cli/latest/reference/ecr/put-registry-scanning-configuration.html)。 | 開發人員 | 

### 建立 Lambda 函數以執行映像
<a name="create-the-lambda-function-to-run-the-image"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 Lambda 函數。 | 在 Lambda 主控台上，選擇**建立函數**，然後選擇**容器映像**。輸入 Amazon ECR 儲存庫中映像的函數名稱和 URI，然後選擇**建立函數**。如需詳細資訊，請參閱 [AWS Lambda 文件](https://docs.aws.amazon.com/lambda/latest/dg/API_CreateFunction.html)。 | 應用程式開發人員 | 
| 測試 Lambda 函數。 | 若要叫用和測試函數，請選擇**測試**。如需詳細資訊，請參閱 [AWS Lambda 文件](https://docs.aws.amazon.com/lambda/latest/dg/testing-functions.html)。 | 應用程式開發人員 | 

## 疑難排解
<a name="deploy-lambda-functions-with-container-images-troubleshooting"></a>


| 問題 | 解決方案 | 
| --- | --- | 
| 組建未成功。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-lambda-functions-with-container-images.html) | 

## 相關資源
<a name="deploy-lambda-functions-with-container-images-resources"></a>
+ [Lambda 的基礎映像](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-images.html)
+ [CodeBuild 的 Docker 範例](https://docs.aws.amazon.com/codebuild/latest/userguide/sample-docker.html)
+ [傳遞臨時登入資料](https://aws.amazon.com/premiumsupport/knowledge-center/codebuild-temporary-credentials-docker/)

## 其他資訊
<a name="deploy-lambda-functions-with-container-images-additional"></a>

**編輯 Dockerfile**

下列程式碼顯示您在 Dockerfile 中編輯的命令：

```
FROM public.ecr.aws/lambda/python:3.xx

# Copy function code
COPY app.py ${LAMBDA_TASK_ROOT} 
COPY requirements.txt  ${LAMBDA_TASK_ROOT} 

# install dependencies
RUN pip3 install --user -r requirements.txt

# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "app.lambda_handler" ]
```

在 `FROM`命令中，針對 Lambda 支援的 Python 版本使用適當的值 （例如，`3.12`)。這將是公有 Amazon ECR 映像儲存庫中可用的基礎映像。 

`COPY app.py ${LAMBDA_TASK_ROOT}` 命令會將程式碼複製到 Lambda 函數將使用的任務根目錄。此命令使用 環境變數，因此我們不必擔心實際路徑。要執行的函數會以引數形式傳遞至 `CMD [ "app.lambda_handler" ]`命令。

`COPY requirements.txt` 命令會擷取程式碼所需的相依性。 

`RUN pip install --user -r requirements.txt` 命令會將相依性安裝到本機使用者目錄。 

若要建置映像，請執行下列命令。

```
docker build -t <image name> .
```

**在 Amazon ECR 中新增映像**

在下列程式碼中，將 取代`aws_account_id`為帳號，`us-east-1`如果您使用的是不同的區域，請取代 。`buildspec` 檔案使用 CodeBuild 組建編號，將影像版本唯一識別為標籤值。您可以變更此項目以符合您的需求。

*buildspec 自訂程式碼*

```
phases:
  install:
    runtime-versions:
       python: 3.xx
  pre_build:
    commands:
      - python3 --version
      - pip3 install --upgrade pip
      - pip3 install --upgrade awscli
      - sudo docker info
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...
      - ls
      - cd app
      - docker build -t cf-demo:$CODEBUILD_BUILD_NUMBER .
      - docker container ls
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker image...
      - aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.us-east-1.amazonaws.com
      - docker tag cf-demo:$CODEBUILD_BUILD_NUMBER aws_account_id.dkr.ecr.us-east-1.amazonaws.com/cf-demo:$CODEBUILD_BUILD_NUMBER
      - docker push aws_account_id.dkr.ecr.us-east-1.amazonaws.com/cf-demo:$CODEBUILD_BUILD_NUMBER
```

# 使用 AWS Fargate 在 Amazon ECS 上部署 Java 微服務
<a name="deploy-java-microservices-on-amazon-ecs-using-aws-fargate"></a>

*Vijay Thompson 和 Sandeep Bondugula，Amazon Web Services*

## 總結
<a name="deploy-java-microservices-on-amazon-ecs-using-aws-fargate-summary"></a>

此模式提供使用 AWS Fargate 在 Amazon Elastic Container Service (Amazon ECS) 上部署容器化 Java 微服務的指引。模式不會使用 Amazon Elastic Container Registry (Amazon ECR) 進行容器管理；而是從 Docker 中樞提取 Docker 映像。

## 先決條件和限制
<a name="deploy-java-microservices-on-amazon-ecs-using-aws-fargate-prereqs"></a>

**先決條件**
+ Docker 中樞上的現有 Java 微服務應用程式
+ 公有 Docker 儲存庫
+ 作用中的 AWS 帳戶
+ 熟悉 AWS 服務，包括 Amazon ECS 和 Fargate
+ Docker、Java 和 Spring Boot 架構
+ Amazon Relational Database Service (Amazon RDS) 啟動並執行 （選用）
+ 如果應用程式需要 Amazon RDS，則為虛擬私有雲端 (VPC) （選用）

## Architecture
<a name="deploy-java-microservices-on-amazon-ecs-using-aws-fargate-architecture"></a>

**來源技術堆疊**
+ Java 微服務 （例如，在 Spring Boot 中實作） 並部署在 Docker

**來源架構**

![\[部署在 Docker 上的 Java 微服務來源架構\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/65185957-2b8b-43a6-964c-95ce0a45ba17/images/0a946ca8-fe37-4ede-85cb-a80a1c36105d.png)


**目標技術堆疊**
+ 使用 Fargate 託管每個微服務的 Amazon ECS 叢集
+ 託管 Amazon ECS 叢集和相關聯安全群組的 VPC 網路 
+ 每個微服務使用 Fargate 啟動容器的叢集/任務定義

**目標架構**

![\[Amazon ECS 上 Java 微服務的目標架構\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/65185957-2b8b-43a6-964c-95ce0a45ba17/images/b21349ea-21fc-4688-b76a-1bde479858aa.png)


## 工具
<a name="deploy-java-microservices-on-amazon-ecs-using-aws-fargate-tools"></a>

**工具**
+ [Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html) 不需要安裝和操作您自己的容器協同運作軟體、管理和擴展虛擬機器叢集，或在這些虛擬機器上排程容器。 
+ [AWS Fargate](https://docs.aws.amazon.com/AmazonECS/latest/userguide/what-is-fargate.html) 可協助您執行容器，而不需要管理伺服器或 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體。它與 Amazon Elastic Container Service (Amazon ECS) 搭配使用。
+ [Docker](https://www.docker.com/) 是一種軟體平台，可讓您快速建置、測試和部署應用程式。Docker 會將軟體封裝至稱為*容器*的標準化單位，其中包含軟體執行所需的一切，包括程式庫、系統工具、程式碼和執行時間。 

**Docker 程式碼**

下列 Dockerfile 指定使用的 Java 開發套件 (JDK) 版本，其中有 Java 封存 (JAR) 檔案、公開的連接埠號碼，以及應用程式的進入點。

```
FROM openjdk:11
ADD target/Spring-docker.jar Spring-docker.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","Spring-docker.jar"]
```

## 史詩
<a name="deploy-java-microservices-on-amazon-ecs-using-aws-fargate-epics"></a>

### 建立新的任務定義
<a name="create-new-task-definitions"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立任務定義。 | 在 Amazon ECS 中執行 Docker 容器需要任務定義。在 [https://console.aws.amazon.com/ecs/](https://console.aws.amazon.com/ecs/)：// 開啟 Amazon ECS 主控台，選擇**任務定義**，然後建立新的任務定義。如需詳細資訊，請參閱 [Amazon ECS 文件](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-task-definition.html)。 | AWS 系統管理員、應用程式開發人員 | 
| 選擇啟動類型。 | 選擇 **Fargate** 作為啟動類型。 | AWS 系統管理員、應用程式開發人員 | 
| 設定任務。 | 定義任務名稱，並使用適當數量的任務記憶體和 CPU 設定應用程式。 | AWS 系統管理員、應用程式開發人員 | 
| 定義容器。 | 指定容器名稱。針對映像，輸入 Docker 網站名稱、儲存庫名稱，以及 Docker 映像的標籤名稱 (`docker.io/sample-repo/sample-application:sample-tag-name`)。設定應用程式的記憶體限制，並為允許的連接埠設定連接埠映射 (`8080, 80`)。 | AWS 系統管理員、應用程式開發人員 | 
| 建立任務。 | 當任務和容器組態就緒時，請建立任務。如需詳細說明，請參閱*相關資源*區段中的連結。 | AWS 系統管理員、應用程式開發人員 | 

### 設定叢集
<a name="configure-the-cluster"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立和設定叢集。 | 選擇**僅聯網**做為叢集類型、設定名稱，然後建立叢集，或在可用時使用現有叢集。如需詳細資訊，請參閱 [Amazon ECS 文件](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create_cluster.html)。 | AWS 系統管理員、應用程式開發人員 | 

### 設定任務
<a name="configure-task"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 任務。 | 在叢集中，選擇**執行新任務**。 | AWS 系統管理員、應用程式開發人員 | 
| 選擇啟動類型。 | 選擇 **Fargate **作為啟動類型。 | AWS 系統管理員、應用程式開發人員 | 
| 選擇任務定義、修訂和平台版本。 | 選擇您要執行的任務、任務定義的修訂，以及平台版本。 | AWS 系統管理員、應用程式開發人員 | 
| 選取 叢集。 | 選擇您要從中執行任務的叢集。 | AWS 系統管理員、應用程式開發人員 | 
| 指定任務數量。 | 設定應執行的任務數量。如果您使用兩個或多個任務啟動，則需要負載平衡器，才能在任務之間分配流量。 | AWS 系統管理員、應用程式開發人員 | 
| 指定任務群組。 | （選用） 指定任務群組名稱，以將一組相關任務識別為任務群組。 | AWS 系統管理員、應用程式開發人員 | 
| 設定叢集 VPC、子網路和安全群組。 | 設定叢集 VPC 和您要部署應用程式的子網路。建立或更新安全群組 (HTTP、HTTPS 和連接埠 8080)，以提供傳入和傳出連線的存取權。 | AWS 系統管理員、應用程式開發人員 | 
| 設定公有 IP 設定。 | 啟用或停用公有 IP，取決於您是否要為 Fargate 任務使用公有 IP 地址。預設的建議選項為**已啟用**。 | AWS 系統管理員、應用程式開發人員 | 
| 檢閱設定並建立任務 | 檢閱您的設定，然後選擇**執行任務**。 | AWS 系統管理員、應用程式開發人員 | 

### 剪下
<a name="cut-over"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 複製應用程式 URL。 | 當任務狀態更新為*執行*中時，選取任務。在聯網區段中，複製公有 IP。 | AWS 系統管理員、應用程式開發人員 | 
| 測試您的應用程式。 | 在瀏覽器中，輸入公有 IP 以測試應用程式。 | AWS 系統管理員、應用程式開發人員 | 

## 相關資源
<a name="deploy-java-microservices-on-amazon-ecs-using-aws-fargate-resources"></a>
+ [Amazon ECS 的 Docker 基本概念 ](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/docker-basics.html)(Amazon ECS 文件）
+ [AWS Fargate 上的 Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/AWS_Fargate.html) (Amazon ECS 文件）
+ [建立任務定義](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-task-definition.html) (Amazon ECS 文件）
+ [建立叢集](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create_cluster.html) (Amazon ECS 文件）
+ [設定基本服務參數](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/basic-service-params.html) (Amazon ECS 文件）
+ [設定網路 ](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-configure-network.html)(Amazon ECS 文件）
+ [在 Amazon ECS 上部署 Java Microservices ](https://aws.amazon.com/blogs/compute/deploying-java-microservices-on-amazon-ec2-container-service/)（部落格文章）

# 在 Amazon S3 中使用 Amazon EKS 和 Helm Chart 儲存庫部署 Kubernetes 資源和套件
<a name="deploy-kubernetes-resources-and-packages-using-amazon-eks-and-a-helm-chart-repository-in-amazon-s3"></a>

*Sagar Panigrahi，Amazon Web Services*

## 總結
<a name="deploy-kubernetes-resources-and-packages-using-amazon-eks-and-a-helm-chart-repository-in-amazon-s3-summary"></a>

此模式可協助您有效率地管理 Kubernetes 應用程式，無論其複雜性為何。模式會將 Helm 整合到現有的持續整合和持續交付 (CI/CD) 管道中，以將應用程式部署到 Kubernetes 叢集。Helm 是 Kubernetes 套件管理員，可協助您管理 Kubernetes 應用程式。Helm Chart 有助於定義、安裝和升級複雜的 Kubernetes 應用程式。圖表可以版本化並存放在 Helm 儲存庫中，這可改善中斷期間的平均還原時間 (MTTR)。 

此模式針對 Kubernetes 叢集使用 Amazon Elastic Kubernetes Service (Amazon EKS)。它使用 Amazon Simple Storage Service (Amazon S3) 做為 Helm Chart 儲存庫，以便整個組織的開發人員集中管理和存取圖表。

## 先決條件和限制
<a name="deploy-kubernetes-resources-and-packages-using-amazon-eks-and-a-helm-chart-repository-in-amazon-s3-prereqs"></a>

**先決條件**
+ 具有虛擬私有雲端 (VPC) 的作用中 Amazon Web Services (AWS) 帳戶
+ Amazon EKS 叢集 
+ 在 Amazon EKS 叢集中設定並準備好接受工作負載的工作者節點
+ Kubectl 用於設定用戶端機器中目標叢集的 Amazon EKS kubeconfig 檔案
+ 建立 S3 儲存貯體的 AWS Identity and Access Management (IAM) 存取權
+ 從用戶端機器存取 Amazon S3 的 IAM （程式設計或角色）
+ 原始程式碼管理和 CI/CD 管道

**限制**
+ 目前不支援升級、刪除或管理自訂資源定義 (CRDs)。
+ 如果您使用的是參考 CRD 的資源，則必須單獨安裝 CRD （在圖表之外）。

**產品版本**
+ Helm 3.6.3 版

## Architecture
<a name="deploy-kubernetes-resources-and-packages-using-amazon-eks-and-a-helm-chart-repository-in-amazon-s3-architecture"></a>

**目標技術堆疊**
+ Amazon EKS
+ Amazon VPC
+ Amazon S3
+ 原始程式碼管理
+ Helm
+ kubectl

**目標架構**

![\[用戶端 Helm 和 Kubectl 在 Amazon S3 中為 Amazon EKS 叢集部署 Helm Chart 儲存庫。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/d3f993e6-4d96-4cb9-a075-c4debe431fd7/images/2f09f7bb-440a-4c4b-b29f-08d136d1ada4.png)


 

**自動化和擴展**
+ AWS CloudFormation 可用來自動建立基礎設施。如需詳細資訊，請參閱 [Amazon EKS 文件中的使用 AWS CloudFormation 建立](https://docs.aws.amazon.com/eks/latest/userguide/creating-resources-with-cloudformation.html) Amazon EKS 資源。
+ Helm 要整合到您現有的 CI/CD 自動化工具中，以自動化 Helm Chart 的封裝和版本控制 （此模式的範圍外）。
+ GitVersion 或 Jenkins 建置號碼可用來自動化圖表的版本控制。

## 工具
<a name="deploy-kubernetes-resources-and-packages-using-amazon-eks-and-a-helm-chart-repository-in-amazon-s3-tools"></a>

**工具**
+ [Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html) – Amazon Elastic Kubernetes Service (Amazon EKS) 是一種受管服務，可在 AWS 上執行 Kubernetes，而不需要站立或維護您自己的 Kubernetes 控制平面。Kubernetes 是一套開放原始碼系統，用於容器化應用程式的自動化部署、擴展與管理。
+ [Helm](https://helm.sh/docs/) – Helm 是 Kubernetes 套件管理員，可協助您在 Kubernetes 叢集上安裝和管理應用程式。
+ [Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/gsg/GetStartedWithS3.html) – Amazon Simple Storage Service (Amazon S3) 是網際網路的儲存體。您可以使用 Amazon S3 隨時從 Web 任何地方存放和擷取任意資料量。
+ [Kubectl](https://kubernetes.io/docs/reference/kubectl/overview/) – Kubectl 是一種命令列公用程式，用於對 Kubernetes 叢集執行命令。

**Code**

已連接範例程式碼。

## 史詩
<a name="deploy-kubernetes-resources-and-packages-using-amazon-eks-and-a-helm-chart-repository-in-amazon-s3-epics"></a>

### 設定和初始化 Helm
<a name="configure-and-initialize-helm"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 安裝 Helm 用戶端。 | 若要在您的本機系統上下載並安裝 Helm 用戶端，請使用下列命令。 <pre>sudo curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash</pre> | DevOps 工程師 | 
| 驗證 Helm 安裝。 | 若要驗證 Helm 是否能夠與 Amazon EKS 叢集中的 Kubernetes API 伺服器通訊，請執行 `helm version`。 | DevOps 工程師 | 

### 在 Amazon EKS 叢集中建立並安裝 Helm Chart
<a name="create-and-install-a-helm-chart-in-the-amazon-eks-cluster"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 NGINX 的 Helm Chart。 | 若要在用戶端機器`my-nginx`上建立名為 的 Helm Chart，請執行 `helm create my-nginx`。 | DevOps 工程師 | 
| 檢閱圖表的結構。 | 若要檢閱圖表的結構，請執行樹狀命令 `tree my-nginx/`。 | DevOps 工程師 | 
| 在圖表中停用服務帳戶建立。 | 在 的 `serviceAccount`區段`values.yaml`下，將`create`金鑰設定為 `false`。這是關閉的，因為不需要為此模式建立服務帳戶。 | DevOps 工程師 | 
| 驗證 (lint) 修改後的圖表是否有語法錯誤。 | 若要驗證圖表是否有任何語法錯誤，再將其安裝在目標叢集中，請執行 `helm lint my-nginx/`。 | DevOps 工程師 | 
| 安裝圖表以部署 Kubernetes 資源。 | 若要執行 Helm Chart 安裝，請使用下列命令。 <pre>helm install --name my-nginx-release --debug my-nginx/ --namespace helm-space </pre>選用旗標會在安裝期間`debug`輸出所有偵錯訊息。`namespace` 旗標指定要在其中建立此圖表資源部分的命名空間。 | DevOps 工程師 | 
| 檢閱 Amazon EKS 叢集中的資源。 | 若要檢閱在`helm-space`命名空間中作為 Helm Chart 一部分建立的資源，請使用下列命令。 <pre>kubectl get all -n helm-space</pre> | DevOps 工程師 | 

### 回復至舊版的 Kubernetes 應用程式
<a name="roll-back-to-a-previous-version-of-a-kubernetes-application"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 修改和升級版本。 | 若要修改圖表，請在 中將`replicaCount`值`values.yaml`變更為 `2`。然後執行下列命令來升級已安裝的版本。<pre>helm upgrade my-nginx-release my-nginx/ --namespace helm-space</pre> | DevOps 工程師 | 
| 檢閱 Helm 版本的歷史記錄。 | 若要列出使用 Helm 安裝的特定版本的所有修訂，請執行下列命令。 <pre>helm history my-nginx-release</pre> | DevOps 工程師 | 
| 檢閱特定修訂的詳細資訊。 | 在切換或轉返到工作版本之前，以及安裝修訂之前的額外驗證層，請使用下列命令檢視傳遞到每個修訂的值。<pre>helm get --revision=2 my-nginx-release</pre> | DevOps 工程師 | 
| 回復至先前的版本。 | 若要復原至先前的修訂版，請使用下列命令。 <pre>helm rollback my-nginx-release 1 </pre>此範例會轉返至修訂版編號 1。 | DevOps 工程師 | 

### 將 S3 儲存貯體初始化為 Helm 儲存庫
<a name="initialize-an-s3-bucket-as-a-helm-repository"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 為 Helm Chart 建立 S3 儲存貯體。 | 建立唯一的 S3 儲存貯體。在 儲存貯體中，建立名為 的資料夾`charts`。此模式中的範例使用 `s3://my-helm-charts/charts`做為目標圖表儲存庫。 | 雲端管理員 | 
| 安裝適用於 Amazon S3 的 Helm 外掛程式。 | 若要在用戶端機器上安裝 helm-s3 外掛程式，請使用下列命令。 <pre>helm plugin install https://github.com/hypnoglow/helm-s3.git --version 0.10.0</pre>注意：Helm V3 支援適用於外掛程式 0.9.0 版及更新版本。 | DevOps 工程師 | 
| 初始化 Amazon S3 Helm 儲存庫。 | 若要將目標資料夾初始化為 Helm 儲存庫，請使用下列命令。 <pre>helm S3 init s3://my-helm-charts/charts </pre>命令會在目標中建立 `index.yaml` 檔案，以追蹤存放在該位置的所有圖表資訊。 | DevOps 工程師 | 
| 將 Amazon S3 儲存庫新增至 Helm。 | 若要在用戶端機器中新增儲存庫，請使用下列命令。<pre>helm repo add my-helm-charts s3://my-helm-charts/charts </pre>此命令會將別名新增至 Helm 用戶端機器中的目標儲存庫。 | DevOps 工程師 | 
| 檢閱儲存庫清單。 | 若要檢視 Helm 用戶端機器中的儲存庫清單，請執行 `helm repo list`。 | DevOps 工程師 | 

### 在 Amazon S3 Helm 儲存庫中封裝和存放圖表
<a name="package-and-store-charts-in-the-amazon-s3-helm-repository"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 封裝圖表。 | 若要封裝您建立的`my-nginx`圖表，請執行 `helm package ./my-nginx/`。命令會將`my-nginx`圖表資料夾的所有內容封裝至封存檔案，該檔案會使用`Chart.yaml`檔案中提及的版本編號來命名。 | DevOps 工程師 | 
| 將套件存放在 Amazon S3 Helm 儲存庫中。 | 若要將套件上傳至 Amazon S3 中的 Helm 儲存庫，請使用 `.tgz` 檔案的正確名稱執行下列命令。<pre>helm s3 push ./my-nginx-0.1.0.tgz my-helm-charts</pre> | DevOps 工程師 | 
| 搜尋 Helm Chart。 | 若要確認圖表在本機和 Amazon S3 中的 Helm 儲存庫中同時出現，請執行下列命令。<pre>helm search repo my-nginx</pre> | DevOps 工程師 | 

### 修改、版本和封裝圖表
<a name="modify-version-and-package-a-chart"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 修改和封裝圖表。 | 在 中`values.yaml`，將 `replicaCount`值設定為 `1`。然後執行 封裝圖表`helm package ./my-nginx/`，這次將 中的版本變更為 `Chart.yaml` `0.1.1`。 在 CI/CD 管道中使用 GitVersion 或 Jenkins 建置號碼等工具，最好透過自動化更新版本控制。自動化版本編號超出此模式的範圍。 | DevOps 工程師 | 
| 將新版本推送至 Amazon S3 中的 Helm 儲存庫。 | 若要將 0.1.1 版的新套件推送至 Amazon S3 中的 `my-helm-charts` Helm 儲存庫，請執行下列命令。<pre>helm s3 push ./my-nginx-0.1.1.tgz my-helm-charts</pre> | DevOps 工程師 | 

### 從 Amazon S3 Helm 儲存庫搜尋並安裝圖表
<a name="search-for-and-install-a-chart-from-the-amazon-s3-helm-repository"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 搜尋 my-nginx 圖表的所有版本。 | 若要檢視圖表的所有可用版本，請使用 `--versions`旗標執行下列命令。<pre>helm search repo my-nginx --versions</pre>如果沒有 旗標，Helm 預設會顯示圖表的最新上傳版本。 | DevOps 工程師 | 
| 從 Amazon S3 Helm 儲存庫安裝圖表。 | 先前任務的搜尋結果會顯示`my-nginx`圖表的多個版本。若要從 Amazon S3 Helm 儲存庫安裝新版本 (0.1.1)，請使用下列命令。<pre>helm upgrade my-nginx-release my-helm-charts/my-nginx --version 0.1.1 --namespace helm-space</pre> | DevOps 工程師 | 

## 相關資源
<a name="deploy-kubernetes-resources-and-packages-using-amazon-eks-and-a-helm-chart-repository-in-amazon-s3-resources"></a>
+ [HELM 文件](https://helm.sh/docs/)
+ [helm-s3 外掛程式 (MIT 授權）](https://github.com/hypnoglow/helm-s3.git)
+ [HELM 用戶端二進位](https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3)
+ [Amazon EKS 文件](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html)

## 附件
<a name="attachments-d3f993e6-4d96-4cb9-a075-c4debe431fd7"></a>

若要存取與本文件相關聯的其他內容，請解壓縮下列檔案： [attachment.zip](samples/p-attach/d3f993e6-4d96-4cb9-a075-c4debe431fd7/attachments/attachment.zip)

# 使用 Terraform 在 Amazon EKS 中部署 CockroachDB 叢集
<a name="deploy-cockroachdb-on-eks-using-terraform"></a>

*Sandip Gangapadhyay 和 Kalyan Senthilnathan，Amazon Web Services*

## 總結
<a name="deploy-cockroachdb-on-eks-using-terraform-summary"></a>

此模式提供 HashiCorp Terraform 模組，用於使用 [CockroachDB](https://www.cockroachlabs.com/docs/stable/) [運算子在 Amazon Elastic Kubernetes Service (Amazon EKS) 上部署多節點 CockroachDB ](https://www.cockroachlabs.com/docs/v25.4/cockroachdb-operator-overview)叢集。CockroachDB 是分散式 SQL 資料庫，可在地理分佈叢集中提供自動水平分片、高可用性和一致的效能。此模式使用 Amazon EKS 作為受管 Kubernetes 平台，並實作 [cert-manager](https://cert-manager.io/docs/) 進行 TLS 安全節點通訊。它還使用 [Network Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/introduction.html) 進行流量分佈，並使用 Pod 建立 CockroachDB [StatefulSets](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/)，以自動複寫資料以實現容錯能力和效能。

**目標對象**

若要實作此模式，建議您熟悉下列項目：
+ HashiCorp Terraform 概念和基礎設施即程式碼 (IaC) 實務
+ AWS 服務，特別是 Amazon EKS
+ Kubernetes 基本概念，包括 StatefulSets、運算子和服務組態
+ 分散式 SQL 資料庫
+ 安全概念，例如 TLS 憑證管理。
+ DevOps 實務、CI/CD 工作流程和基礎設施自動化

## 先決條件和限制
<a name="deploy-cockroachdb-on-eks-using-terraform-prereqs"></a>

**先決條件**
+ 作用中 AWS 帳戶
+ 在 Amazon EKS 叢集中部署資源的許可
+ 標記節點的 Amazon EKS 叢集版本 1.23 或更新版本 `node=cockroachdb`
+ [Amazon Elastic Block Store 容器儲存界面 (CSI) 驅動程式](https://github.com/kubernetes-sigs/aws-ebs-csi-driver) 1.19.0 版或更新版本，安裝在 Amazon EKS 叢集中
+ Terraform CLI 1.0.0 版或更新版本，[已安裝](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli)
+ kubectl，[已安裝](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)
+ Git，[已安裝](https://git-scm.com/install/)
+ AWS Command Line Interface (AWS CLI) 2.9.18 版或更新版本，[已安裝](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)並[設定](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)

**限制**
+ CockroachDB Kubernetes Operator 不支援多區域部署的多個 Kubernetes 叢集。如需更多限制，請參閱[跨多個 Kubernetes 叢集協調 CockroachDB ](https://www.cockroachlabs.com/docs/stable/orchestrate-cockroachdb-with-kubernetes-multi-cluster.html#eks)(CockroachDB 文件） 和 [CockroachDB Kubernetes Operator](https://github.com/cockroachdb/cockroach-operator) (GitHub)。
+ 持久性磁碟區宣告 (PVCs的自動剔除目前預設為停用。這表示在解除委任並移除節點之後，運算子不會移除掛載至其 Pod 的持久性磁碟區。如需詳細資訊，請參閱 CockroachDB 文件中的[自動 PVC 剔除](https://www.cockroachlabs.com/docs/stable/scale-cockroachdb-kubernetes.html#automatic-pvc-pruning)。

**產品版本**
+ CockroachDB 22.2.2 版

## Architecture
<a name="deploy-cockroachdb-on-eks-using-terraform-architecture"></a>

**目標架構**

下圖顯示虛擬私有雲端 (VPC) 中三個 AWS 可用區域的高可用性 CockroachDB 部署。CockroachDB Pod 是透過 Amazon EKS 管理。架構說明使用者如何透過 Network Load Balancer 存取資料庫，將流量分配到 CockroachDB Pod。在每個可用區域中的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體上執行的 Pod，可提供彈性和容錯能力。

![\[在 VPC 內三個 AWS 可用區域中部署高可用性的 CockroachDB。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/e22d81ab-b85c-4709-8579-4c9cdb4afdb6/images/4b163abf-6fdc-4310-840c-bda621ab25dd.png)


**已建立資源**

部署此模式中使用的 Terraform 模組會建立下列資源：

1. **Network Load Balancer** – 此資源可做為用戶端請求的進入點，並將流量平均分配到 CockroachDB 執行個體。

1. **CockroachDB StatefulSet** – StatefulSet 定義 Amazon EKS 叢集中 CockroachDB 部署的所需狀態。它會管理 CockroachDB Pod 的排序部署、擴展和更新。

1. **CockroachDB Pod** – 這些 Pod 是做為 Kubernetes Pod 內容器執行的 CockroachDB 執行個體。這些 Pod 會跨分散式叢集存放和管理資料。

1. **CockroachDB 資料庫** – 這是由 CockroachDB 管理的分散式資料庫，跨越多個 Pod。它會複寫資料以實現高可用性、容錯能力和效能。

## 工具
<a name="deploy-cockroachdb-on-eks-using-terraform-tools"></a>

**AWS 服務**
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) 是一種開放原始碼工具，可協助您 AWS 服務 透過命令列 shell 中的命令與 互動。
+ [Amazon Elastic Kubernetes Service (Amazon EKS)](https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html) 可協助您在 上執行 Kubernetes， AWS 而無需安裝或維護您自己的 Kubernetes 控制平面或節點。

**其他工具**
+ [HashiCorp Terraform](https://www.terraform.io/docs) 是一種基礎設施即程式碼 (IaC) 工具，可協助您使用程式碼來佈建和管理雲端基礎設施和資源。
+ [kubectl](https://kubernetes.io/docs/tasks/tools/) 是一種命令列界面，可協助您針對 Kubernetes 叢集執行命令。

**程式碼儲存庫**

此模式的程式碼可在 GitHub 中使用 [Terraform 儲存庫在 Amazon EKS 中部署 CockroachDB 叢集](https://github.com/aws-samples/crdb-cluster-eks-terraform)中取得。程式碼儲存庫包含下列適用於 Terraform 的檔案和資料夾：
+ `modules` 資料夾 – 此資料夾包含 CockroachDB 的 Terraform 模組
+ `main` 資料夾 – 此資料夾包含呼叫 CockroachDB 子模組的根模組，以建立 CockroachDB 資料庫叢集。

## 最佳實務
<a name="deploy-cockroachdb-on-eks-using-terraform-best-practices"></a>
+ 請勿縮減至少於三個節點。這被視為 CockroachDB 上的反模式，並可能導致錯誤。如需詳細資訊，請參閱 CockroachDB 文件中的[叢集擴展](https://www.cockroachlabs.com/docs/stable/scale-cockroachdb-kubernetes.html)。
+ 使用 Karpernter 或 Cluster Autoscaler 實作 Amazon EKS 自動擴展。這可讓 CockroachDB 叢集自動水平擴展和自動擴展新節點。如需詳細資訊，請參閱 Amazon EKS 文件中的[使用 Karpenter 和 Cluster Autoscaler 擴展叢集運算](https://docs.aws.amazon.com/eks/latest/userguide/autoscaling.html)。
**注意**  
由於 `podAntiAffinity` Kubernetes 排程規則，在一個 Amazon EKS 節點中只能排程一個 CockroachDB Pod。
+ 如需 Amazon EKS 安全最佳實務，請參閱 Amazon EKS 文件中的[安全最佳實務](https://docs.aws.amazon.com/eks/latest/best-practices/security.html)。
+ 如需 CockroachDB 的 SQL 效能最佳實務，請參閱 CockroachDB 文件中的 [SQL 效能最佳實務](https://www.cockroachlabs.com/docs/stable/performance-best-practices-overview.html)。
+ 如需為 Terraform 狀態檔案設定 Amazon Simple Storage Service (Amazon S3) 遠端後端的詳細資訊，請參閱 Terraform 文件中的 [Amazon S3](https://developer.hashicorp.com/terraform/language/backend/s3)。

## 史詩
<a name="deploy-cockroachdb-on-eks-using-terraform-epics"></a>

### 設定您的環境
<a name="set-up-your-environment"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 複製程式碼儲存庫。 | 輸入下列命令來複製儲存庫：<pre>git clone https://github.com/aws-samples/crdb-cluster-eks-terraform.git</pre> | DevOps 工程師，Git | 
| 更新 Terraform 變數。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-cockroachdb-on-eks-using-terraform.html) | DevOps 工程師，Terraform | 

### 部署 資源
<a name="deploy-the-resources"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 部署 基礎設施。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-cockroachdb-on-eks-using-terraform.html) | DevOps 工程師，Terraform | 

### 驗證部署
<a name="verify-the-deployment"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 驗證資源建立。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-cockroachdb-on-eks-using-terraform.html) | DevOps 工程師 | 
| （選用） 向上或向下擴展。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-cockroachdb-on-eks-using-terraform.html) | DevOps 工程師，Terraform | 

### 清除
<a name="clean-up"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 刪除基礎設施。 | 將節點擴展至 `0`可降低運算成本。不過，對於此模組建立的持久性 Amazon EBS 磁碟區，您仍需支付費用。若要降低儲存成本，請依照下列步驟刪除所有磁碟區：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-cockroachdb-on-eks-using-terraform.html) | Terraform | 

## 疑難排解
<a name="deploy-cockroachdb-on-eks-using-terraform-troubleshooting"></a>


| 問題 | 解決方案 | 
| --- | --- | 
| 驗證供應商登入資料時發生錯誤 | 當您執行 Terraform `apply`或 `destroy`命令時，您可能會遇到下列錯誤：`Error: configuring Terraform AWS Provider: error validating provider  credentials: error calling sts:GetCallerIdentity: operation error STS: GetCallerIdentity, https response error StatusCode: 403, RequestID: 123456a9-fbc1-40ed-b8d8-513d0133ba7f, api error InvalidClientTokenId: The security token included in the request is invalid.`此錯誤是由本機電腦組態中使用的登入資料的安全字符過期所造成。如需如何解決錯誤的指示，請參閱 AWS CLI 文件中的[設定和檢視組態設定](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html#cli-configure-files-methods)。 | 
| 處於待定狀態的 CockroachDB Pod | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-cockroachdb-on-eks-using-terraform.html) | 

## 相關資源
<a name="deploy-cockroachdb-on-eks-using-terraform-resources"></a>
+ [在單一 Kubernetes 叢集中部署 CockroachDB ](https://www.cockroachlabs.com/docs/dev/deploy-cockroachdb-with-kubernetes.html)(CockroachDB 文件）
+ [跨多個 Kubernetes 叢集協調 CockroachDB ](https://www.cockroachlabs.com/docs/dev/orchestrate-cockroachdb-with-kubernetes-multi-cluster.html)(CockroachDB 文件）
+ [AWS 提供者](https://registry.terraform.io/providers/hashicorp/aws/latest/docs) (Terraform 文件）

## 附件
<a name="attachments-e22d81ab-b85c-4709-8579-4c9cdb4afdb6"></a>

若要存取與本文件相關聯的其他內容，請解壓縮下列檔案： [attachment.zip](samples/p-attach/e22d81ab-b85c-4709-8579-4c9cdb4afdb6/attachments/attachment.zip)

# 在 Amazon EKS 上部署範例 Java 微服務，並使用 Application Load Balancer 公開微服務
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer"></a>

*Vijay Thompson 和 Akkamahadevi 租用數學，Amazon Web Services*

## 總結
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-summary"></a>

此模式說明如何使用`eksctl`命令列公用程式和 Amazon Elastic Container Registry (Amazon ECR)，將範例 Java 微服務部署為 Amazon Elastic Kubernetes Service (Amazon EKS) 上的容器化應用程式。您可以使用 Application Load Balancer 來負載平衡應用程式流量。

## 先決條件和限制
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-prereqs"></a>

**先決條件**
+ 作用中的 AWS 帳戶
+ 在 macOS、Linux 或 Windows 上安裝和設定 AWS Command Line Interface (AWS CLI) 1.7 版或更新版本
+ 執行中的 [Docker 協助程式](https://docs.docker.com/config/daemon/)
+ 在 macOS、Linux 或 Windows 上安裝和設定的`eksctl`命令列公用程式 （如需詳細資訊，請參閱 [Amazon EKS 文件中的 Amazon EKS – eksctl 入門](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-eksctl.html)。)
+ 在 macOS、Linux 或 Windows 上安裝和設定的`kubectl`命令列公用程式 （如需詳細資訊，請參閱 Amazon EKS 文件中的[安裝或更新 kubectl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)。)

**限制**
+ 此模式不包含 Application Load Balancer 的 SSL 憑證安裝。

## Architecture
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-architecture"></a>

**目標技術堆疊**
+ Amazon ECR
+ Amazon EKS
+ Elastic Load Balancing

**目標架構**

下圖顯示用於在 Amazon EKS 上容器化 Java 微服務的架構。

![\[部署為 Amazon EKS 上容器化應用程式的 Java 微服務。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/e1dd8ab0-9e1e-4d2b-b7af-89d3e583e57c/images/aaca4fd9-5aaa-4df5-aebd-02a2ed881c3b.png)


## 工具
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-tools"></a>
+ [Amazon Elastic Container Registry (Amazon ECR)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) 是一種受管容器映像登錄服務，安全、可擴展且可靠。
+ [Amazon Elastic Kubernetes Service (Amazon EKS)](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) 可協助您在 AWS 上執行 Kubernetes，而無需安裝或維護您自己的 Kubernetes 控制平面或節點。
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) 是一種開放原始碼工具，可協助您透過命令列 shell 中的命令與 AWS 服務互動。
+ [Elastic Load Balancing](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html) 會自動將傳入流量分散到一或多個可用區域中的多個目標，例如 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體、容器和 IP 地址。
+ [eksctl](https://eksctl.io/) 可協助您在 Amazon EKS 上建立叢集。
+ [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) 可讓您針對 Kubernetes 叢集執行命令。
+ [Docker](https://www.docker.com/) 可協助您在稱為容器的套件中建置、測試和交付應用程式。

## 史詩
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-epics"></a>

### 使用 eksctl 建立 Amazon EKS 叢集
<a name="create-an-amazon-eks-cluster-by-using-eksctl"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 Amazon EKS 叢集。 | 若要建立使用兩個 t2.small Amazon EC2 執行個體做為節點的 Amazon EKS 叢集，請執行下列命令：<pre>eksctl create cluster --name <your-cluster-name> --version <version-number> --nodes=1 --node-type=t2.small</pre>程序可能需要 15 到 20 分鐘。建立叢集之後，適當的 Kubernetes 組態會新增至您的 [kubeconfig](https://docs.aws.amazon.com/eks/latest/userguide/create-kubeconfig.html) 檔案。您可以使用 `kubeconfig` 檔案搭配 `kubectl`****，在後續步驟中部署應用程式。 | 開發人員、系統管理員 | 
| 驗證 Amazon EKS 叢集。 | 若要確認叢集已建立且您可以連線到叢集，請執行 `kubectl get nodes`命令。 | 開發人員、系統管理員 | 

### 建立 Amazon ECR 儲存庫並推送 Docker 映像。
<a name="create-an-amazon-ecr-repository-and-push-the-docker-image"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 Amazon ECR 儲存庫。 | 遵循 Amazon ECR 文件中[建立私有儲存庫](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)的指示。 | 開發人員、系統管理員 | 
| 建立 POM XML 檔案。 | 根據此模式[額外資訊](#deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-additional)區段中`pom.xml`*的範例 POM 檔案*程式碼來建立檔案。 | 開發人員、系統管理員 | 
| 建立來源檔案。 | 根據下列範例，在`src/main/java/eksExample`路徑`HelloWorld.java`中建立名為 的來源檔案：<pre>package eksExample;<br />import static spark.Spark.get;<br /><br />public class HelloWorld {<br />    public static void main(String[] args) {<br />        get("/", (req, res) -> {<br />            return "Hello World!";<br />        });<br />    }<br />}</pre>請務必使用下列目錄結構：<pre>├── Dockerfile<br />├── deployment.yaml<br />├── ingress.yaml<br />├── pom.xml<br />├── service.yaml<br />└── src<br />    └── main<br />        └── java<br />            └── eksExample<br />                └── HelloWorld.java</pre> |  | 
| 建立 Dockerfile。 | `Dockerfile` 根據此模式[額外資訊](#deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-additional)區段中*的範例 Dockerfile *程式碼建立 。 | 開發人員、系統管理員 | 
| 建置並推送 Docker 映像。 | 在您希望 `Dockerfile`建置、標記映像並將映像推送至 Amazon ECR 的目錄中，執行下列命令：<pre>aws ecr get-login-password --region <region>| docker login --username <username> --password-stdin <account_number>.dkr.ecr.<region>.amazonaws.com<br />docker buildx build --platform linux/amd64 -t hello-world-java:v1 .<br />docker tag hello-world-java:v1 <account_number>.dkr.ecr.<region>.amazonaws.com/<repository_name>:v1<br />docker push <account_number>.dkr.ecr.<region>.amazonaws.com/<repository_name>:v1</pre>修改上述命令中的 AWS 區域、帳戶號碼和儲存庫詳細資訊。請務必記下映像 URL 以供日後使用。具有 M1 晶片的 macOS 系統在建置與在 AMD64 平台上執行的 Amazon EKS 相容的映像時發生問題。若要解決此問題，請使用 [Docker buildx](https://docs.docker.com/engine/reference/commandline/buildx/) 建置適用於 Amazon EKS 的 Docker 映像。 |  | 

### 部署 Java 微服務
<a name="deploy-the-java-microservices"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立部署檔案。 | `deployment.yaml` 根據此模式[額外資訊](#deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-additional)區段中*的範例部署檔案程式碼，建立名為 的 YAML 檔案*。使用您先前複製的映像 URL 做為 Amazon ECR 儲存庫映像檔案的路徑。 | 開發人員、系統管理員 | 
| 在 Amazon EKS 叢集上部署 Java 微服務。 | 若要在 Amazon EKS 叢集中建立部署，請執行 `kubectl apply -f deployment.yaml`命令。 | 開發人員、系統管理員 | 
| 驗證 Pod 的狀態。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer.html) | 開發人員、系統管理員 | 
| 建立服務。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer.html) | 開發人員、系統管理員 | 
| 安裝 AWS Load Balancer 控制器附加元件。 | 遵循 Amazon EKS 文件中[安裝 AWS Load Balancer 控制器附加元件](https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html)的指示。您必須安裝 附加元件，才能為 Kubernetes 服務建立 Application Load Balancer 或 Network Load Balancer。 | 開發人員、系統管理員 | 
| 建立輸入資源。 | `ingress.yaml` 根據此模式[額外資訊](#deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-additional)區段中*的範例輸入資源檔案程式碼，建立名為 的 YAML 檔案*。 | 開發人員、系統管理員 | 
| 建立 Application Load Balancer。 | 若要部署輸入資源並建立 Application Load Balancer，請執行 `kubectl apply -f ingress.yaml`命令。 | 開發人員、系統管理員 | 

### 測試應用程式。
<a name="test-the-application"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 測試並驗證應用程式。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer.html) | 開發人員、系統管理員 | 

## 相關資源
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-resources"></a>
+ [建立私有儲存庫](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html) (Amazon ECR 文件）
+ [推送 Docker 映像](https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-push-ecr-image.html) (Amazon ECR 文件）
+ [輸入控制器 ](https://www.eksworkshop.com/beginner/130_exposing-service/ingress_controller_alb/)(Amazon EKS 研討會）
+ [Docker buildx](https://docs.docker.com/engine/reference/commandline/buildx/) (Docker 文件）

## 其他資訊
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-additional"></a>

**POM 檔案範例**

```
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>


  <groupId>helloWorld</groupId>
  <artifactId>helloWorld</artifactId>
  <version>1.0-SNAPSHOT</version>


  <dependencies>
    <dependency>
      <groupId>com.sparkjava</groupId><artifactId>spark-core</artifactId><version>2.0.0</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>2.4</version>
        <configuration><finalName>eksExample</finalName><archive><manifest>
              <addClasspath>true</addClasspath><mainClass>eksExample.HelloWorld</mainClass><classpathPrefix>dependency-jars/</classpathPrefix>
            </manifest></archive>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version>
        <configuration><source>1.8</source><target>1.8</target></configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId>
        <executions>
          <execution>
            <goals><goal>attached</goal></goals><phase>package</phase>
            <configuration>
              <finalName>eksExample</finalName>
              <descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs>
              <archive><manifest><mainClass>eksExample.HelloWorld</mainClass></manifest></archive>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>
```

**範例 Dockerfile**

```
FROM bellsoft/liberica-openjdk-alpine-musl:17

RUN apk add maven
WORKDIR /code

# Prepare by downloading dependencies
ADD pom.xml /code/pom.xml
RUN ["mvn", "dependency:resolve"]
RUN ["mvn", "verify"]

# Adding source, compile and package into a fat jar
ADD src /code/src
RUN ["mvn", "package"]

EXPOSE 4567
CMD ["java", "-jar", "target/eksExample-jar-with-dependencies.jar"]
```

**部署檔案範例**

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: microservice-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app.kubernetes.io/name: java-microservice
  template:
    metadata:
      labels:
        app.kubernetes.io/name: java-microservice
    spec:
      containers:
      - name: java-microservice-container
        image: .dkr.ecr.amazonaws.com/:
        ports:
        - containerPort: 4567
```

**服務檔案範例**

```
apiVersion: v1
kind: Service
metadata:
  name: "service-java-microservice"
spec:
  ports:
    - port: 80
      targetPort: 4567
      protocol: TCP
  type: NodePort
  selector:
    app.kubernetes.io/name: java-microservice
```

**範例輸入資源檔案**

```
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: "java-microservice-ingress"
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/load-balancer-name: apg2
    alb.ingress.kubernetes.io/target-type: ip
  labels:
    app: java-microservice
spec:
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: "service-java-microservice"
                port:
                  number: 80
```

# 在 Amazon EKS 叢集上部署以 gRPC 為基礎的應用程式，並使用 Application Load Balancer 存取它
<a name="deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer"></a>

*Kirankumar Chandrashekar 和 Huy Nguyen，Amazon Web Services*

## 摘要
<a name="deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer-summary"></a>

此模式說明如何在 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集上託管以 gRPC 為基礎的應用程式，並透過 Application Load Balancer 安全地存取它。

[gRPC](https://grpc.io/) 是一種可在任何環境中執行的開放原始碼遠端程序呼叫 (RPC) 架構。您可以使用它進行微服務整合和用戶端-伺服器通訊。如需 gRPC 的詳細資訊，請參閱 AWS 部落格文章 [Application Load Balancer 支援end-to-end HTTP/2 和 gRPC](https://aws.amazon.com/blogs/aws/new-application-load-balancer-support-for-end-to-end-http-2-and-grpc/)。

此模式說明如何託管在 Amazon EKS 上的 Kubernetes Pod 上執行的 gRPC 型應用程式。gRPC 用戶端會透過具有 SSL/TLS 加密連線的 HTTP/2 通訊協定連線至 Application Load Balancer。Application Load Balancer 會將流量轉送至在 Amazon EKS Pod 上執行的 gRPC 應用程式。您可以使用 [Kubernetes Horizontal Pod Autoscaler，根據流量自動擴展 gRPC Pod ](https://docs.aws.amazon.com/eks/latest/userguide/horizontal-pod-autoscaler.html)的數量。Application Load Balancer 的目標群組會對 Amazon EKS 節點執行運作狀態檢查、評估目標是否正常運作，以及僅將流量轉送至運作狀態良好的節點。

## 先決條件和限制
<a name="deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer-prereqs"></a>

**先決條件**
+ 作用中的 AWS 帳戶
+ 在 Linux、macOS 或 Windows 上安裝和設定 [Docker](https://www.docker.com/)。
+ [在 Linux、macOS 或 Windows 上安裝和設定 AWS Command Line Interface (AWS CLI) 第 2 版](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)。  macOS
+ [eksctl](https://github.com/eksctl-io/eksctl#installation)，在 Linux、macOS 或 Windows 上安裝和設定。
+ `kubectl`，已安裝並設定為存取 Amazon EKS 叢集上的資源。如需詳細資訊，請參閱 Amazon EKS 文件中的[安裝或更新 kubectl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)。 
+ [gRPCurl](https://github.com/fullstorydev/grpcurl)，已安裝並設定。
+ 新的或現有的 Amazon EKS 叢集。如需詳細資訊，請參閱 [Amazon EKS 入門。](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html)
+ 您的電腦終端機已設定為存取 Amazon EKS 叢集。如需詳細資訊，請參閱《Amazon EKS 文件》中的[設定您的電腦與叢集通訊](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-console.html#eks-configure-kubectl)。
+ [AWS Load Balancer 控制器](https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html)，在 Amazon EKS 叢集中佈建。
+ 具有有效 SSL 或 SSL/TLS 憑證的現有 DNS 主機名稱。您可以使用 AWS Certificate Manager (ACM) 或將現有憑證上傳至 ACM，來取得網域的憑證。如需這兩個選項的詳細資訊，請參閱 ACM 文件中的[請求公有憑證](https://docs.aws.amazon.com/acm/latest/userguide/gs-acm-request-public.html)和[將憑證匯入 AWS Certificate Manager](https://docs.aws.amazon.com/acm/latest/userguide/import-certificate.html)。

## Architecture
<a name="deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer-architecture"></a>

下圖顯示此模式實作的架構。

![\[Amazon EKS 上 gRPC 型應用程式的架構\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/abf727c1-ff8b-43a7-923f-bce825d1b459/images/281936fa-bc43-4b4e-a343-ba1eab97df38.png)


 

下圖顯示從卸載至 Application Load Balancer 的 gRPC 用戶端接收 SSL/TLS 流量的工作流程。流量會以純文字轉送至 gRPC 伺服器，因為它來自虛擬私有雲端 (VPC)。

![\[將 SSL/TLS 流量傳送至 gRPC 伺服器的工作流程\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/abf727c1-ff8b-43a7-923f-bce825d1b459/images/09e0c3f6-0c39-40b7-908f-8c4c693a5f02.png)


## 工具
<a name="deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer-tools"></a>

**AWS 服務**
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) 是一種開放原始碼工具，可協助您透過命令列 Shell 中的命令與 AWS 服務互動。
+ [Elastic Load Balancing](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html) 會將傳入的應用程式或網路流量分散到多個目標。例如，您可以將流量分散到一或多個可用區域中的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體、容器和 IP 地址。
+ [Amazon Elastic Container Registry (Amazon ECR)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) 是一種受管容器映像登錄服務，安全、可擴展且可靠。 
+ [Amazon Elastic Kubernetes Service (Amazon EKS)](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) 可協助您在 AWS 上執行 Kubernetes，而無需安裝或維護您自己的 Kubernetes 控制平面或節點。 

**工具**
+ [eksctl](https://eksctl.io/) 是在 Amazon EKS 上建立叢集的簡單 CLI 工具。
+ [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) 是一種命令列公用程式，用於對 Kubernetes 叢集執行命令。
+ [AWS Load Balancer 控制器](https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html) 可協助您 管理 Kubernetes 叢集的 AWS Elastic Load Balancer。
+ [gRPCurl ](https://github.com/fullstorydev/grpcurl)是一種命令列工具，可協助您與 gRPC 服務互動。

**程式碼儲存庫**

此模式的程式碼可在 GitHub [grpc-traffic-on-alb-to-eks](https://github.com/aws-samples/grpc-traffic-on-alb-to-eks.git) 儲存庫中使用。

## 史詩
<a name="deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer-epics"></a>

### 建置 gRPC 伺服器的 Docker 映像並將其推送至 Amazon ECR
<a name="build-and-push-the-grpc-serverrsquor-s-docker-image-to-amazon-ecr"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 Amazon ECR 儲存庫。 | 登入 AWS 管理主控台，開啟 [Amazon ECR 主控台](https://console.aws.amazon.com/ecr/)，然後建立 Amazon ECR 儲存庫。如需詳細資訊，請參閱 Amazon ECR 文件中的[建立儲存庫](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)。請務必記錄 Amazon ECR 儲存庫的 URL。您也可以執行下列命令，使用 AWS CLI 建立 Amazon ECR 儲存庫：<pre>aws ecr create-repository --repository-name helloworld-grpc</pre> | 雲端管理員 | 
| 建置 Docker 影像。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer.html) | DevOps 工程師 | 
| 將 Docker 映像推送至 Amazon ECR。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer.html) | DevOps 工程師 | 

### 將 Kubernetes 資訊清單部署至 Amazon EKS 叢集
<a name="deploy-the-kubernetes-manifests-to-the-amazon-eks-cluster"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 修改 Kubernetes 資訊清單檔案中的值。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer.html) | DevOps 工程師 | 
| 部署 Kubernetes 資訊清單檔案。 | 執行下列`kubectl`命令，將`grpc-sample.yaml`檔案部署至 Amazon EKS 叢集： <pre>kubectl apply -f ./kubernetes/grpc-sample.yaml</pre> | DevOps 工程師 | 

### 建立 Application Load Balancer FQDN 的 DNS 記錄
<a name="create-the-dns-record-for-the-application-load-balancerapos-s-fqdn"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 記錄 Application Load Balancer 的 FQDN。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer.html) | DevOps 工程師 | 

### 測試解決方案
<a name="test-the-solution"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 測試 gRPC 伺服器。 | 執行下列命令，使用 gRPCurl 來測試端點：<pre>grpcurl grpc.example.com:443 list <br />grpc.reflection.v1alpha.ServerReflection<br />helloworld.helloworld</pre>`grpc.example.com` 將 取代為您的 DNS 名稱。 | DevOps 工程師 | 
| 使用 gRPC 用戶端測試 gRPC 伺服器。 | 在`helloworld_client_ssl.py`範例 gRPC 用戶端中，`grpc.example.com`將來自 的主機名稱取代為用於 gRPC 伺服器的主機名稱。 下列程式碼範例顯示用戶端請求的 gRPC 伺服器回應：<pre>python ./app/helloworld_client_ssl.py<br />message: "Hello to gRPC server from Client"<br /><br />message: "Thanks for talking to gRPC server!! Welcome to hello world. Received message is \"Hello to gRPC server from Client\""<br />received: true</pre>這表示用戶端可以與伺服器通訊，而且連線成功。 | DevOps 工程師 | 

### 清除
<a name="clean-up"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 移除 DNS 記錄。 | 移除指向您先前建立之 Application Load Balancer FQDN 的 DNS 記錄。 | 雲端管理員 | 
| 移除負載平衡器。 | 在 [Amazon EC2 主控台](https://console.aws.amazon.com/ec2/)上，選擇**負載平衡器**，然後移除 Kubernetes 控制器為輸入資源建立的負載平衡器。 | 雲端管理員 | 
| 刪除 Amazon EKS 叢集。 | 使用 刪除 Amazon EKS 叢集`eksctl`：<pre>eksctl delete cluster -f ./eks.yaml</pre> | AWS DevOps | 

## 相關資源
<a name="deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer-resources"></a>
+ [Amazon EKS 上的網路負載平衡](https://docs.aws.amazon.com/eks/latest/userguide/load-balancing.html)
+ [Application Load Balancer 的目標群組](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-target-groups.html#target-group-protocol-version)

## 其他資訊
<a name="deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer-additional"></a>

**範例輸入資源：**

```
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/healthcheck-protocol: HTTP
    alb.ingress.kubernetes.io/ssl-redirect: "443"
    alb.ingress.kubernetes.io/backend-protocol-version: "GRPC"
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:<AWS-Region>:<AccountId>:certificate/<certificate_ID>
  labels:
    app: grpcserver
    environment: dev
  name: grpcserver
  namespace: grpcserver
spec:
  ingressClassName: alb
  rules:
  - host: grpc.example.com # <----- replace this as per your host name for which the SSL certtficate is available in ACM
    http:
      paths:
      - backend:
          service:
            name: grpcserver
            port:
              number: 9000
        path: /
        pathType: Prefix
```

**部署資源範例：**

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: grpcserver
  namespace: grpcserver
spec:
  selector:
    matchLabels:
      app: grpcserver
  replicas: 1
  template:
    metadata:
      labels:
        app: grpcserver
    spec:
      containers:
      - name: grpc-demo
        image: <your_aws_account_id>.dkr.ecr.us-east-1.amazonaws.com/helloworld-grpc:1.0   #<------- Change to the URI that the Docker image is pushed to
        imagePullPolicy: Always
        ports:
        - name: grpc-api
          containerPort: 9000
        env:
        - name: POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
      restartPolicy: Always
```

**輸出範例：**

```
NAME             CLASS           HOSTS                          Address                PORTS          AGE
 grpcserver      <none>      <DNS-HostName>                  <ELB-address>              80            27d
```

# 在做為 Docker 容器 AWS IoT Greengrass V2 執行時部署容器化應用程式
<a name="deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container"></a>

*Salih Bakir、Giuseppe Di Bella 和 Gustav Svalander，Amazon Web Services*

## 總結
<a name="deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container-summary"></a>

AWS IoT Greengrass Version 2作為 Docker 容器部署時， 原生不支援執行 Docker 應用程式容器。此模式示範如何根據 AWS IoT Greengrass V2 啟用 Docker-in-Docker (DinD) 功能的最新版本 建立自訂容器映像。使用 DinD，您可以在 AWS IoT Greengrass V2 環境中執行容器化應用程式。

您可以將此模式部署為獨立的解決方案，或將其與 Amazon ECS Anywhere 等容器協同運作平台整合。在任一部署模型中，您維護包括 AWS IoT SiteWise Edge 處理功能的完整 AWS IoT Greengrass V2 功能，同時啟用可擴展的容器型部署。

## 先決條件和限制
<a name="deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container-prereqs"></a>

**先決條件**
+ 作用中 AWS 帳戶。
+ 如需一般 AWS IoT Greengrass Version 2 先決條件，請參閱 AWS IoT Greengrass Version 2 文件中的[先決條件](https://docs.aws.amazon.com/greengrass/v2/developerguide/getting-started-prerequisites.html)。
+ 在 Linux、macOS 或 Windows 上安裝和設定 Docker Engine。
+ Docker Compose （如果您使用 Docker Compose 命令列界面 (CLI) 來執行 Docker 映像）。
+ Linux 作業系統。
+ 具有支援虛擬化之主機伺服器的 Hypervisor。
+ 系統需求：
  + 2 GB RAM （最低）
  + 5 GB 的可用磁碟空間 （最低）
  + 對於 AWS IoT SiteWise Edge，具有 16 GB RAM 和 50 GB 可用磁碟空間的 x86\$164 四核心 CPU。如需 AWS IoT SiteWise 資料處理的詳細資訊，請參閱 AWS IoT SiteWise 文件中的[資料處理套件需求](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/configure-gateway-ggv2.html#w2aac17c19c13b7)。

**產品版本**
+ AWS IoT Greengrass Version 2 2.5.3 版或更新版本
+ Docker-in-Docker 1.0.0 版或更新版本
+ Docker Compose 1.22 版或更新版本
+ Docker 引擎 20.10.12 版或更新版本

**限制**
+ 有些 AWS 服務 完全無法使用 AWS 區域。如需區域可用性，請參閱[AWS 依區域的服務](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。如需特定端點，請參閱[服務端點和配額](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)，然後選擇服務的連結。

## Architecture
<a name="deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container-architecture"></a>

**目標技術堆疊**
+ **資料來源** – 產生資料處理資料的 IoT 裝置、感應器或工業設備
+ **AWS IoT Greengrass V2** – 做為具有 D-in-D 功能的 Docker 容器執行，部署在邊緣基礎設施上
+ **容器化應用程式** – 以巢狀 Docker 容器的形式在 AWS IoT Greengrass V2 環境中執行的自訂應用程式
+ **（選用） Amazon ECS Anywhere** – 管理容器部署的 AWS IoT Greengrass V2 容器協同運作
+ **其他 AWS 服務** – AWS IoT Core AWS IoT SiteWise和其他 AWS 服務 用於資料處理和管理

**目標架構**

下圖顯示使用 Amazon ECS Anywhere 的範例目標部署架構，Amazon ECS Anywhere 是一種容器管理工具。

![\[使用 Amazon ECS Anywhere 的部署架構。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/2ecf5354-40e0-4fd9-9798-086719059784/images/5ed2652e-9604-4809-8962-b167e1991658.png)


該圖顯示以下工作流程：

**1：容器映像儲存** – Amazon ECR 會存放 AWS IoT Greengrass 容器映像和邊緣處理所需的任何自訂應用程式容器。

**2 **和** 3：容器部署** – Amazon ECS Anywhere 會將 AWS IoT Greengrass 容器映像從 Amazon ECR 部署到節點，管理容器生命週期和部署程序。

**4：元件部署** – 部署 AWS IoT Greengrass 的核心會根據其組態自動部署其相關元件。元件包括在容器化環境中的 AWS IoT SiteWise Edge 和其他必要的邊緣處理元件。

**5：資料擷取** – 完全設定後， AWS IoT Greengrass 開始從節點的各種 IoT 資料來源擷取遙測和感應器資料。

**6：資料處理和雲端整合** – 容器化 AWS IoT Greengrass 核心會使用其部署的元件 （包括工業資料的 AWS IoT SiteWise Edge) 在本機處理資料。然後，它會將處理的資料傳送至 AWS 雲端 服務，以進一步分析和儲存。

## 工具
<a name="deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container-tools"></a>

**AWS 服務**
+ [Amazon ECS Anywhere](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch-type-external.html) 可協助您在自己的基礎設施上部署、使用和管理 Amazon ECS 任務和服務。
+ [Amazon Elastic Compute Cloud (Amazon EC2)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts.html) 在 AWS 雲端中提供可擴展的運算容量。您可以視需要啟動任意數量的虛擬伺服器，，並快速進行擴展或縮減。
+ [Amazon Elastic Container Registry (Amazon ECR)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) 是一種受管容器映像登錄服務，安全、可擴展且可靠。
+ [AWS IoT Greengrass](https://docs.aws.amazon.com/greengrass/v2/developerguide/what-is-iot-greengrass.html) 是一種開放原始碼物聯網 (IoT) 邊緣執行期和雲端服務，可協助您在裝置上建置、部署和管理 IoT 應用程式。
+ [AWS IoT SiteWise](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/what-is-sitewise.html) 可協助您大規模收集、建模、分析和視覺化工業設備的資料。

**其他工具**
+ [Docker](https://www.docker.com/) 是一組平台即服務 (PaaS) 產品，可在作業系統層級使用虛擬化在容器中交付軟體。
+ [Docker Compose](https://docs.docker.com/compose/) 是一種用於定義和執行多容器應用程式的工具。
+ [Docker Engine](https://docs.docker.com/engine/) 是一種開放原始碼容器化技術，用於建置和容器化應用程式。

**程式碼儲存庫**

此模式的程式碼可在 GitHub [AWS IoT Greengrass v2 Docker-in-Docker](https://github.com/aws-samples/aws-iot-greengrass-docker-in-docker) 儲存庫中使用。

## 史詩
<a name="deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container-epics"></a>

### 建置 AWS IoT Greengrass V2 Docker-in-Docker 映像
<a name="build-the-gg2-docker-in-docker-image"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 複製並導覽至儲存庫。 | 若要複製儲存庫，請使用下列命令：`git clone https://github.com/aws-samples/aws-iot-greengrass-v2-docker-in-docker.git`若要導覽至 `docker`目錄，請使用下列命令：`cd aws-iot-greengrass-v2-docker-in-docker/docker` | DevOps 工程師，AWS DevOps | 
| 建置 Docker 影像。 | 若要使用預設 （最新） 版本建置 Docker 映像，請執行下列命令：`docker build -t x86_64/aws-iot-greengrass:latest .`或者，若要使用特定版本建置 Docker 映像，請執行下列命令：`docker build --build-arg GREENGRASS_RELEASE_VERSION=2.12.0 -t x86_64/aws-iot-greengrass:2.12.0 .`若要驗證組建，請執行下列命令：`docker images \| grep aws-iot-greengrass`  | AWS DevOps、DevOps 工程師、應用程式開發人員 | 
| （選用） 推送至 Amazon ECR。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html) | 應用程式開發人員、AWS DevOps、DevOps 工程師 | 

### 設定 AWS 登入資料
<a name="configure-aws-credentials"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 選取身分驗證方法。 | 請選擇下列其中一個選項：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html) | AWS 管理員 | 
| 設定身分驗證方法。 | 對於您選取的身分驗證方法，請使用下列組態指引：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html) | AWS 管理員 | 

### 使用 Docker Compose 執行
<a name="run-with-docker-compose"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定 `docker-compose.yml`. | 使用環境變數更新 `docker-compose.yml` 檔案，如下所示：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html)[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html)[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html) | DevOps 工程師 | 
| 啟動並驗證容器。 | 若要從前景開始，請執行下列命令：`docker-compose up --build`或者，若要從背景開始，請執行下列命令：`docker-compose up --build -d`若要驗證狀態，請執行下列命令：`docker-compose ps`若要監控日誌，請執行下列命令：`docker-compose logs -f` | DevOps 工程師 | 

### 使用 Docker CLI 執行
<a name="run-with-docker-cli"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 使用 Docker CLI 執行容器。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html)[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html)[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html)[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html)[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html) | DevOps 工程師 | 
| 驗證容器。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html)[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html) | DevOps 工程師 | 

### 管理容器化應用程式
<a name="manage-containerized-applications"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 部署應用程式。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html)[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html)[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html) | 應用程式開發人員 | 
| 存取和測試 Docker-in-Docker。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html) | DevOps 工程師 | 

### （選用） 與 Amazon ECS Anywhere 整合
<a name="optional-integrate-with-ecs-anywhere"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定 Amazon ECS 叢集。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html)[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html)[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html) | AWS 管理員 | 
| 部署 Amazon ECS 任務。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html)[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html)[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html) | AWS 管理員 | 

### 停止和清除
<a name="stop-and-cleanup"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 停止容器。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html)[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html)[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html) | DevOps 工程師 | 

## 疑難排解
<a name="deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container-troubleshooting"></a>


| 問題 | 解決方案 | 
| --- | --- | 
| 容器無法從許可錯誤開始。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html)`--privileged` 會將延伸權限授予容器。 | 
| 佈建失敗並出現登入資料錯誤。 | 若要驗證登入資料設定是否正確，請使用下列步驟：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html)確定 IAM 許可包含 `iot:CreateThing`、`iot:CreatePolicy`、`iam:CreateRole`、 `iot:AttachPolicy`和 `iam:AttachRolePolicy`。 | 
| 無法連線到容器內的 Docker 協助程式。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html) | 
| 容器用盡磁碟空間。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html)確保磁碟空間下限：基本操作為 5 GB， AWS IoT SiteWise 邊緣為 50 GB | 
| 建置問題。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html) | 
| 網路連線問題。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html)確認防火牆允許傳出 HTTPS (443) 和 MQTT (8883) 流量。 | 
| Greengrass 元件無法部署。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html)檢查 `/greengrass/v2/logs/`目錄中的元件特定日誌。 | 
| 容器會在啟動後立即結束。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container.html)如果 ，請確認已正確設定所有必要的環境變數`PROVISION=true`。啟動容器時，請務必使用 `--init`旗標。 | 

## 相關資源
<a name="deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container-resources"></a>

**AWS resources**
+ [Amazon Elastic Container Service](https://aws.amazon.com/ecs/)
+ [設定 AWS IoT SiteWise 模型和資產的邊緣資料處理](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/edge-processing.html)
+ [什麼是 AWS IoT Greengrass](https://docs.aws.amazon.com/greengrass/v2/developerguide/what-is-iot-greengrass.html)

**其他資源**
+ [Docker 文件](https://docs.docker.com/)

## 其他資訊
<a name="deploy-containerized-applications-on-aws-iot-greengrass-version-2-running-as-a-docker-container-additional"></a>
+ 對於 AWS IoT SiteWise Edge 資料處理，Docker 必須在 AWS IoT Greengrass 環境中可用。
+ 若要執行巢狀容器，您必須使用管理員層級登入資料執行 AWS IoT Greengrass 容器。

# 使用 Elastic Beanstalk 部署容器
<a name="deploy-containers-by-using-elastic-beanstalk"></a>

*Thomas Scott 和 Jean-Baptiste Guillois，Amazon Web Services*

## 總結
<a name="deploy-containers-by-using-elastic-beanstalk-summary"></a>

在 Amazon Web Services (AWS) 雲端上，AWS Elastic Beanstalk 支援 Docker 做為可用的平台，讓容器可以使用建立的環境來執行。此模式示範如何使用 Elastic Beanstalk 服務部署容器。此模式的部署將使用以 Docker 平台為基礎的 Web 伺服器環境。

若要使用 Elastic Beanstalk 部署和擴展 Web 應用程式和服務，請上傳程式碼並自動處理部署。容量佈建、負載平衡、自動擴展和應用程式運作狀態監控也包含在內。當您使用 Elastic Beanstalk 時，您可以完全控制其代表您建立的 AWS 資源。使用 Elastic Beanstalk 並不收取其他費用。您只需為用於存放和執行應用程式的 AWS 資源付費。

此模式包含使用 [AWS Elastic Beanstalk 命令列界面 (EB CLI) ](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb-cli3-install-advanced.html)和 AWS 管理主控台進行部署的說明。

**使用案例**

Elastic Beanstalk 的使用案例包括下列項目： 
+ 部署原型環境以示範前端應用程式。（此模式使用 Dockerfile ** **作為範例。)
+ 部署 API 來處理指定網域的 API 請求。
+ 使用 Docker-Compose 部署協同運作解決方案 (`docker-compose.yml` ** **不在此模式中做為實際範例）。

## 先決條件和限制
<a name="deploy-containers-by-using-elastic-beanstalk-prereqs"></a>

**先決條件**
+ 一個 AWS 帳戶
+ 本機安裝的 AWS EB CLI
+ 安裝在本機電腦上的 Docker

**限制**
+ 免費計劃上每個 IP 地址每 6 小時的 Docker 提取限制為 100 次提取。

## Architecture
<a name="deploy-containers-by-using-elastic-beanstalk-architecture"></a>

**目標技術堆疊**
+ Amazon Elastic Compute Cloud (Amazon EC2) 執行個體
+ 安全群組
+ Application Load Balancer
+ Auto Scaling 群組

**目標架構**

![\[使用 Elastic Beanstalk 部署容器的架構。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/dfabcdc2-747f-40e2-a603-08ea31ba71d3/images/1d17ff09-1aea-4c72-adb5-eaf741601428.png)


**自動化和擴展**

AWS Elastic Beanstalk 可以根據提出的請求數量自動擴展。為環境建立的 AWS 資源包括一個 Application Load Balancer、Auto Scaling 群組，以及一或多個 Amazon EC2 執行個體。 

負載平衡器位於 Amazon EC2 執行個體前面，這是 Auto Scaling 群組的一部分。Amazon EC2 Auto Scaling 會自動啟動額外的 Amazon EC2 執行個體，以容納您的應用程式增加的負載。如果您的應用程式負載減少，Amazon EC2 Auto Scaling 會停止執行個體，但至少會讓一個執行個體持續執行。

**自動擴展觸發條件**

Elastic Beanstalk 環境中的 Auto Scaling 群組會使用兩個 Amazon CloudWatch 警示來啟動擴展操作。當每個執行個體的平均傳出網路流量，在五分鐘期間高於 6 MB 或低於 2 MB 時，預設的觸發條件就會擴展。如要有效地使用 Amazon EC2 Auto Scaling，請根據您的應用程式、執行個體類型和服務需求，設定適用的觸發。您可以根據多項統計資料來進行擴展，包括延遲、磁碟 I/O、CPU 使用率和請求計數。如需詳細資訊，請參閱 [Auto Scaling 觸發](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environments-cfg-autoscaling-triggers.html)條件。

## 工具
<a name="deploy-containers-by-using-elastic-beanstalk-tools"></a>

**AWS 服務**
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) 是一種開放原始碼工具，可協助您透過命令列 shell 中的命令與 AWS 服務互動。
+ [AWS EB Command Line Interface (EB CLI)](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb-cli3-install.html) 是命令列用戶端，可用來建立、設定和管理 Elastic Beanstalk 環境。
+ [Elastic Load Balancing](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html) 會將傳入的應用程式或網路流量分散到多個目標。例如，您可以在一或多個可用區域中跨 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體、容器和 IP 地址分配流量。

**其他服務**
+ [Docker](https://www.docker.com/) 會將軟體封裝至稱為容器的標準化單位，其中包括程式庫、系統工具、程式碼和執行時間。

**Code**

此模式的程式碼可在 GitHub [叢集範例應用程式](https://github.com/aws-samples/cluster-sample-app)儲存庫中使用。

## 史詩
<a name="deploy-containers-by-using-elastic-beanstalk-epics"></a>

### 使用 Dockerfile 建置
<a name="build-with-a-dockerfile"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 複製遠端儲存庫。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containers-by-using-elastic-beanstalk.html) | 應用程式開發人員、AWS 管理員、AWS DevOps | 
| 初始化 Elastic Beanstalk Docker 專案。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containers-by-using-elastic-beanstalk.html) | 應用程式開發人員、AWS 管理員、AWS DevOps | 
| 在本機測試專案。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containers-by-using-elastic-beanstalk.html) | 應用程式開發人員、AWS 管理員、AWS DevOps | 

### 使用 EB CLI 部署
<a name="deploy-using-eb-cli"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 執行部署命令 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containers-by-using-elastic-beanstalk.html) | 應用程式開發人員、AWS 管理員、AWS DevOps | 
| 存取部署的版本。 | 部署命令完成後，請使用 `eb open`命令存取專案。 | 應用程式開發人員、AWS 管理員、AWS DevOps | 

### 使用主控台部署
<a name="deploy-using-the-console"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 使用瀏覽器部署應用程式。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-containers-by-using-elastic-beanstalk.html) | 應用程式開發人員、AWS 管理員、AWS DevOps | 
| 存取部署的版本。 | 部署之後，請存取部署的應用程式，然後選擇提供的 URL。 | 應用程式開發人員、AWS 管理員、AWS DevOps | 

## 相關資源
<a name="deploy-containers-by-using-elastic-beanstalk-resources"></a>
+ [Web 伺服器環境](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/concepts-webserver.html)
+ [在 macOS 上安裝 EB CLI](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb-cli3-install-osx.html)
+ [手動安裝 EB CLI](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb-cli3-install-advanced.html)

## 其他資訊
<a name="deploy-containers-by-using-elastic-beanstalk-additional"></a>

**使用 Elastic Beanstalk 的優點**
+ 自動基礎設施佈建
+ 基礎平台的自動管理
+ 支援應用程式的自動修補和更新
+ 應用程式自動擴展
+ 自訂節點數量的能力
+ 能夠視需要存取基礎設施元件
+ 輕鬆部署到其他容器部署解決方案

# 使用 Lambda 函數、Amazon VPC 和無伺服器架構產生靜態傳出 IP 地址
<a name="generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture"></a>

*Thomas Scott，Amazon Web Services*

## 摘要
<a name="generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture-summary"></a>

此模式說明如何使用無伺服器架構，在 Amazon Web Services (AWS) 雲端中產生靜態傳出 IP 地址。如果組織想要使用安全檔案傳輸通訊協定 (SFTP) 將檔案傳送至不同的商業實體，則可以從此方法中受益。這表示商業實體必須能夠存取允許檔案通過其防火牆的 IP 地址。 

模式的方法可協助您建立使用[彈性 IP 地址](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html)做為傳出 IP 地址的 AWS Lambda 函數。透過遵循此模式中的步驟，您可以建立 Lambda 函數和虛擬私有雲端 (VPC)，透過具有靜態 IP 地址的網際網路閘道路由傳出流量。若要使用靜態 IP 地址，請將 Lambda 函數連接至 VPC 及其子網路。 

## 先決條件和限制
<a name="generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture-prereqs"></a>

**先決條件**
+ 作用中的 AWS 帳戶 
+ 建立和部署 Lambda 函數，以及建立 VPC 及其子網路的 AWS Identity and Access Management (IAM) 許可。如需詳細資訊，請參閱 AWS Lambda 文件中的[執行角色和使用者許可](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html#vpc-permissions)。
+ 如果您打算使用基礎設施做為程式碼 (IaC) 來實作此模式的方法，則需要整合的開發環境 (IDE)，例如 AWS Cloud9。如需詳細資訊，請參閱 [ AWS Cloud9 文件中的什麼是 AWS Cloud9？](https://docs.aws.amazon.com/cloud9/latest/user-guide/welcome.html)。 AWS Cloud9 

## Architecture
<a name="generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture-architecture"></a>

下圖顯示此模式的無伺服器架構。

![\[AWS 雲端 VPC architecture with two availability zones, public and private subnets, NAT gateways, and a Lambda function.\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/eb1d0b05-df33-45ae-b27e-36090055b300/images/c15cc6da-ce4e-4ea0-9feb-de1c845d3ce8.png)


該圖顯示以下工作流程：

1. 傳出流量會在 `NAT gateway 1`中離開`Public subnet 1`。

1. 傳出流量會在 `NAT gateway 2`中離開`Public subnet 2`。

1. Lambda 函數可以在 `Private subnet 1`或 中執行`Private subnet 2`。

1. `Private subnet 1` 和 將流量`Private subnet 2`路由到公有子網路中的 NAT 閘道。

1. NAT 閘道會從公有子網路將傳出流量傳送至網際網路閘道。

1. 傳出資料會從網際網路閘道傳輸到外部伺服器。



**技術堆疊  **
+ Lambda
+ Amazon Virtual Private Cloud (Amazon VPC)

 

**自動化和擴展**

您可以在不同的可用區域中使用兩個公有和兩個私有子網路，以確保高可用性 (HA)。即使一個可用區域無法使用，模式的解決方案仍會繼續運作。

## 工具
<a name="generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture-tools"></a>
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) – AWS Lambda 是一種運算服務，支援執行程式碼，無需佈建或管理伺服器。Lambda 只有在需要時才會執行程式碼，可自動從每天數項請求擴展成每秒數千項請求。只需為使用的運算時間支付費用，一旦未執行程式碼，就會停止計費。
+ [Amazon VPC](https://docs.aws.amazon.com/vpc/) – Amazon Virtual Private Cloud (Amazon VPC) 會佈建 AWS 雲端的邏輯隔離區段，您可以在已定義的虛擬網路中啟動 AWS 資源。這個虛擬網路與您在資料中心中操作的傳統網路非常相似，且具備使用 AWS 可擴展基礎設施的優勢。

## 史詩
<a name="generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture-epics"></a>

### 建立新 VPC
<a name="create-a-new-vpc"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立新 VPC | 登入 AWS 管理主控台，開啟 Amazon VPC 主控台，然後建立名為 `Lambda VPC` 且`10.0.0.0/25`** **具有 IPv4 CIDR 範圍的 VPC。如需建立 VPC 的詳細資訊，請參閱 [Amazon VPC 文件](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-getting-started.html#getting-started-create-vpc)中的 Amazon VPC 入門。  | AWS 管理員 | 

### 建立兩個公有子網路
<a name="create-two-public-subnets"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立第一個公有子網路。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture.html) | AWS 管理員 | 
| 建立第二個公有子網路。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture.html) | AWS 管理員 | 

### 建立兩個私有子網路
<a name="create-two-private-subnets"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立第一個私有子網路。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture.html) | AWS 管理員 | 
| 建立第二個私有子網路。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture.html) | AWS 管理員 | 

### 為您的 NAT 閘道建立兩個彈性 IP 地址
<a name="create-two-elastic-ip-addresses-for-your-nat-gateways"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
|  建立第一個彈性 IP 地址。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture.html)此彈性 IP 地址用於您的第一個 NAT 閘道。  | AWS 管理員 | 
| 建立第二個彈性 IP 地址。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture.html)此彈性 IP 地址用於您的第二個 NAT 閘道。 | AWS 管理員 | 

### 建立網際網路閘道
<a name="create-an-internet-gateway"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立網際網路閘道 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture.html) | AWS 管理員 | 
| 將網際網路閘道連接至 VPC。 | 選取您剛建立的網際網路閘道，然後選擇 **Actions, Attach to VPC (動作、連接到 VPC)**。 | AWS 管理員 | 

### 建立兩個 NAT 閘道
<a name="create-two-nat-gateways"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立第一個 NAT 閘道。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture.html) | AWS 管理員 | 
| 建立第二個 NAT 閘道。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture.html) | AWS 管理員 | 

### 為您的公有和私有子網路建立路由表
<a name="create-route-tables-for-your-public-and-private-subnets"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立公有-1 子網路的路由表。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture.html) | AWS 管理員 | 
| 建立公有-二子網路的路由表。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture.html) | AWS 管理員 | 
| 建立私有子網路的路由表。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture.html) | AWS 管理員 | 
| 建立私有-兩個子網路的路由表。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture.html) | AWS 管理員 | 

### 建立 Lambda 函數，將其新增至 VPC，然後測試解決方案
<a name="create-the-lambda-function-add-it-to-the-vpc-and-test-the-solution"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立新 Lambda 函數。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture.html) | AWS 管理員 | 
| 將 Lambda 函數新增至 VPC。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture.html) | AWS 管理員 | 
| 編寫程式碼以呼叫外部服務。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture.html) | AWS 管理員 | 

## 相關資源
<a name="generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture-resources"></a>
+ [設定 Lambda 函式以存取 VPC 中的資源](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html)

# 遷移至 Amazon ECR 儲存庫時，自動識別重複的容器映像
<a name="identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository"></a>

*Rishabh Yadav 和 Rishi Singla，Amazon Web Services*

## 總結
<a name="identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository-summary"></a>

模式提供自動化解決方案，以識別存放在不同容器儲存庫中的映像是否為重複。當您計劃將映像從其他容器儲存庫遷移到 Amazon Elastic Container Registry (Amazon ECR) 時，此檢查很有用。

如需基礎資訊，模式也會說明容器映像的元件，例如映像摘要、資訊清單和標籤。當您計劃遷移至 Amazon ECR 時，您可以比較映像摘要，以決定跨容器登錄檔同步容器映像。遷移容器映像之前，您需要檢查 Amazon ECR 儲存庫中是否存在這些映像，以防止重複。不過，比較映像摘要可能很難偵測重複項目，這可能會導致初始遷移階段發生問題。 此模式會比較存放在不同容器登錄檔中的兩個類似影像的摘要，並說明摘要為何不同，以協助您準確比較影像。

## 先決條件和限制
<a name="identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository-prereqs"></a>
+ 作用中 AWS 帳戶
+ 存取 [Amazon ECR 公有登錄](https://gallery.ecr.aws/)檔
+ 熟悉下列項目 AWS 服務：
  + [AWS CodeCommit](https://aws.amazon.com/codecommit/)
  + [AWS CodePipeline](https://aws.amazon.com/codepipeline/)
  + [AWS CodeBuild](https://aws.amazon.com/codebuild/)
  + [AWS Identity and Access Management (IAM)](https://aws.amazon.com/iam/)
  + [Amazon Simple Storage Service (Amazon S3)](https://aws.amazon.com/s3/)
+ 設定的 CodeCommit 登入資料 （請參閱[說明](https://docs.aws.amazon.com/codecommit/latest/userguide/setting-up-gc.html))

## Architecture
<a name="identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository-architecture"></a>

**容器映像元件**

下圖說明容器映像的一些元件。這些元件會在圖表後說明。

![\[資訊清單、組態、檔案系統層和摘要。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/7db5020c-6f5b-4e91-b91a-5b8ae844be1b/images/71b99c67-a934-4f94-8af8-2a8431fb91f5.png)


**術語和定義**

下列術語在[開放式容器計畫 (OCI) 映像規格](https://github.com/opencontainers/image-spec/blob/main/spec.md)中定義。
+ **登錄檔：**映像儲存和管理的服務。
+ **用戶端：**與登錄檔通訊並搭配本機映像使用的工具。
+ **推送：**將映像上傳至登錄檔的程序。
+ **提取：**從登錄檔下載映像的程序。
+ **Blob：**由登錄檔存放且可由摘要處理之內容的二進位形式。
+ **索引：**用於識別不同電腦平台 （例如 x86-64 或 ARM 64 位元） 或媒體類型的多個影像資訊清單的建構。如需詳細資訊，請參閱 [OCI 影像索引規格](https://github.com/opencontainers/image-spec/blob/main/image-index.md)。
+ **資訊清單：**JSON 文件，定義透過資訊清單端點上傳的影像或成品。資訊清單可以使用描述項來參考儲存庫中的其他 Blob。如需詳細資訊，請參閱 [OCI 映像資訊清單規格](https://github.com/opencontainers/image-spec/blob/main/manifest.md)。
+ **檔案系統層：**影像的系統程式庫和其他相依性。
+ **組態：**包含成品中繼資料並在資訊清單中參考的 Blob。如需詳細資訊，請參閱 [OCI 映像組態規格](https://github.com/opencontainers/image-spec/blob/main/config.md)。
+ **物件或成品：**儲存在 Blob 中的概念內容項目，並與具有組態的隨附資訊清單相關聯。
+ **摘要：**從資訊清單內容的密碼編譯雜湊建立的唯一識別符。映像摘要有助於唯一識別不可變的容器映像。當您使用映像摘要提取映像時，每次在任何作業系統或架構上都會下載相同的映像。如需詳細資訊，請參閱 [OCI Image Specification](https://github.com/opencontainers/image-spec/blob/main/descriptor.md#digests)。
+ **標籤：**人類可讀取的資訊清單識別符。相較於不可變的影像摘要，標籤是動態的。指向影像的標籤可以變更，並從一個影像移至另一個影像，但基礎影像摘要保持不變。

**目標架構**

下圖顯示此模式所提供解決方案的高階架構，透過比較存放在 Amazon ECR 和私有儲存庫中的映像來識別重複的容器映像。

![\[使用 CodePipeline 和 CodeBuild 自動偵測重複項目。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/7db5020c-6f5b-4e91-b91a-5b8ae844be1b/images/5ee62bc8-db8d-48a3-9e79-f3392b6e9bf7.png)


## 工具
<a name="identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository-tools"></a>

**AWS 服務**
+ [CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) 可協助您設定 AWS 資源、快速一致地佈建資源，以及在整個 AWS 帳戶 和 區域的生命週期中管理資源。
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html)是一種全受管建置服務，可協助您編譯原始程式碼、執行單元測試，並產生準備好部署的成品。
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) 是一種版本控制服務，可協助您私下存放和管理 Git 儲存庫，而無需管理您自己的來源控制系統。
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) 可協助您快速建模和設定軟體版本的不同階段，並自動化持續發行軟體變更所需的步驟。
+ [Amazon Elastic Container Registry (Amazon ECR)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) 是一種受管容器映像登錄服務，安全、可擴展且可靠。

**程式碼 **

此模式的程式碼可在 GitHub 儲存庫中取得** **[自動化解決方案，以識別儲存庫之間的重複容器映像](https://github.com/aws-samples/automated-solution-to-identify-duplicate-container-images-between-repositories/)。

## 最佳實務
<a name="identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository-best-practices"></a>
+ [CloudFormation 最佳實務](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/best-practices.html)
+ [AWS CodePipeline 最佳實務](https://docs.aws.amazon.com/codepipeline/latest/userguide/best-practices.html)

## 史詩
<a name="identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository-epics"></a>

### 從 Amazon ECR 公有和私有儲存庫提取容器映像
<a name="pull-container-images-from-ecr-public-and-private-repositories"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 從 Amazon ECR 公有儲存庫中提取映像。 | 從終端機執行下列命令，`amazonlinux`從 Amazon ECR 公有儲存庫提取映像。<pre>$~ % docker pull public.ecr.aws/amazonlinux/amazonlinux:2018.03 </pre>將映像提取至本機機器後，您會看到下列提取摘要，其代表映像索引。<pre>2018.03: Pulling from amazonlinux/amazonlinux<br />4ddc0f8d367f: Pull complete <br /><br />Digest: sha256:f972d24199508c52de7ad37a298bda35d8a1bd7df158149b381c03f6c6e363b5<br /><br />Status: Downloaded newer image for public.ecr.aws/amazonlinux/amazonlinux:2018.03<br />public.ecr.aws/amazonlinux/amazonlinux:2018.03</pre> | 應用程式開發人員、AWS DevOps、AWS 管理員 | 
| 將映像推送至 Amazon ECR 私有儲存庫。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository.html) | AWS 管理員、AWS DevOps、應用程式開發人員 | 
| 從 Amazon ECR 私有儲存庫提取相同的映像。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository.html) | 應用程式開發人員、AWS DevOps、AWS 管理員 | 

### 比較影像資訊清單
<a name="compare-the-image-manifests"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 尋找存放在 Amazon ECR 公有儲存庫中的映像資訊清單。 | 從終端機執行下列命令，`public.ecr.aws/amazonlinux/amazonlinux:2018.03`從 Amazon ECR 公有儲存庫提取映像資訊清單。<pre>$~ % docker manifest inspect public.ecr.aws/amazonlinux/amazonlinux:2018.03<br />{<br />   "schemaVersion": 2,<br />   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",<br />   "manifests": [<br />      {<br />         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",<br />         "size": 529,<br />         "digest": "sha256:52db9000073d93b9bdee6a7246a68c35a741aaade05a8f4febba0bf795cdac02",<br />         "platform": {<br />            "architecture": "amd64",<br />            "os": "linux"<br />         }<br />      }<br />   ]<br />}</pre> | AWS 管理員、AWS DevOps、應用程式開發人員 | 
| 尋找存放在 Amazon ECR 私有儲存庫中的映像資訊清單。 | 從終端機執行下列命令，`<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest`從 Amazon ECR 私有儲存庫提取映像資訊清單。<pre>$~ % docker manifest inspect <account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest                                          <br />{<br />	"schemaVersion": 2,<br />	"mediaType": "application/vnd.docker.distribution.manifest.v2+json",<br />	"config": {<br />		"mediaType": "application/vnd.docker.container.image.v1+json",<br />		"size": 1477,<br />		"digest": "sha256:f7cee5e1af28ad4e147589c474d399b12d9b551ef4c3e11e02d982fce5eebc68"<br />	},<br />	"layers": [<br />		{<br />			"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",<br />			"size": 62267075,<br />			"digest": "sha256:4ddc0f8d367f424871a060e2067749f32bd36a91085e714dcb159952f2d71453"<br />		}<br />	]<br />}</pre> | AWS DevOps、AWS 系統管理員、應用程式開發人員 | 
| 比較 Docker 提取的摘要與 Amazon ECR 私有儲存庫中影像的資訊清單摘要。 | 另一個問題是為什麼 **docker pull** 命令提供的摘要與影像 的資訊清單摘要不同`<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest`。用於 **docker pull** 的摘要代表影像資訊清單的摘要，存放在登錄檔中。此摘要會被視為雜湊鏈的根目錄，因為資訊清單包含將下載並匯入 Docker 的內容雜湊。在此資訊清單中，Docker 中使用的映像 ID 為 `config.digest`。這代表 Docker 使用的映像組態。因此，您可以說資訊清單是信封，而影像是信封的內容。資訊清單摘要一律與影像 ID 不同。不過，特定資訊清單應一律產生相同的影像 ID。由於資訊清單摘要是雜湊鏈，我們無法保證指定影像 ID 永遠相同。在大多數情況下，它會產生相同的摘要，但 Docker 無法保證這一點。資訊清單摘要中的可能差異源於 Docker 不會儲存本機使用 gzip 壓縮的 Blob。因此，匯出層可能會產生不同的摘要，但未壓縮的內容保持不變。影像 ID 會驗證未壓縮的內容是否相同；也就是說，影像 ID 現在是內容可定址識別符 (`chainID`)。若要確認此資訊，您可以比較 Amazon ECR 公有和私有儲存庫上 **docker inspect** 命令的輸出：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository.html)結果會驗證兩個影像具有相同的影像 ID 摘要和圖層摘要。ID： `f7cee5e1af28ad4e147589c474d399b12d9b551ef4c3e11e02d982fce5eebc68`圖層： `d5655967c2c4e8d68f8ec7cf753218938669e6c16ac1324303c073c736a2e2a2`此外，摘要是根據本機受管物件的位元組 （本機檔案是容器映像層的 tar) 或推送至登錄伺服器的 Blob。不過，當您將 Blob 推送至登錄檔時，會壓縮 tar，並在壓縮的 tar 檔案中計算摘要。因此，**Docker 提取**摘要值的差異源自於在登錄檔 (Amazon ECR 私有或公有） 層級套用的壓縮。此說明專屬於使用 Docker 用戶端。您將不會在其他用戶端看到此行為，例如 **nerdctl** 或 **Finch**，因為它們不會在推送和提取操作期間自動壓縮映像。 | AWS DevOps、AWS 系統管理員、應用程式開發人員 | 

### 自動識別 Amazon ECR 公有和私有儲存庫之間的重複映像
<a name="automatically-identify-duplicate-images-between-ecr-public-and-private-repositories"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 複製儲存庫。 | 將此模式的 Github 儲存庫複製到本機資料夾：<pre>$git clone https://github.com/aws-samples/automated-solution-to-identify-duplicate-container-images-between-repositories</pre> | AWS 管理員、AWS DevOps | 
| 設定 CI/CD 管道。 | GitHub 儲存庫包含一個 `.yaml` 檔案，可建立 CloudFormation 堆疊以在其中設定管道 AWS CodePipeline。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository.html)管道將設定兩個階段 (CodeCommit 和 CodeBuild，如架構圖所示），以識別私有儲存庫中也存在於公有儲存庫中的映像。管道是以下列資源設定：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository.html) | AWS 管理員、AWS DevOps | 
| 填入 CodeCommit 儲存庫。 | 若要填入 CodeCommit 儲存庫，請執行下列步驟：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository.html) | AWS 管理員、AWS DevOps | 
| 清除。 | 若要避免產生未來費用，請依照下列步驟刪除資源：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository.html) | AWS 管理員 | 

## 疑難排解
<a name="identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository-troubleshooting"></a>


| 問題 | 解決方案 | 
| --- | --- | 
| 當您嘗試從終端機或命令列推送、提取或以其他方式與 CodeCommit 儲存庫互動時，系統會提示您提供使用者名稱和密碼，而且您必須為 IAM 使用者提供 Git 登入資料。 | 此錯誤的最常見原因如下：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository.html)根據作業系統和本機環境，您可能需要安裝登入資料管理工具、設定作業系統中包含的登入資料管理工具，或自訂本機環境以使用登入資料儲存體。例如，如果您的電腦正在執行 macOS，您可以使用 Keychain Access 公用程式來存放您的登入資料。如果您的電腦執行 Windows，您可以使用隨著適用於 Windows 的 Git 安裝的 Credential Manager。如需詳細資訊，請參閱 CodeCommit 文件中的[使用 Git 登入資料設定 HTTPS 使用者](https://docs.aws.amazon.com/codecommit/latest/userguide/setting-up-gc.html)，以及 Git 文件中的[登入資料儲存](https://git-scm.com/book/en/v2/Git-Tools-Credential-Storage)。 | 
| 當您將映像推送到 Amazon ECR 儲存庫時，遇到 HTTP 403 或「沒有基本身分驗證登入資料」錯誤。 | 即使您已使用 aws ecr get-login-password 命令成功向 Docker 進行身分驗證，也可能會從 **docker push** 或 **docker pull** 命令中遇到這些錯誤訊息。 ** get-login-password** 已知原因包括：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository.html) | 

## 相關資源
<a name="identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository-resources"></a>
+ [識別儲存庫之間重複容器映像的自動化解決方案 ](https://github.com/aws-samples/automated-solution-to-identify-duplicate-container-images-between-repositories/)(GitHub 儲存庫）
+ [Amazon ECR 公有圖庫](https://gallery.ecr.aws/)
+ [Amazon ECR 中的私有映像 ](https://docs.aws.amazon.com/AmazonECR/latest/userguide/images.html)(Amazon ECR 文件）
+ [AWS::CodePipeline::Pipeline 資源](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-pipeline.html) (CloudFormation 文件）
+ [OCI 影像格式規格](https://github.com/opencontainers/image-spec/blob/main/spec.md)

## 其他資訊
<a name="identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository-additional"></a>

**Amazon ECR 公有儲存庫中映像的 Docker 檢查輸出**

```
[
    {
        "Id": "sha256:f7cee5e1af28ad4e147589c474d399b12d9b551ef4c3e11e02d982fce5eebc68",
        "RepoTags": [
            "<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest",
            "public.ecr.aws/amazonlinux/amazonlinux:2018.03"
        ],
        "RepoDigests": [
            "<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository@sha256:52db9000073d93b9bdee6a7246a68c35a741aaade05a8f4febba0bf795cdac02",
            "public.ecr.aws/amazonlinux/amazonlinux@sha256:f972d24199508c52de7ad37a298bda35d8a1bd7df158149b381c03f6c6e363b5"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2023-02-23T06:20:11.575053226Z",
        "Container": "ec7f2fc7d2b6a382384061247ef603e7d647d65f5cd4fa397a3ccbba9278367c",
        "ContainerConfig": {
            "Hostname": "ec7f2fc7d2b6",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"/bin/bash\"]"
            ],
            "Image": "sha256:c1bced1b5a65681e1e0e52d0a6ad17aaf76606149492ca0bf519a466ecb21e51",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
        "DockerVersion": "20.10.17",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "sha256:c1bced1b5a65681e1e0e52d0a6ad17aaf76606149492ca0bf519a466ecb21e51",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": null
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 167436755,
        "VirtualSize": 167436755,
        "GraphDriver": {
            "Data": {
                "MergedDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/merged",
                "UpperDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/diff",
                "WorkDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:d5655967c2c4e8d68f8ec7cf753218938669e6c16ac1324303c073c736a2e2a2"
            ]
        },
        "Metadata": {
            "LastTagTime": "2023-03-02T10:28:47.142155987Z"
        }
    }
]
```

**Amazon ECR 私有儲存庫中映像的 Docker 檢查輸出**

```
[
    {
        "Id": "sha256:f7cee5e1af28ad4e147589c474d399b12d9b551ef4c3e11e02d982fce5eebc68",
        "RepoTags": [
            "<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository:latest",
            "public.ecr.aws/amazonlinux/amazonlinux:2018.03"
        ],
        "RepoDigests": [
            "<account-id>.dkr.ecr.us-east-1.amazonaws.com/test_ecr_repository@sha256:52db9000073d93b9bdee6a7246a68c35a741aaade05a8f4febba0bf795cdac02",
            "public.ecr.aws/amazonlinux/amazonlinux@sha256:f972d24199508c52de7ad37a298bda35d8a1bd7df158149b381c03f6c6e363b5"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2023-02-23T06:20:11.575053226Z",
        "Container": "ec7f2fc7d2b6a382384061247ef603e7d647d65f5cd4fa397a3ccbba9278367c",
        "ContainerConfig": {
            "Hostname": "ec7f2fc7d2b6",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"/bin/bash\"]"
            ],
            "Image": "sha256:c1bced1b5a65681e1e0e52d0a6ad17aaf76606149492ca0bf519a466ecb21e51",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
        "DockerVersion": "20.10.17",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "sha256:c1bced1b5a65681e1e0e52d0a6ad17aaf76606149492ca0bf519a466ecb21e51",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": null
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 167436755,
        "VirtualSize": 167436755,
        "GraphDriver": {
            "Data": {
                "MergedDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/merged",
                "UpperDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/diff",
                "WorkDir": "/var/lib/docker/overlay2/c2c2351a82b26cbdf7782507500e5adb5c2b3a2875bdbba79788a4b27cd6a913/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:d5655967c2c4e8d68f8ec7cf753218938669e6c16ac1324303c073c736a2e2a2"
            ]
        },
        "Metadata": {
            "LastTagTime": "2023-03-02T10:28:47.142155987Z"
        }
    }
]
```

# 使用 Kubernetes DaemonSet 在 Amazon EKS 工作者節點上安裝 SSM Agent
<a name="install-ssm-agent-on-amazon-eks-worker-nodes-by-using-kubernetes-daemonset"></a>

*Mahendra Revanasiddappa，Amazon Web Services*

## 總結
<a name="install-ssm-agent-on-amazon-eks-worker-nodes-by-using-kubernetes-daemonset-summary"></a>

**請注意，2021 年 9 月：**最新的 Amazon EKS 最佳化 AMIs 會自動安裝 SSM 代理程式。如需詳細資訊，請參閱 2021 年 6 月 AMIs[版本備註](https://github.com/awslabs/amazon-eks-ami/releases/tag/v20210621)。

在 Amazon Elastic Kubernetes Service (Amazon EKS) 中，基於安全準則，工作者節點不會連接 Secure Shell (SSH) 金鑰對。此模式顯示如何使用 Kubernetes DaemonSet 資源類型在所有工作者節點上安裝 AWS Systems Manager Agent (SSM Agent)，而不是手動安裝或取代節點的 Amazon Machine Image (AMI)。DaemonSet 在工作者節點上使用 Cron 任務來排程 SSM Agent 的安裝。您也可以使用此模式在工作者節點上安裝其他套件。

當您對叢集中的問題進行疑難排解時，安裝隨需 SSM Agent 可讓您使用工作者節點建立 SSH 工作階段、收集日誌或查看執行個體組態，而不需要 SSH 金鑰對。

## 先決條件和限制
<a name="install-ssm-agent-on-amazon-eks-worker-nodes-by-using-kubernetes-daemonset-prereqs"></a>

**先決條件**
+ 具有 Amazon Elastic Compute Cloud (Amazon EC2) 工作者節點的現有 Amazon EKS 叢集。
+ 容器執行個體應具備與 SSM 服務通訊所需的許可。AWS Identity and Access Management (IAM) 受管角色 **AmazonSSMManagedInstanceCore** 提供 SSM Agent 在 EC2 執行個體上執行的必要許可。如需詳細資訊，請參閱 [AWS Systems Manager 文件](https://docs.aws.amazon.com/systems-manager/latest/userguide/setup-instance-profile.html)。

**限制**
+ 此模式不適用於 AWS Fargate，因為 Fargate 平台不支援 DaemonSets。
+ 此模式僅適用於 Linux 型工作者節點。
+ DaemonSet Pod 會以特殊權限模式執行。如果 Amazon EKS 叢集有一個 Webhook，以特殊權限模式封鎖 Pod，則不會安裝 SSM Agent。

## Architecture
<a name="install-ssm-agent-on-amazon-eks-worker-nodes-by-using-kubernetes-daemonset-architecture"></a>

下圖說明此模式的架構。

![\[使用 Kubernetes DaemonSet 在 Amazon EKS 工作者節點上安裝 SSM Agent。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/016d53f3-45c1-4913-b542-67124e1462b8/images/3a6dfd00-e54b-44d5-843a-4c26ce9826c9.png)


## 工具
<a name="install-ssm-agent-on-amazon-eks-worker-nodes-by-using-kubernetes-daemonset-tools"></a>

**工具**
+ [kubectl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html) 是一種命令列公用程式，用於與 Amazon EKS 叢集互動。此模式使用 `kubectl` 在 Amazon EKS 叢集上部署 DaemonSet，這會在所有工作者節點上安裝 SSM Agent。
+ [Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html) 可讓您在 AWS 上輕鬆執行 Kubernetes，而無需安裝、操作和維護您自己的 Kubernetes 控制平面或節點。Kubernetes 是一套開放原始碼系統，用於容器化應用程式的自動化部署、擴展與管理。
+ [AWS Systems Manager Session Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager.html) 可讓您透過互動式、一鍵式瀏覽器型 shell 或透過 AWS Command Line Interface (AWS CLI) 來管理您的 EC2 執行個體、內部部署執行個體和虛擬機器 (VMs)。

**Code**

使用下列程式碼來建立 DaemonSet 組態檔案，該檔案將在 Amazon EKS 叢集上安裝 SSM Agent。請遵循 [Epics](#install-ssm-agent-on-amazon-eks-worker-nodes-by-using-kubernetes-daemonset-epics) 區段中的指示。

```
cat << EOF > ssm_daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  labels:
    k8s-app: ssm-installer
  name: ssm-installer
  namespace: kube-system
spec:
  selector:
    matchLabels:
      k8s-app: ssm-installer
  template:
    metadata:
      labels:
        k8s-app: ssm-installer
    spec:
      containers:
      - name: sleeper
        image: busybox
        command: ['sh', '-c', 'echo I keep things running! && sleep 3600']
      initContainers:
      - image: amazonlinux
        imagePullPolicy: Always
        name: ssm
        command: ["/bin/bash"]
        args: ["-c","echo '* * * * * root yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm & rm -rf /etc/cron.d/ssmstart' > /etc/cron.d/ssmstart"]
        securityContext:
          allowPrivilegeEscalation: true
        volumeMounts:
        - mountPath: /etc/cron.d
          name: cronfile
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      volumes:
      - name: cronfile
        hostPath:
          path: /etc/cron.d
          type: Directory
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      terminationGracePeriodSeconds: 30
EOF
```

## 史詩
<a name="install-ssm-agent-on-amazon-eks-worker-nodes-by-using-kubernetes-daemonset-epics"></a>

### 設定 kubectl
<a name="set-up-kubectl"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 安裝並設定 kubectl 以存取 EKS 叢集。 | 如果 `kubectl` 尚未安裝並設定為存取 Amazon EKS 叢集，請參閱 Amazon EKS 文件中的[安裝 kubectl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)。 | DevOps | 

### 部署 DaemonSet
<a name="deploy-the-daemonset"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 DaemonSet 組態檔案。 | 在此模式稍早的 [Code](#install-ssm-agent-on-amazon-eks-worker-nodes-by-using-kubernetes-daemonset-tools)section 中使用程式碼來建立名為 的 DaemonSet 組態檔案`ssm_daemonset.yaml`，該檔案將部署到 Amazon EKS 叢集。DaemonSet 啟動的 Pod 具有主要容器和 `init`容器。主要容器具有 `sleep`命令。`init` 容器包含 `command`區段，可建立 cron 任務檔案，以在路徑 上安裝 SSM Agent`/etc/cron.d/`。Cron 任務只會執行一次，並在任務完成後自動刪除其建立的檔案。當初始化容器完成時，主要容器會等待 60 分鐘再結束。60 分鐘後，會啟動新的 Pod。如果缺少 SSM Agent，此 Pod 會安裝 SSM Agent，或將 SSM Agent 更新為最新版本。如有需要，您可以修改 `sleep`命令，每天重新啟動一次 Pod 或更頻繁地執行。  | DevOps | 
| 在 Amazon EKS 叢集上部署 DaemonSet。 | 若要在 Amazon EKS 叢集上部署您在上一個步驟中建立的 DaemonSet 組態檔案，請使用下列命令：<pre>kubectl apply -f ssm_daemonset.yaml </pre>此命令會建立 DaemonSet，以在工作者節點上執行 Pod，以安裝 SSM Agent。 | DevOps | 

## 相關資源
<a name="install-ssm-agent-on-amazon-eks-worker-nodes-by-using-kubernetes-daemonset-resources"></a>
+ [安裝 kubectl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html) (Amazon EKS 文件）
+ [設定 Session Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-getting-started.html) (AWS Systems Manager 文件）

# 使用 preBootstrapCommands 在 Amazon EKS 工作者節點上安裝 SSM 代理程式和 CloudWatch 代理程式
<a name="install-the-ssm-agent-and-cloudwatch-agent-on-amazon-eks-worker-nodes-using-prebootstrapcommands"></a>

*Akamahadevi hiremath，Amazon Web Services*

## 總結
<a name="install-the-ssm-agent-and-cloudwatch-agent-on-amazon-eks-worker-nodes-using-prebootstrapcommands-summary"></a>

此模式提供程式碼範例，以及在 Amazon EKS 叢集建立期間，在 Amazon Web Services (AWS) 雲端的 Amazon Elastic Kubernetes Service (Amazon EKS) 工作者節點上安裝 AWS Systems Manager Agent (SSM Agent) 和 Amazon CloudWatch 代理程式的步驟。 Amazon CloudWatch 您可以使用`eksctl`[組態檔案結構描述 ](https://eksctl.io/usage/schema/)(Weaveworks 文件） 中的 `preBootstrapCommands` 屬性來安裝 SSM Agent 和 CloudWatch 代理程式。然後，您可以使用 SSM Agent 連線到工作者節點，而無需使用 Amazon Elastic Compute Cloud (Amazon EC2) 金鑰對。此外，您可以使用 CloudWatch 代理程式來監控 Amazon EKS 工作者節點上的記憶體和磁碟使用率。

## 先決條件和限制
<a name="install-the-ssm-agent-and-cloudwatch-agent-on-amazon-eks-worker-nodes-using-prebootstrapcommands-prereqs"></a>

**先決條件**
+ 作用中的 AWS 帳戶
+ 在 macOS、Linux 或 Windows 上安裝和設定的 [eksctl 命令列公用程式](https://docs.aws.amazon.com/eks/latest/userguide/eksctl.html)
+ 在 macOS、Linux 或 Windows 上安裝和設定的 [kubectl 命令列公用程式](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)

**限制**
+ 建議您避免將長時間執行的指令碼新增至 `preBootstrapCommands`****屬性，因為這會延遲節點在擴展活動期間加入 Amazon EKS 叢集。我們建議您改為建立[自訂 Amazon Machine Image (AMI)](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.customenv.html)。
+ 此模式僅適用於 Amazon EC2 Linux 執行個體。

## Architecture
<a name="install-the-ssm-agent-and-cloudwatch-agent-on-amazon-eks-worker-nodes-using-prebootstrapcommands-architecture"></a>

**技術堆疊**
+ Amazon CloudWatch
+ Amazon Elastic Kubernetes Service (Amazon EKS)
+ AWS Systems Manager 參數存放區

**目標架構**

下圖顯示使用者使用 SSM Agent 連線至 Amazon EKS 工作者節點的範例，該 SSM Agent 是使用 安裝。 `preBootstrapCommands`

![\[User connecting to Amazon EKS worker nodes via Systems Manager, with SSM Agent and CloudWatch agent on each node.\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/b37a3cdb-204f-4014-8317-3600a793dac7/images/9a5760af-23bb-4616-97b0-b401a9d080cf.png)


該圖顯示以下工作流程：

1. 使用者使用 `eksctl`組態檔案搭配 `preBootstrapCommands` 屬性來建立 Amazon EKS 叢集，這會安裝 SSM 代理程式和 CloudWatch 代理程式。

1. 任何稍後因擴展活動而加入叢集的新執行個體都會使用預先安裝的 SSM Agent 和 CloudWatch 代理程式建立。

1. 使用者使用 SSM 代理程式連線至 Amazon EC2，然後使用 CloudWatch 代理程式監控記憶體和磁碟使用率。

## 工具
<a name="install-the-ssm-agent-and-cloudwatch-agent-on-amazon-eks-worker-nodes-using-prebootstrapcommands-tools"></a>
+ [Amazon CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html) 可協助您即時監控 AWS 資源的指標，以及您在 AWS 上執行的應用程式。
+ [Amazon Elastic Kubernetes Service (Amazon EKS)](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) 可協助您在 AWS 上執行 Kubernetes，而無需安裝或維護您自己的 Kubernetes 控制平面或節點。
+ [AWS Systems Manager 參數存放區](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html)為組態資料管理和秘密管理提供安全的階層式儲存。
+ [AWS Systems Manager Session Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager.html) 可協助您透過互動式、一鍵式瀏覽器型 shell 或透過 AWS Command Line Interface (AWS CLI) 來管理 EC2 執行個體、內部部署執行個體和虛擬機器。
+ [eksctl](https://eksctl.io/usage/schema/) 是一種命令列公用程式，用於在 Amazon EKS 上建立和管理 Kubernetes 叢集。
+ [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) 是與叢集 API 伺服器通訊的命令列公用程式。

## 史詩
<a name="install-the-ssm-agent-and-cloudwatch-agent-on-amazon-eks-worker-nodes-using-prebootstrapcommands-epics"></a>

### 建立 Amazon EKS 叢集
<a name="create-an-amazon-eks-cluster"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 存放 CloudWatch 代理程式組態檔案。 | 將 CloudWatch 代理程式組態檔案存放在您要建立 Amazon EKS 叢集的 AWS 區域中的 AWS [AWS Systems Manager 參數存放](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html)區中。若要這樣做，請在 AWS Systems Manager 參數存放區中[建立參數](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-create-console.html)，並記下參數的名稱 （例如 `AmazonCloudwatch-linux`)。如需詳細資訊，請參閱此模式[額外資訊](#install-the-ssm-agent-and-cloudwatch-agent-on-amazon-eks-worker-nodes-using-prebootstrapcommands-additional)區段中*的範例 CloudWatch 代理程式組態檔案*程式碼。 | DevOps 工程師 | 
| 建立 eksctl 組態檔案和叢集。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/install-the-ssm-agent-and-cloudwatch-agent-on-amazon-eks-worker-nodes-using-prebootstrapcommands.html) | AWS DevOps | 

### 驗證 SSM Agent 和 CloudWatch 代理程式是否正常運作
<a name="verify-that-the-ssm-agent-and-cloudwatch-agent-work"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 測試 SSM 代理程式。 | 透過使用 AWS Systems Manager 文件中[開始工作階段](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-sessions-start.html#start-ec2-console%20%20or%20https:%2F%2Fdocs.aws.amazon.com%2Fsystems-manager%2Flatest%2Fuserguide%2Fsession-manager-working-with-sessions-start.html%23sessions-start-cli)中涵蓋的任何方法，使用 SSH 連線至 Amazon EKS 叢集節點。 | AWS DevOps | 
| 測試 CloudWatch 代理程式。 | 使用 CloudWatch 主控台來驗證 CloudWatch 代理程式：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/install-the-ssm-agent-and-cloudwatch-agent-on-amazon-eks-worker-nodes-using-prebootstrapcommands.html) | AWS DevOps | 

## 相關資源
<a name="install-the-ssm-agent-and-cloudwatch-agent-on-amazon-eks-worker-nodes-using-prebootstrapcommands-resources"></a>
+ [在伺服器上安裝和執行 CloudWatch 代理程式 ](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-commandline-fleet.html)(Amazon CloudWatch 文件）
+ [建立 Systems Manager 參數 （主控台）](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-create-console.html) (AWS Systems Manager 文件）
+ [建立 CloudWatch 代理程式組態檔案](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/create-cloudwatch-agent-configuration-file.html) (Amazon CloudWatch 文件）
+ [啟動工作階段 (AWS CLI)](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-sessions-start.html#sessions-start-cli) (AWS Systems Manager 文件）
+ [啟動工作階段 (Amazon EC2 主控台）](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-sessions-start.html#start-ec2-console) (AWS Systems Manager 文件）

## 其他資訊
<a name="install-the-ssm-agent-and-cloudwatch-agent-on-amazon-eks-worker-nodes-using-prebootstrapcommands-additional"></a>

**CloudWatch 代理程式組態檔案範例**

在下列範例中，CloudWatch 代理程式設定為監控 Amazon Linux 執行個體上的磁碟和記憶體使用率：

```
{
    "agent": {
        "metrics_collection_interval": 60,
        "run_as_user": "cwagent"
    },
    "metrics": {
        "append_dimensions": {
            "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
            "ImageId": "${aws:ImageId}",
            "InstanceId": "${aws:InstanceId}",
            "InstanceType": "${aws:InstanceType}"
        },
        "metrics_collected": {
            "disk": {
                "measurement": [
                    "used_percent"
                ],
                "metrics_collection_interval": 60,
                "resources": [
                    "*"
                ]
            },
            "mem": {
                "measurement": [
                    "mem_used_percent"
                ],
                "metrics_collection_interval": 60
            }
        }
    }
}
```

**範例 eksctl 組態檔案**

```
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
  name: test
  region: us-east-2
  version: "1.24"
managedNodeGroups:
  - name: test
    minSize: 2
    maxSize: 4
    desiredCapacity: 2
    volumeSize: 20
    instanceType: t3.medium
    preBootstrapCommands:
    - sudo yum install amazon-ssm-agent -y
    - sudo systemctl enable amazon-ssm-agent
    - sudo systemctl start amazon-ssm-agent
    - sudo yum install amazon-cloudwatch-agent -y
    - sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c ssm:AmazonCloudwatch-linux
    iam:
      attachPolicyARNs:
        - arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy
        - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
        - arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly
        - arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
```

**其他程式碼詳細資訊**
+ 在 `preBootstrapCommands` 屬性的最後一行中， `AmazonCloudwatch-linux`是 AWS System Manager 參數存放區中建立的參數名稱。您必須在建立 Amazon EKS 叢集的相同 AWS 區域中的參數存放區`AmazonCloudwatch-linux`中包含 。您也可以指定檔案路徑，但建議您使用 Systems Manager，以便於自動化和重複使用。
+ 如果您在`eksctl`組態檔案中使用 ，您會`preBootstrapCommands`在 AWS 管理主控台中看到兩個啟動範本。第一個啟動範本包含 中指定的命令`preBootstrapCommands`。第二個範本包含 中指定的命令`preBootstrapCommands`和預設 Amazon EKS 使用者資料。需要此資料才能讓節點加入叢集。節點群組的 Auto Scaling 群組使用此使用者資料來啟動新的執行個體。
+ 如果您在`eksctl`組態檔案中使用 `iam` 屬性，則必須列出預設 Amazon EKS 政策，以及您連接的 AWS Identity and Access Management (IAM) 政策中所需的任何其他政策。在*建立 eksctl 組態檔案和叢集*步驟的程式碼片段中，新增`CloudWatchAgentServerPolicy``AmazonSSMMangedInstanceCore`了額外的政策，以確保 CloudWatch 代理程式和 SSM 代理程式如預期般運作。`AmazonEKSWorkerNodePolicy`、`AmazonEKS_CNI_Policy`、 `AmazonEC2ContainerRegistryReadOnly`政策是 Amazon EKS 叢集正常運作所需的必要政策。

# 啟用 Amazon EKS Auto 模式時遷移 NGINX 傳入控制器
<a name="migrate-nginx-ingress-controller-eks-auto-mode"></a>

*Olawale Olaleye 和 Shamanth Devagari，Amazon Web Services*

## 總結
<a name="migrate-nginx-ingress-controller-eks-auto-mode-summary"></a>

適用於 Amazon Elastic Kubernetes Service (Amazon EKS) 的 [EKS Auto Mode](https://docs.aws.amazon.com/eks/latest/userguide/automode.html) 可減少在 Kubernetes 叢集上執行工作負載的操作開銷。此模式 AWS 也允許 代表您設定和管理基礎設施。在現有叢集上啟用 EKS Auto Mode 時，您必須仔細規劃 [NGINX 傳入控制器](https://docs.nginx.com/nginx-ingress-controller/overview/about/)組態的遷移。這是因為無法直接傳輸 Network Load Balancer。

在現有 Amazon EKS 叢集中啟用 EKS Auto Mode 時，您可以使用藍/綠部署策略來遷移 NGINX 傳入控制器執行個體。

## 先決條件和限制
<a name="migrate-nginx-ingress-controller-eks-auto-mode-prereqs"></a>

**先決條件**
+ 作用中 AWS 帳戶
+ 執行 Kubernetes 1.29 版或更新版本的 [Amazon EKS 叢集](https://docs.aws.amazon.com/eks/latest/userguide/create-cluster.html) 
+ 執行[最低版本的](https://docs.aws.amazon.com/eks/latest/userguide/auto-enable-existing.html#auto-addons-required) Amazon EKS 附加元件
+ 最新版本的 [kubectl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html#kubectl-install-update)
+ 現有的 [NGINX 傳入控制器](https://kubernetes.github.io/ingress-nginx/deploy/#aws)執行個體
+ （選用） Amazon Route 53 中用於 DNS 型流量轉移的[託管區域](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zones-working-with.html) 

## Architecture
<a name="migrate-nginx-ingress-controller-eks-auto-mode-architecture"></a>

*藍/綠部署*是一種部署策略，您可以在其中建立兩個不同但相同的環境。藍/綠部署提供近乎零的停機時間發佈和復原功能。基本概念是在執行不同應用程式版本的兩個相同環境之間轉移流量。

下圖顯示啟用 EKS Auto Mode 時，Network Load Balancer 從兩個不同的 NGINX 傳入控制器執行個體遷移。您可以使用藍/綠部署，在兩個 Network Load Balancer 之間轉移流量。

![\[使用藍/綠部署策略來遷移 NGINX 傳入控制器執行個體。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/57e8c14f-cb50-4027-8ef6-ce8ea3f2db25/images/211a029a-90d8-4c92-8200-19e54062f936.png)


原始命名空間是*藍色*命名空間。在啟用 EKS Auto 模式之前，這是原始 NGINX 傳入控制器服務和執行個體執行的位置。原始服務和執行個體會連線至具有在 Route 53 中設定之 DNS 名稱的 Network Load Balancer。Load [AWS Load Balancer 控制器](https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.11/)將此 Network Load Balancer 部署在目標虛擬私有雲端 (VPC) 中。

下圖顯示下列工作流程，以設定藍/綠部署的環境：

1. 在不同的命名空間中安裝和設定另一個 NGINX 傳入控制器執行個體，即*綠色*命名空間。

1. 在 Route 53 中，設定新 Network Load Balancer 的 DNS 名稱。

## 工具
<a name="migrate-nginx-ingress-controller-eks-auto-mode-tools"></a>

**AWS 服務**
+ [Amazon Elastic Kubernetes Service (Amazon EKS)](https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html) 可協助您在 上執行 Kubernetes， AWS 而無需安裝或維護您自己的 Kubernetes 控制平面或節點。
+ [Elastic Load Balancing](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html) 會將傳入的應用程式或網路流量分散到多個目標。例如，您可以在一或多個可用區域中跨 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體、容器和 IP 地址分配流量。
+ [Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html) 是一種可用性高、可擴展性強的 DNS Web 服務。
+ [Amazon Virtual Private Cloud (Amazon VPC)](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) 可協助您在已定義的虛擬網路中啟動 AWS 資源。此虛擬網路與您在自己的資料中心中操作的傳統網路相似，且具備使用 AWS可擴展基礎設施的優勢。

**其他工具**
+ [Helm](https://helm.sh/) 是 Kubernetes 的開放原始碼套件管理員，可協助您在 Kubernetes 叢集上安裝和管理應用程式。
+ [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) 是一種命令列界面，可協助您針對 Kubernetes 叢集執行命令。
+ [NGINX 輸入控制器](https://docs.nginx.com/nginx-ingress-controller/overview/about/)透過請求處理、身分驗證、自助式自訂資源和偵錯來連接 Kubernetes 應用程式和服務。

## 史詩
<a name="migrate-nginx-ingress-controller-eks-auto-mode-epics"></a>

### 檢閱現有環境
<a name="review-the-existing-environment"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 確認原始 NGINX 傳入控制器執行個體可運作。 | 輸入下列命令來驗證`ingress-nginx`命名空間中的資源是否可運作。如果您已在另一個命名空間中部署 NGINX 傳入控制器，請更新此命令中的命名空間名稱。<pre>kubectl get all -n ingress-nginx</pre>在輸出中，確認 NGINX 輸入控制器 Pod 處於執行中狀態。以下是輸出範例：<pre>NAME                                           READY   STATUS      RESTARTS      AGE<br />pod/ingress-nginx-admission-create-xqn9d       0/1     Completed   0             88m<br />pod/ingress-nginx-admission-patch-lhk4j        0/1     Completed   1             88m<br />pod/ingress-nginx-controller-68f68f859-xrz74   1/1     Running     2 (10m ago)   72m<br /><br />NAME                                         TYPE           CLUSTER-IP       EXTERNAL-IP                                                                     PORT(S)                      AGE<br />service/ingress-nginx-controller             LoadBalancer   10.100.67.255    k8s-ingressn-ingressn-abcdefg-12345.elb.eu-west-1.amazonaws.com   80:30330/TCP,443:31462/TCP   88m<br />service/ingress-nginx-controller-admission   ClusterIP      10.100.201.176   <none>                                                                          443/TCP                      88m<br /><br />NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE<br />deployment.apps/ingress-nginx-controller   1/1     1            1           88m<br /><br />NAME                                                 DESIRED   CURRENT   READY   AGE<br />replicaset.apps/ingress-nginx-controller-68f68f859   1         1         1       72m<br />replicaset.apps/ingress-nginx-controller-d8c96cf68   0         0         0       88m<br /><br />NAME                                       STATUS     COMPLETIONS   DURATION   AGE<br />job.batch/ingress-nginx-admission-create   Complete   1/1           4s         88m<br />job.batch/ingress-nginx-admission-patch    Complete   1/1           5s         88m</pre> | DevOps 工程師 | 

### 部署範例 HTTPd 工作負載以使用 NGINX 傳入控制器
<a name="deploy-a-sample-httpd-workload-to-use-the-nginx-ingress-controller"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 Kubernetes 資源。 | 輸入下列命令來建立範例 Kubernetes 部署、服務和輸入：<pre>kubectl create deployment demo --image=httpd --port=80</pre><pre>kubectl expose deployment demo</pre><pre> kubectl create ingress demo --class=nginx \<br />  --rule nginxautomode.local.dev/=demo:80</pre> | DevOps 工程師 | 
| 檢閱部署的資源。 | 輸入下列命令以檢視已部署資源的清單：<pre>kubectl get all,ingress</pre>在輸出中，確認範例 HTTPd Pod 處於執行中狀態。以下是輸出範例：<pre>NAME                        READY   STATUS    RESTARTS   AGE<br />pod/demo-7d94f8cb4f-q68wc   1/1     Running   0          59m<br /><br />NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE<br />service/demo         ClusterIP   10.100.78.155   <none>        80/TCP    59m<br />service/kubernetes   ClusterIP   10.100.0.1      <none>        443/TCP   117m<br /><br />NAME                   READY   UP-TO-DATE   AVAILABLE   AGE<br />deployment.apps/demo   1/1     1            1           59m<br /><br />NAME                              DESIRED   CURRENT   READY   AGE<br />replicaset.apps/demo-7d94f8cb4f   1         1         1       59m<br /><br />NAME                             CLASS   HOSTS                                  ADDRESS                                                                         PORTS   AGE<br />ingress.networking.k8s.io/demo   nginx   nginxautomode.local.dev                k8s-ingressn-ingressn-abcdefg-12345.elb.eu-west-1.amazonaws.com                 80      56m</pre> | DevOps 工程師 | 
| 確認服務可連線。 | 輸入下列命令，確認可透過 Network Load Balancer 的 DNS 名稱存取服務：<pre>curl -H "Host: nginxautomode.local.dev" http://k8s-ingressn-ingressn-abcdefg-12345.elb.eu-west-1.amazonaws.com</pre>以下是預期的輸出：<pre><html><body><h1>It works!</h1></body></html></pre> | DevOps 工程師 | 
| （選用） 建立 DNS 記錄。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/migrate-nginx-ingress-controller-eks-auto-mode.html) | DevOps 工程師，AWS DevOps | 

### 在現有叢集上啟用 EKS Auto 模式
<a name="enable-eks-auto-mode-on-the-existing-cluster"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 啟用 EKS Auto 模式。 | 遵循[在現有叢集上啟用 EKS Auto Mode](https://docs.aws.amazon.com/eks/latest/userguide/auto-enable-existing.html) 中的指示 (Amazon EKS 文件）。 | AWS DevOps | 

### 安裝新的 NGINX 傳入控制器
<a name="install-a-new-nginx-ingress-controller"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定新的 NGINX 傳入控制器執行個體。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/migrate-nginx-ingress-controller-eks-auto-mode.html) | DevOps 工程師 | 
| 部署新的 NGINX 執行個體控制器執行個體。 | 輸入下列命令以套用修改的資訊清單檔案：<pre>kubectl apply -f deploy.yaml</pre> | DevOps 工程師 | 
| 確認部署成功。 | 輸入下列命令來驗證`ingress-nginx-v2`命名空間中的資源是否正常運作：<pre>kubectl get all -n ingress-nginx-v2</pre>在輸出中，確認 NGINX 輸入控制器 Pod 處於執行中狀態。以下是輸出範例：<pre>NAME                                            READY   STATUS      RESTARTS   AGE<br />pod/ingress-nginx-admission-create-7shrj        0/1     Completed   0          24s<br />pod/ingress-nginx-admission-patch-vkxr5         0/1     Completed   1          24s<br />pod/ingress-nginx-controller-757bfcbc6d-4fw52   1/1     Running     0          24s<br /><br />NAME                                         TYPE           CLUSTER-IP       EXTERNAL-IP                                                                     PORT(S)                      AGE<br />service/ingress-nginx-controller             LoadBalancer   10.100.208.114   k8s-ingressn-ingressn-2e5e37fab6-848337cd9c9d520f.elb.eu-west-1.amazonaws.com   80:31469/TCP,443:30658/TCP   24s<br />service/ingress-nginx-controller-admission   ClusterIP      10.100.150.114   <none>                                                                          443/TCP                      24s<br /><br />NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE<br />deployment.apps/ingress-nginx-controller   1/1     1            1           24s<br /><br />NAME                                                  DESIRED   CURRENT   READY   AGE<br />replicaset.apps/ingress-nginx-controller-757bfcbc6d   1         1         1       24s<br /><br />NAME                                       STATUS     COMPLETIONS   DURATION   AGE<br />job.batch/ingress-nginx-admission-create   Complete   1/1           4s         24s<br />job.batch/ingress-nginx-admission-patch    Complete   1/1           5s         24s</pre> | DevOps 工程師 | 
| 為範例 HTTPd 工作負載建立新的輸入。 | 輸入下列命令，為現有的範例 HTTPd 工作負載建立新的輸入：<pre>kubectl create ingress demo-new --class=nginx-v2 \<br />  --rule nginxautomode.local.dev/=demo:80</pre> | DevOps 工程師 | 
| 確認新的輸入正常運作。 | 輸入下列命令來確認新的輸入是否正常運作：<pre>curl -H "Host: nginxautomode.local.dev" k8s-ingressn-ingressn-2e5e37fab6-848337cd9c9d520f.elb.eu-west-1.amazonaws.com</pre>以下是預期的輸出：<pre><html><body><h1>It works!</h1></body></html></pre> | DevOps 工程師 | 

### 剪下
<a name="cut-over"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 切換到新的命名空間。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/migrate-nginx-ingress-controller-eks-auto-mode.html) | AWS DevOps，DevOps 工程師 | 
| 檢閱兩個輸入。 | 輸入下列命令來檢閱為範例 HTTPd 工作負載建立的兩個輸入：<pre>kubectl get ingress</pre>以下是輸出範例：<pre>NAME       CLASS      HOSTS                                  ADDRESS                                                                         PORTS   AGE<br />demo       nginx      nginxautomode.local.dev   k8s-ingressn-ingressn-abcdefg-12345.elb.eu-west-1.amazonaws.com                              80      95m<br />demo-new   nginx-v2   nginxautomode.local.dev   k8s-ingressn-ingressn-2e5e37fab6-848337cd9c9d520f.elb.eu-west-1.amazonaws.com                80      33s</pre> | DevOps 工程師 | 

## 相關資源
<a name="migrate-nginx-ingress-controller-eks-auto-mode-resources"></a>
+ 在[現有叢集上啟用 EKS Auto Mode ](https://docs.aws.amazon.com/eks/latest/userguide/auto-enable-existing.html)(Amazon EKS 文件）
+ 對 [Amazon EKS (re：Post 知識中心） 中 Kubernetes 服務控制器建立的負載平衡器進行故障診斷](https://repost.aws/knowledge-center/eks-load-balancers-troubleshooting)AWS 
+ [NGINX 傳入控制器](https://docs.nginx.com/nginx-ingress-controller/) (NGINX 文件）

# 將您的容器工作負載從 Azure Red Hat OpenShift (ARO) 遷移至 Red Hat OpenShift Service on AWS (ROSA)
<a name="migrate-container-workloads-from-aro-to-rosa"></a>

*Naveen Ramasamy、Srikanth Rangavajhala 和 Gireesh Sreekantan，Amazon Web Services*

## 總結
<a name="migrate-container-workloads-from-aro-to-rosa-summary"></a>

此模式提供step-by-step說明。 OpenShift [Red Hat OpenShift Service on AWS](https://aws.amazon.com/rosa/) ROSA 是由 Red Hat 與 合作提供的受管 Kubernetes 服務 AWS。它可協助您使用 Kubernetes 平台部署、管理和擴展容器化應用程式，並受益於 Red Hat 在 Kubernetes 和 AWS 雲端 基礎設施方面的專業知識。

從 ARO、其他雲端或內部部署遷移容器工作負載到 ROSA 需要將應用程式、組態和資料從一個平台傳輸到另一個平台。此模式有助於確保順利轉換，同時最佳化 AWS 雲端 服務、安全性和成本效益。它涵蓋兩種將工作負載遷移至 ROSA 叢集的方法：CI/CD 和 Migration Toolkit for Containers (MTC)。

此模式涵蓋這兩種方法。您選擇的方法取決於遷移程序的複雜性和確定性。如果您完全控制應用程式的狀態，並且可以透過管道保證一致的設定，我們建議您使用 CI/CD 方法。不過，如果您的應用程式狀態涉及不確定性、不可預見的變更或複雜的生態系統，建議您使用 MTC 做為可靠且受控制的路徑，將應用程式及其資料遷移至新的叢集。如需這兩種方法的詳細比較，請參閱[其他資訊](#migrate-container-workloads-from-aro-to-rosa-additional)一節。

遷移至 ROSA 的優點：
+ ROSA 與 無縫整合 AWS 為原生服務。您可以透過 輕鬆存取， AWS 管理主控台 並透過單一 計費 AWS 帳戶。它提供與其他 的完整相容性 AWS 服務 ，並提供來自 AWS 和 Red Hat 的協作支援。
+ ROSA 支援混合多雲端部署。它可讓應用程式在內部部署資料中心和多個雲端環境中一致地執行。
+ ROSA 受益於 Red Hat 的安全重點，並提供角色型存取控制 (RBAC)、映像掃描和漏洞評估等功能，以確保安全的容器環境。
+ ROSA 旨在輕鬆擴展應用程式，並提供高可用性選項。它允許應用程式視需要成長，同時維持可靠性。
+ 相較於手動設定和管理方法，ROSA 可自動化並簡化 Kubernetes 叢集的部署。這可加速開發和部署程序。
+ ROSA 受益於 AWS 雲端 服務，並提供與資料庫服務、儲存解決方案和安全服務等 AWS 方案的無縫整合。

## 先決條件和限制
<a name="migrate-container-workloads-from-aro-to-rosa-prereqs"></a>

**先決條件**
+ 作用中 AWS 帳戶。
+ 為 AWS 服務 該 ROSA 設定的許可依賴 來交付功能。如需詳細資訊，請參閱 ROSA 文件中的[先決條件](https://docs.aws.amazon.com/rosa/latest/userguide/set-up.html)。
+ ROSA [主控台上已啟用 ROSA](https://console.aws.amazon.com/rosa)。如需說明，請參閱 [ROSA 文件](https://docs.aws.amazon.com/rosa/latest/userguide/set-up.html#enable-rosa)。
+ 安裝並設定 ROSA 叢集。如需詳細資訊，請參閱 [ROSA 文件中的 ROSA 入門](https://docs.aws.amazon.com/rosa/latest/userguide/getting-started.html)。若要了解設定 ROSA 叢集的不同方法，請參閱 AWS 規範指引指南 [ROSA 實作策略](https://docs.aws.amazon.com/prescriptive-guidance/latest/red-hat-openshift-on-aws-implementation/)。
+ 從內部部署網路到 AWS 透過 [AWS Direct Connect](https://docs.aws.amazon.com/whitepapers/latest/aws-vpc-connectivity-options/aws-direct-connect.html)（偏好） 或 [AWS Virtual Private Network (Site-to-Site VPN)](https://docs.aws.amazon.com/vpc/latest/userguide/vpn-connections.html) 建立的網路連線。
+ Amazon Elastic Compute Cloud (Amazon EC2) 執行個體或其他虛擬伺服器，用於安裝工具，例如 `aws client`、OpenShift CLI (`oc`) 用戶端、ROSA 用戶端和 Git 二進位檔。

CI/CD 方法的其他先決條件：
+ 存取內部部署 Jenkins 伺服器，具有建立新管道、新增階段、新增 OpenShift 叢集和執行建置的許可。
+ 存取維護應用程式原始碼的 Git 儲存庫，具有建立新 Git 分支和執行遞交至新分支的許可。

MTC 方法的其他先決條件：
+ Amazon Simple Storage Service (Amazon S3) 儲存貯體，將用作複寫儲存庫。
+ 來源 ARO 叢集的管理存取權。這是設定 MTC 連線的必要條件。

**限制**
+ 有些 AWS 服務 完全無法使用 AWS 區域。如需區域可用性，請參閱[AWS 服務 依區域](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。如需特定端點，請參閱[服務端點和配額](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)頁面，然後選擇服務的連結。

## Architecture
<a name="migrate-container-workloads-from-aro-to-rosa-architecture"></a>

ROSA 提供三種網路部署模式：公有、私有和 [AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/privatelink/what-is-privatelink.html).PrivateLinkenables Red Hat 網站可靠性工程 (SRE) 團隊，使用連線至現有 VPC 中叢集 PrivateLink 端點的私有子網路來管理叢集。

選擇 PrivateLinkoption 可提供最安全的組態。因此，我們建議將其用於敏感工作負載或嚴格的合規要求。如需公有和私有網路部署選項的相關資訊，請參閱 [Red Hat OpenShift 文件](https://docs.openshift.com/rosa/architecture/rosa-architecture-models.html#rosa-hcp-architecture_rosa-architecture-models)。

**重要**  
您只能在安裝時建立 PrivateLink 叢集。安裝後，您無法將叢集變更為使用 PrivateLink。

下圖說明 ROSA 叢集的 PrivateLink 架構，該叢集使用 Direct Connect 連線到內部部署和 ARO 環境。

![\[使用 AWS Direct Connect 和 AWS PrivateLink 的 ROSA 叢集。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/527cedfb-ec21-42be-bf21-d4e4e4f9db51/images/eff9b017-6fc7-4874-b610-849a42071ef4.png)


**AWS ROSA 的 許可**

對於 ROSA 的 AWS 許可，我們建議您使用 AWS Security Token Service (AWS STS) 搭配短期動態字符。此方法使用最低權限的預先定義角色和政策，授予 ROSA 在 中操作的最小許可 AWS 帳戶，並支援 ROSA 安裝、控制平面和運算功能。

**CI/CD 管道重新部署**

對於具有成熟 CI/CD 管道的使用者，CI/CD 管道重新部署是建議的方法。選擇此選項時，您可以使用任何 [DevOps 部署策略](https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/deployment-strategies.html)，逐步將應用程式負載轉移到 ROSA 上的部署。

**注意**  
此模式假設您有一個常見的使用案例，其中您有現場部署 Git、JFrog Artifactory 和 Jenkins 管道。此方法要求您建立從內部部署網路到 AWS 的網路連線 Direct Connect，並在遵循 [Epics](#migrate-container-workloads-from-aro-to-rosa-epics) 區段中的指示之前設定 ROSA 叢集。如需詳細資訊，請參閱[先決條件](#migrate-container-workloads-from-aro-to-rosa-prereqs)一節。

下圖顯示此方法的工作流程。

![\[使用 CI/CD 方法將容器從 ARO 遷移至 ROSA。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/527cedfb-ec21-42be-bf21-d4e4e4f9db51/images/f658590e-fbd9-4297-a02c-0b516694d436.png)


**MTC 方法**

您可以使用 [Migration Toolkit for Containers (MTC)](https://docs.openshift.com/container-platform/4.13/migration_toolkit_for_containers/about-mtc.html)****，在不同 Kubernetes 環境之間遷移容器化工作負載，例如從 ARO 遷移至 ROSA。MTC 透過自動化數個關鍵任務並提供管理遷移生命週期的全方位架構，簡化遷移程序。

下圖顯示此方法的工作流程。

![\[使用 MTC 方法將容器從 ARO 遷移至 ROSA。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/527cedfb-ec21-42be-bf21-d4e4e4f9db51/images/979bbc7b-2e39-4dd1-b4f0-ea1032880a38.png)


## 工具
<a name="migrate-container-workloads-from-aro-to-rosa-tools"></a>

**AWS 服務**
+ [AWS DataSync](https://docs.aws.amazon.com/datasync/latest/userguide/what-is-datasync.html) 是一種線上資料傳輸和探索服務，可協助您在 AWS 儲存服務之間來回移動檔案或物件資料。
+ [AWS Direct Connect](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html) 會透過標準乙太網路光纖纜線將您的內部網路連結至某個 Direct Connect 位置。透過此連線，您可以在網路路徑中略過網際網路服務提供者 AWS 服務 時，直接建立虛擬介面至公有。
+ [AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/privatelink/what-is-privatelink.html) 可協助您建立從虛擬私有雲端 (VPCs) 到 VPC 外部服務的單向私有連線。
+ [Red Hat OpenShift Service on AWS (ROSA)](https://docs.aws.amazon.com/rosa/latest/userguide/what-is-rosa.html) 是一種受管服務，可協助 Red Hat OpenShift 使用者建置、擴展和管理容器化應用程式 AWS。
+ [AWS Security Token Service (AWS STS)](https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html) 可協助您為使用者請求暫時、有限權限的登入資料。

**其他工具**
+ [Migration Toolkit for Containers (MTC)](https://docs.openshift.com/container-platform/4.13/migration_toolkit_for_containers/about-mtc.html) 提供主控台和 API，可將容器化應用程式從 ARO 遷移至 ROSA。

## 最佳實務
<a name="migrate-container-workloads-from-aro-to-rosa-best-practices"></a>
+ 針對[彈性](https://docs.aws.amazon.com/ROSA/latest/userguide/disaster-recovery-resiliency.html)和如果您有安全合規工作負載，請設定使用 PrivateLink 的多可用區域 ROSA 叢集。如需詳細資訊，請參閱 [ROSA 文件](https://docs.aws.amazon.com/rosa/latest/userguide/getting-started-classic-private-link.html)。
**注意**  
無法在安裝後設定 PrivateLink。
+ 您用於複寫儲存庫的 S3 儲存貯體不應公開。使用適當的 S3 儲存貯體政策來限制存取。
+ 如果您選擇 MTC 方法，請使用**階段**遷移選項來減少切換期間的停機時間時段。
+ 在您佈建 ROSA 叢集之前和之後，檢閱您的服務配額。如有必要，請根據您的需求請求提高配額。如需詳細資訊，請參閱[服務配額文件](https://docs.aws.amazon.com/servicequotas/latest/userguide/request-quota-increase.html)。
+ 檢閱 [ROSA 安全準則](https://docs.aws.amazon.com/ROSA/latest/userguide/security.html)並實作安全最佳實務。
+ 建議您在安裝後移除預設叢集管理員。如需詳細資訊，請參閱 [Red Hat OpenShift 文件](https://docs.openshift.com/container-platform/4.13/post_installation_configuration/cluster-tasks.html)。
+ 使用機器集區自動擴展來縮減 ROSA 叢集中未使用的工作者節點，以最佳化成本。如需詳細資訊，請參閱 [ROSA 研討會](https://catalog.workshops.aws/aws-openshift-workshop/en-US/5-nodes-storage/3-autoscale-machine-pool)。
+ 使用適用於 OpenShift Container Platform 的 Red Hat Cost Management 服務，更深入了解和追蹤雲端和容器的成本。如需詳細資訊，請參閱 [ROSA 研討會](https://catalog.workshops.aws/aws-openshift-workshop/en-US/10-cost-management)。
+ 使用 監控和稽核 ROSA 叢集基礎設施服務和應用程式 AWS 服務。如需詳細資訊，請參閱 [ROSA 研討會](https://catalog.workshops.aws/aws-openshift-workshop/en-US/8-observability)。

## 史詩
<a name="migrate-container-workloads-from-aro-to-rosa-epics"></a>

### 選項 1：使用 CI/CD 管道
<a name="option-1-use-a-ci-cd-pipeline"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 將新的 ROSA 叢集新增至 Jenkins。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/migrate-container-workloads-from-aro-to-rosa.html) | AWS 管理員、AWS 系統管理員、AWS DevOps | 
| 將`oc`用戶端新增至 Jenkins 節點。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/migrate-container-workloads-from-aro-to-rosa.html) | AWS 管理員、AWS 系統管理員、AWS DevOps | 
| 建立新的 Git 分支。 | 在適用於 的 Git 儲存庫中建立新的分支`rosa-dev`。此分支會將 ROSA 的程式碼或組態參數變更與您現有的管道分開。 | AWS DevOps | 
| 標記 ROSA 的影像。 | 在建置階段中，使用不同的標籤來識別從 ROSA 管道建置的映像。 | AWS 管理員、AWS 系統管理員、AWS DevOps | 
| 建立管道。 | 建立新的 Jenkins 管道，其與您現有的管道類似。對於此管道，請使用您先前建立的 `rosa-dev` Git 分支，並確保包含與您現有管道相同的 Git 結帳、程式碼掃描和建置階段。 | AWS 管理員、AWS 系統管理員、AWS DevOps | 
| 新增 ROSA 部署階段。 | 在新的管道中，新增要部署到 ROSA 叢集的階段，並參考您新增至 Jenkins 全域組態的 ROSA 叢集。 | AWS 管理員、AWS DevOps、AWS 系統管理員 | 
| 啟動新的組建。 | 在 Jenkins 中，選取您的管道，然後選擇**立即建置**，或透過將變更遞交至 Git 中的`rosa-dev`分支來啟動新建置。 | AWS 管理員、AWS DevOps、AWS 系統管理員 | 
| 驗證部署。 | 使用 **oc** 命令或 [ROSA 主控台](https://console.aws.amazon.com/rosa)來驗證應用程式是否已部署在您的目標 ROSA 叢集上。 | AWS 管理員、AWS DevOps、AWS 系統管理員 | 
| 將資料複製到目標叢集。 | 對於具狀態工作負載，請使用 AWS DataSync 或開放原始碼公用程式，例如 **rsync**，將資料從來源叢集複製到目標叢集，或者您可以使用 MTC 方法。如需詳細資訊，請參閱 [AWS DataSync 文件](https://docs.aws.amazon.com/datasync/latest/userguide/what-is-datasync.html)。 | AWS 管理員、AWS DevOps、AWS 系統管理員 | 
| 測試您的應用程式。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/migrate-container-workloads-from-aro-to-rosa.html) | AWS 管理員、AWS DevOps、AWS 系統管理員 | 
| 切換。 | 如果您的測試成功，請使用適當的 Amazon Route 53 政策，將流量從 ARO 託管應用程式移至 ROSA 託管應用程式。當您完成此步驟時，應用程式的工作負載將完全轉換為 ROSA 叢集。 | AWS 管理員、AWS 系統管理員 | 

### 選項 2：使用 MTC
<a name="option-2-use-mtc"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 安裝 MTC 運算子。 | 在 ARO 和 ROSA 叢集上安裝 MTC 運算子：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/migrate-container-workloads-from-aro-to-rosa.html) | AWS 管理員、AWS DevOps、AWS 系統管理員 | 
| 設定至複寫儲存庫的網路流量。 | 如果您使用的是代理伺服器，請將其設定為允許複寫儲存庫與叢集之間的網路流量。複寫儲存庫是 MTC 用來遷移資料的中繼儲存物件。在遷移期間，來源和目標叢集必須具有複寫儲存庫的網路存取權。 | AWS 管理員、AWS DevOps、AWS 系統管理員 | 
| 將來源叢集新增至 MTC。 | 在 MTC Web 主控台上，新增 ARO 來源叢集。 | AWS 管理員、AWS DevOps、AWS 系統管理員 | 
| 新增 Amazon S3 做為複寫儲存庫。 | 在 MTC Web 主控台上，新增 Amazon S3 儲存貯體 （請參閱[先決條件](#migrate-container-workloads-from-aro-to-rosa-prereqs)) 做為複寫儲存庫。 | AWS 管理員、AWS DevOps、AWS 系統管理員 | 
| 建立遷移計畫。 | 在 MTC Web 主控台上，建立遷移計畫，並將資料傳輸類型指定為**複製**。這將指示 MTC 將資料從來源 (ARO) 叢集複製到 S3 儲存貯體，以及從儲存貯體複製到目標 (ROSA) 叢集。 | AWS 管理員、AWS DevOps、AWS 系統管理員 | 
| 執行遷移計畫。 | 使用**階段**或**切換**選項執行遷移計劃：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/migrate-container-workloads-from-aro-to-rosa.html) | AWS 管理員、AWS DevOps、AWS 系統管理員 | 

## 疑難排解
<a name="migrate-container-workloads-from-aro-to-rosa-troubleshooting"></a>


| 問題 | 解決方案 | 
| --- | --- | 
| 連線問題 | 當您將容器工作負載從 ARO 遷移至 ROSA 時，您可能會遇到連線問題，應加以解決，以確保成功遷移。為了在遷移期間解決這些連線問題 （列於此表中），精細規劃、與網路和安全團隊的協調，以及徹底的測試至關重要。在每個步驟實作逐步遷移策略並驗證連線，有助於將潛在的中斷降至最低，並確保從 ARO 順利轉換至 ROSA。 | 
| 網路組態差異 | ARO 和 ROSA 的網路組態可能會有變化，例如虛擬網路 (VNet) 設定、子網路和網路政策。為了在服務之間進行適當的通訊，請確保網路設定在兩個平台之間保持一致。 | 
| 安全群組和防火牆規則 | ROSA 和 ARO 可能有不同的預設安全群組和防火牆設定。請務必調整和更新這些規則，以允許必要的流量在遷移期間維持容器和服務之間的連線。  | 
| IP 地址和 DNS 變更 | 當您遷移工作負載時，IP 地址和 DNS 名稱可能會變更。重新設定依賴靜態 IPs 或特定 DNS 名稱的應用程式。  | 
| 外部服務存取 | 如果您的應用程式依賴資料庫或 APIs等外部服務，您可能需要更新其連線設定，以確保它們可以與 ROSA 的新服務通訊。 | 
| Azure Private Link 組態 | 如果您在 ARO 中使用 Azure Private Link 或私有端點服務，則需要在 ROSA 中設定同等功能，以確保資源之間的私有連線。 | 
| Site-to-Site VPN 或 Direct Connect 設定  | 如果您的內部部署網路與 ARO 之間存在現有 Site-to-Site VPN 或 Direct Connect 連線，您將需要與 ROSA 建立類似的連線，以便與本機資源進行不間斷的通訊。 | 
| 輸入和負載平衡器設定 | ARO 和 ROSA 之間的輸入控制器和負載平衡器組態可能不同。重新設定這些設定，以維護 服務的外部存取權。 | 
| 憑證和 TLS 處理 | 如果您的應用程式使用 SSL 憑證或 TLS，請確定憑證在 ROSA 中有效且設定正確。 | 
| 容器登錄檔存取 | 如果您的容器託管在外部容器登錄檔中，請為 ROSA 設定適當的身分驗證和存取許可。 | 
| 監控和記錄 | 更新監控和記錄組態，以反映 ROSA 上的新基礎設施，以便您可以繼續有效監控容器的運作狀態和效能。 | 

## 相關資源
<a name="migrate-container-workloads-from-aro-to-rosa-resources"></a>

**AWS**** 參考**
+ [什麼是 Red Hat OpenShift Service on AWS？](https://docs.aws.amazon.com/ROSA/latest/userguide/what-is-rosa.html) (ROSA 文件）
+ [ROSA 入門 ](https://docs.aws.amazon.com/ROSA/latest/userguide/getting-started.html)(ROSA 文件）
+ [Red Hat OpenShift Service on AWS 實作策略](https://docs.aws.amazon.com/prescriptive-guidance/latest/red-hat-openshift-on-aws-implementation/) (AWS 方案指引）
+ [Red Hat OpenShift Service on AWS 現在 GA](https://aws.amazon.com/blogs/aws/red-hat-openshift-service-on-aws-now-generally-availably/) (AWS 部落格文章）
+ [ROSA 研討會](https://catalog.workshops.aws/aws-openshift-workshop/en-US/0-introduction)
+ [ROSA 常見問答集](https://aws.amazon.com/rosa/faqs/)
+ [ROSA 研討會常見問答集](https://www.rosaworkshop.io/rosa/14-faq/)
+ [ROSA 定價](https://aws.amazon.com/rosa/pricing/)

**Red Hat OpenShift 文件**
+ [在 上快速安裝叢集 AWS](https://docs.openshift.com/container-platform/4.13/installing/installing_aws/installing-aws-default.html)
+ [在受限的網路 AWS 中於 上安裝叢集](https://docs.openshift.com/container-platform/4.13/installing/installing_aws/installing-restricted-networks-aws-installer-provisioned.html)
+ [在 上安裝叢集 AWS 到現有的 VPC](https://docs.openshift.com/container-platform/4.13/installing/installing_aws/installing-aws-vpc.html)
+ [AWS 使用 CloudFormation 範本在 的使用者佈建基礎設施上安裝叢集](https://docs.openshift.com/container-platform/4.13/installing/installing_aws/installing-aws-user-infra.html)
+ [使用使用者佈建的基礎設施在受限的網路 AWS 中安裝叢集](https://docs.openshift.com/container-platform/4.13/installing/installing_aws/installing-restricted-networks-aws.html)
+ [AWS 使用自訂在 上安裝叢集](https://docs.openshift.com/container-platform/4.13/installing/installing_aws/installing-aws-customizations.html)
+ [OpenShift CLI 入門](https://docs.openshift.com/container-platform/4.13/cli_reference/openshift_cli/getting-started-cli.html)

## 其他資訊
<a name="migrate-container-workloads-from-aro-to-rosa-additional"></a>

**在 MTC 和 CI/CD 管道重新部署選項之間進行選擇**

將應用程式從一個 OpenShift 叢集遷移到另一個叢集需要仔細考慮。理想情況下，您會希望使用 CI/CD 管道重新部署應用程式並處理持久性磁碟區資料的遷移，以順利轉換。不過，實際上，叢集上執行中的應用程式容易隨著時間而發生不可預見的變更。這些變更可能會導致應用程式逐漸偏離其原始部署狀態。MTC 為命名空間的確切內容不確定，且將所有應用程式元件無縫遷移至新叢集的情況提供解決方案。

做出正確的選擇需要評估您的特定案例，並權衡每種方法的好處。透過這樣做，您可以確保成功且無縫的遷移符合您的需求和優先順序。以下是在兩個選項之間進行選擇的其他準則。

**CI/CD 管道重新部署**

如果您的應用程式可以使用管道放心地重新部署，建議使用 CI/CD 管道方法。這可確保遷移受到控制、可預測，並與現有的部署實務保持一致。選擇此方法時，您可以使用[藍/綠部署](https://docs.aws.amazon.com/whitepapers/latest/overview-deployment-options/bluegreen-deployments.html)或金絲雀部署策略，逐步將負載轉移到 ROSA 上的部署。在此案例中，此模式假設 Jenkins 正在從內部部署環境協調應用程式部署。

優點：
+ 您不需要來源 ARO 叢集的管理存取權，也不需要在來源或目的地叢集上部署任何運算子。
+ 此方法可協助您使用 DevOps 策略逐步切換流量。

缺點：
+ 它需要更多精力來測試應用程式的功能。
+ 如果您的應用程式包含持久性資料，則需要使用 AWS DataSync 或其他工具來複製資料的額外步驟。

**MTC 遷移**

在真實世界中，執行中的應用程式可能會發生非預期的變更，導致它們偏離初始部署。當您不確定來源叢集上應用程式的目前狀態時，請選擇 MTC 選項。例如，如果您的應用程式生態系統跨越各種元件、組態和資料儲存磁碟區，我們建議您選擇 MTC，以確保完整遷移涵蓋應用程式及其整個環境。

優點：
+ MTC 提供工作負載的完整備份和還原。
+ 遷移工作負載時，它會將持久性資料從來源複製到目標。
+ 它不需要存取原始程式碼儲存庫。

缺點：
+ 您需要管理權限，才能在來源和目的地叢集上安裝 MTC 運算子。
+ DevOps 團隊需要訓練，才能使用 MTC 工具並執行遷移。

# 使用 Amazon ECS Anywhere 在 Amazon WorkSpaces 上執行 Amazon ECS 任務 Amazon ECS Anywhere
<a name="run-amazon-ecs-tasks-on-amazon-workspaces-with-amazon-ecs-anywhere"></a>

*Akash Kumar，Amazon Web Services*

## 總結
<a name="run-amazon-ecs-tasks-on-amazon-workspaces-with-amazon-ecs-anywhere-summary"></a>

Amazon Elastic Container Service (Amazon ECS) Anywhere 支援在任何環境中部署 Amazon ECS 任務，包括 Amazon Web Services (AWS) 受管基礎設施和客戶受管基礎設施。您可以在使用在雲端中執行且隨時為最新狀態的全 AWS 受管控制平面時執行此操作。 

企業通常會使用 Amazon WorkSpaces 來開發容器型應用程式。這需要具有 Amazon ECS 叢集的 Amazon Elastic Compute Cloud (Amazon EC2) 或 AWS Fargate，才能測試和執行 ECS 任務。現在，透過使用 Amazon ECS Anywhere，您可以將 Amazon WorkSpaces 直接新增為 ECS 叢集的外部執行個體，也可以直接執行任務。這可縮短您的開發時間，因為您可以使用 Amazon WorkSpaces 上的 ECS 叢集在本機測試容器。您也可以節省使用 EC2 或 Fargate 執行個體來測試容器應用程式的成本。

此模式示範如何使用 Amazon ECS Anywhere 在 Amazon WorkSpaces Amazon ECS Anywhere 任務。它設定 ECS 叢集，並使用 AWS Directory Service Simple AD 啟動 WorkSpaces。然後，範例 ECS 任務會在 WorkSpaces 中啟動 NGINX。

## 先決條件和限制
<a name="run-amazon-ecs-tasks-on-amazon-workspaces-with-amazon-ecs-anywhere-prereqs"></a>
+ 作用中的 AWS 帳戶
+ AWS 命令列界面 (AWS CLI)
+ [在您的機器上設定的](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html) AWS 登入資料

## Architecture
<a name="run-amazon-ecs-tasks-on-amazon-workspaces-with-amazon-ecs-anywhere-architecture"></a>

**目標技術堆疊**
+ 虛擬私有雲端 (VPC)
+ Amazon ECS 叢集
+ Amazon WorkSpaces
+ 具有 Simple AD 的 AWS Directory Service 

**目標架構**

![\[ECS Anywhere 會設定 ECS 叢集，並使用 Simple AD 啟動 WorkSpaces。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/da8b2249-3423-485c-9fef-6f902025e969/images/fd354d14-f29b-4b9e-8f1a-c3cb7ed4d6bf.png)


 

架構包含下列服務和資源：
+ 自訂 VPC 中具有公有和私有子網路的 ECS 叢集
+ VPC 中的簡易 AD 可讓使用者存取 Amazon WorkSpaces
+ 使用 Simple AD 在 VPC 中佈建的 Amazon WorkSpaces 
+ 啟用 AWS Systems Manager 以新增 Amazon WorkSpaces 做為受管執行個體
+ 使用 Amazon ECS 和 AWS Systems Manager Agent (SSM Agent)，Amazon WorkSpaces 已新增至 Systems Manager 和 ECS 叢集
+ 要在 ECS 叢集的 WorkSpaces 中執行的範例 ECS 任務

## 工具
<a name="run-amazon-ecs-tasks-on-amazon-workspaces-with-amazon-ecs-anywhere-tools"></a>
+ [AWS Directory Service Simple Active Directory (Simple AD)](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/directory_simple_ad.html) 是由 Samba 4 Active Directory 相容伺服器提供支援的獨立受管目錄。Simple AD 提供 AWS Managed Microsoft AD 提供的部分功能，包括能夠管理使用者並安全地連線至 Amazon EC2 執行個體。
+ [Amazon Elastic Container Service (Amazon ECS)](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html) 是快速、可擴展的容器管理服務，可協助您執行、停止和管理叢集上的容器。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 可透過控制已驗證並獲授權使用的人員，協助您安全地管理對 AWS 資源的存取。
+ [AWS Systems Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-systems-manager.html) 可協助您管理在 AWS 雲端中執行的應用程式和基礎設施。它可簡化應用程式和資源管理、縮短偵測和解決操作問題的時間，並協助您大規模安全地管理 AWS 資源。
+ [Amazon WorkSpaces](https://docs.aws.amazon.com/workspaces/latest/adminguide/amazon-workspaces.html) 可協助您為使用者佈建以雲端為基礎的虛擬 Microsoft Windows 或 Amazon Linux 桌面，稱為 *WorkSpaces*。WorkSpaces 無需採購和部署硬體或安裝複雜軟體。

## 史詩
<a name="run-amazon-ecs-tasks-on-amazon-workspaces-with-amazon-ecs-anywhere-epics"></a>

### 設定 ECS 叢集
<a name="set-up-the-ecs-cluster"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立和設定 ECS 叢集。 | 若要建立 ECS 叢集，請遵循 [AWS 文件](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create_cluster.html)中的指示，包括下列步驟：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/run-amazon-ecs-tasks-on-amazon-workspaces-with-amazon-ecs-anywhere.html) | 雲端架構師 | 

### 啟動 Amazon WorkSpaces
<a name="launch-amazon-workspaces"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定 Simple AD 並啟動 Amazon WorkSpaces。 | 若要為新建立的 VPC 佈建 Simple AD 目錄並啟動 Amazon WorkSpaces，請遵循 [AWS 文件](https://docs.aws.amazon.com/workspaces/latest/adminguide/launch-workspace-simple-ad.html)中的指示。 | 雲端架構師 | 

### 為混合環境設定 AWS Systems Manager
<a name="set-up-aws-systems-manager-for-a-hybrid-environment"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 下載連接的指令碼。 | 在本機電腦上，下載*附件*區段中的 `ssm-trust-policy.json`和 `ssm-activation.json` 檔案。 | 雲端架構師 | 
| 新增 IAM 角色。 | 根據您的業務需求新增環境變數。<pre>export AWS_DEFAULT_REGION=${AWS_REGION_ID}<br />export ROLE_NAME=${ECS_TASK_ROLE}<br />export CLUSTER_NAME=${ECS_CLUSTER_NAME}<br />export SERVICE_NAME=${ECS_CLUSTER_SERVICE_NAME}</pre>執行下列命令。<pre>aws iam create-role --role-name $ROLE_NAME --assume-role-policy-document file://ssm-trust-policy.json</pre> | 雲端架構師 | 
| 將 AmazonSSMManagedInstanceCore 政策新增至 IAM 角色。 | 執行下列命令。<pre>aws iam attach-role-policy --role-name $ROLE_NAME --policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore</pre> | 雲端架構師 | 
| 將 AmazonEC2ContainerServiceforEC2Role 政策新增至 IAM 角色。 | 執行下列命令。<pre>aws iam attach-role-policy --role-name $ROLE_NAME --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role</pre> | 雲端架構師 | 
| 驗證 IAM 角色。 | 若要驗證 IAM 角色，請執行下列命令。<pre>aws iam list-attached-role-policies --role-name $ROLE_NAME</pre> | 雲端架構師 | 
| 啟用 Systems Manager。 | 執行下列命令。<pre>aws ssm create-activation --iam-role $ROLE_NAME | tee ssm-activation.json</pre> | 雲端架構師 | 

### 將 WorkSpaces 新增至 ECS 叢集
<a name="add-workspaces-to-the-ecs-cluster"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
|  連線至 WorkSpaces。 | 若要連線至 並設定工作區，請遵循 [AWS 文件](https://docs.aws.amazon.com/workspaces/latest/userguide/workspaces-user-getting-started.html)中的指示。 | 應用程式開發人員 | 
| 下載 ecs-anywhere 安裝指令碼。 | 在命令提示中，執行下列 命令。<pre>curl -o "ecs-anywhere-install.sh" "https://amazon-ecs-agent-packages-preview.s3.us-east-1.amazonaws.com/ecs-anywhere-install.sh" && sudo chmod +x ecs-anywhere-install.sh</pre> | 應用程式開發人員 | 
| 檢查 Shell 指令碼的完整性。 | （選用） 執行下列命令。<pre>curl -o "ecs-anywhere-install.sh.sha256" "https://amazon-ecs-agent-packages-preview.s3.us-east-1.amazonaws.com/ecs-anywhere-install.sh.sha256" && sha256sum -c ecs-anywhere-install.sh.sha256<br /><br /><br /></pre> | 應用程式開發人員 | 
| 在 Amazon Linux 上新增 EPEL 儲存庫。 | 若要新增適用於 Enterprise Linux (EPEL) 的額外套件儲存庫，請執行命令 `sudo amazon-linux-extras install epel -y`。 | 應用程式開發人員 | 
| 安裝 Amazon ECS Anywhere。 | 若要執行安裝指令碼，請使用下列命令。<pre>sudo ./ecs-anywhere-install.sh --cluster $CLUSTER_NAME --activation-id $ACTIVATION_ID --activation-code $ACTIVATION_CODE --region $AWS_REGION<br /><br /><br /></pre> |  | 
| 從 ECS 叢集檢查執行個體資訊。 | 若要檢查 Systems Manager 和 ECS 叢集執行個體資訊，並驗證是否已在叢集上新增 WorkSpaces，請從本機電腦執行下列命令。<pre>aws ssm describe-instance-information" && "aws ecs list-container-instances --cluster $CLUSTER_NAME</pre> | 應用程式開發人員 | 

### 新增 WorkSpaces 的 ECS 任務
<a name="add-an-ecs-task-for-the-workspaces"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立任務執行 IAM 角色。 | `external-task-definition.json` 從*附件*區段下載 `task-execution-assume-role.json`和 。 在本機電腦上，執行下列命令。<pre>aws iam --region $AWS_DEFAULT_REGION create-role --role-name $ECS_TASK_EXECUTION_ROLE --assume-role-policy-document file://task-execution-assume-role.json</pre> | 雲端架構師 | 
| 將政策新增至執行角色。 | 執行下列命令。<pre>aws iam --region $AWS_DEFAULT_REGION attach-role-policy --role-name $ECS_TASK_EXECUTION_ROLE --policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy</pre> | 雲端架構師 | 
| 建立任務角色。 | 執行下列命令。<pre>aws iam --region $AWS_DEFAULT_REGION create-role --role-name $ECS_TASK_EXECUTION_ROLE --assume-role-policy-document file://task-execution-assume-role.json<br /><br /><br /></pre> | 雲端架構師 | 
| 將任務定義註冊到叢集。 | 在本機電腦上，執行下列命令。<pre>aws ecs register-task-definition --cli-input-json file://external-task-definition.json</pre> | 雲端架構師 | 
| 執行任務。 | 在本機電腦上，執行下列命令。<pre>aws ecs run-task --cluster $CLUSTER_NAME --launch-type EXTERNAL --task-definition nginx</pre> | 雲端架構師 | 
| 驗證任務執行狀態。 | 若要擷取任務 ID，請執行下列命令。<pre>export TEST_TASKID=$(aws ecs list-tasks --cluster $CLUSTER_NAME | jq -r '.taskArns[0]')</pre>使用任務 ID，執行下列命令。<pre>aws ecs describe-tasks --cluster $CLUSTER_NAME --tasks ${TEST_TASKID}</pre> | 雲端架構師 | 
| 驗證 WorkSpace 上的任務。 | 若要檢查 NGINX 是否在 WorkSpace 上執行，請執行 命令` curl http://localhost:8080`。 | 應用程式開發人員 | 

## 相關資源
<a name="run-amazon-ecs-tasks-on-amazon-workspaces-with-amazon-ecs-anywhere-resources"></a>
+ [ECS 叢集](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/clusters.html)
+ [設定混合環境](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-managedinstances.html)
+ [Amazon WorkSpaces](https://docs.aws.amazon.com/workspaces/latest/adminguide/amazon-workspaces.html)
+ [簡易 AD](https://docs.aws.amazon.com/workspaces/latest/adminguide/launch-workspace-simple-ad.html)

## 附件
<a name="attachments-da8b2249-3423-485c-9fef-6f902025e969"></a>

若要存取與本文件相關聯的其他內容，請解壓縮下列檔案： [attachment.zip](samples/p-attach/da8b2249-3423-485c-9fef-6f902025e969/attachments/attachment.zip)

# 在 Amazon EC2 Linux 執行個體上執行 ASP.NET Core Web API Docker 容器
<a name="run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance"></a>

*Vijai Anand Ramalingam 和 Sreelaxmi Pai，Amazon Web Services*

## 總結
<a name="run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance-summary"></a>

此模式適用於開始在 Amazon Web Services (AWS) 雲端上容器化其應用程式的人員。當您開始在雲端上容器化應用程式時，通常不會設定容器協同運作平台。此模式可協助您在 AWS 上快速設定基礎設施，以測試容器化應用程式，而不需要複雜的容器協同運作基礎設施。

現代化旅程的第一步是轉換應用程式。如果是舊版 .NET Framework 應用程式，您必須先將執行時間變更為 ASP.NET Core。然後執行下列動作：
+ 建立 Docker 容器映像
+ 使用建置的映像執行 Docker 容器
+ 在任何容器協同運作平台上部署應用程式之前，請先驗證應用程式，例如 Amazon Elastic Container Service (Amazon ECS) 或 Amazon Elastic Kubernetes Service (Amazon EKS)。 

此模式涵蓋 Amazon Elastic Compute Cloud (Amazon EC2) Linux 執行個體上現代應用程式開發的建置、執行和驗證層面。

## 先決條件和限制
<a name="run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance-prereqs"></a>

**先決條件**
+ 作用中的[Amazon Web Services (AWS) 帳戶](https://aws.amazon.com/account/)
+ [AnAWS Identity and Access Management (IAM) 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)具有足夠的存取權，可為此模式建立 AWS 資源 
+ [Visual Studio Community 2022 ](https://visualstudio.microsoft.com/downloads/)或更新版本下載並安裝
+ 將 .NET Framework 專案現代化為 ASP.NET Core
+ GitHub 儲存庫

**產品版本**
+ Visual Studio Community 2022 或更新版本

## Architecture
<a name="run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance-architecture"></a>

**目標架構**

此模式使用 [AWS CloudFormation 範本](https://console.aws.amazon.com/cloudformation/home?region=us-east-2#/stacks/new?stackName=SSM-SSH-Demo&templateURL=https://aws-quickstart.s3.amazonaws.com/quickstart-examples/samples/session-manager-ssh/session-manager-example.yaml)來建立高度可用的架構，如下圖所示。Amazon EC2 Linux 執行個體會在私有子網路中啟動。AWS Systems Manager Session Manager 用於存取私有 Amazon EC2 Linux 執行個體，以及測試在 Docker 容器中執行的 API。

![\[存取 Amazon EC2 Linux 執行個體並測試在 Docker 容器中執行之 API 的使用者。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/512e61b2-10ba-43be-bbd8-2bdc597c3de3/images/9c5206f6-32b1-47be-9037-360c0bff713c.png)


1. 透過 Session Manager 存取 Linux 執行個體

## 工具
<a name="run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance-tools"></a>

**AWS 服務**
+ [AWS 命令列界面](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) – AWS 命令列界面 (AWS CLI) 是一種開放原始碼工具，可透過命令列 shell 中的命令與 AWS 服務互動。透過最少的組態，您可以執行 AWS CLI 命令來實作相當於瀏覽器型 AWS 管理主控台所提供功能的功能。
+ [AWS 管理主控台](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/learn-whats-new.html) – AWS 管理主控台是一種 Web 應用程式，包含並參考各種用於管理 AWS 資源的服務主控台。若是首次登入，這時主控台頁面將會顯示。首頁提供每個服務主控台的存取權，並提供單一位置來存取執行 AWS 相關任務所需的資訊。
+ [AWS Systems Manager Session Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager.html) – Session Manager 是全受管的 AWS Systems Manager 功能。使用 Session Manager，您可以管理 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體。Session Manager 提供安全且可稽核的節點管理，無需開啟傳入連接埠、維護堡壘主機或管理 SSH 金鑰。

**其他工具**
+ [Visual Studio 2022](https://visualstudio.microsoft.com/downloads/) – Visual Studio 2022 是整合式開發環境 (IDE)。
+ [Docker](https://www.docker.com/) – Docker 是一組平台即服務 (PaaS) 產品，可在作業系統層級使用虛擬化在容器中交付軟體。

**Code**

```
FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
 WORKDIR /app
EXPOSE 80
EXPOSE 443
 
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["DemoNetCoreWebAPI/DemoNetCoreWebAPI.csproj", "DemoNetCoreWebAPI/"]
RUN dotnet restore "DemoNetCoreWebAPI/DemoNetCoreWebAPI.csproj"
COPY . .
WORKDIR "/src/DemoNetCoreWebAPI"
RUN dotnet build "DemoNetCoreWebAPI.csproj" -c Release -o /app/build
 
FROM build AS publish
RUN dotnet publish "DemoNetCoreWebAPI.csproj" -c Release -o /app/publish
 
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "DemoNetCoreWebAPI.dll"]
```

## 史詩
<a name="run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance-epics"></a>

### 開發 ASP.NET Core Web API
<a name="develop-the-asp-net-core-web-api"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 使用 Visual Studio 建立範例 ASP.NET Core Web API。 | 若要建立範例 ASP.NET Core Web API，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance.html) | 應用程式開發人員 | 
| 建立 Dockerfile。 | 若要建立 Dockerfile，請執行下列其中一項操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance.html)若要將變更推送到您的 GitHub 儲存庫，請執行下列命令。<pre>git add --all<br />git commit -m "Dockerfile added"<br />git push</pre> | 應用程式開發人員 | 

### 設定 Amazon EC2 Linux 執行個體
<a name="set-up-the-amazon-ec2-linux-instance"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定 基礎設施。 | 啟動 [AWS CloudFormation 範本](https://console.aws.amazon.com/cloudformation/home?region=us-east-2#/stacks/new?stackName=SSM-SSH-Demo&templateURL=https://aws-quickstart.s3.amazonaws.com/quickstart-examples/samples/session-manager-ssh/session-manager-example.yaml)以建立基礎設施，其中包含下列項目： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance.html)若要進一步了解如何使用 Session Manager 存取私有 Amazon EC2 執行個體，而不需要堡壘主機，請參閱[無堡壘世界](https://aws.amazon.com/blogs/infrastructure-and-automation/toward-a-bastion-less-world/)部落格文章。 | 應用程式開發人員、AWS 管理員、AWS DevOps | 
| 登入 Amazon EC2 Linux 執行個體。 | 若要連線至私有子網路中的 Amazon EC2 Linux 執行個體，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance.html) | 應用程式開發人員 | 
| 安裝並啟動 Docker。 | 若要在 Amazon EC2 Linux 執行個體中安裝和啟動 Docker，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance.html) | 應用程式開發人員、AWS 管理員、AWS DevOps | 
| 安裝 Git 並複製儲存庫。 | 若要在 Amazon EC2 Linux 執行個體上安裝 Git，並從 GitHub 複製儲存庫，請執行下列動作。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance.html) | 應用程式開發人員、AWS 管理員、AWS DevOps | 
| 建置並執行 Docker 容器。 | 若要建置 Docker 映像並在 Amazon EC2 Linux 執行個體內執行容器，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance.html) | 應用程式開發人員、AWS 管理員、AWS DevOps | 

### 測試 Web API
<a name="test-the-web-api"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 使用 curl 命令測試 Web API。 | 若要測試 Web API，請執行下列命令。<pre>curl -X GET "http://localhost/WeatherForecast" -H  "accept: text/plain"</pre>驗證 API 回應。您可以在本機執行時，從 Swagger 取得每個端點的 curl 命令。 | 應用程式開發人員 | 

### 清除資源
<a name="clean-up-resources"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 刪除所有資源。 | 刪除堆疊以移除所有資源。這可確保您不需要為未使用的任何服務付費。 | AWS 管理員、AWS DevOps | 

## 相關資源
<a name="run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance-resources"></a>
+ [使用 PuTTY 從 Windows 連線至 Linux 執行個體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/putty.html)
+ [使用 ASP.NET Core 建立 Web API](https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api?view=aspnetcore-5.0&tabs=visual-studio)
+ [向無堡壘的世界邁進](https://aws.amazon.com/blogs/infrastructure-and-automation/toward-a-bastion-less-world/)

# 使用 Amazon EFS on Amazon EKS 搭配 AWS Fargate，以持久性資料儲存來執行具狀態工作負載
<a name="run-stateful-workloads-with-persistent-data-storage-by-using-amazon-efs-on-amazon-eks-with-aws-fargate"></a>

*Ricardo Morais、Rodrigo Bersa 和 Amazon Web Services Lucio Pereira*

## 總結
<a name="run-stateful-workloads-with-persistent-data-storage-by-using-amazon-efs-on-amazon-eks-with-aws-fargate-summary"></a>

此模式透過使用 AWS Fargate 佈建您的運算資源，為在 Amazon Elastic Kubernetes Service (Amazon EKS) 上執行的容器提供啟用 Amazon Elastic File System (Amazon EFS) 作為儲存裝置的指引。

此模式中描述的設定遵循安全最佳實務，並預設提供靜態安全性和傳輸中的安全性。若要加密 Amazon EFS 檔案系統，它會使用 AWS Key Management Service (AWS KMS) 金鑰，但您也可以指定金鑰別名，以分派建立 KMS 金鑰的程序。

您可以遵循此模式中的步驟，為proof-of-concept(PoC) 應用程式建立命名空間和 Fargate 設定檔、安裝用於整合 Kubernetes 叢集與 Amazon EFS 的 Amazon EFS 容器儲存界面 (CSI) 驅動程式、設定儲存類別，以及部署 PoC 應用程式。這些步驟會產生在多個 Kubernetes 工作負載之間共用的 Amazon EFS 檔案系統，透過 Fargate 執行。模式隨附可自動化這些步驟的指令碼。

如果您想要容器化應用程式中的資料持久性，並想要避免擴展操作期間遺失資料，則可以使用此模式。例如：
+ **DevOps 工具** – 常見的案例是開發持續整合和持續交付 (CI/CD) 策略。在這種情況下，您可以使用 Amazon EFS 作為共用檔案系統，在 CI/CD 工具的不同執行個體之間存放組態，或在 CI/CD 工具的不同執行個體之間存放管道階段的快取 （例如 Apache Maven 儲存庫）。
+ **Web 伺服器** – 常見的案例是使用 Apache 做為 HTTP Web 伺服器。您可以使用 Amazon EFS 做為共用檔案系統，來存放 Web 伺服器不同執行個體之間共用的靜態檔案。在此範例案例中，修改會直接套用至檔案系統，而不是將靜態檔案製作成 Docker 映像。

## 先決條件和限制
<a name="run-stateful-workloads-with-persistent-data-storage-by-using-amazon-efs-on-amazon-eks-with-aws-fargate-prereqs"></a>

**先決條件**
+ 作用中的 AWS 帳戶
+ 具有 Kubernetes 1.17 版或更新版本的現有 Amazon EKS 叢集 （已測試至 1.27 版）
+ 現有的 Amazon EFS 檔案系統，可動態繫結 Kubernetes StorageClass 和佈建檔案系統
+ 叢集管理許可
+ 設定為指向所需 Amazon EKS 叢集的內容

**限制**
+ 當您搭配 Fargate 使用 Amazon EKS 時，需要考量一些限制。例如，不支援使用某些 Kubernetes 建構模組，例如 DaemonSets 和特殊權限容器。如需 Fargate 限制的詳細資訊，請參閱 Amazon EKS 文件中的 [AWS Fargate 考量](https://docs.aws.amazon.com/eks/latest/userguide/fargate.html#fargate-considerations)事項。
+ 此模式提供的程式碼支援執行 Linux 或 macOS 的工作站。

**產品版本**
+ AWS Command Line Interface (AWS CLI) 第 2 版或更新版本
+ Amazon EFS CSI 驅動程式 1.0 版或更新版本 （已測試至 2.4.8 版）
+ eksctl 0.24.0 版或更新版本 （已測試至 0.158.0 版）
+ jq 1.6 版或更新版本
+ kubectl 1.17 版或更新版本 （已測試至 1.27 版）
+ Kubernetes 1.17 版或更新版本 （已測試至 1.27 版）

## Architecture
<a name="run-stateful-workloads-with-persistent-data-storage-by-using-amazon-efs-on-amazon-eks-with-aws-fargate-architecture"></a>

![\[使用 Amazon EFS 搭配持久性資料儲存體執行具狀態工作負載的架構圖\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/2487e285-269b-415b-a270-877f973e3aaf/images/ec8de63c-3307-4010-9e03-2bd7b9881fff.png)


目標架構包含下列基礎設施：
+ 虛擬私有雲端 (VPC)
+ 兩個可用區域
+ 具有 NAT 閘道的公有子網路，可提供網際網路存取
+ 具有 Amazon EKS 叢集和 Amazon EFS 掛載目標 （也稱為*掛載點*) 的私有子網路
+ VPC 層級的 Amazon EFS 

以下是 Amazon EKS 叢集的環境基礎設施：
+ 在命名空間層級容納 Kubernetes 建構的 AWS Fargate 設定檔
+ 具有下列項目的 Kubernetes 命名空間：
  + 跨可用區域分佈的兩個應用程式 Pod
  + 在叢集層級繫結至持久性磁碟區 (PV) 的一個持久性磁碟區宣告 (PVC)
+ 整個叢集的 PV，繫結至命名空間中的 PVC，並指向叢集外部私有子網路中的 Amazon EFS 掛載目標

## 工具
<a name="run-stateful-workloads-with-persistent-data-storage-by-using-amazon-efs-on-amazon-eks-with-aws-fargate-tools"></a>

**AWS 服務**
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) 是一種開放原始碼工具，可用來從命令列與 AWS 服務互動。
+ [Amazon Elastic File System (Amazon EFS)](https://docs.aws.amazon.com/efs/latest/ug/whatisefs.html) 可協助您在 AWS 雲端中建立和設定共用檔案系統。在此模式中，它提供簡單、可擴展、全受管和共用的檔案系統，以便與 Amazon EKS 搭配使用。
+ [Amazon Elastic Kubernetes Service (Amazon EKS)](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) 可協助您在 AWS 上執行 Kubernetes，而無需安裝或操作您自己的叢集。
+ [AWS Fargate](https://docs.aws.amazon.com/eks/latest/userguide/fargate.html) 是 Amazon EKS 的無伺服器運算引擎。它為您的 Kubernetes 應用程式建立和管理運算資源。
+ [AWS Key Management Service (AWS KMS)](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) 可協助您建立和控制密碼編譯金鑰，以協助保護您的資料。

**其他工具**
+ [Docker](https://www.docker.com/) 是一組平台即服務 (PaaS) 產品，可在作業系統層級使用虛擬化在容器中交付軟體。
+ [eksctl](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-eksctl.html) 是一種命令列公用程式，用於在 Amazon EKS 上建立和管理 Kubernetes 叢集。
+ [kubectl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html) 是一種命令列界面，可協助您針對 Kubernetes 叢集執行命令。
+ [jq](https://stedolan.github.io/jq/download/) 是用於剖析 JSON 的命令列工具。

**Code**

此模式的程式碼會在 GitHub [持續性組態中使用 AWS Fargate 儲存庫搭配 Amazon EKS 上的 Amazon EFS ](https://github.com/aws-samples/eks-efs-share-within-fargate)中提供。指令碼會透過 在資料夾中依 epic `epic01` 組織`epic06`，對應至此模式中[的 Epics](#run-stateful-workloads-with-persistent-data-storage-by-using-amazon-efs-on-amazon-eks-with-aws-fargate-epics) 區段順序。

## 最佳實務
<a name="run-stateful-workloads-with-persistent-data-storage-by-using-amazon-efs-on-amazon-eks-with-aws-fargate-best-practices"></a>

目標架構包含下列服務和元件，並遵循 [AWS Well-Architected Framework](https://aws.amazon.com/architecture/well-architected/) 最佳實務：
+ Amazon EFS，提供簡單、可擴展、全受管的彈性 NFS 檔案系統。這在 Pod 中執行的所有 PoC 應用程式複寫中用作共用檔案系統，這些複寫會分佈在所選 Amazon EKS 叢集的私有子網路中。
+ 每個私有子網路的 Amazon EFS 掛載目標。這可提供叢集虛擬私有雲端 (VPC) 內每個可用區域的備援。
+ 執行 Kubernetes 工作負載的 Amazon EKS。您必須先佈建 Amazon EKS 叢集，才能使用此模式，如[先決條件](#run-stateful-workloads-with-persistent-data-storage-by-using-amazon-efs-on-amazon-eks-with-aws-fargate-prereqs)一節中所述。
+ AWS KMS，可為存放在 Amazon EFS 檔案系統中的內容提供靜態加密。
+ Fargate，可管理容器的運算資源，讓您可以專注於業務需求，而不是基礎設施負擔。系統會為所有私有子網路建立 Fargate 設定檔。它提供叢集虛擬私有雲端 (VPC) 內每個可用區域的備援。
+ Kubernetes Pod，用於驗證內容可由應用程式的不同執行個體共用、取用和寫入。

## 史詩
<a name="run-stateful-workloads-with-persistent-data-storage-by-using-amazon-efs-on-amazon-eks-with-aws-fargate-epics"></a>

### 佈建 Amazon EKS 叢集 （選用）
<a name="provision-an-amazon-eks-cluster-optional"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 Amazon EKS 叢集。 | 如果您已部署叢集，請跳到下一個史詩。在您現有的 AWS 帳戶中建立 Amazon EKS 叢集。在 [GitHub 目錄中](https://github.com/aws-samples/eks-efs-share-within-fargate/tree/master/bootstrap)，使用其中一種模式，透過 Terraform 或 eksctl 部署 Amazon EKS 叢集。如需詳細資訊，請參閱《[Amazon EKS 文件》中的建立 Amazon EKS 叢集](https://docs.aws.amazon.com/eks/latest/userguide/create-cluster.html)。在 Terraform 模式中，也有範例顯示如何：將 Fargate 設定檔連結至 Amazon EKS 叢集、建立 Amazon EFS 檔案系統，以及在 Amazon EKS 叢集中部署 Amazon EFS CSI 驅動程式。 | AWS 管理員、Terraform 或 eksctl 管理員、Kubernetes 管理員 | 
| 匯出環境變數。 | 執行 env.sh 指令碼。這提供後續步驟中所需的資訊。<pre>source ./scripts/env.sh<br />Inform the AWS Account ID:<br /><13-digit-account-id><br />Inform your AWS Region:<br /><aws-Region-code><br />Inform your Amazon EKS Cluster Name:<br /><amazon-eks-cluster-name><br />Inform the Amazon EFS Creation Token:<br /><self-genereated-uuid></pre>如果尚未記下，您可以使用下列 CLI 命令取得上述要求的所有資訊。<pre># ACCOUNT ID<br />aws sts get-caller-identity --query "Account" --output text</pre><pre># REGION CODE<br />aws configure get region</pre><pre># CLUSTER EKS NAME<br />aws eks list-clusters --query "clusters" --output text</pre><pre># GENERATE EFS TOKEN<br />uuidgen</pre> | AWS 系統管理員 | 

### 建立 Kubernetes 命名空間和連結的 Fargate 設定檔
<a name="create-a-kubernetes-namespace-and-a-linked-fargate-profile"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 為應用程式工作負載建立 Kubernetes 命名空間和 Fargate 設定檔。 | 建立命名空間以接收與 Amazon EFS 互動的應用程式工作負載。執行 `create-k8s-ns-and-linked-fargate-profile.sh` 指令碼。您可以選擇使用自訂命名空間名稱或預設提供的命名空間 `poc-efs-eks-fargate`。**使用自訂應用程式命名空間名稱：**<pre>export $APP_NAMESPACE=<CUSTOM_NAME><br />./scripts/epic01/create-k8s-ns-and-linked-fargate-profile.sh \<br />-c "$CLUSTER_NAME" -n "$APP_NAMESPACE"</pre>**沒有自訂應用程式命名空間名稱：**<pre>./scripts/epic01/create-k8s-ns-and-linked-fargate-profile.sh \<br />    -c "$CLUSTER_NAME"</pre>其中 `$CLUSTER_NAME`是 Amazon EKS 叢集的名稱。`-n <NAMESPACE>` 參數為選用；如果未收到通知，則會提供預設產生的命名空間名稱。 | 具有授予許可的 Kubernetes 使用者 | 

### 建立 Amazon EFS 檔案系統
<a name="create-an-amazon-efs-file-system"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 產生唯一的字符。 | Amazon EFS 需要建立字符以確保等冪性操作 （使用相同的建立字符呼叫操作沒有效果）。若要符合此要求，您必須透過可用的技術產生唯一的權杖。例如，您可以產生通用的唯一識別符 (UUID)，以用作建立字符。 | AWS 系統管理員 | 
| 建立 Amazon EFS 檔案系統。 | 建立 檔案系統，以接收應用程式工作負載讀取和寫入的資料檔案。您可以建立加密或未加密的檔案系統。（最佳實務是，此模式的程式碼會建立加密系統，以預設啟用靜態加密。) 您可以使用唯一的對稱 AWS KMS 金鑰來加密檔案系統。如果未指定自訂金鑰，則會使用 AWS 受管金鑰。在您為 Amazon EFS 產生唯一字符之後，請使用 create-efs.sh 指令碼來建立加密或未加密的 Amazon EFS 檔案系統。**使用靜態加密，不使用 KMS 金鑰：**<pre>./scripts/epic02/create-efs.sh \<br />    -c "$CLUSTER_NAME" \<br />    -t "$EFS_CREATION_TOKEN"</pre>其中 `$CLUSTER_NAME`是 Amazon EKS 叢集的名稱`$EFS_CREATION_TOKEN`，也是檔案系統的唯一建立字符。**使用靜態加密搭配 KMS 金鑰：**<pre>./scripts/epic02/create-efs.sh \<br />    -c "$CLUSTER_NAME" \<br />    -t "$EFS_CREATION_TOKEN" \<br />    -k "$KMS_KEY_ALIAS"</pre>其中 `$CLUSTER_NAME`是 Amazon EKS 叢集的名稱， `$EFS_CREATION_TOKEN` 是檔案系統的唯一建立字符， `$KMS_KEY_ALIAS`是 KMS 金鑰的別名。**沒有加密：**<pre>./scripts/epic02/create-efs.sh -d \<br />    -c "$CLUSTER_NAME" \<br />    -t "$EFS_CREATION_TOKEN"</pre>其中 `$CLUSTER_NAME`是 Amazon EKS 叢集的名稱， `$EFS_CREATION_TOKEN` 是檔案系統的唯一建立字符，並`–d`停用靜態加密。 | AWS 系統管理員 | 
| 建立安全群組。 | 建立安全群組以允許 Amazon EKS 叢集存取 Amazon EFS 檔案系統。 | AWS 系統管理員 | 
| 更新安全群組的傳入規則。 | 更新安全群組的傳入規則，以允許下列設定的傳入流量：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/run-stateful-workloads-with-persistent-data-storage-by-using-amazon-efs-on-amazon-eks-with-aws-fargate.html) | AWS 系統管理員 | 
| 為每個私有子網路新增掛載目標。 | 針對 Kubernetes 叢集的每個私有子網路，為檔案系統和安全群組建立掛載目標。 | AWS 系統管理員 | 

### 在 Kubernetes 叢集中安裝 Amazon EFS 元件
<a name="install-amazon-efs-components-into-the-kubernetes-cluster"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 部署 Amazon EFS CSI 驅動程式。 | 將 Amazon EFS CSI 驅動程式部署至叢集。驅動程式會根據應用程式建立的持久性磁碟區宣告佈建儲存體。執行`create-k8s-efs-csi-sc.sh`指令碼，將 Amazon EFS CSI 驅動程式和儲存類別部署至叢集。<pre>./scripts/epic03/create-k8s-efs-csi-sc.sh</pre>此指令碼使用 `kubectl`公用程式，因此請確定已設定內容並指向所需的 Amazon EKS 叢集。 | 具有授予許可的 Kubernetes 使用者 | 
| 部署儲存類別。 | 將儲存體方案部署到 Amazon EFS 佈建器的叢集 (efs.csi.aws.com：//)。 | 具有授予許可的 Kubernetes 使用者 | 

### 將 PoC 應用程式安裝到 Kubernetes 叢集
<a name="install-the-poc-application-into-the-kubernetes-cluster"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 部署持久性磁碟區。 | 部署持久性磁碟區，並將其連結至建立的儲存體方案和 Amazon EFS 檔案系統的 ID。應用程式會使用持久性磁碟區來讀取和寫入內容。您可以在儲存欄位中指定持久性磁碟區的任何大小。Kubernetes 需要此欄位，但由於 Amazon EFS 是彈性檔案系統，因此不會強制執行任何檔案系統容量。您可以部署具有或不具有加密的持久性磁碟區。（根據最佳實務，Amazon EFS CSI 驅動程式預設會啟用加密。) 執行`deploy-poc-app.sh`指令碼以部署持久性磁碟區、持久性磁碟區宣告和兩個工作負載。**使用傳輸中加密：**<pre>./scripts/epic04/deploy-poc-app.sh \<br />    -t "$EFS_CREATION_TOKEN"</pre>其中 `$EFS_CREATION_TOKEN`是檔案系統的唯一建立字符。**沒有傳輸中加密：**<pre>./scripts/epic04/deploy-poc-app.sh -d \<br />    -t "$EFS_CREATION_TOKEN"</pre>其中 `$EFS_CREATION_TOKEN`是檔案系統的唯一建立字符，並`–d`停用傳輸中的加密。 | 具有授予許可的 Kubernetes 使用者 | 
| 部署應用程式請求的持久性磁碟區宣告。 | 部署應用程式請求的持久性磁碟區宣告，並將其連結至儲存體方案。使用與您先前建立的持久性磁碟區相同的存取模式。您可以在儲存欄位中指定持久性磁碟區宣告的任何大小。Kubernetes 需要此欄位，但由於 Amazon EFS 是彈性檔案系統，因此不會強制執行任何檔案系統容量。 | 具有授予許可的 Kubernetes 使用者 | 
| 部署工作負載 1。 | 部署代表應用程式工作負載 1 的 Pod。此工作負載會將內容寫入檔案 `/data/out1.txt`。 | 具有授予許可的 Kubernetes 使用者 | 
| 部署工作負載 2。 | 部署代表應用程式工作負載 2 的 Pod。此工作負載會將內容寫入檔案 `/data/out2.txt`。 | 具有授予許可的 Kubernetes 使用者 | 

### 驗證檔案系統的持久性、耐用性和可共用性
<a name="validate-file-system-persistence-durability-and-shareability"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 檢查 的狀態`PersistentVolume`。 | 輸入下列命令以檢查 的狀態`PersistentVolume`。<pre>kubectl get pv</pre>如需輸出範例，請參閱[其他資訊](#run-stateful-workloads-with-persistent-data-storage-by-using-amazon-efs-on-amazon-eks-with-aws-fargate-additional)一節。 | 具有授予許可的 Kubernetes 使用者 | 
| 檢查 的狀態`PersistentVolumeClaim`。 | 輸入下列命令來檢查 的狀態`PersistentVolumeClaim`。<pre>kubectl -n poc-efs-eks-fargate get pvc</pre>如需輸出範例，請參閱[其他資訊](#run-stateful-workloads-with-persistent-data-storage-by-using-amazon-efs-on-amazon-eks-with-aws-fargate-additional)一節。 | 具有授予許可的 Kubernetes 使用者 | 
| 驗證工作負載 1 是否可以寫入檔案系統。 | 輸入下列命令來驗證工作負載 1 正在寫入 `/data/out1.txt`。<pre>kubectl exec -ti poc-app1 -n poc-efs-eks-fargate -- tail -f /data/out1.txt</pre>結果如下：<pre>...<br />Thu Sep  3 15:25:07 UTC 2023 - PoC APP 1<br />Thu Sep  3 15:25:12 UTC 2023 - PoC APP 1<br />Thu Sep  3 15:25:17 UTC 2023 - PoC APP 1<br />...</pre> | 具有授予許可的 Kubernetes 使用者 | 
| 驗證工作負載 2 是否可以寫入檔案系統。 | 輸入下列命令來驗證工作負載 2 正在寫入 `/data/out2.txt`。<pre>kubectl -n $APP_NAMESPACE exec -ti poc-app2 -- tail -f /data/out2.txt</pre>結果如下：<pre>...<br />Thu Sep  3 15:26:48 UTC 2023 - PoC APP 2<br />Thu Sep  3 15:26:53 UTC 2023 - PoC APP 2<br />Thu Sep  3 15:26:58 UTC 2023 - PoC APP 2<br />...</pre> | 具有授予許可的 Kubernetes 使用者 | 
| 驗證工作負載 1 可以讀取工作負載 2 寫入的檔案。 | 輸入下列命令來驗證工作負載 1 是否可以讀取由工作負載 2 寫入`/data/out2.txt`的檔案。<pre>kubectl exec -ti poc-app1 -n poc-efs-eks-fargate -- tail -n 3 /data/out2.txt</pre>結果如下：<pre>...<br />Thu Sep  3 15:26:48 UTC 2023 - PoC APP 2<br />Thu Sep  3 15:26:53 UTC 2023 - PoC APP 2<br />Thu Sep  3 15:26:58 UTC 2023 - PoC APP 2<br />...</pre> | 具有授予許可的 Kubernetes 使用者 | 
| 驗證工作負載 2 可以讀取由工作負載 1 寫入的檔案。 | 輸入下列命令來驗證工作負載 2 是否可以讀取由工作負載 1 寫入`/data/out1.txt`的檔案。<pre>kubectl -n $APP_NAMESPACE exec -ti poc-app2 -- tail -n 3 /data/out1.txt</pre>結果如下：<pre>...<br />Thu Sep  3 15:29:22 UTC 2023 - PoC APP 1<br />Thu Sep  3 15:29:27 UTC 2023 - PoC APP 1<br />Thu Sep  3 15:29:32 UTC 2023 - PoC APP 1<br />...</pre> | 具有授予許可的 Kubernetes 使用者 | 
| 在您移除應用程式元件後，驗證檔案是否已保留。 | 接著，您可以使用指令碼來移除應用程式元件 （持久性磁碟區、持久性磁碟區宣告和 Pod)，並驗證檔案`/data/out1.txt`和 `/data/out2.txt` 是否保留在檔案系統中。使用以下命令來執行 `validate-efs-content.sh` 指令碼。<pre>./scripts/epic05/validate-efs-content.sh \<br />    -t "$EFS_CREATION_TOKEN"</pre>其中 `$EFS_CREATION_TOKEN`是檔案系統的唯一建立字符。結果如下：<pre>pod/poc-app-validation created<br />Waiting for pod get Running state...<br />Waiting for pod get Running state...<br />Waiting for pod get Running state...<br />Results from execution of 'find /data' on validation process pod:<br />/data<br />/data/out2.txt<br />/data/out1.txt</pre> | 具有授予許可的 Kubernetes 使用者、系統管理員 | 

### 監控操作
<a name="monitor-operations"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 監控應用程式日誌。 | 在第二天操作中，將應用程式日誌運送到 Amazon CloudWatch 以進行監控。 | AWS 系統管理員、具有授與許可的 Kubernetes 使用者 | 
| 使用 Container Insights 監控 Amazon EKS 和 Kubernetes 容器。 | 作為第二天操作的一部分，請使用 Amazon CloudWatch Container Insights 監控 Amazon EKS 和 Kubernetes 系統。此工具會從不同層級和維度的容器化應用程式收集、彙總和摘要指標。如需詳細資訊，請參閱[相關資源](#run-stateful-workloads-with-persistent-data-storage-by-using-amazon-efs-on-amazon-eks-with-aws-fargate-resources)一節。 | AWS 系統管理員、具有授與許可的 Kubernetes 使用者 | 
| 使用 CloudWatch 監控 Amazon EFS。 | 作為第二天操作的一部分，請使用 Amazon CloudWatch 監控檔案系統，該系統會收集來自 Amazon EFS 的原始資料並將其處理為可讀且幾近即時的指標。如需詳細資訊，請參閱[相關資源](#run-stateful-workloads-with-persistent-data-storage-by-using-amazon-efs-on-amazon-eks-with-aws-fargate-resources)一節。 | AWS 系統管理員 | 

### 清除資源
<a name="clean-up-resources"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 清除模式的所有已建立資源。 | 完成此模式後，請清除所有資源，以避免產生 AWS 費用。在您完成使用 PoC 應用程式後，執行`clean-up-resources.sh`指令碼以移除所有資源。完成下列其中一個選項。**使用靜態加密搭配 KMS 金鑰：**<pre>./scripts/epic06/clean-up-resources.sh \<br />    -c "$CLUSTER_NAME" \<br />    -t "$EFS_CREATION_TOKEN" \<br />    -k "$KMS_KEY_ALIAS"</pre>其中 `$CLUSTER_NAME`是 Amazon EKS 叢集的名稱， `$EFS_CREATION_TOKEN` 是檔案系統的建立字符，而 `$KMS_KEY_ALIAS`是 KMS 金鑰的別名。**不使用靜態加密：**<pre>./scripts/epic06/clean-up-resources.sh \<br />    -c "$CLUSTER_NAME" \<br />    -t "$EFS_CREATION_TOKEN"</pre>其中 `$CLUSTER_NAME`是 Amazon EKS 叢集的名稱， `$EFS_CREATION_TOKEN`是檔案系統的建立字符。 | 具有授予許可的 Kubernetes 使用者、系統管理員 | 

## 相關資源
<a name="run-stateful-workloads-with-persistent-data-storage-by-using-amazon-efs-on-amazon-eks-with-aws-fargate-resources"></a>

**參考**
+ [AWS Fargate for Amazon EKS 現在支援 Amazon EFS](https://aws.amazon.com/blogs/aws/new-aws-fargate-for-amazon-eks-now-supports-amazon-efs/) （公告）
+ [如何在 AWS Fargate 上使用 Amazon EKS 時擷取應用程式日誌](https://aws.amazon.com/blogs/containers/how-to-capture-application-logs-when-using-amazon-eks-on-aws-fargate/) （部落格文章）
+ [使用 Container Insights](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/ContainerInsights.html) (Amazon CloudWatch 文件）
+ 在 [Amazon EKS 和 Kubernetes 上設定 Container Insights ](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/deploy-container-insights-EKS.html)(Amazon CloudWatch 文件）
+ [Amazon EKS 和 Kubernetes Container Insights 指標](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Container-Insights-metrics-EKS.html) (Amazon CloudWatch 文件）
+ [使用 Amazon CloudWatch 監控 Amazon EFS ](https://docs.aws.amazon.com/efs/latest/ug/monitoring-cloudwatch.html) (Amazon EFS 文件）

**GitHub 教學課程和範例**
+ [靜態佈建](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/examples/kubernetes/static_provisioning/README.md)
+ [傳輸中加密](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/examples/kubernetes/encryption_in_transit/README.md)
+ [從多個 Pod 存取檔案系統](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/examples/kubernetes/multiple_pods/README.md)
+ [在 StatefulSets 中使用 Amazon EFS ](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/examples/kubernetes/statefulset/README.md)
+ [掛載子路徑](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/examples/kubernetes/volume_path/README.md)
+ [使用 Amazon EFS 存取點](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/examples/kubernetes/access_points/README.md)
+ [Terraform 的 Amazon EKS 藍圖](https://aws-ia.github.io/terraform-aws-eks-blueprints/)

**必要工具**
+ [安裝 AWS CLI 第 2 版](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)
+ [安裝 eksctl](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-eksctl.html)
+ [安裝 kubectl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)
+ [安裝 jq](https://stedolan.github.io/jq/download/)

## 其他資訊
<a name="run-stateful-workloads-with-persistent-data-storage-by-using-amazon-efs-on-amazon-eks-with-aws-fargate-additional"></a>

以下是 `kubectl get pv`命令的範例輸出。

```
NAME         CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                             STORAGECLASS   REASON   AGE
poc-app-pv   1Mi        RWX            Retain           Bound    poc-efs-eks-fargate/poc-app-pvc   efs-sc                  3m56s
```

以下是 `kubectl -n poc-efs-eks-fargate get pvc`命令的範例輸出。

```
NAME          STATUS   VOLUME       CAPACITY   ACCESS MODES   STORAGECLASS   AGE
poc-app-pvc   Bound    poc-app-pv   1Mi        RWX            efs-sc         4m34s
```

# 使用 Amazon EKS Pod Identity 和 KEDA 在 Amazon EKS 中設定事件驅動的自動擴展
<a name="event-driven-auto-scaling-with-eks-pod-identity-and-keda"></a>

*Dipen Desai、Abhay Diwan、Kamal Joshi 和 Mahendra Revanasiddappa，Amazon Web Services*

## 總結
<a name="event-driven-auto-scaling-with-eks-pod-identity-and-keda-summary"></a>

協同運作平台，例如 [Amazon Elastic Kubernetes Service (Amazon EKS)](https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html)，已簡化容器型應用程式的生命週期管理。這有助於組織專注於建置、保護、操作和維護容器型應用程式。隨著事件驅動型部署越來越常見，組織會根據各種事件來源更頻繁地擴展 Kubernetes 部署。此方法結合自動擴展，可提供隨需運算資源和專為應用程式邏輯量身打造的高效擴展，進而大幅節省成本。

[KEDA](https://keda.sh/) 是以 Kubernetes 為基礎的事件驅動自動擴展器。KEDA 可協助您根據需要處理的事件數量，擴展 Kubernetes 中的任何容器。它很輕量，並與任何 Kubernetes 叢集整合。它也適用於標準 Kubernetes 元件，例如 [Horizontal Pod Autoscaling (HPA)](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/)。KEDA 也提供 [TriggerAuthentication](https://keda.sh/docs/2.14/concepts/authentication/#re-use-credentials-and-delegate-auth-with-triggerauthentication)，這項功能可協助您委派身分驗證。它可讓您描述與 ScaledObject 和部署容器分開的身分驗證參數。

AWS 提供支援各種 Kubernetes 部署選項的 AWS Identity and Access Management (IAM) 角色，包括 Amazon EKS、Amazon EKS Anywhere、 Red Hat OpenShift Service on AWS (ROSA) 和 Amazon Elastic Compute Cloud (Amazon EC2) 上的自我管理 Kubernetes 叢集。這些角色使用 OpenID Connect (OIDC) 身分提供者和 IAM 信任政策等 IAM 建構，在不同的環境中操作，而無需直接依賴 Amazon EKS 服務或 APIs。如需詳細資訊，請參閱 Amazon EKS 文件中的[服務帳戶的 IAM 角色](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html)。

[Amazon EKS Pod Identity](https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html) 可簡化 Kubernetes 服務帳戶擔任 IAM 角色的程序，而無需 OIDC 供應商。它可讓您管理應用程式的登入資料。您可以將 IAM 角色與 Kubernetes 服務帳戶建立關聯，並將 Pod 設定為使用服務帳戶，而不是建立 AWS 登入資料並將其分發至容器或使用 Amazon EC2 執行個體的角色。這可協助您跨多個叢集使用 IAM 角色，並透過啟用跨 IAM 角色重複使用許可政策來簡化政策管理。

透過使用 Amazon EKS Pod Identity 實作 KEDA，企業可以實現高效的事件驅動型自動擴展和簡化的憑證管理。應用程式會根據需求擴展，以最佳化資源使用率並降低成本。

此模式可協助您將 Amazon EKS Pod 身分與 KEDA 整合。它展示了如何使用 `keda-operator` 服務帳戶和透過 委派身分驗證`TriggerAuthentication`。它還描述了如何在 KEDA 運算子的 IAM 角色與應用程式的 IAM 角色之間設定信任關係。此信任關係可讓 KEDA 監控事件佇列中的訊息，並調整目的地 Kubernetes 物件的擴展。

## 先決條件和限制
<a name="event-driven-auto-scaling-with-eks-pod-identity-and-keda-prereqs"></a>

**先決條件**
+ AWS Command Line Interface (AWS CLI) 2.13.17 版或更新版本，[已安裝](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ Python 3.11.5 版或更新版本，[已安裝](https://www.python.org/downloads/)
+ 適用於 Python (Boto3) 的 AWS SDK 1.34.135 版或更新版本，[已安裝](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html)
+ Helm 3.12.3 版或更新版本，[已安裝](https://helm.sh/docs/intro/install/)
+ kubectl 1.25.1 版或更新版本，[已安裝](https://kubernetes.io/docs/tasks/tools/)
+ Docker 引擎 26.1.1 版或更新版本，[已安裝](https://docs.docker.com/engine/install/)
+ [已建立](https://docs.aws.amazon.com/eks/latest/userguide/create-cluster.html) Amazon EKS 叢集 1.24 版或更新版本
+ [符合](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-agent-setup.html#pod-id-agent-add-on-create)建立 Amazon EKS Pod Identity 代理程式的先決條件

**限制**
+ 您必須在`keda-operator`角色與`keda-identity`角色之間建立信任關係。此模式的 [Epics](#event-driven-auto-scaling-with-eks-pod-identity-and-keda-epics) 區段提供說明。

## Architecture
<a name="event-driven-auto-scaling-with-eks-pod-identity-and-keda-architecture"></a>

在此模式中，您會建立下列 AWS 資源：
+ **Amazon Elastic Container Registry (Amazon ECR) 儲存庫** – 在此模式中，此儲存庫名為 `keda-pod-identity-registry`。此私有儲存庫用於存放範例應用程式的 Docker 映像。
+ **Amazon Simple Queue Service (Amazon SQS) 佇列** – 在此模式中，此佇列名為 `event-messages-queue`。佇列可做為收集和儲存傳入訊息的訊息緩衝區。KEDA 會監控佇列指標，例如訊息計數或佇列長度，並根據這些指標自動擴展應用程式。
+ **應用程式 IAM 角色** – 在此模式中，此角色名為 `keda-identity`。`keda-operator` 角色會擔任此角色。此角色允許存取 Amazon SQS 佇列。
+ **KEDA 運算子的 IAM 角色** – 在此模式中，此角色名為 `keda-operator`。KEDA 運算子使用此角色進行必要的 AWS API 呼叫。此角色具有擔任`keda-identity`角色的許可。由於 `keda-operator`與 `keda-identity`角色之間的信任關係，該`keda-operator`角色具有 Amazon SQS 許可。

透過 `TriggerAuthentication`和 `ScaledObject`Kubernetes 自訂資源，運算子會使用 `keda-identity`角色來與 Amazon SQS 佇列連線。根據佇列大小，KEDA 會自動擴展應用程式部署。它會為佇列中的每 5 個未讀取訊息新增 1 個 Pod。在預設組態中，如果 Amazon SQS 佇列中沒有未讀取的訊息，應用程式會縮減至 0 個 Pod。KEDA 運算子會以您指定的間隔監控佇列。

 

下圖顯示如何使用 Amazon EKS Pod Identity 為`keda-operator`角色提供 Amazon SQS 佇列的安全存取權。

![\[使用 KEDA 和 Amazon EKS Pod Identity 自動擴展以 Kubernetes 為基礎的應用程式。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/56f7506d-e8d3-43e5-bec6-42267fedd0ae/images/05bdbd09-9eb8-4c0b-8c0d-efe38aecb683.png)


該圖顯示以下工作流程：

1. 您在 Amazon EKS 叢集中安裝 Amazon EKS Pod Identity 代理程式。

1. 您可以在 Amazon EKS 叢集的 KEDA 命名空間中部署 KEDA 運算子。

1. 您可以在目標中建立 `keda-operator`和 `keda-identity` IAM 角色 AWS 帳戶。

1. 您可以在 IAM 角色之間建立信任關係。

1. 您可以在 `security` 命名空間中部署應用程式。

1. KEDA 運算子會在 Amazon SQS 佇列中輪詢訊息。

1. KEDA 會啟動 HPA，根據佇列大小自動擴展應用程式。

## 工具
<a name="event-driven-auto-scaling-with-eks-pod-identity-and-keda-tools"></a>

**AWS 服務**
+ [Amazon Elastic Container Registry (Amazon ECR)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) 是一種受管容器映像登錄服務，安全、可擴展且可靠。
+ [Amazon Elastic Kubernetes Service (Amazon EKS)](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) 可協助您在 上執行 Kubernetes， AWS 而無需安裝或維護您自己的 Kubernetes 控制平面或節點。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 透過控制已驗證並獲授權使用的人員，協助您安全地管理對 AWS 資源的存取。
+ [Amazon Simple Queue Service (Amazon SQS)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html) 提供安全、耐用且可用的託管佇列，可協助您整合和分離分散式軟體系統和元件。

**其他工具**
+ [KEDA](https://keda.sh/) 是以 Kubernetes 為基礎的事件驅動自動擴展器。

**程式碼儲存庫**

此模式的程式碼可在 GitHub [事件驅動的自動擴展中使用 EKS Pod Identity 和 KEDA ](https://github.com/aws-samples/event-driven-autoscaling-using-podidentity-and-keda/tree/main)儲存庫。

## 最佳實務
<a name="event-driven-auto-scaling-with-eks-pod-identity-and-keda-best-practices"></a>

建議您遵循下列最佳實務：
+ [Amazon EKS 最佳實務](https://docs.aws.amazon.com/eks/latest/best-practices/introduction.html)
+ [IAM 中的安全最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)
+ [Amazon SQS 最佳實務](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-best-practices.html)

## 史詩
<a name="event-driven-auto-scaling-with-eks-pod-identity-and-keda-epics"></a>

### 建立 AWS 資源
<a name="create-aws-resources"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 KEDA 運算子的 IAM 角色。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/event-driven-auto-scaling-with-eks-pod-identity-and-keda.html) | AWS 管理員 | 
| 為範例應用程式建立 IAM 角色。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/event-driven-auto-scaling-with-eks-pod-identity-and-keda.html) | AWS 管理員 | 
| 建立 Amazon SQS 佇列。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/event-driven-auto-scaling-with-eks-pod-identity-and-keda.html) | 一般 AWS | 
| 建立 Amazon ECR 儲存庫。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/event-driven-auto-scaling-with-eks-pod-identity-and-keda.html) | 一般 AWS | 

### 設定 Amazon EKS 叢集
<a name="set-up-the-eks-cluster"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 部署 Amazon EKS Pod Identity 代理程式。 | 針對目標 Amazon EKS 叢集，設定 Amazon EKS Pod Identity 代理程式。請遵循 [Amazon EKS 文件中的設定 Amazon EKS Pod 身分代理](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-agent-setup.html#pod-id-agent-add-on-create)程式中的指示。 | AWS DevOps | 
| 部署 KEDA。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/event-driven-auto-scaling-with-eks-pod-identity-and-keda.html) | DevOps 工程師 | 
| 將 IAM 角色指派給 Kubernetes 服務帳戶。 | 遵循 Amazon EKS 文件中將 [IAM 角色指派給 Kubernetes 服務帳戶](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-association.html)的指示。使用下列的值：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/event-driven-auto-scaling-with-eks-pod-identity-and-keda.html) | AWS DevOps | 
| 建立 命名空間。 | 輸入下列命令以在目標 Amazon EKS 叢集中建立`security`命名空間：<pre>kubectl create ns security</pre> | DevOps 工程師 | 

### 部署範例應用程式
<a name="deploy-the-sample-application"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 複製應用程式檔案。 | 輸入下列命令，從 GitHub [使用 EKS Pod Identity 和 KEDA 儲存庫複製事件驅動的自動擴展](https://github.com/aws-samples/event-driven-autoscaling-using-podidentity-and-keda/tree/main)：<pre>git clone https://github.com/aws-samples/event-driven-autoscaling-using-podidentity-and-keda.git</pre> | DevOps 工程師 | 
| 建置 Docker 影像。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/event-driven-auto-scaling-with-eks-pod-identity-and-keda.html) | DevOps 工程師 | 
| 將 Docker 映像推送至 Amazon ECR。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/event-driven-auto-scaling-with-eks-pod-identity-and-keda.html)您可以透過導覽至 Amazon ECR 儲存庫頁面，然後選擇**檢視推送命令來尋找推送命令**。 | DevOps 工程師 | 
| 部署範例應用程式。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/event-driven-auto-scaling-with-eks-pod-identity-and-keda.html) | DevOps 工程師 | 
| 將 IAM 角色指派給應用程式服務帳戶。 | 執行下列其中一項操作，將 `keda-identity` IAM 角色與範例應用程式的 服務帳戶建立關聯：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/event-driven-auto-scaling-with-eks-pod-identity-and-keda.html) | DevOps 工程師 | 
| 部署 `ScaledObject`和 `TriggerAuthentication`。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/event-driven-auto-scaling-with-eks-pod-identity-and-keda.html) | DevOps 工程師 | 

### 測試自動擴展
<a name="test-auto-scaling"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 傳送訊息至 Amazon SQS 佇列。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/event-driven-auto-scaling-with-eks-pod-identity-and-keda.html) | DevOps 工程師 | 
| 監控應用程式 Pod。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/event-driven-auto-scaling-with-eks-pod-identity-and-keda.html) | DevOps 工程師 | 

## 疑難排解
<a name="event-driven-auto-scaling-with-eks-pod-identity-and-keda-troubleshooting"></a>


| 問題 | 解決方案 | 
| --- | --- | 
| KEDA 運算子無法擴展應用程式。 | 輸入下列命令來檢查 IAM `keda-operator` 角色的日誌：<pre>kubectl logs -n keda -l app=keda-operator -c keda-operator</pre> 如果有`HTTP 403`回應代碼，則應用程式和 KEDA 擴展器沒有足夠的許可來存取 Amazon SQS 佇列。請完成下列步驟：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/event-driven-auto-scaling-with-eks-pod-identity-and-keda.html)如果發生錯誤`Assume-Role`，則 [Amazon EKS 節點 IAM 角色](https://docs.aws.amazon.com/eks/latest/userguide/create-node-role.html)無法擔任為 定義的 IAM 角色`TriggerAuthentication`。請完成下列步驟：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/event-driven-auto-scaling-with-eks-pod-identity-and-keda.html) | 

## 相關資源
<a name="event-driven-auto-scaling-with-eks-pod-identity-and-keda-resources"></a>
+ [設定 Amazon EKS Pod Identity Agent](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-agent-setup.html) (Amazon EKS 文件）
+ [部署 KEDA](https://keda.sh/docs/2.14/deploy/) (KEDA 文件）
+ [ScaledObject 規格](https://keda.sh/docs/2.16/reference/scaledobject-spec/) (KEDA 文件）
+ [使用 TriggerAuthentication 進行身分驗證](https://keda.sh/docs/2.14/concepts/authentication/) (KEDA 文件）

# 使用 PGO 在 Amazon EKS 上簡化 PostgreSQL 部署
<a name="streamline-postgresql-deployments-amazon-eks-pgo"></a>

*Shalaka Dengale，Amazon Web Services*

## 總結
<a name="streamline-postgresql-deployments-amazon-eks-pgo-summary"></a>

此模式整合來自 Crunchy Data (PGO) 的 Postgres Operator 與 Amazon Elastic Kubernetes Service (Amazon EKS)，以簡化雲端原生環境中的 PostgreSQL 部署。PGO 提供在 Kubernetes 中管理 PostgreSQL 資料庫的自動化和可擴展性。當您將 PGO 與 Amazon EKS 結合時，它會形成強大的平台，以有效率地部署、管理和擴展 PostgreSQL 資料庫。

此整合提供下列主要優點：
+ 自動化部署：簡化 PostgreSQL 叢集部署和管理。
+ 自訂資源定義 (CRDs)：** **使用 Kubernetes 基本概念進行 PostgreSQL 管理。
+ 高可用性：支援自動容錯移轉和同步複寫。
+ 自動化備份和還原：** **簡化備份和還原程序。
+ 水平擴展：** **啟用 PostgreSQL 叢集的動態擴展。
+ 版本升級：促進滾動升級，減少停機時間。
+ 安全性：強制執行加密、存取控制和身分驗證機制。

## 先決條件和限制
<a name="streamline-postgresql-deployments-amazon-eks-pgo-prereqs"></a>

**先決條件**
+ 作用中 AWS 帳戶。
+ [在 Linux、macOS 或 Windows 上安裝和設定 AWS Command Line Interface (AWS CLI) 第 2 版](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)。 macOS
+ [AWS CLI Config](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-quickstart.html)，從命令列連接 AWS 資源。
+ 在 Linux、macOS 或 Windows 上安裝和設定 [eksctl](https://github.com/eksctl-io/eksctl#installation)。
+ `kubectl`，已安裝並設定為存取 Amazon EKS 叢集上的資源。如需詳細資訊，請參閱 Amazon EKS 文件中的[設定 kubectl 和 eksctl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)。 
+ 您的電腦終端機已設定為存取 Amazon EKS 叢集。如需詳細資訊，請參閱《Amazon EKS 文件》中的[設定您的電腦與叢集通訊](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-console.html#eks-configure-kubectl)。

**產品版本**
+ Kubernetes 1.21–1.24 版或更新版本 （請參閱 [PGO 文件](https://access.crunchydata.com/documentation/postgres-operator/5.2.5/))。
+ PostgreSQL 10 版或更新版本。此模式使用 PostgreSQL 第 16 版。

**限制**
+ 有些 AWS 服務 完全無法使用 AWS 區域。如需區域可用性，請參閱[AWS 服務 依區域](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。如需特定端點，請參閱[服務端點和配額](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)頁面，然後選擇服務的連結。

## Architecture
<a name="streamline-postgresql-deployments-amazon-eks-pgo-architecture"></a>

**目標技術堆疊 **
+ Amazon EKS
+ Amazon Virtual Private Cloud (Amazon VPC)
+ Amazon Elastic Compute Cloud (Amazon EC2)

**目標架構 **

![\[使用 PGO 搭配三個可用區域和兩個複本、PgBouncer 和 PGO 運算子的架構。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/4c164012-7527-4ebe-b6a7-c129600328d6/images/26a5572b-405b-4634-b96a-91254c3ea2c1.png)


此模式會建置架構，其中包含具有三個節點的 Amazon EKS 叢集。每個節點在後端的一組 EC2 執行個體上執行。此 PostgreSQL 設定遵循主要複本架構，對於大量讀取的使用案例特別有效。架構包含下列元件：
+ **主要資料庫容器 (pg-primary)** 託管主 PostgreSQL 執行個體，其中所有寫入操作都會導向。
+ **次要複本容器 (pg-replica)** 託管從主要資料庫複寫資料並處理讀取操作的 PostgreSQL 執行個體。
+ **PgBouncer** 是 PGO 隨附的 PostgreSQL 資料庫輕量型連線集區器。它位於用戶端和 PostgreSQL 伺服器之間，並充當資料庫連線的媒介。
+ **PGO** 可在此 Kubernetes 環境中自動化 PostgreSQL 叢集的部署和管理。
+ **Patroni** 是一種開放原始碼工具，可管理和自動化 PostgreSQL 的高可用性組態。它包含在 PGO 中。當您在 Kubernetes 中使用 Patroni 搭配 PGO 時，它在確保 PostgreSQL 叢集的彈性和容錯能力方面扮演重要角色。如需詳細資訊，請參閱 [Patroni 文件](https://patroni.readthedocs.io/en/latest/)。

工作流程包含以下步驟：
+ **部署 PGO 運算子**。您可以在在 Amazon EKS 上執行的 Kubernetes 叢集上部署 PGO 運算子。這可以透過使用 Kubernetes 資訊清單或 Helm Chart 來完成。此模式使用 Kubernetes 資訊清單。
+ **定義 PostgreSQL 執行個體**。當運算子執行時，您可以建立自訂資源 CRs)，以指定 PostgreSQL 執行個體的所需狀態。這包括儲存、複寫和高可用性設定等組態。
+ **運算子管理**。您可以透過 CRs 等 Kubernetes API 物件與運算子互動，以建立、更新或刪除 PostgreSQL 執行個體。
+ **監控和維護**。您可以監控在 Amazon EKS 上執行的 PostgreSQL 執行個體的運作狀態和效能。運算子通常會為監控目的提供指標和記錄。您可以視需要執行例行維護任務，例如升級和修補。如需詳細資訊，請參閱 Amazon EKS 文件中的[監控叢集效能和檢視日誌](https://docs.aws.amazon.com/eks/latest/userguide/eks-observe.html)。
+ **擴展和備份**：您可以使用運算子提供的功能來擴展 PostgreSQL 執行個體和管理備份。

此模式不包含監控、維護和備份操作。

**自動化和擴展**
+ 您可以使用 CloudFormation 自動建立基礎設施。如需詳細資訊，請參閱[《Amazon EKS 文件》中的使用 建立 CloudFormation](https://docs.aws.amazon.com/eks/latest/userguide/creating-resources-with-cloudformation.html) Amazon EKS 資源。
+ 您可以使用 GitVersion 或 Jenkins 建置號碼來自動化資料庫執行個體的部署。

## 工具
<a name="streamline-postgresql-deployments-amazon-eks-pgo-tools"></a>

**AWS 服務**
+ [Amazon Elastic Kubernetes Service (Amazon EKS)](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) 可協助您在 上執行 Kubernetes， AWS 而無需安裝或維護您自己的 Kubernetes 控制平面或節點。 
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) 是一種開放原始碼工具，可協助您 AWS 服務 透過命令列 shell 中的命令與 互動。

**其他工具**
+ [eksctl](https://eksctl.io/) 是在 Amazon EKS 上建立叢集的簡單命令列工具。
+ [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) 是命令列公用程式，用於對 Kubernetes 叢集執行命令。
+ [PGO](https://github.com/CrunchyData/postgres-operator) 可自動化和擴展 Kubernetes 中 PostgreSQL 資料庫的管理。

## 最佳實務
<a name="streamline-postgresql-deployments-amazon-eks-pgo-best-practices"></a>

遵循下列最佳實務，以確保部署順暢且有效率：
+ **保護您的 EKS 叢集**。實作 EKS 叢集的安全最佳實務，例如針對服務帳戶 AWS Identity and Access Management (IRSA)、網路政策和 VPC 安全群組使用 (IAM) 角色。限制對 EKS 叢集 API 伺服器的存取，並使用 TLS 加密節點和 API 伺服器之間的通訊。
+ **確保在 Amazon EKS 上執行的 PGO 和 Kubernetes 之間的版本相容性**。有些 PGO 功能可能需要特定的 Kubernetes 版本或引入相容性限制。如需詳細資訊，請參閱 PGO 文件中的[元件與相容性](https://access.crunchydata.com/documentation/postgres-operator/5.2.5/references/components/)。
+ 規劃 PGO 部署**的資源配置**，包括 CPU、記憶體和儲存。考慮 PGO 及其管理的 PostgreSQL 執行個體的資源需求。監控資源用量並視需要擴展資源。
+ **專為高可用性而設計**。設計您的 PGO 部署以獲得高可用性，以盡可能減少停機時間並確保可靠性。跨多個可用區域部署多個 PGO 複本，以實現容錯能力。
+ 為 PGO 管理的 PostgreSQL 資料庫**實作備份和還原程序**。使用 PGO 或第三方備份解決方案提供的功能，這些功能與 Kubernetes 和 Amazon EKS 相容。
+ 為您的 PGO 部署**設定監控和記錄**，以追蹤效能、運作狀態和事件。使用 Prometheus 等工具來監控指標，並使用 Grafana 來視覺化。設定記錄以擷取 PGO 日誌以進行疑難排解和稽核。
+ 正確**設定聯網**，以允許 PGO、PostgreSQL 執行個體和 Kubernetes 叢集中其他服務之間的通訊。使用 Amazon VPC 網路功能和 Kubernetes 網路外掛程式，例如 Calico 或 [Amazon VPC CNI](https://github.com/aws/amazon-vpc-cni-k8s)，以進行網路政策強制執行和流量隔離。
+ 考慮效能、耐用性和可擴展性等因素，為您的 PostgreSQL 資料庫**選擇適當的儲存選項**。使用 Amazon Elastic Block Store (Amazon EBS) 磁碟區或 AWS 受管儲存服務進行持久性儲存。如需詳細資訊，請參閱 [Amazon EKS 文件中的使用 Amazon EBS 存放 Kubernetes 磁碟區](https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html)。
+ **使用基礎設施做為程式碼 (IaC) 工具** CloudFormation ，例如 在 Amazon EKS 上自動化 PGO 的部署和組態。定義基礎設施元件，包括 EKS 叢集、聯網和 PGO 資源，做為一致性、可重複性和版本控制的程式碼。

## 史詩
<a name="streamline-postgresql-deployments-amazon-eks-pgo-epics"></a>

### 建立 IAM 角色
<a name="create-an-iam-role"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 IAM 角色。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/streamline-postgresql-deployments-amazon-eks-pgo.html) | AWS 管理員 | 

### 建立 Amazon EKS 叢集
<a name="create-an-eks-cluster"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 Amazon EKS 叢集。 | 如果您已部署叢集，請略過此步驟。否則， AWS 帳戶 請使用 `eksctl`、Terraform 或 在您目前的 中部署 Amazon EKS 叢集 CloudFormation。此模式使用 `eksctl`進行叢集部署。此模式使用 Amazon EC2 做為 Amazon EKS 的節點群組。如果您想要使用 AWS Fargate，請參閱 [eksctl 文件](https://eksctl.io/usage/schema/#managedNodeGroups)中的`managedNodeGroups`組態。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/streamline-postgresql-deployments-amazon-eks-pgo.html) | AWS 管理員、Terraform 或 eksctl 管理員、Kubernetes 管理員 | 
| 驗證叢集的狀態。 | 執行下列命令以查看叢集中節點的目前狀態：<pre>kubectl get nodes</pre>如果您遇到錯誤，請參閱 Amazon EKS 文件的[疑難排解一節](https://docs.aws.amazon.com/eks/latest/userguide/troubleshooting.html)。 | AWS 管理員、Terraform 或 eksctl 管理員、Kubernetes 管理員 | 

### 建立 OIDC 身分提供者
<a name="create-an-oidc-identity-provider"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 啟用 IAM OIDC 提供者。 | 作為 Amazon EBS 容器儲存介面 (CSI) 驅動程式的先決條件，您必須為叢集擁有現有的 IAM OpenID Connect (OIDC) 提供者。使用下列命令啟用 IAM OIDC 提供者：<pre>eksctl utils associate-iam-oidc-provider --region={region} --cluster={YourClusterNameHere} --approve</pre>如需此步驟的詳細資訊，請參閱 [Amazon EKS 文件](https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html)。 | AWS 管理員 | 
| 為 Amazon EBS CSI 驅動程式建立 IAM 角色。 | 使用下列`eksctl`命令為 CSI 驅動程式建立 IAM 角色：<pre>eksctl create iamserviceaccount \<br />  --region {RegionName} \<br />  --name ebs-csi-controller-sa \<br />  --namespace kube-system \<br />  --cluster {YourClusterNameHere} \<br />  --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \<br />  --approve \<br />  --role-only \<br />  --role-name AmazonEKS_EBS_CSI_DriverRole</pre>如果您使用加密的 Amazon EBS 磁碟機，則必須進一步設定政策。如需說明，請參閱 [Amazon EBS SCI 驅動程式文件](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/docs/install.md#installation-1)。 | AWS 管理員 | 
| 新增 Amazon EBS CSI 驅動程式。 | 使用下列`eksctl`命令來新增 Amazon EBS CSI 驅動程式：<pre>eksctl create addon \<br />  --name aws-ebs-csi-driver \<br />  --cluster <YourClusterName> service-account-role-arn arn:aws:iam::$(aws sts get-caller-identity \<br />  --query Account \<br />  --output text):role/AmazonEKS_EBS_CSI_DriverRole \<br />  --force</pre> | AWS 管理員 | 

### 安裝 PGO
<a name="install-pgo"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 複製 PGO 儲存庫。 | 複製 PGO 的 GitHub 儲存庫：<pre>git clone https://github.com/CrunchyData/postgres-operator-examples.git </pre> | AWS DevOps | 
| 提供建立服務帳戶的角色詳細資訊。 | 若要授予 Amazon EKS 叢集對所需 AWS 資源的存取權，請指定您先前在 `service_account.yaml` 檔案中建立之 OIDC 角色的 Amazon Resource Name (ARN)。此檔案位於 儲存庫的[命名空間資料夾中](https://github.com/CrunchyData/postgres-operator-examples/tree/main/kustomize/install/rbac/namespace)。<pre>cd postgres-operator-examples</pre><pre>---<br />metadata:<br />  annotations:<br />    eks.amazonaws.com/role-arn: arn:aws:iam::<accountId>:role/<role_name> # Update the OIDC role ARN created earlier</pre> | AWS 管理員、Kubernetes 管理員 | 
| 建立命名空間和 PGO 先決條件。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/streamline-postgresql-deployments-amazon-eks-pgo.html) | Kunernetes 管理員 | 
| 驗證 Pod 的建立。 | 確認已建立命名空間和預設組態：<pre>kubectl get pods -n postgres-operator</pre> | AWS 管理員、Kubernetes 管理員 | 
| 驗證 PVCs。 | 使用下列命令來驗證持久性磁碟區宣告 PVCs)：<pre>kubectl describe pvc -n postgres-operator</pre> | AWS 管理員、Kubernetes 管理員 | 

### 建立和部署 運算子
<a name="create-and-deploy-an-operator"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立運算子。 | 修改位於 的檔案內容`/kustomize/postgres/postgres.yaml`以符合下列項目：<pre>spec:<br />  instances:<br />    - name: pg-1<br />      replicas: 3<br />  patroni:<br />    dynamicConfiguration:<br />      postgresql:<br />      pg_hba:<br />        - "host all all 0.0.0.0/0 trust" # this line enabled logical replication with programmatic access<br />        - "host all postgres 127.0.0.1/32 md5"<br />      synchronous_mode: true<br />  users:<br />  - name: replicator<br />    databases:<br />      - testdb<br />    options: "REPLICATION"</pre>這些更新會執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/streamline-postgresql-deployments-amazon-eks-pgo.html) | AWS 管理員、DBA、Kubernetes 管理員 | 
| 部署 運算子。 | 部署 PGO 運算子，以在 Kubernetes 環境中啟用 PostgreSQL 資料庫的簡化管理和操作：<pre>kubectl apply -k kustomize/postgres</pre> | AWS 管理員、DBA、Kubernetes 管理員 | 
| 驗證部署。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/streamline-postgresql-deployments-amazon-eks-pgo.html)從命令輸出中，記下主要複本 (`primary_pod_name`) 和僅供讀取複本 (`read_pod_name`)。您將在後續步驟中使用這些項目。 | AWS 管理員、DBA、Kubernetes 管理員 | 

### 驗證串流複寫
<a name="verify-streaming-replication"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 將資料寫入主要複本。 | 使用下列命令連線至 PostgreSQL 主要複本，並將資料寫入資料庫：<pre>kubectl exec -it <primary_pod_name> bash -n postgres-operator</pre><pre>psql</pre><pre>CREATE TABLE customers (firstname text, customer_id serial, date_created timestamp);<br />\dt</pre> | AWS 管理員、Kubernetes 管理員 | 
| 確認僅供讀取複本具有相同的資料。 | 連線至 PostgreSQL 僅供讀取複本，並檢查串流複寫是否正常運作：<pre>kubectl exec -it {read_pod_name} bash -n postgres-operator</pre><pre>psql</pre><pre>\dt</pre>僅供讀取複本應具有您在上一個步驟中於主要複本中建立的資料表。 | AWS 管理員、Kubernetes 管理員 | 

## 疑難排解
<a name="streamline-postgresql-deployments-amazon-eks-pgo-troubleshooting"></a>


| 問題 | 解決方案 | 
| --- | --- | 
| Pod 不會啟動。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/streamline-postgresql-deployments-amazon-eks-pgo.html) | 
| 複本明顯落後於主要資料庫。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/streamline-postgresql-deployments-amazon-eks-pgo.html) | 
| 您無法查看 PostgreSQL 叢集的效能和運作狀態。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/streamline-postgresql-deployments-amazon-eks-pgo.html) | 
| 複寫無法運作。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/streamline-postgresql-deployments-amazon-eks-pgo.html) | 

## 相關資源
<a name="streamline-postgresql-deployments-amazon-eks-pgo-resources"></a>
+ [Amazon Elastic Kubernetes Service](https://docs.aws.amazon.com/whitepapers/latest/overview-deployment-options/amazon-elastic-kubernetes-service.html) (*AWS 白皮書上的部署選項概觀*)
+  [CloudFormation](https://docs.aws.amazon.com/whitepapers/latest/overview-deployment-options/aws-cloudformation.html) (*AWS 白皮書上的部署選項概觀*)
+ [開始使用 Amazon EKS – eksctl](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-eksctl.html) (*Amazon EKS 使用者指南*)
+ [設定 kubectl 和 eksctl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html) (*Amazon EKS 使用者指南*)
+ [為 OpenID Connect 聯合建立角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_oidc.html) (*IAM 使用者指南*)
+ [設定 的設定 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)(*AWS CLI 使用者指南*)
+ [Crunchy Postgres for Kubernetes 文件](https://access.crunchydata.com/documentation/postgres-operator/latest)
+ [Crunch & Learn：適用於 Kubernetes 5.0 的 Crunchy Postgres](https://www.youtube-nocookie.com/embed/IIf9WZO3K50) （影片）

# 使用 Application Load Balancer 在 Amazon ECS 中使用交互 TLS 簡化應用程式身分驗證
<a name="simplify-application-authentication-with-mutual-tls-in-amazon-ecs"></a>

*Olawale Olaleye 和 Shamanth Devagari，Amazon Web Services*

## 總結
<a name="simplify-application-authentication-with-mutual-tls-in-amazon-ecs-summary"></a>

此模式可協助您使用 Application [Application Load Balancer (ALB)](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/mutual-authentication.html)，透過 Amazon Elastic Container Service (Amazon ECS) 中的交互 TLS，簡化應用程式身分驗證並卸載安全負擔。使用 ALB，您可以從中驗證 X.509 用戶端憑證 AWS 私有憑證授權單位。這種強大的組合有助於實現服務之間的安全通訊，減少應用程式中複雜身分驗證機制的需求。此外， 模式會使用 Amazon Elastic Container Registry (Amazon ECR) 來存放容器映像。

此模式中的範例使用來自公有圖庫的 Docker 影像，最初建立範例工作負載。之後，新的 Docker 映像會建置為儲存在 Amazon ECR 中。對於來源，請考慮 Git 型系統，例如 GitHub、GitLab 或 Bitbucket，或使用 Amazon Simple Storage Service Amazon S3 (Amazon S3)。若要建置 Docker 映像，請考慮 AWS CodeBuild 針對後續映像使用 。

## 先決條件和限制
<a name="simplify-application-authentication-with-mutual-tls-in-amazon-ecs-prereqs"></a>

**先決條件**
+  AWS 帳戶 具有部署 AWS CloudFormation 堆疊存取權的作用中 。請確定您具有部署 CloudFormation 的 AWS Identity and Access Management (IAM) [使用者或角色許可](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/control-access-with-iam.html)。
+ AWS Command Line Interface (AWS CLI) [已安裝](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。使用 或在 `~/.aws/credentials` 檔案中[設定](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)環境變數，在本機電腦 AWS CLI 或環境中設定您的 AWS 登入資料。
+ [已安裝](https://www.openssl.org/) OpenSSL。
+ [已安裝](https://www.docker.com/get-started/) Docker。
+ 熟悉[工具](#simplify-application-authentication-with-mutual-tls-in-amazon-ecs-tools) AWS 服務 中所述的 。
+ Docker 和 NGINX 的知識。

**限制**
+ Application Load Balancer 的相互 TLS 僅支援 X.509v3 用戶端憑證。不支援 X.509v1 用戶端憑證。
+ 此模式程式碼儲存庫中提供的 CloudFormation 範本不包含佈建 CodeBuild 專案做為堆疊的一部分。
+ 有些 AWS 服務 完全無法使用 AWS 區域。如需區域可用性，請參閱[AWS 依區域的服務](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。如需特定端點，請參閱[服務端點和配額](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)，然後選擇服務的連結。

**產品版本**
+ Docker 27.3.1 版或更新版本
+ AWS CLI 2.14.5 版或更新版本

## Architecture
<a name="simplify-application-authentication-with-mutual-tls-in-amazon-ecs-architecture"></a>

下圖顯示此模式的架構元件。

![\[使用 Application Load Balancer 透過交互 TLS 進行驗證的工作流程。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/a343fa4e-097f-416b-9c83-01a28eb57dc3/images/e1371297-b987-4487-9b13-8120933c921f.png)


 該圖顯示以下工作流程：

1. 建立 Git 儲存庫，並將應用程式程式碼遞交至儲存庫。

1. 在 中建立私有憑證授權機構 (CA) AWS 私有 CA。

1. 建立 CodeBuild 專案。CodeBuildproject 由遞交變更觸發，並建立 Docker 映像並將建置映像發佈至 Amazon ECR。

1. 從 CA 複製憑證鏈和憑證內文，並將憑證套件上傳至 Amazon S3。

1. 使用您上傳到 Amazon S3 的 CA 套件建立信任存放區。將信任存放區與 Application Load Balancer (ALB) 上的交互 TLS 接聽程式建立關聯。

1. 使用私有 CA 為容器工作負載發行用戶端憑證。也使用 建立私有 TLS 憑證 AWS 私有 CA。

1. 將私有 TLS 憑證匯入 AWS Certificate Manager (ACM)，並搭配 ALB 使用。

1. 當 與 中的容器工作負載通訊時， 中的容器工作負載`ServiceTwo`會使用發行的用戶端憑證來驗證 ALB`ServiceOne`。

1. 中的容器工作負載會在與 中的容器工作負載通訊時，`ServiceOne`使用發行的用戶端憑證來驗證 ALB`ServiceTwo`。

**自動化和擴展**

透過使用 CloudFormation 或 SDK 的 API 操作來佈建 AWS 資源 AWS Cloud Development Kit (AWS CDK) ，即可完全自動化此模式。

您可以使用 AWS CodePipeline 實作持續整合和持續部署 (CI/CD) 管道，使用 CodeBuild 自動化容器映像建置程序，並將新版本部署至 Amazon ECS 叢集服務。

## 工具
<a name="simplify-application-authentication-with-mutual-tls-in-amazon-ecs-tools"></a>

**AWS 服務 **
+ [AWS Certificate Manager (ACM)](https://docs.aws.amazon.com/acm/latest/userguide/acm-overview.html) 可協助您建立、存放和續約公有和私有 SSL/TLS X.509 憑證和金鑰，以保護 AWS 網站和應用程式。
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) 可協助您設定 AWS 資源、快速一致地佈建資源，以及在整個 AWS 帳戶 和 生命週期中管理資源 AWS 區域。
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) 是一種全受管建置服務，可協助您編譯原始程式碼、執行單元測試，並產生準備好部署的成品。
+ [Amazon Elastic Container Registry (Amazon ECR)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) 是一種受管容器映像登錄服務，安全、可擴展且可靠。
+ [Amazon Elastic Container Service (Amazon ECS)](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html) 是一種高度可擴展的快速容器管理服務，可用於執行、停止和管理叢集上的容器。您可以在 管理的無伺服器基礎設施上執行任務和服務 AWS Fargate。或者，若要進一步控制您的基礎設施，您可以在您管理的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體叢集上執行任務和服務。
+ [Amazon ECS Exec](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec.html) 可讓您直接與容器互動，而不需要先與主機容器作業系統互動、開啟傳入連接埠或管理 SSH 金鑰。您可以使用 ECS Exec 在 Amazon EC2 執行個體上執行的容器上執行命令，或取得 Shell 至容器 AWS Fargate。
+ [Elastic Load Balancing (ELB)](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html) 會將傳入的應用程式或網路流量分配到多個目標。例如，您可以在一或多個可用區域中將流量分配到 Amazon EC2 執行個體、容器和 IP 地址。ELB 會監控其已註冊目標的運作狀態，並僅將流量路由至運作狀態良好的目標。ELB 會在傳入流量隨時間變更時擴展負載平衡器。它可以自動擴展到大多數工作負載。
+ [AWS Fargate](https://docs.aws.amazon.com/AmazonECS/latest/userguide/what-is-fargate.html) 可協助您執行容器，而無需管理伺服器或 Amazon EC2 執行個體。Fargate 與 Amazon ECS 和 Amazon Elastic Kubernetes Service (Amazon EKS) 相容。您可以使用 Fargate 啟動類型或 Fargate 容量提供者來執行 Amazon ECS 任務和服務。若要這樣做，請將您的應用程式封裝在容器中、指定 CPU 和記憶體需求、定義聯網和 IAM 政策，以及啟動應用程式。每個 Fargate 任務都有自己的隔離界限，不會與其他任務共用基礎核心、CPU 資源、記憶體資源或彈性網路界面。
+ [AWS 私有憑證授權單位](https://docs.aws.amazon.com/privateca/latest/userguide/PcaWelcome.html) 可讓您建立私有憑證授權機構 (CA) 階層 (包括根 CA 和次級 CA)，而不需要操作內部部署 CA 的投資和維護成本。

**其他工具**** **
+ [Docker](https://www.docker.com/) 是一組平台即服務 (PaaS) 產品，可在作業系統層級使用虛擬化在容器中交付軟體。
+ [GitHub](https://docs.github.com/en/repositories/creating-and-managing-repositories/quickstart-for-repositories)、[GitLab](https://docs.gitlab.com/ee/user/get_started/get_started_projects.html) 和 [Bitbucket](https://support.atlassian.com/bitbucket-cloud/docs/tutorial-learn-bitbucket-with-git/) 是一些常用的 Git 型來源控制系統，用於追蹤來源碼變更。
+ [NGINX Open Source](https://nginx.org/en/docs/?_ga=2.187509224.1322712425.1699399865-405102969.1699399865) 是開放原始碼負載平衡器、內容快取和 Web 伺服器。此模式會將其用作 Web 伺服器。
+ [OpenSSL](https://www.openssl.org/) 是一種開放原始碼程式庫，可提供 TLS 和 CMS 的 OpenSSL 實作所使用的服務。

**程式碼儲存庫**

此模式的程式碼可在 GitHub [mTLS-with-Application-Load-Balancer-in-Amazon-ECS](https://github.com/aws-samples/mTLS-with-Application-Load-Balancer-in-Amazon-ECS) 儲存庫中使用。

## 最佳實務
<a name="simplify-application-authentication-with-mutual-tls-in-amazon-ecs-best-practices"></a>
+ 使用 Amazon ECS Exec 執行命令或取得在 Fargate 上執行的容器 shell。您也可以使用 ECS Exec 來協助收集診斷資訊以進行偵錯。
+ 使用安全群組和網路存取控制清單 ACLs) 來控制服務之間的傳入和傳出流量。Fargate 任務會從虛擬私有雲端 (VPC) 中設定的子網路接收 IP 地址。

## 史詩
<a name="simplify-application-authentication-with-mutual-tls-in-amazon-ecs-epics"></a>

### 建立儲存庫
<a name="create-the-repository"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 下載原始程式碼。 | 若要下載此模式的原始碼，請分叉或複製 GitHub [mTLS-with-Application-Load-Balancer-in-Amazon-ECS](https://github.com/aws-samples/mTLS-with-Application-Load-Balancer-in-Amazon-ECS) 儲存庫。 | DevOps 工程師 | 
| 建立 Git 儲存庫。 | 若要建立 Git 儲存庫以包含 Dockerfile 和 `buildspec.yaml` 檔案，請使用下列步驟：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/simplify-application-authentication-with-mutual-tls-in-amazon-ecs.html)`git clone https://github.com/aws-samples/mTLS-with-Application-Load-Balancer-in-Amazon-ECS.git` | DevOps 工程師 | 

### 建立 CA 並產生憑證
<a name="create-ca-and-generate-certificates"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 在 中建立私有 CA AWS 私有 CA。 | 若要建立私有憑證授權機構 (CA)，請在終端機中執行下列命令。將範例變數中的值取代為您自己的值。<pre>export AWS_DEFAULT_REGION="us-west-2"<br />export SERVICES_DOMAIN="www.example.com"<br /><br />export ROOT_CA_ARN=`aws acm-pca create-certificate-authority \<br />    --certificate-authority-type ROOT \<br />    --certificate-authority-configuration \<br />    "KeyAlgorithm=RSA_2048,<br />    SigningAlgorithm=SHA256WITHRSA,<br />    Subject={<br />        Country=US,<br />        State=WA,<br />        Locality=Seattle,<br />        Organization=Build on AWS,<br />        OrganizationalUnit=mTLS Amazon ECS and ALB Example,<br />        CommonName=${SERVICES_DOMAIN}}" \<br />        --query CertificateAuthorityArn --output text`</pre>如需詳細資訊，請參閱 AWS 文件中的在 [中建立私有 CA AWS 私有 CA](https://docs.aws.amazon.com/privateca/latest/userguide/create-CA.html)。 | DevOps 工程師，AWS DevOps | 
| 建立並安裝私有 CA 憑證。 | 若要為您的私有根 CA 建立並安裝憑證，請在終端機中執行下列命令：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/simplify-application-authentication-with-mutual-tls-in-amazon-ecs.html) | AWS DevOps，DevOps 工程師 | 
| 請求受管憑證。 | 若要在 中請求私有憑證 AWS Certificate Manager 以搭配私有 ALB 使用，請使用下列命令：<pre>export TLS_CERTIFICATE_ARN=`aws acm request-certificate \<br />    --domain-name "*.${DOMAIN_DOMAIN}" \<br />    --certificate-authority-arn ${ROOT_CA_ARN} \<br />    --query CertificateArn --output text`</pre> | DevOps 工程師，AWS DevOps | 
| 使用私有 CA 發行用戶端憑證。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/simplify-application-authentication-with-mutual-tls-in-amazon-ecs.html)`openssl req -out client_csr1.pem -new -newkey rsa:2048 -nodes -keyout client_private-key1.pem``openssl req -out client_csr2.pem -new -newkey rsa:2048 -nodes -keyout client_private-key2.pem`此命令會傳回兩個服務的 CSR 和私有金鑰。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/simplify-application-authentication-with-mutual-tls-in-amazon-ecs.html)<pre>SERVICE_ONE_CERT_ARN=`aws acm-pca issue-certificate \<br />    --certificate-authority-arn ${ROOT_CA_ARN} \<br />    --csr fileb://client_csr1.pem \<br />    --signing-algorithm "SHA256WITHRSA" \<br />    --validity Value=5,Type="YEARS" --query CertificateArn --output text` <br /><br />echo "SERVICE_ONE_CERT_ARN: ${SERVICE_ONE_CERT_ARN}"<br /><br />aws acm-pca get-certificate \<br />    --certificate-authority-arn ${ROOT_CA_ARN} \<br />    --certificate-arn ${SERVICE_ONE_CERT_ARN} \<br />     | jq -r '.Certificate' > client_cert1.cert<br /><br />SERVICE_TWO_CERT_ARN=`aws acm-pca issue-certificate \<br />    --certificate-authority-arn ${ROOT_CA_ARN} \<br />    --csr fileb://client_csr2.pem \<br />    --signing-algorithm "SHA256WITHRSA" \<br />    --validity Value=5,Type="YEARS" --query CertificateArn --output text` <br /><br />echo "SERVICE_TWO_CERT_ARN: ${SERVICE_TWO_CERT_ARN}"<br /><br />aws acm-pca get-certificate \<br />    --certificate-authority-arn ${ROOT_CA_ARN} \<br />    --certificate-arn ${SERVICE_TWO_CERT_ARN} \<br />     | jq -r '.Certificate' > client_cert2.cert</pre>如需詳細資訊，請參閱 AWS 文件中的[發行私有終端實體憑證](https://docs.aws.amazon.com/privateca/latest/userguide/PcaIssueCert.html)。 | DevOps 工程師，AWS DevOps | 

### 佈建 AWS 服務
<a name="provision-aws-services"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
|  AWS 服務 使用 CloudFormation 範本佈建 。 | 若要佈建虛擬私有雲端 (VPC)、Amazon ECS 叢集、Amazon ECS 服務、Application Load Balancer 和 Amazon Elastic Container Registry (Amazon ECR)，請使用 CloudFormation 範本。 | DevOps 工程師 | 
| 取得變數。 | 確認您有執行兩個服務的 Amazon ECS 叢集。若要擷取資源詳細資訊並將其儲存為變數，請使用下列命令：<pre><br />export LoadBalancerDNS=$(aws cloudformation describe-stacks --stack-name ecs-mtls \<br />--output text \<br />--query 'Stacks[0].Outputs[?OutputKey==`LoadBalancerDNS`].OutputValue')<br /><br />export ECRRepositoryUri=$(aws cloudformation describe-stacks --stack-name ecs-mtls \<br />--output text \<br />--query 'Stacks[0].Outputs[?OutputKey==`ECRRepositoryUri`].OutputValue')<br /><br />export ECRRepositoryServiceOneUri=$(aws cloudformation describe-stacks --stack-name ecs-mtls \<br />--output text \<br />--query 'Stacks[0].Outputs[?OutputKey==`ECRRepositoryServiceOneUri`].OutputValue')<br /><br />export ECRRepositoryServiceTwoUri=$(aws cloudformation describe-stacks --stack-name ecs-mtls \<br />--output text \<br />--query 'Stacks[0].Outputs[?OutputKey==`ECRRepositoryServiceTwoUri`].OutputValue')<br /><br />export ClusterName=$(aws cloudformation describe-stacks --stack-name ecs-mtls \<br />--output text \<br />--query 'Stacks[0].Outputs[?OutputKey==`ClusterName`].OutputValue')<br /><br />export BucketName=$(aws cloudformation describe-stacks --stack-name ecs-mtls \<br />--output text \<br />--query 'Stacks[0].Outputs[?OutputKey==`BucketName`].OutputValue')<br /><br />export Service1ListenerArn=$(aws cloudformation describe-stacks --stack-name ecs-mtls \<br />--output text \<br />--query 'Stacks[0].Outputs[?OutputKey==`Service1ListenerArn`].OutputValue')<br /><br />export Service2ListenerArn=$(aws cloudformation describe-stacks --stack-name ecs-mtls \<br />--output text \<br />--query 'Stacks[0].Outputs[?OutputKey==`Service2ListenerArn`].OutputValue')</pre> | DevOps 工程師 | 
| 建立 CodeBuild 專案。 | 若要使用 CodeBuild 專案為您的 Amazon ECS 服務建立 Docker 映像，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/simplify-application-authentication-with-mutual-tls-in-amazon-ecs.html)如需詳細資訊，請參閱 AWS 文件中的在 [中建立建置專案 AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/create-project.html)。 | AWS DevOps，DevOps 工程師 | 
| 建置 Docker 映像。 | 您可以使用 CodeBuild 來執行映像建置程序。CodeBuild 需要與 Amazon ECR 互動和使用 Amazon S3 的許可。在此程序中，會建置 Docker 映像並推送至 Amazon ECR 登錄檔。如需範本和程式碼的詳細資訊，請參閱[其他資訊](#simplify-application-authentication-with-mutual-tls-in-amazon-ecs-additional)。（選用） 若要在本機建置以供測試之用，請使用下列命令：<pre># login to ECR<br />aws ecr get-login-password | docker login --username AWS --password-stdin $ECRRepositoryUri<br /><br /># build image for service one<br />cd /service1<br />aws s3 cp s3://$BucketName/serviceone/ service1/ --recursive<br />docker build -t $ECRRepositoryServiceOneUri .<br />docker push $ECRRepositoryServiceOneUri<br /><br /># build image for service two<br />cd ../service2<br />aws s3 cp s3://$BucketName/servicetwo/ service2/ --recursive<br />docker build -t $ECRRepositoryServiceTwoUri .<br />docker push $ECRRepositoryServiceTwoUri</pre> | DevOps 工程師 | 

### 啟用交互 TLS
<a name="enable-mutual-tls"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 將 CA 憑證上傳至 Amazon S3。 | 若要將 CA 憑證上傳至 Amazon S3 儲存貯體，請使用下列範例命令：`aws s3 cp ca-cert.pem s3://$BucketName/acm-trust-store/ ` | AWS DevOps，DevOps 工程師 | 
| 建立信任存放區。 | 若要建立信任存放區，請使用下列範例命令：<pre>TrustStoreArn=`aws elbv2 create-trust-store --name acm-pca-trust-certs \<br />    --ca-certificates-bundle-s3-bucket $BucketName \<br />    --ca-certificates-bundle-s3-key acm-trust-store/ca-cert.pem --query 'TrustStores[].TrustStoreArn' --output text`</pre> | AWS DevOps，DevOps 工程師 | 
| 上傳用戶端憑證。 | 若要將用戶端憑證上傳至 Amazon S3 for Docker 映像，請使用下列範例命令：<pre># for service one<br />aws s3 cp client_cert1.cert s3://$BucketName/serviceone/<br />aws s3 cp client_private-key1.pem s3://$BucketName/serviceone/<br /><br /># for service two<br />aws s3 cp client_cert2.cert s3://$BucketName/servicetwo/<br />aws s3 cp client_private-key2.pem s3://$BucketName/servicetwo/</pre> | AWS DevOps，DevOps 工程師 | 
| 修改接聽程式。 | 若要在 ALB 上啟用交互 TLS，請使用下列命令修改 HTTPS 接聽程式：<pre>aws elbv2 modify-listener \<br />    --listener-arn $Service1ListenerArn \<br />    --certificates CertificateArn=$TLS_CERTIFICATE_ARN_TWO \<br />    --ssl-policy ELBSecurityPolicy-2016-08 \<br />    --protocol HTTPS \<br />    --port 8080 \<br />    --mutual-authentication Mode=verify,TrustStoreArn=$TrustStoreArn,IgnoreClientCertificateExpiry=false<br /><br />aws elbv2 modify-listener \<br />    --listener-arn $Service2ListenerArn \<br />    --certificates CertificateArn=$TLS_CERTIFICATE_ARN_TWO \<br />    --ssl-policy ELBSecurityPolicy-2016-08 \<br />    --protocol HTTPS \<br />    --port 8090 \<br />    --mutual-authentication Mode=verify,TrustStoreArn=$TrustStoreArn,IgnoreClientCertificateExpiry=false<br /></pre>如需詳細資訊，請參閱 AWS 文件中的[在 Application Load Balancer 上設定交互 TLS](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/configuring-mtls-with-elb.html)。 | AWS DevOps，DevOps 工程師 | 

### 更新服務
<a name="update-the-services"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 更新 Amazon ECS 任務定義。 | 若要更新 Amazon ECS 任務定義，請修改新修訂中的 `image` 參數。若要取得個別服務的值，請使用您在先前步驟中建置的新 Docker 映像 Uri 更新任務定義： `echo $ECRRepositoryServiceOneUri` 或 `echo $ECRRepositoryServiceTwoUri`<pre><br />    "containerDefinitions": [<br />        {<br />            "name": "nginx",<br />            "image": "public.ecr.aws/nginx/nginx:latest",   # <----- change to new Uri<br />            "cpu": 0,</pre>如需詳細資訊，請參閱 AWS 文件中的使用 主控台[更新 Amazon ECS 任務定義](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/update-task-definition-console-v2.html)。 | AWS DevOps，DevOps 工程師 | 
| 更新 Amazon ECS 服務。 | 使用最新的任務定義更新服務。此任務定義是新建置 Docker 映像的藍圖，其中包含交互 TLS 身分驗證所需的用戶端憑證。 若要更新服務，請使用下列程序：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/simplify-application-authentication-with-mutual-tls-in-amazon-ecs.html)對其他服務重複這些步驟。 | AWS 管理員、AWS DevOps、DevOps 工程師 | 

### 存取應用程式
<a name="access-the-application"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 複製應用程式 URL。 | 使用 Amazon ECS 主控台檢視任務。當任務狀態更新為**執行**中時，選取任務。在**任務**區段中，複製任務 ID。 | AWS 管理員、AWS DevOps | 
| 測試您的應用程式。 | 若要測試您的應用程式，請使用 ECS Exec 存取任務。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/simplify-application-authentication-with-mutual-tls-in-amazon-ecs.html) | AWS 管理員、AWS DevOps | 

## 相關資源
<a name="simplify-application-authentication-with-mutual-tls-in-amazon-ecs-resources"></a>

**Amazon ECS 文件**
+ [使用主控台建立 Amazon ECS 任務定義](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-task-definition.html)
+ [建立容器映像以用於 Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-container-image.html)
+ [Amazon ECS 叢集](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/clusters.html)
+ [適用於 的 Amazon ECS AWS Fargate](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-container-image.html#create-container-image-next-steps)
+ [Amazon ECS 聯網最佳實務](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/networking-best-practices.html)
+ [Amazon ECS 服務定義參數](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service_definition_parameters.html)

**其他 AWS 資源**
+ [如何使用 AWS 私有 CA 在 Application Load Balancer 上設定 mTLS？](https://repost.aws/knowledge-center/elb-alb-configure-private-ca-mtls) (AWS re:Post)

## 其他資訊
<a name="simplify-application-authentication-with-mutual-tls-in-amazon-ecs-additional"></a>

**編輯 Dockerfile**** **

下列程式碼顯示您在服務 1 的 Dockerfile 中編輯的命令：

```
FROM public.ecr.aws/nginx/nginx:latest
WORKDIR /usr/share/nginx/html
RUN echo "Returning response from Service 1: Ok" > /usr/share/nginx/html/index.html
ADD client_cert1.cert client_private-key1.pem /usr/local/share/ca-certificates/
RUN chmod -R 400 /usr/local/share/ca-certificates/
```

下列程式碼顯示您在服務 2 的 Dockerfile 中編輯的命令：

```
FROM public.ecr.aws/nginx/nginx:latest
WORKDIR /usr/share/nginx/html
RUN echo "Returning response from Service 2: Ok" > /usr/share/nginx/html/index.html
ADD client_cert2.cert client_private-key2.pem /usr/local/share/ca-certificates/
RUN chmod -R 400 /usr/local/share/ca-certificates/
```

如果您使用 CodeBuild 建置 Docker 映像， `buildspec` 檔案會使用 CodeBuild 組建編號來唯一地將映像版本識別為標籤值。您可以變更 `buildspec` 檔案以符合您的需求，如下列`buildspec `自訂程式碼所示：

```
version: 0.2

phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $ECR_REPOSITORY_URI
      - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
      - IMAGE_TAG=${COMMIT_HASH:=latest}
  build:
    commands:
        # change the S3 path depending on the service
      - aws s3 cp s3://$YOUR_S3_BUCKET_NAME/serviceone/ $CodeBuild_SRC_DIR/ --recursive 
      - echo Build started on `date`
      - echo Building the Docker image...
      - docker build -t $ECR_REPOSITORY_URI:latest .
      - docker tag $ECR_REPOSITORY_URI:latest $ECR_REPOSITORY_URI:$IMAGE_TAG
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker images...
      - docker push $ECR_REPOSITORY_URI:latest
      - docker push $ECR_REPOSITORY_URI:$IMAGE_TAG
      - echo Writing image definitions file...
      # for ECS deployment reference
      - printf '[{"name":"%s","imageUri":"%s"}]' $CONTAINER_NAME $ECR_REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json   

artifacts:
  files:
    - imagedefinitions.json
```

# 更多模式
<a name="containersandmicroservices-more-patterns-pattern-list"></a>

**Topics**
+ [自動化刪除 AWS CloudFormation 堆疊和相關聯的資源](automate-deletion-cloudformation-stacks-associated-resources.md)
+ [使用 AWS Service Catalog 和 自動化動態管道管理，以在 Gitflow 環境中部署 Hotfix 解決方案 AWS CodePipeline](automate-dynamic-pipeline-management-for-deploying-hotfix-solutions.md)
+ [使用 AWS CDK 自動為微服務建置 CI/CD 管道和 Amazon ECS 叢集](automatically-build-ci-cd-pipelines-and-amazon-ecs-clusters-for-microservices-using-aws-cdk.md)
+ [使用 GitHub 動作和 Terraform 建置 Docker 映像並將其推送至 Amazon ECR](build-and-push-docker-images-to-amazon-ecr-using-github-actions-and-terraform.md)
+ [容器化已由 Blu Age 現代化的大型主機工作負載](containerize-mainframe-workloads-that-have-been-modernized-by-blu-age.md)
+ [使用 Firelens 日誌路由器為 Amazon ECS 建立自訂日誌剖析器](create-a-custom-log-parser-for-amazon-ecs-using-a-firelens-log-router.md)
+ [使用 Terraform 在 Amazon Bedrock 上部署代理程式系統，搭配CrewAI 架構](deploy-agentic-systems-on-amazon-bedrock-with-the-crewai-framework.md)
+ [使用 Terraform 部署容器化 Blu Age 應用程式的環境](deploy-an-environment-for-containerized-blu-age-applications-by-using-terraform.md)
+ [使用 Amazon SageMaker 中的推論管道，將預先處理邏輯部署到單一端點中的 ML 模型](deploy-preprocessing-logic-into-an-ml-model-in-a-single-endpoint-using-an-inference-pipeline-in-amazon-sagemaker.md)
+ [將工作負載從 Azure DevOps 管道部署到私有 Amazon EKS 叢集](deploy-workloads-from-azure-devops-pipelines-to-private-amazon-eks-clusters.md)
+ [使用 K8sGPT 和 Amazon Bedrock 整合實作採用 AI 技術的 Kubernetes 診斷和故障診斷](implement-ai-powered-kubernetes-diagnostics-and-troubleshooting-with-k8sgpt-and-amazon-bedrock-integration.md)
+ [使用 AWS 程式碼服務和 AWS KMS 多區域金鑰，管理將微服務部署至多個帳戶和區域的藍/綠部署](manage-blue-green-deployments-of-microservices-to-multiple-accounts-and-regions-by-using-aws-code-services-and-aws-kms-multi-region-keys.md)
+ [使用 AWS CDK 設定 Amazon ECS Anywhere 來管理內部部署容器應用程式](manage-on-premises-container-applications-by-setting-up-amazon-ecs-anywhere-with-the-aws-cdk.md)
+ [在 Amazon ECS 上從 Oracle WebLogic 遷移至 Apache Tomcat (TomEE)](migrate-from-oracle-weblogic-to-apache-tomcat-tomee-on-amazon-ecs.md)
+ [設定最低可行的資料空間以在組織之間共用資料](minimum-viable-data-space-share-data-organizations.md)
+ [在 AWS 上現代化 ASP.NET Web Forms 應用程式](modernize-asp-net-web-forms-applications-on-aws.md)
+ [使用 AWS CloudFormation 和 AWS Config 監控 Amazon ECR 儲存庫是否有萬用字元許可](monitor-amazon-ecr-repositories-for-wildcard-permissions-using-aws-cloudformation-and-aws-config.md)
+ [使用 CloudWatch Logs Insights 監控應用程式活動](monitor-application-activity-by-using-cloudwatch-logs-insights.md)
+ [使用 AWS CDK 和 GitLab 在 Amazon ECS Anywhere 上設定混合工作負載的 CI/CD 管道](set-up-a-ci-cd-pipeline-for-hybrid-workloads-on-amazon-ecs-anywhere-by-using-aws-cdk-and-gitlab.md)
+ [使用 cert-manager 和 Let's Encrypt 為 Amazon EKS 上的應用程式設定end-to-end加密](set-up-end-to-end-encryption-for-applications-on-amazon-eks-using-cert-manager-and-let-s-encrypt.md)
+ [使用 Flux 簡化 Amazon EKS 多租戶應用程式部署](simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux.md)
+ [使用 SageMaker AI 和 hydra 簡化從本機開發到可擴展實驗的機器學習工作流程](streamline-machine-learning-workflows-by-using-amazon-sagemaker.md)
+ [使用 AWS Lambda 在六邊形架構中建構 Python 專案](structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.md)
+ [使用 LocalStack 和 Terraform Tests 測試 AWS 基礎設施](test-aws-infra-localstack-terraform.md)
+ [使用 AWS Fargate WaitCondition 勾點建構來協調資源相依性和任務執行](use-the-aws-fargate-waitcondition-hook-construct.md)
+ [使用 Amazon Bedrock 代理程式，透過文字型提示在 Amazon EKS 中自動建立存取項目控制項](using-amazon-bedrock-agents-to-automate-creation-of-access-entry-controls-in-amazon-eks.md)

# 無伺服器
<a name="serverless-pattern-list"></a>

**Topics**
+ [使用 AWS Amplify 建置無伺服器 React Native 行動應用程式](build-a-serverless-react-native-mobile-app-by-using-aws-amplify.md)
+ [透過單一控制平面管理多個 SaaS 產品的租用戶](manage-tenants-across-multiple-saas-products-on-a-single-control-plane.md)
+ [使用與靜態 IP 地址相關聯的端點，整合 Amazon S3 預先簽章的 URL 產生和物件下載](consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses.md)
+ [在組織中建立跨帳戶 Amazon EventBridge 連線](create-cross-account-amazon-eventbridge-connection-organization.md)
+ [使用 Kinesis Data Streams 和 Firehose 搭配 將 DynamoDB 記錄交付至 Amazon S3 AWS CDK](deliver-dynamodb-records-to-amazon-s3-using-kinesis-data-streams-and-amazon-data-firehose-with-aws-cdk.md)
+ [在 Amazon API Gateway 中使用自訂網域實作路徑型 API 版本控制](implement-path-based-api-versioning-by-using-custom-domains.md)
+ [將 psycopg2 程式庫匯入 AWS Lambda ，以與您的 PostgreSQL 資料庫互動](import-psycopg2-library-lambda.md)
+ [將 Amazon API Gateway 與 Amazon SQS 整合，以處理非同步 REST APIs](integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis.md)
+ [使用 Amazon API Gateway 和 AWS Lambda 非同步處理事件](process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda.md)
+ [使用 Amazon API Gateway 和 Amazon DynamoDB Streams 非同步處理事件](processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams.md)
+ [使用 Amazon API Gateway、Amazon SQS 和 AWS Fargate 非同步處理事件](process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate.md)
+ [從 AWS Step Functions 同步執行 AWS Systems Manager 自動化任務 AWS Step Functions](run-aws-systems-manager-automation-tasks-synchronously-from-aws-step-functions.md)
+ [在 AWS Lambda 函數中使用 Python 執行 S3 物件的平行讀取](run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function.md)
+ [將遙測資料從 AWS Lambda 傳送至 OpenSearch，以進行即時分析和視覺化](send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization.md)
+ [為以儲存格為基礎的架構設定無伺服器儲存格路由器](serverless-cell-router-architecture.md)
+ [透過 VPC 端點設定 Amazon S3 儲存貯體的私有存取權](set-up-private-access-to-an-amazon-s3-bucket-through-a-vpc-endpoint.md)
+ [AWS Step Functions 使用 Amazon Bedrock 對 中的狀態進行故障診斷](troubleshooting-states-in-aws-step-functions.md)
+ [更多模式](serverless-more-patterns-pattern-list.md)

# 使用 AWS Amplify 建置無伺服器 React Native 行動應用程式
<a name="build-a-serverless-react-native-mobile-app-by-using-aws-amplify"></a>

*Deekshitulu Pentakota，Amazon Web Services*

## 總結
<a name="build-a-serverless-react-native-mobile-app-by-using-aws-amplify-summary"></a>

此模式示範如何使用 AWS Amplify 和下列 AWS 服務，為 React Native 行動應用程式建立無伺服器後端：
+ AWS AppSync
+ Amazon Cognito
+ Amazon DynamoDB

在您使用 Amplify 設定和部署應用程式的後端之後，Amazon Cognito 會驗證應用程式使用者，並授權他們存取應用程式。然後AWS AppSync 會與前端應用程式和後端 DynamoDB 資料表互動，以建立和擷取資料。

**注意**  
此模式使用簡單的「ToDoList」應用程式做為範例，但您可以使用類似的程序來建立任何 React Native 行動應用程式。

## 先決條件和限制
<a name="build-a-serverless-react-native-mobile-app-by-using-aws-amplify-prereqs"></a>

**先決條件**
+ 作用中的 AWS 帳戶
+ [Amplify 命令列界面 (Amplify CLI)](https://docs.amplify.aws/cli/start/install/)，已安裝並設定
+ XCode （任何版本）
+ Microsoft Visual Studio （任何版本、任何程式碼編輯器、任何文字編輯器）
+ 熟悉 Amplify
+ 熟悉 Amazon Cognito
+ 熟悉 AWS AppSync
+ 熟悉 DynamoDB
+ 熟悉 Node.js
+ 熟悉 npm
+ 熟悉 React 和 React Native
+ 熟悉 JavaScript 和 ECMAScript 6 (ES6)
+ 熟悉 GraphQL

## Architecture
<a name="build-a-serverless-react-native-mobile-app-by-using-aws-amplify-architecture"></a>

下圖顯示在 AWS 雲端中執行 React Native 行動應用程式後端的範例架構：

![\[使用 AWS 服務執行 React Native 行動應用程式的工作流程。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/c95e0150-5762-4c90-946c-efa3a22913e4/images/5beff5f9-9d14-49dc-a046-b74e5bfbd13f.png)


圖表顯示下列架構：

1. Amazon Cognito 會驗證應用程式使用者，並授權他們存取應用程式。

1. 若要建立和擷取資料，AWS AppSync 會使用 GraphQL API 與前端應用程式和後端 DynamoDB 資料表互動。

## 工具
<a name="build-a-serverless-react-native-mobile-app-by-using-aws-amplify-tools"></a>

**AWS 服務**
+ [AWS Amplify](https://docs.aws.amazon.com/amplify/latest/userguide/welcome.html) 是一組專門建置的工具和功能，可協助前端 Web 和行動開發人員在 AWS 上快速建置完整堆疊的應用程式。
+ [AWS AppSync](https://docs.aws.amazon.com/appsync/latest/devguide/what-is-appsync.html) 提供可擴展的 GraphQL 介面，可協助應用程式開發人員結合來自多個來源的資料，包括 Amazon DynamoDB、AWS Lambda 和 HTTP APIs。
+ [Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html) 為 Web 和行動應用程式提供身分驗證、授權和使用者管理。
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) 是一項全受管 NoSQL 資料庫服務，可提供快速、可預期且可擴展的效能。

**Code**

此模式中使用的範例應用程式的程式碼可在 GitHub [aws-amplify-react-native-ios-todo-app](https://github.com/aws-samples/aws-amplify-react-native-ios-todo-app) 儲存庫中找到。若要使用範例檔案，請遵循此模式的** Epics** 區段中的指示。

## 史詩
<a name="build-a-serverless-react-native-mobile-app-by-using-aws-amplify-epics"></a>

### 建立並執行您的 React Native 應用程式
<a name="create-and-run-your-react-native-app"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定 React Native 開發環境。 | 如需說明，請參閱 React Native 文件中的[設定開發環境](https://reactnative.dev/docs/next/environment-setup)。 | 應用程式開發人員 | 
| 在 iOS 模擬器中建立並執行 ToDoList React Native 行動應用程式。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/build-a-serverless-react-native-mobile-app-by-using-aws-amplify.html) | 應用程式開發人員 | 

### 初始化應用程式的新後端環境
<a name="initialize-a-new-backend-environment-for-the-app"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 在 Amplify 中建立支援應用程式所需的後端服務。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/build-a-serverless-react-native-mobile-app-by-using-aws-amplify.html)對於此模式中使用的 ToDoList 應用程式設定，請套用下列範例組態。**React Native Amplify 應用程式組態設定範例**<pre>? Name: ToDoListAmplify<br /><br />? Environment: dev<br /><br />? Default editor: Visual Studio Code<br /><br />? App type: javascript<br /><br />? Javascript framework: react-native<br /><br />? Source Directory Path: src<br /><br />? Distribution Directory Path: /<br /><br />? Build Command: npm run-script build<br /><br />? Start Command: npm run-script start<br /><br />? Select the authentication method you want to use: AWS profile<br /><br />? Please choose the profile you want to use: default</pre>如需詳細資訊，請參閱 [Amplify 開發中心文件中建立新的 Amplify 後端](https://docs.amplify.aws/lib/project-setup/create-application/q/platform/js/#create-a-new-amplify-backend)。`amplify init` 命令會使用 [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) 佈建下列資源： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/build-a-serverless-react-native-mobile-app-by-using-aws-amplify.html) | 應用程式開發人員 | 

### 將 Amazon Cognito 身分驗證新增至 Amplify React Native 應用程式
<a name="add-amazon-cognito-authentication-to-your-amplify-react-native-app"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 Amazon Cognito 身分驗證服務。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/build-a-serverless-react-native-mobile-app-by-using-aws-amplify.html)對於此模式中使用的 ToDoList 應用程式設定，請套用下列範例組態。**範例身分驗證服務組態設定**<pre>? Do you want to use the default authentication and security configuration? \ <br />Default configuration<br /> <br />? How do you want users to be able to sign in? \ <br />Username <br /><br />? Do you want to configure advanced settings? \ <br />No, I am done</pre>`amplify add auth` 命令會在專案根目錄中的本機資料夾 (**擴增**) 中建立必要的資料夾、檔案和相依性檔案。對於此模式中使用的 ToDoList 應用程式設定，系統會為此目的建立 **aws-exports.js**。 | 應用程式開發人員 | 
| 將 Amazon Cognito 服務部署至 AWS 雲端。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/build-a-serverless-react-native-mobile-app-by-using-aws-amplify.html)若要查看專案中已部署的服務，請執行下列命令，前往 Amplify 主控台：`amplify console` | 應用程式開發人員 | 
| 安裝 React Native 所需的 Amplify 程式庫，以及 iOS 的 CocoaPods 相依性。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/build-a-serverless-react-native-mobile-app-by-using-aws-amplify.html) | 應用程式開發人員 | 
| 匯入並設定 Amplify 服務。 | 在應用程式的進入點檔案中 （例如** App.js**)，輸入以下幾行程式碼匯入並載入 Amplify 服務的組態檔案：<pre>import Amplify from 'aws-amplify'<br />import config from './src/aws-exports'<br />Amplify.configure(config)</pre>如果您在應用程式進入點檔案中匯入 Amplify 服務後收到錯誤，請停止應用程式。然後，開啟 XCode 並從專案的 iOS 資料夾選取 **ToDoListAmplify.xcworkspace**，然後執行應用程式。 | 應用程式開發人員 | 
| 更新應用程式的進入點檔案，以使用 withAuthenticator 高階元件 (HOC)。 | `withAuthenticator` HOC 只會使用幾行程式碼，在您的應用程式中提供登入、註冊和忘記密碼工作流程。如需詳細資訊，請參閱 Amplify 開發中心中的[選項 1：使用預先建置的 UI 元件](https://docs.amplify.aws/lib/auth/getting-started/q/platform/js/#option-1-use-pre-built-ui-components)。此外，React 文件中的[高階元件](https://reactjs.org/docs/higher-order-components.html)。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/build-a-serverless-react-native-mobile-app-by-using-aws-amplify.html)**withAuthenticator HOC 程式碼範例**<pre>import Amplify from 'aws-amplify'<br />import config from './src/aws-exports'<br />Amplify.configure(config)<br />import { withAuthenticator } from 'aws-amplify-react-native';<br /><br /><br />const App = () => {<br />  return null;<br />};<br /><br /><br />export default withAuthenticator(App);</pre>在 iOS 模擬器中，應用程式會顯示 Amazon Cognito 服務提供的登入畫面。 | 應用程式開發人員 | 
| 測試身分驗證服務設定。 | 在 iOS 模擬器中，執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/build-a-serverless-react-native-mobile-app-by-using-aws-amplify.html)您也可以開啟 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/)，並檢查是否已在**身分集**區中建立新的使用者。 | 應用程式開發人員 | 

### 將 AWS AppSync API 和 DynamoDB 資料庫連線至應用程式
<a name="connect-an-aws-appsync-api-and-dynamodb-database-to-the-app"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 AWS AppSync API 和 DynamoDB 資料庫。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/build-a-serverless-react-native-mobile-app-by-using-aws-amplify.html)對於此模式中使用的 ToDoList 應用程式設定，請套用下列範例組態。**範例 API 和資料庫組態設定**<pre>? Please select from one of the below mentioned services: \ <br />GraphQL <br /><br />? Provide API name: todolistamplify<br /><br />? Choose the default authorization type for the API \ <br />Amazon Cognito User Pool<br /><br />Do you want to use the default authentication and security configuration<br /><br />? Default configuration How do you want users to be able to sign in? \ <br />Username<br /><br />Do you want to configure advanced settings? \ <br />No, I am done.<br /><br />? Do you want to configure advanced settings for the GraphQL API \ <br />No, I am done.<br /><br />? Do you have an annotated GraphQL schema? \ <br />No<br /><br />? Choose a schema template: \ <br />Single object with fields (e.g., "Todo" with ID, name, description)<br /><br />? Do you want to edit the schema now? \ <br />Yes</pre>**GraphQL 結構描述範例**<pre> type Todo @model {<br />   id: ID!<br />   name: String!<br />   description: String<br />}</pre> | 應用程式開發人員 | 
| 部署 AWS AppSync API。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/build-a-serverless-react-native-mobile-app-by-using-aws-amplify.html)對於此模式中使用的 ToDoList 應用程式設定，請套用下列範例組態。**AWS AppSync API 組態設定範例**下列組態會在 AWS AppSync 中建立 GraphQL API，並在 Dynamo DB中建立 **Todo** 資料表。<pre> ? Are you sure you want to continue? Yes<br />? Do you want to generate code for your newly created GraphQL API Yes<br />? Choose the code generation language target javascript<br />? Enter the file name pattern of graphql queries, mutations and subscriptions src/graphql/**/*.js<br />? Do you want to generate/update all possible GraphQL operations - \ <br />queries, mutations and subscriptions Yes<br />? Enter maximum statement depth \<br />[increase from default if your schema is deeply nested] 2</pre> | 應用程式開發人員 | 
| 將應用程式的前端連接至 AWS AppSync API。 | 若要使用此模式中提供的範例 ToDoList 應用程式，請從 [aws-amplify-react-native-ios-todo-app](https://github.com/aws-samples/aws-amplify-react-native-ios-todo-app) GitHub 儲存庫中的 **App.js** 檔案複製程式碼。然後，將範例程式碼整合到您的本機環境。儲存庫的 **App.js** 檔案中提供的範例程式碼執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/build-a-serverless-react-native-mobile-app-by-using-aws-amplify.html) | 應用程式開發人員 | 

## 相關資源
<a name="build-a-serverless-react-native-mobile-app-by-using-aws-amplify-resources"></a>
+ [AWS Amplify](https://aws.amazon.com/amplify/)
+ [Amazon Cognito](https://aws.amazon.com/cognito/)
+ [AWS AppSync](https://aws.amazon.com/appsync/)
+ [Amazon DynamoDB](https://aws.amazon.com/dynamodb/)
+ [React](https://reactjs.org/) (React 文件） 

# 透過單一控制平面管理多個 SaaS 產品的租用戶
<a name="manage-tenants-across-multiple-saas-products-on-a-single-control-plane"></a>

*Ramanna Avancha、Kishan Kavala、Anusha Mandava 和 Jenifer Pascal，Amazon Web Services*

## 總結
<a name="manage-tenants-across-multiple-saas-products-on-a-single-control-plane-summary"></a>

此模式說明如何在 AWS 雲端的單一控制平面上管理多個軟體即服務 (SaaS) 產品的租用戶生命週期。提供的參考架構可協助組織減少其個別 SaaS 產品的備援、共用功能的實作，並提供大規模的控管效率。

大型企業可以在各種業務單位擁有多個 SaaS 產品。這些產品通常需要佈建供不同訂閱層級的外部租戶使用。如果沒有常見的租用戶解決方案，IT 管理員必須花時間跨多個 SaaS APIs 管理未區分的功能，而不是專注於核心產品功能開發。

此模式中提供的常見租戶解決方案有助於集中管理組織的許多共用 SaaS 產品功能，包括下列項目：
+ 安全
+ 租戶佈建
+ 租戶資料儲存
+ 租戶通訊
+ 產品管理
+ 指標記錄和監控

## 先決條件和限制
<a name="manage-tenants-across-multiple-saas-products-on-a-single-control-plane-prereqs"></a>

**先決條件**
+ 作用中的 AWS 帳戶
+ Amazon Cognito 或第三方身分提供者 (IdP) 的知識
+ Amazon API Gateway 的知識
+ AWS Lambda 的知識
+ Amazon DynamoDB 的知識
+ 了解 AWS Identity and Access Management (IAM)
+ AWS Step Functions 的知識
+ 了解 AWS CloudTrail 和 Amazon CloudWatch
+ Python 程式庫和程式碼的知識
+ 了解 SaaS APIs，包括不同類型的使用者 （組織、租戶、管理員和應用程式使用者）、訂閱模型和租戶隔離模型
+ 了解組織的多產品 SaaS 需求和多租戶訂閱

**限制**
+ 此模式未涵蓋常見租用戶解決方案與個別 SaaS 產品之間的整合。
+ 此模式只會在單一 AWS 區域中部署 Amazon Cognito 服務。

## Architecture
<a name="manage-tenants-across-multiple-saas-products-on-a-single-control-plane-architecture"></a>

**目標技術堆疊**
+ Amazon API Gateway
+ Amazon Cognito
+ AWS CloudTrail
+ Amazon CloudWatch
+ Amazon DynamoDB
+ IAM
+ AWS Lambda
+ Amazon Simple Storage Service (Amazon S3)
+ Amazon Simple Notification Service (Amazon SNS)
+ AWS Step 函數

**目標架構**

下圖顯示管理 AWS 雲端中單一控制平面上多個 SaaS 產品的租用戶生命週期的範例工作流程。

![\[在單一控制平面上管理租用戶生命週期的工作流程。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/4306bc76-22a7-45ca-a107-43df6c6f7ac8/images/700faf4d-c28f-4814-96aa-2d895cdcb518.png)


 該圖顯示以下工作流程：

1. AWS 使用者透過呼叫 API Gateway 端點，啟動租戶佈建、產品佈建或管理相關動作。

1. 使用者透過從 Amazon Cognito 使用者集區或其他 IdP 擷取的存取字符進行身分驗證。

1. 個別佈建或管理任務是由與 API Gateway API 端點整合的 Lambda 函數執行。

1. 通用租戶解決方案APIs （適用於租戶、產品和使用者） 會收集所有必要的輸入參數、標頭和字符。然後，管理 APIs會叫用相關聯的 Lambda 函數。

1. 管理 APIs和 Lambda 函數的 IAM 許可都由 IAM 服務驗證。

1. Lambda 函數會從 DynamoDB 和 Amazon S3 中的目錄 （適用於租戶、產品和使用者） 存放和擷取資料。

1. 驗證許可後，會叫用 AWS Step Functions 工作流程來執行特定任務。圖表中的範例顯示租用戶佈建工作流程。

1. 個別 AWS Step Functions 工作流程任務會在預先定義的工作流程 （狀態機器） 中執行。

1. 從 DynamoDB 或 Amazon S3 擷取執行與每個工作流程任務相關聯的 Lambda 函數所需的任何必要資料。可能需要使用 AWS CloudFormation 範本佈建其他 AWS 資源。

1. 如有需要，工作流程會傳送請求，為特定 SaaS 產品佈建額外的 AWS 資源到該產品的 AWS 帳戶。

1. 當請求成功或失敗時，工作流程會將狀態更新作為訊息發佈至 Amazon SNS 主題。

1. Amazon SNS 已訂閱 Step Functions 工作流程的 Amazon SNS 主題。

1. 然後，Amazon SNS 會將工作流程狀態更新傳回給 AWS 使用者。

1. 每個 AWS 服務動作的日誌，包括 API 呼叫的稽核線索，都會傳送至 CloudWatch。您可以在 CloudWatch 中為每個使用案例設定特定規則和警示。

1. 日誌會封存在 Amazon S3 儲存貯體中以供稽核之用。

**自動化和擴展**

此模式使用 CloudFormation 範本來協助自動化常見租用戶解決方案的部署。範本也可以協助您快速擴展或縮減相關聯的資源。

如需詳細資訊，請參閱《[AWS CloudFormation 使用者指南》中的使用](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-guide.html) *AWS CloudFormation *範本。

## 工具
<a name="manage-tenants-across-multiple-saas-products-on-a-single-control-plane-tools"></a>

**AWS 服務**
+ [Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html) 可協助您建立、發佈、維護、監控和保護任何規模的 REST、HTTP 和 WebSocket APIs。
+ [Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html) 為 Web 和行動應用程式提供身分驗證、授權和使用者管理。
+ [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) 可協助您稽核 AWS 帳戶的控管、合規和營運風險。
+ [Amazon CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html) 可協助您即時監控 AWS 資源的指標，以及您在 AWS 上執行的應用程式。
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) 是一項全受管 NoSQL 資料庫服務，可提供快速、可預期且可擴展的效能。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 可透過控制已驗證並獲授權使用的人員，協助您安全地管理對 AWS 資源的存取。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一種運算服務，可協助您執行程式碼，而無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展，因此您只需按使用的運算時間付費。
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) 是一種雲端型物件儲存服務，可協助您儲存、保護和擷取任何數量的資料。
+ [Amazon Simple Notification Service (Amazon SNS)](https://docs.aws.amazon.com/sns/latest/dg/welcome.html) 可協助您協調和管理發佈者和用戶端之間的訊息交換，包括 Web 伺服器和電子郵件地址。
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html) 是一種無伺服器協同運作服務，可協助您結合 AWS Lambda 函數和其他 AWS 服務來建置業務關鍵應用程式。

## 最佳實務
<a name="manage-tenants-across-multiple-saas-products-on-a-single-control-plane-best-practices"></a>

此模式中的解決方案使用單一控制平面來管理多個租用戶的加入，以及佈建對多個 SaaS 產品的存取。控制平面可協助管理使用者管理其他四個功能特定的平面：
+ 安全平面
+ 工作流程平面
+ 通訊平面
+ 記錄和監控平面

## 史詩
<a name="manage-tenants-across-multiple-saas-products-on-a-single-control-plane-epics"></a>

### 設定安全平面
<a name="configure-the-security-plane"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 為您的多租戶 SaaS 平台建立需求。 | 建立下列項目的詳細需求：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/manage-tenants-across-multiple-saas-products-on-a-single-control-plane.html) | 雲端架構師、AWS 系統管理員 | 
| 設定 Amazon Cognito 服務。 | 請遵循《[Amazon Cognito 開發人員指南》](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-getting-started.html)*中的 Amazon Cognito *入門中的指示。 | 雲端架構師 | 
| 設定所需的 IAM 政策。 | 為您的使用案例建立所需的 IAM 政策。然後，將政策映射至 Amazon Cognito 中的 IAM 角色。如需詳細資訊，請參閱《*Amazon Cognito 開發人員指南*》中的[使用政策和](https://docs.aws.amazon.com/cognito/latest/developerguide/security-iam.html#security_iam_access-manage)[角色型存取控制管理存取權](https://docs.aws.amazon.com/cognito/latest/developerguide/role-based-access-control.html)。 | 雲端管理員、雲端架構師、AWS IAM 安全性 | 
| 設定所需的 API 許可。 | 使用 IAM 角色和政策以及 Lambda 授權方來設定 API Gateway 存取許可。如需說明，請參閱《*Amazon API Gateway 開發人員指南*》中的下列章節：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/manage-tenants-across-multiple-saas-products-on-a-single-control-plane.html) | 雲端管理員、雲端架構師 | 

### 設定資料平面
<a name="configure-the-data-plane"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立所需的資料目錄。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/manage-tenants-across-multiple-saas-products-on-a-single-control-plane.html)如需詳細資訊，請參閱《Amazon [ DynamoDB 開發人員指南》中的設定 ](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SettingUp.html)DynamoDB。 * DynamoDB * | DBA | 

### 設定控制平面
<a name="configure-the-control-plane"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 Lambda 函數和 API Gateway APIs 以執行必要的控制平面任務。 | 建立個別的 Lambda 函數和 API Gateway APIs，以新增、刪除和管理下列項目：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/manage-tenants-across-multiple-saas-products-on-a-single-control-plane.html)如需詳細資訊，請參閱《[AWS Lambda 開發人員指南》中的搭配 Amazon API Gateway 使用](https://docs.aws.amazon.com/lambda/latest/dg/services-apigateway.html) AWS Lambda。 *AWS Lambda * | 應用程式開發人員 | 

### 設定工作流程平面
<a name="configure-the-workflow-plane"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 識別 AWS Step Functions 工作流程必須執行的任務。 | 識別並記錄下列項目的詳細 AWS Step Functions 工作流程需求：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/manage-tenants-across-multiple-saas-products-on-a-single-control-plane.html)確定主要利益相關者核准要求。 | 應用程式擁有者 | 
| 建立所需的 AWS Step Functions 工作流程。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/manage-tenants-across-multiple-saas-products-on-a-single-control-plane.html) | 應用程式開發人員、建置領導 | 

### 設定通訊平面
<a name="configure-the-communication-plane"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 Amazon SNS 主題。 | 建立 Amazon SNS 主題以接收有關下列項目的通知：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/manage-tenants-across-multiple-saas-products-on-a-single-control-plane.html)如需詳細資訊，請參閱《*Amazon SNS * [SNS 開發人員指南》中的建立 SNS 主題](https://docs.aws.amazon.com/sns/latest/dg/sns-create-topic.html)。 | 應用程式擁有者、雲端架構師 | 
| 訂閱端點至每個 Amazon SNS 主題。 | 若要接收發佈至 Amazon SNS 主題的訊息，您必須訂閱每個主題的端點。如需詳細資訊，請參閱《[Amazon SNS 開發人員指南》中的訂閱 Amazon SNS 主題](https://docs.aws.amazon.com/sns/latest/dg/sns-create-subscribe-endpoint-to-topic.html)。 *Amazon SNS * | 應用程式開發人員、雲端架構師 | 

### 設定記錄和監控平面
<a name="configure-the-logging-and-monitoring-plane"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 為常用租用戶解決方案的每個元件啟用記錄。 | 為您建立的通用租用戶解決方案中的每個資源在元件層級啟用記錄。如需詳細說明，請參閱下列主題：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/manage-tenants-across-multiple-saas-products-on-a-single-control-plane.html)您可以使用 IAM 政策，將每個資源的日誌合併到集中式日誌帳戶。如需詳細資訊，請參閱[集中式記錄和多帳戶安全護欄](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/centralized-logging-and-multiple-account-security-guardrails.html)。 | 應用程式開發人員、AWS 系統管理員、雲端管理員 | 

### 佈建和部署通用租戶解決方案
<a name="provision-and-deploy-the-common-tenant-solution"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 CloudFormation 範本。 | 使用 CloudFormation 範本，自動化完整通用租用戶解決方案及其所有元件的部署和維護。如需詳細資訊，請參閱 [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-guide.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-guide.html)。 | 應用程式開發人員、DevOps 工程師、CloudFormation 開發人員 | 

## 相關資源
<a name="manage-tenants-across-multiple-saas-products-on-a-single-control-plane-resources"></a>
+ [使用 Amazon Cognito 使用者集區做為授權方控制對 REST API 的存取](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-integrate-with-cognito.html) (*Amazon API Gateway 開發人員指南*)
+ [使用 API Gateway Lambda 授權方](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html) (*Amazon API Gateway 開發人員指南*)
+ [Amazon Cognito 使用者集區 ](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools.html)(*Amazon Cognito 開發人員指南*)
+ [跨帳戶跨區域 CloudWatch 主控台](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Cross-Account-Cross-Region.html) (*Amazon CloudWatch 使用者指南*)

# 使用與靜態 IP 地址相關聯的端點，整合 Amazon S3 預先簽章的 URL 產生和物件下載
<a name="consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses"></a>

*Song Jin、Eunhye Jo 和 Amazon Web Services Jun Soung Lee*

## 總結
<a name="consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses-summary"></a>

此模式透過為物件下載建立安全的自訂預先簽章 URLs，簡化對 Amazon Simple Storage Service (Amazon S3) 的存取。解決方案提供具有唯一網域和靜態 IP 地址的單一端點。它專為需要在具有靜態 IP 地址的統一網域下整合 API 和 Amazon S3 端點的客戶量身打造。使用案例涉及遵循 IP 和網域允許清單防火牆政策的使用者，限制對特定網域和 IP 地址的 API 存取。

架構採用金鑰 AWS 服務，包括 AWS Global Accelerator Amazon API Gateway、 AWS Lambda Application Load Balancer AWS PrivateLink和 Amazon S3。此設計集中在單一網域下產生預先簽章 URLs和 Amazon S3 端點的 API，並連結至具有兩個靜態 IP 地址的 加速器。因此，使用者可以輕鬆地請求預先簽章URLs，並透過具有靜態 IP 地址的統一網域端點下載 Amazon S3 物件。

此架構特別有利於具有嚴格政策或合規要求的客戶，例如公有、醫療和金融領域的客戶。

## 先決條件和限制
<a name="consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses-prereqs"></a>

**先決條件**
+ 作用中 AWS 帳戶
+ 自訂網域名稱的公有託管區域
+ 在您選擇的 AWS Certificate Manager (ACM) 中匯入 AWS 區域 的網域

**限制**
+ Amazon S3 儲存貯體名稱必須符合端點的網域名稱。此要求旨在確保可透過單一 API 端點提供 Amazon S3 端點。
+ API Gateway 中使用的自訂網域名稱應與單一 API 端點的網域名稱相符。
+ 有些 AWS 服務 完全無法使用 AWS 區域。如需區域可用性，請參閱[AWS 依區域的服務](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。如需特定端點，請參閱[服務端點和配額](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)，然後選擇服務的連結。

## Architecture
<a name="consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses-architecture"></a>

下圖顯示此模式的目標架構和工作流程。

![\[預先簽章 URL 產生和物件下載的元件和工作流程。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/e19ebcb5-2138-481e-952e-3cfee9ad9e97/images/effd197c-d4d7-4990-8b66-3eb1c64aab4c.png)


圖表說明下列概念和工作流程：

1. 使用者使用透過 提供的自訂端點 AWS Global Accelerator，使用自訂網域名稱和相關聯的 IP 地址，啟動產生預先簽章 URL 的請求。

1. Lambda 函數會產生預先簽章的 URL，指向自訂端點。它會以 301 重新導向回應，其中包含產生的預先簽章 URL。透過重新導向的預先簽章 URL，使用者會使用透過 Global Accelerator 提供的自訂端點自動下載物件。

預先簽章 URL 產生和物件下載工作流程的整體架構元件如下：
+ 由 Global Accelerator 佈建靜態 IP 地址。
+ 使用自訂網域名稱，將加速器的別名註冊為 Amazon Route 53 公有託管區域的 A 記錄。
+ 建立儲存貯體名稱符合已註冊自訂網域名稱的 Amazon S3 儲存貯體。
+ 建立 API Gateway 和 Amazon S3 服務的 VPC 端點。
+ 要連線至 Global Accelerator 的內部 Application Load Balancer 組態。
+ 指派已連接 ACM 憑證之 API Gateway 的自訂網域名稱。
+ 部署與 Lambda 函數整合的私有 API Gateway。
+ Lambda 函數配備連接的 AWS Identity and Access Management (IAM) 角色 （具有 [GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html) 許可）。

## 工具
<a name="consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses-tools"></a>

**AWS 服務**
+ [Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html) 可協助您建立、發佈、維護、監控和保護任何規模的 REST、HTTP 和 WebSocket APIs。
+ [Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/) 會將傳入的應用程式流量分散到多個可用區域中的多個目標，例如 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體。
+ [AWS Certificate Manager (ACM)](https://docs.aws.amazon.com/acm/latest/userguide/acm-overview.html) 可協助您建立、存放和續約公有和私有 SSL/TLS X.509 憑證和金鑰，以保護 AWS 網站和應用程式。
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html) 是一種軟體開發架構，可協助您在程式碼中定義和佈建 AWS 雲端 基礎設施。
+ [AWS Global Accelerator](https://docs.aws.amazon.com/global-accelerator/latest/dg/what-is-global-accelerator.html) 是一種全域服務，支援多個 中的端點 AWS 區域。您可以建立加速器，透過 AWS 全球網路將流量導向最佳端點。如此可改善網際網路應用程式的可用性和效能，提升全球觀眾的使用體驗。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 透過控制已驗證並獲授權使用的人員，協助您安全地管理對 AWS 資源的存取。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一項運算服務，可協助您執行程式碼，無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展，因此您只需支付使用的運算時間。
+ [AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/privatelink/what-is-privatelink.html) 可協助您建立從虛擬私有雲端 (VPCs) 到 VPC 外部服務的單向私有連線。
+ [Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html) 是一種可用性高、可擴展性強的 DNS Web 服務。
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) 是一種雲端型物件儲存服務，可協助您儲存、保護和擷取任何數量的資料。

**其他工具**
+ [Terraform](https://www.terraform.io/) 是 HashiCorp 的基礎設施即程式碼 (IaC) 工具，可協助您建立和管理雲端和內部部署資源。

**程式碼儲存庫**

您可以根據您的偏好，使用 AWS CDK 或 Terraform 部署此模式。[Epics](#consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses-epics) 區段包含兩種部署方法的說明。此模式的程式碼可在下列 GitHub 儲存庫中使用：
+ **AWS CDK** – [s3-presignedurl-staticips-endpoint-with-cdk](https://github.com/aws-samples/s3-presignedurl-staticips-endpoint-with-cdk)
+ **Terraform** – [s3-presignedurl-staticips-endpoint-with-terraform](https://github.com/aws-samples/s3-presignedurl-staticips-endpoint-with-terraform)

## 最佳實務
<a name="consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses-best-practices"></a>
+ 為了增強生產環境中的安全性，請務必實作授權機制，例如 [Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html)，以限制對`PresignedUrl`世代 API 的存取。
+ 遵循最低權限原則，並授予執行任務所需的最低許可。如需詳細資訊，請參閱 IAM 文件中的[授予最低權限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#grant-least-priv)和[安全最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

## 史詩
<a name="consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses-epics"></a>

### 準備環境
<a name="prepare-the-environment"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 決定網域名稱。 | 決定統一 Amazon S3 端點的公有網域名稱。網域名稱也會用作 Amazon S3 儲存貯體名稱。 | AWS 管理員、網路管理員 | 
| 建立公有的託管區域。 | 在 Amazon Route 53 中建立[公有託管區域](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/CreatingHostedZone.html)。其網域名稱必須與 API Gateway 中使用的網域名稱相符。 | AWS 管理員、網路管理員 | 
| 準備 SSL 憑證。 | 使用 AWS Certificate Manager (ACM) 為您的 Web 應用程式網域[請求](https://docs.aws.amazon.com/acm/latest/userguide/acm-public-certificates.html)或[匯入](https://docs.aws.amazon.com/acm/latest/userguide/import-certificate.html) SSL 憑證。 | AWS 管理員、網路管理員 | 

### 使用 Terraform 部署模式
<a name="deploy-the-pattern-with-terraform"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定 Terraform 開發環境。 | 若要設定開發環境，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses.html) | AWS 管理員、雲端管理員 | 
| 修改 `.tfvars`和 ** **`provider.tf` 檔案。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses.html)**注意下列事項：**[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses.html) | AWS 管理員、雲端管理員 | 
| 佈建網路資源。 | 若要佈建網路資源，請執行下列命令：<pre>cd ./2.vpc_alb_ga<br />terraform init<br />terraform plan --var-file=apg.tfvars<br />terraform apply --var-file=apg.tfvars</pre>在`apply `命令執行期間，出現提示時輸入 **yes**。 | AWS 管理員、雲端管理員 | 
| 佈建 API Gateway、Amazon S3 和 Lambda。 | 若要佈建網路資源，請使用下列命令：<pre>cd ./2.apigw_s3_lambda<br />terraform init<br />terraform plan --var-file=apg.tfvars<br />terraform apply --var-file=apg.tfvars</pre> | AWS 管理員、雲端管理員 | 

### 使用 部署模式 AWS CDK
<a name="deploy-the-pattern-with-cdk"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定 AWS CDK 開發環境。 | 若要設定開發環境，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses.html) | AWS 管理員、雲端管理員 | 
| 在 `config/index.ts` 檔案中設定網域設定。 | 若要編輯常數變數的選項，請使用下列命令：<pre>export const options = {<br />    certificateArn: '{arn of the acm which created before}',<br />    dnsAttr: {<br />        zoneName: '{public hosted zone name}',<br />        hostedZoneId: 'hosted zone Id',<br />    },<br />    domainNamePrefix: '{Prefix for the domain}',<br />    presignPath: 'presign',<br />    objectsPath: 'objects',<br />};</pre>在命令中，將每個預留位置取代為您自己的資訊：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses.html) | AWS 管理員、雲端管理員 | 
| 部署堆疊。 | 若要部署兩個堆疊，一個用於虛擬私有雲端 (VPC)，另一個用於應用程式，請使用下列命令：<pre>$ npm install <br />$ cdk synth <br />$ cdk deploy --all</pre> | AWS 管理員、雲端管理員 | 

### 測試模式
<a name="test-the-pattern"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 驗證端點的 IP 地址。 | 若要驗證此模式的網域具有靜態 IP 地址，請使用下列命令：<pre>nslookup ${s3-bucket-prefix}.${domain}</pre> | 網路管理員 | 
| 上傳您稍後可以下載的測試檔案。 | 將測試檔案上傳至 Amazon S3 儲存貯體中的 `'/objects'` 資料夾。 | AWS 管理員、雲端管理員 | 
| 叫用 API 以產生預先簽章的 URL。 | 若要產生預先簽章的 URL，請使用下列格式從瀏覽器或 API 用戶端 （例如 [Postman](https://www.postman.com/product/what-is-postman/)) 呼叫 URL：<pre>https://${s3-bucket-prefix}.${domain}/presign/objects/${uploaded-filename}</pre>將 `${s3-bucket-prefix}`和 中的預留位置值取代為您在先前步驟中設定`${domain}`的值。 | 應用程式擁有者 | 
| 檢查結果。 | 預期的結果是您應該會收到 301 （移動永久） 重新導向狀態碼。此回應將包含預先簽章的 URL，應會自動啟動測試檔案的下載。 | 測試工程師 | 

### 使用 Terraform 清除
<a name="clean-up-with-terraform"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 銷毀 API Gateway、Amazon S3 和 Lambda 資源。 | 若要刪除資源，請使用下列命令：<pre>cd ./2.apigw_s3_lambda<br />terraform init<br />terraform plan --destroy --var-file=apg.tfvars<br />terraform destroy --var-file=apg.tfvars<br /></pre> | AWS 管理員、雲端管理員 | 
| 銷毀網路資源。 | 若要刪除網路資源，請使用下列命令：<pre>cd ./1.vpc_alb_ga<br />terraform init<br />terraform plan --destroy --var-file=apg.tfvars<br />terraform destroy --var-file=apg.tfvars<br /></pre> | AWS 管理員、雲端管理員 | 

### 使用 清除 AWS CDK
<a name="clean-up-with-cdk"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 銷毀堆疊。 | 若要同時銷毀 VPC 和應用程式堆疊，請使用下列命令：<pre>$ cdk destroy --all</pre> | AWS 管理員、雲端管理員 | 
| 清空並刪除 Amazon S3 儲存貯體。 | [清空](https://docs.aws.amazon.com/AmazonS3/latest/userguide/empty-bucket.html)並[刪除](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-bucket.html)物件 Amazon S3 儲存貯體，以及預設不會刪除的日誌 Amazon S3 儲存貯體。Amazon S3 儲存貯體名稱為 `${s3-bucket-prefix}.${domain}`和 `${s3-bucket-prefix}.${domain}-logs`。如果您偏好使用 [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) 刪除儲存貯體，請使用下列命令：<pre>$ aws s3 rm s3://${s3-bucket-prefix}.${domain} --recursive<br />$ aws s3 rb s3://${s3-bucket-prefix}.${domain} --force<br />$ aws s3 rm s3://${s3-bucket-prefix}.${domain}-logs --recursive<br />$ aws s3 rb s3://${s3-bucket-prefix}.${domain}-logs --force</pre>將 `${s3-bucket-prefix}`和 取代`${domain}`為您在先前步驟中設定的值。，/p> | AWS 管理員、雲端管理員 | 

## 相關資源
<a name="consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses-resources"></a>

**AWS 部落格**
+ [透過 提供的靜態 IP 地址存取 Amazon API Gateway AWS Global Accelerator](https://aws.amazon.com/blogs/networking-and-content-delivery/accessing-an-aws-api-gateway-via-static-ip-addresses-provided-by-aws-global-accelerator/) 
+ [在 JavaScript 的模組化中產生預先簽章 AWS CDK 的 URL JavaScript](https://aws.amazon.com/blogs/developer/generate-presigned-url-modular-aws-sdk-javascript/) 
+ [使用 ALB、S3 和 PrivateLink 託管內部 HTTPS 靜態網站](https://aws.amazon.com/blogs/networking-and-content-delivery/hosting-internal-https-static-websites-with-alb-s3-and-privatelink/) 

# 在組織中建立跨帳戶 Amazon EventBridge 連線
<a name="create-cross-account-amazon-eventbridge-connection-organization"></a>

*Sam Wilson 和 Robertstone，Amazon Web Services*

## 總結
<a name="create-cross-account-amazon-eventbridge-connection-organization-summary"></a>

大型分散式系統使用 Amazon EventBridge 來傳達 AWS Organizations 組織中各種 Amazon Web Services (AWS) 帳戶之間的狀態變更。不過，EventBridge 通常只能以相同 中的端點或取用者為目標 AWS 帳戶。例外狀況是不同帳戶中的事件匯流排。該事件匯流排是有效的目標。若要使用來自另一個帳戶中事件匯流排的事件，必須將事件從來源帳戶的事件匯流排推送到目的地帳戶的事件匯流排。為了避免在不同應用程式中管理關鍵事件時遇到挑戰 AWS 帳戶，請使用此模式中顯示的建議方法。

此模式說明如何使用涉及 AWS 帳戶 AWS Organizations 組織中多個 的 EventBridge 實作事件驅動型架構。模式使用 AWS Cloud Development Kit (AWS CDK) Toolkit 和 AWS CloudFormation。

EventBridge 提供無伺服器事件匯流排，可協助您接收、篩選、轉換、路由和交付事件。EventBridge 是事件驅動架構的關鍵元件，支援訊息生產者與這些訊息消費者之間的區隔。在單一帳戶中，這是直接的。多帳戶結構需要一個帳戶中事件匯流排上的事件的額外考量，才能在相同組織內的其他帳戶中使用。

如需生產者和消費者帳戶特定考量的相關資訊，請參閱[其他資訊](#create-cross-account-amazon-eventbridge-connection-organization-additional)一節。

## 先決條件和限制
<a name="create-cross-account-amazon-eventbridge-connection-organization-prereqs"></a>

**先決條件**
+ 至少有兩個關聯的 AWS Organizations 組織 AWS 帳戶
+ 兩者中的 AWS Identity and Access Management (IAM) 角色 AWS 帳戶 ，可讓您 AWS 帳戶 使用 在兩者中佈建基礎設施 AWS CloudFormation
+ [本機安裝](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)的 Git
+ AWS Command Line Interface 在[本機安裝](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) (AWS CLI)
+ 在AWS CDK [本機安裝](https://docs.aws.amazon.com/cdk/latest/guide/cli.html) ，並在兩者中[引導](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html#bootstrapping-howto) AWS 帳戶

**產品版本**

此模式已使用下列工具和版本建置和測試：
+ AWS CDK 工具組 2.126.0
+ Node.js 18.19.0
+ npm 10.2.3
+ Python 3.12

此模式應適用於任何版本的 AWS CDK v2 或 npm。Node.js 13.0.0 到 13 AWS CDK.6.0 版與 不相容。

## Architecture
<a name="create-cross-account-amazon-eventbridge-connection-organization-architecture"></a>

**目標架構**

下圖顯示從一個帳戶推送事件並在另一個帳戶中使用事件的架構工作流程。

![\[連接來源生產者帳戶和目的地消費者帳戶的三個步驟程序。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/34a5f3ae-511d-4636-999f-c73396770117/images/ccc4878a-6281-4a77-a483-4e6f299d7807.png)


工作流程包含下列步驟：

1. 來源帳戶中的生產者 AWS Lambda 函數會在帳戶的 EventBridge 事件匯流排上放置事件。

1. 跨帳戶 EventBridge 規則會將事件路由到目的地帳戶中的 EventBridge 事件匯流排。

1. 目的地帳戶中的 EventBridge 事件匯流排具有目標 Lambda 規則，可叫用 Consumer Lambda 函數。

最佳實務是使用[無效字母佇列 (DLQ)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html) 來處理消費者 Lambda 函數的失敗調用。不過，為了清楚起見，此解決方案省略了 DLQ。若要進一步了解如何在工作流程中實作 DLQ，並改善工作流程從失敗中復原的能力，請參閱[實作 AWS Lambda 錯誤處理模式](https://aws.amazon.com/blogs/compute/implementing-aws-lambda-error-handling-patterns/)部落格文章。

**自動化和擴展**

AWS CDK 會自動佈建所需的架構。EventBridge 可以根據 擴展到每秒數千筆記錄 AWS 區域。如需詳細資訊，請參閱 [Amazon EventBridge 配額文件](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-quota.html)。

## 工具
<a name="create-cross-account-amazon-eventbridge-connection-organization-tools"></a>

**AWS 服務**
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html) 是一種軟體開發架構，可協助您在程式碼中定義和佈建 AWS 雲端 基礎設施。此模式使用 [AWS CDK Toolkit](https://docs.aws.amazon.com/cdk/latest/guide/cli.html)，這是一個命令列雲端開發套件，可協助您與 AWS CDK 應用程式互動。
+ [Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html) 是一種無伺服器事件匯流排服務，可協助您將應用程式與來自各種來源的即時資料連線。例如， AWS Lambda 函數、使用 API 目的地的 HTTP 調用端點，或其他事件匯流排 AWS 帳戶。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一項運算服務，可協助您執行程式碼，無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展，因此您只需支付使用的運算時間。
+ [AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html) 是一種帳戶管理服務，可協助您將多個 合併 AWS 帳戶 到您建立並集中管理的組織。

**其他工具**
+ [Node.js](https://nodejs.org/en/docs/) 是一種事件驅動的 JavaScript 執行期環境，旨在建置可擴展的網路應用程式。
+ [npm](https://docs.npmjs.com/about-npm) 是在 Node.js 環境中執行的軟體登錄檔，用於共用或借用套件和管理私有套件的部署。
+ [Python](https://www.python.org/) 是一種一般用途的電腦程式設計語言。

**程式碼儲存庫**

此模式的程式碼可在 GitHub [cross-account-eventbridge-in-organization](https://github.com/aws-samples/aws-cdk-examples/tree/main/python/cross-account-eventbridge-in-organization) 儲存庫中使用。

## 最佳實務
<a name="create-cross-account-amazon-eventbridge-connection-organization-best-practices"></a>

如需使用 EventBridge 時的最佳實務，請參閱下列資源：
+ [Amazon EventBridge 事件模式的最佳實務](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-patterns-best-practices.html)
+ [在 Amazon EventBridge 中定義規則時的最佳實務](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-rules-best-practices.html)

## 史詩
<a name="create-cross-account-amazon-eventbridge-connection-organization-epics"></a>

### 準備您的本機 AWS CDK 部署環境
<a name="prepare-your-local-cdk-deployment-environment"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定來源帳戶和目的地帳戶的本機登入資料。 | 檢閱[設定新的組態和登入](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-quickstart.html#getting-started-quickstart-new)資料，並使用對您的環境最有意義的身分驗證和登入資料方法。請務必 AWS CLI 為來源帳戶和目的地帳戶身分驗證設定 。這些指示假設您已在本機設定兩個 AWS 設定檔： `sourceAccount`和 `destinationAccount`。 | 應用程式開發人員 | 
| 同時引導兩者 AWS 帳戶。 | 若要引導帳戶，請執行下列命令：<pre>cdk bootstrap --profile sourceAccount<br />cdk bootstrap --profile destinationAccount</pre> | 應用程式開發人員 | 
| 複製模式程式碼。 | 若要複製儲存庫，請執行下列命令：<pre>git clone git@github.com:aws-samples/aws-cdk-examples.git</pre>然後，將目錄變更為新複製的專案資料夾：<pre>cd aws-cdk-examples/python/cross-account-eventbridge-in-organization</pre> | 應用程式開發人員 | 

### 將 ProducerStack 部署至來源帳戶
<a name="deploy-producerstack-to-the-source-account"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| `cdk.json` 使用 AWS Organizations 和 帳戶詳細資訊修改 。 | 在專案的根資料夾中，對 進行下列變更`cdk.json`：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-cross-account-amazon-eventbridge-connection-organization.html) | 應用程式開發人員 | 
| 部署 ProducerStack 資源。 | 從專案的根目錄執行下列命令：<pre>cdk deploy ProducerStack --profile sourceAccount</pre>出現提示時，請接受透過 建立的新 IAM 角色和其他安全相關許可 AWS CloudFormation。 | 應用程式開發人員 | 
| 確認已部署 ProducerStack 資源。 | 若要驗證資源，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-cross-account-amazon-eventbridge-connection-organization.html) | 應用程式開發人員 | 

### 將 ConsumerStack 部署至目的地帳戶
<a name="deploy-consumerstack-to-the-destination-account"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 部署 ConsumerStack 資源。 | 從專案的根目錄執行下列命令：<pre>cdk deploy ConsumerStack --profile destinationAccount</pre>出現提示時，請接受透過 建立的新 IAM 角色和其他安全相關許可 CloudFormation。 | 應用程式開發人員 | 
| 確認已部署 ConsumerStack 資源 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-cross-account-amazon-eventbridge-connection-organization.html) | 應用程式開發人員 | 

### 產生和使用事件
<a name="produce-and-consume-events"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 叫用 Producer Lambda 函數。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-cross-account-amazon-eventbridge-connection-organization.html) | 應用程式開發人員 | 
| 確認已收到事件。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-cross-account-amazon-eventbridge-connection-organization.html) | 應用程式開發人員 | 

### 清除
<a name="cleanup"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 銷毀 ConsumerStack 資源。 | 如果您使用此模式做為測試，請清除已部署的資源，以避免產生額外費用。從專案的根目錄執行下列命令：<pre>cdk destroy ConsumerStack --profile destinationAccount</pre>系統會提示您確認刪除堆疊。 | 應用程式開發人員 | 
| 銷毀 ProducerStack 資源。 | 從專案的根目錄執行下列命令：<pre>cdk destroy ProducerStack --profile sourceAccount</pre>系統會提示您確認刪除堆疊。 | 應用程式開發人員 | 

## 疑難排解
<a name="create-cross-account-amazon-eventbridge-connection-organization-troubleshooting"></a>


| 問題 | 解決方案 | 
| --- | --- | 
| 目的地帳戶中未收到任何事件。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-cross-account-amazon-eventbridge-connection-organization.html) | 
| 從主控台叫用 Lambda 函數會傳回下列錯誤：`User: arn:aws:iam::123456789012:user/XXXXX is not authorized to perform: lambda:Invoke` | 請聯絡您的 AWS 帳戶 管理員，以取得 `ProducerStack-ProducerLambdaXXXX` Lambda 函數的適當`lambda:Invoke`動作許可。 | 

## 相關資源
<a name="create-cross-account-amazon-eventbridge-connection-organization-resources"></a>

**參考**
+ [AWS Organizations 使用者指南](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html)
+ [Amazon EventBridge 事件模式](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-patterns.html)
+ [Amazon EventBridge 中的規則](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-rules.html)

**教學課程和影片**
+ [教學課程：建立和設定組織](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_tutorials_basic.html)
+ [AWS re：Invent 2023 - 使用 Amazon EventBridge (COM301-R) 的進階事件驅動模式](https://www.youtube.com/watch?v=6X4lSPkn4ps)

## 其他資訊
<a name="create-cross-account-amazon-eventbridge-connection-organization-additional"></a>

**製作者規則**

在來源帳戶中，建立 EventBridge 事件匯流排以接受來自生產者的訊息 （如*架構*一節所示）。在此事件匯流排上建立具有隨附 IAM 許可的規則。這些規則會根據下列`cdk.json`結構，以目的地帳戶中的 EventBridge 事件匯流排為目標：

```
"rules": [
  {
    "id": "CrossAccount",
    "sources": ["Producer"],
    "detail_types": ["TestType"],
    "targets": [
      {
        "id": "ConsumerEventBus",
        "arn": "arn:aws:events:us-east-2:012345678901:event-bus/CrossAccount"
      }
    ]
  }
]
```

對於每個耗用事件匯流排，必須包含事件模式和目標事件匯流排。

*事件模式*

[事件模式](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-patterns.html)會篩選此規則將套用的事件。基於此範例，事件來源和記錄會`detail_types`識別要從來源帳戶的事件匯流排傳輸哪些事件到目的地帳戶的事件匯流排。

*目標事件匯流排*

此規則以另一個帳戶中存在的事件匯流排為目標。需要完整 `arn`(Amazon Resource Name) 才能唯一識別目標事件匯流排，而 `id`是 使用的[邏輯 ID](https://docs.aws.amazon.com/cdk/v2/guide/identifiers.html#identifiers_logical_ids) AWS CloudFormation。建立目標規則時，目標事件匯流排實際上不需要存在。

**目的地帳戶特定的考量事項**

在目的地帳戶中，會建立 EventBridge 事件匯流排，以從來源帳戶的事件匯流排接收訊息。若要允許從來源帳戶發佈事件，您必須建立以[資源為基礎的政策](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-use-resource-based.html)：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [{
    "Sid": "AllowOrgToPutEvents",
    "Effect": "Allow",
    "Principal": "*",
    "Action": "events:PutEvents",
    "Resource": "arn:aws:events:us-east-2:012345678901:event-bus/CrossAccount",
    "Condition": {
      "StringEquals": {
        "aws:PrincipalOrgID": "o-XXXXXXXXX"
      }
    }
  }]
}
```

特別重要的是授予`events:PutEvents`許可，允許同一組織中的任何其他帳戶發佈事件到此事件匯流排。將 `aws:PrincipalOrgId`設定為組織 ID 會授予所需的許可。

**事件模式**

您可以修改包含的事件模式，以符合您的使用案例：

```
rule = events.Rule(
    self,
    self.id + 'Rule' + rule_definition['id'],
    event_bus=event_bus,
    event_pattern=events.EventPattern(
        source=rule_definition['sources'],
        detail_type=rule_definition['detail_types'],
    )
)
```

為了減少不必要的處理，事件模式應指定只有目的地帳戶要處理的事件才會傳輸到目的地帳戶的事件匯流排。

*以資源為基礎的政策*

此範例使用組織 ID 來控制允許哪些帳戶在目的地帳戶的事件匯流排上放置事件。考慮使用更嚴格的政策，例如指定來源帳戶。

*EventBridge 配額*

請記住下列[配額](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-quota.html)：
+ 每個事件匯流排 300 個規則是預設配額。這可以視需要擴展，但應該適合大多數的使用案例。
+ 每個規則允許五個目標。我們建議應用程式架構師為每個目的地帳戶使用不同的規則，以支援對事件模式的精細控制。

# 使用 Kinesis Data Streams 和 Firehose 搭配 將 DynamoDB 記錄交付至 Amazon S3 AWS CDK
<a name="deliver-dynamodb-records-to-amazon-s3-using-kinesis-data-streams-and-amazon-data-firehose-with-aws-cdk"></a>

*Shashank Shrivastava 和 Daniel Matuki da Cunha，Amazon Web Services*

## 摘要
<a name="deliver-dynamodb-records-to-amazon-s3-using-kinesis-data-streams-and-amazon-data-firehose-with-aws-cdk-summary"></a>

此模式提供範例程式碼和應用程式，以使用 Amazon Kinesis Data Streams 和 Amazon Data Firehose，將記錄從 Amazon DynamoDB 交付至 Amazon Simple Storage Service (Amazon S3)。模式的方法使用 [AWS Cloud Development Kit (AWS CDK) L3 建構](https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html)，並包含如何在資料交付至 Amazon Web Services (AWS) 雲端上的目標 S3 儲存貯體 AWS Lambda 之前使用 執行資料轉換的範例。

Kinesis Data Streams 會在 DynamoDB 資料表中記錄項目層級修改，並將其複寫至所需的 Kinesis 資料串流。您的應用程式可以存取 Kinesis 資料串流，並以近乎即時的速度檢視項目層級的變更。Kinesis Data Streams 也提供其他 Amazon Kinesis 服務的存取權，例如 Firehose 和 Amazon Managed Service for Apache Flink。這表示您可以建置應用程式，以提供即時儀表板、產生提醒、實作動態定價和廣告，以及執行複雜的資料分析。

您可以將此模式用於資料整合使用案例。例如，運輸車輛或工業設備可以將大量資料傳送至 DynamoDB 資料表。然後，這些資料可以轉換並存放在 Amazon S3 中託管的資料湖中。然後，您可以使用 Amazon Athena、Amazon Redshift Spectrum、Amazon Rekognition 和 等無伺服器服務來查詢和處理資料，並預測任何潛在的瑕疵 AWS Glue。

## 先決條件和限制
<a name="deliver-dynamodb-records-to-amazon-s3-using-kinesis-data-streams-and-amazon-data-firehose-with-aws-cdk-prereqs"></a>

*先決條件*
+ 作用中 AWS 帳戶。
+ AWS Command Line Interface (AWS CLI)，已安裝並設定。如需詳細資訊，請參閱 AWS CLI 文件中的 [入門 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)。
+ Node.js (18.x\$1) 和 npm，已安裝並設定。如需詳細資訊，請參閱 `npm` 文件中的[下載並安裝 Node.js 和 npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)。
+ aws-cdk (2.x\$1)，已安裝並設定。如需詳細資訊，請參閱 AWS CDK 文件中的 [入門 AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html)。
+ GitHub [aws-dynamodb-kinesisfirehose-s3-ingestion](https://github.com/aws-samples/aws-dynamodb-kinesisfirehose-s3-ingestion/) 儲存庫，在您的本機電腦上複製和設定。
+ DynamoDB 資料表的現有範例資料。資料必須使用下列格式： `{"SourceDataId": {"S": "123"},"MessageData":{"S": "Hello World"}}`

## Architecture
<a name="deliver-dynamodb-records-to-amazon-s3-using-kinesis-data-streams-and-amazon-data-firehose-with-aws-cdk-architecture"></a>

下圖顯示使用 Kinesis Data Streams 和 Firehose 將記錄從 DynamoDB 交付至 Amazon S3 的範例工作流程。

![\[使用 Kinesis Data Streams 和 Firehose 將記錄從 DynamoDB 交付至 Amazon S3 的範例工作流程。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/e2a9c412-312e-4900-9774-19a281c578e4/images/6e6df998-e6c2-4eaf-b263-ace752194689.png)


該圖顯示以下工作流程：

1. 使用 Amazon API Gateway 做為 DynamoDB 的代理來擷取資料。您也可以使用任何其他來源將資料擷取至 DynamoDB。 

1. 項目層級變更會在 Kinesis Data Streams 中以近乎即時的方式產生，以交付至 Amazon S3。

1. Kinesis Data Streams 會將記錄傳送至 Firehose 以進行轉換和交付。 

1. Lambda 函數會將記錄從 DynamoDB 記錄格式轉換為 JSON 格式，其中僅包含記錄項目屬性名稱和值。

## 工具
<a name="deliver-dynamodb-records-to-amazon-s3-using-kinesis-data-streams-and-amazon-data-firehose-with-aws-cdk-tools"></a>

*AWS 服務*
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html) 是一種軟體開發架構，可協助您在程式碼中定義和佈建 AWS 雲端基礎設施。
+ [AWS CDK Toolkit](https://docs.aws.amazon.com/cdk/latest/guide/cli.html) 是命令列雲端開發套件，可協助您與 AWS CDK 應用程式互動。
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) 是一種開放原始碼工具，可協助您 AWS 服務 透過命令列 shell 中的命令與 互動。
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) 可協助您設定 AWS 資源、快速且一致地佈建資源，以及在整個 AWS 帳戶 和 生命週期中管理資源 AWS 區域。

*程式碼儲存庫*

此模式的程式碼可在 GitHub [aws-dynamodb-kinesisfirehose-s3-ingestion](https://github.com/aws-samples/aws-dynamodb-kinesisfirehose-s3-ingestion/) 儲存庫中使用。

## 史詩
<a name="deliver-dynamodb-records-to-amazon-s3-using-kinesis-data-streams-and-amazon-data-firehose-with-aws-cdk-epics"></a>

### 設定範例程式碼
<a name="set-up-and-configure-the-sample-code"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 安裝相依性。 | 在本機電腦上，執行下列命令，從 `pattern/aws-dynamodb-kinesisstreams-s3`和 `sample-application` 目錄中`package.json`的檔案安裝相依性：<pre>cd <project_root>/pattern/aws-dynamodb-kinesisstreams-s3 </pre><pre>npm install && npm run build</pre><pre>cd <project_root>/sample-application/</pre><pre>npm install && npm run build</pre>  | 應用程式開發人員，一般 AWS | 
| 產生 CloudFormation 範本。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deliver-dynamodb-records-to-amazon-s3-using-kinesis-data-streams-and-amazon-data-firehose-with-aws-cdk.html) | 應用程式開發人員、一般 AWS、AWS DevOps | 

### 部署 資源
<a name="deploy-the-resources"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 檢查並部署 資源。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deliver-dynamodb-records-to-amazon-s3-using-kinesis-data-streams-and-amazon-data-firehose-with-aws-cdk.html) | 應用程式開發人員、一般 AWS、AWS DevOps | 

### 將資料擷取至 DynamoDB 資料表以測試解決方案
<a name="ingest-data-into-the-dynamodb-table-to-test-the-solution"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 將範例資料擷取至 DynamoDB 資料表。 | 在 中執行下列命令，將請求傳送至 DynamoDB 資料表 AWS CLI：`aws dynamodb put-item --table-name <your_table_name> --item '{"<table_partition_key>": {"S": "<partition_key_ID>"},"MessageData":{"S": "<data>"}}'`範例：`aws dynamodb put-item --table-name SourceData_table --item '{"SourceDataId": {"S": "123"},"MessageData":{"S": "Hello World"}}'`根據預設，如果操作成功， `put-item`不會傳回任何值做為輸出。如果操作失敗，則會傳回錯誤。資料存放在 DynamoDB 中，然後傳送至 Kinesis Data Streams 和 Firehose。 您可以使用不同的方法來將資料新增至 DynamoDB 資料表。如需詳細資訊，請參閱 DynamoDB 文件中的將[資料載入資料表](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SampleData.LoadData.html)。 | 應用程式開發人員 | 
| 確認已在 S3 儲存貯體中建立新的物件。 | 登入 AWS 管理主控台 並監控 S3 儲存貯體，以確認已使用您傳送的資料建立新物件。 如需詳細資訊，請參閱 Amazon S3 文件中的 [GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)。 | 應用程式開發人員，一般 AWS | 

### 清除資源
<a name="clean-up-resources"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 清除資源。 | 執行 `cdk destroy`命令來刪除此模式使用的所有資源。 | 應用程式開發人員，一般 AWS | 

## 相關資源
<a name="deliver-dynamodb-records-to-amazon-s3-using-kinesis-data-streams-and-amazon-data-firehose-with-aws-cdk-resources"></a>
+ [s3-static-site-stack.ts](https://github.com/awslabs/aws-solutions-constructs/blob/main/source/use_cases/aws-s3-static-website/lib/s3-static-site-stack.ts#L25) (GitHub 儲存庫）
+ [aws-apigateway-dynamodb 模組](https://github.com/awslabs/aws-solutions-constructs/tree/main/source/patterns/%40aws-solutions-constructs/aws-apigateway-dynamodb) (GitHub 儲存庫）
+ [aws-kinesisstreams-kinesisfirehose-s3 模組](https://github.com/awslabs/aws-solutions-constructs/tree/main/source/patterns/%40aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3) (GitHub 儲存庫）
+ [變更 DynamoDB Streams 的資料擷取 ](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html)(DynamoDB 文件）
+ [使用 Kinesis Data Streams 擷取對 DynamoDB 的變更](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/kds.html) (DynamoDB 文件）

# 在 Amazon API Gateway 中使用自訂網域實作路徑型 API 版本控制
<a name="implement-path-based-api-versioning-by-using-custom-domains"></a>

*Corey Schnedl、Marcel Barbosa、Mario Lopez Martinez、Anbazhagan Ponnuswamy、Gaurav Samudra 和 Abhilash Vinod、Amazon Web Services*

## 摘要
<a name="implement-path-based-api-versioning-by-using-custom-domains-summary"></a>

此模式示範如何使用[自訂網域](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-custom-domains.html)的 [API 映射](https://docs.aws.amazon.com/apigateway/latest/developerguide/rest-api-mappings.html)功能，為 Amazon API Gateway 實作以路徑為基礎的 API 版本控制解決方案。

Amazon API Gateway 是一項全受管服務，可用於建立、發佈、維護、監控和保護任何規模APIs。透過使用服務的自訂網域功能，您可以建立更簡單的自訂網域名稱，並提供更直覺URLs 給您的 API 使用者。您可以使用 API 映射將 API 階段連線至自訂網域名稱。建立網域名稱並設定 DNS 記錄之後，您可以使用 API 映射，透過自訂網域名稱將流量傳送至您的 API。

在 API 公開可用之後，消費者會使用它。隨著公有 API 的演進，其服務合約也會演進以反映新功能。不過，變更或移除現有功能並不明智。任何中斷變更都可能會影響消費者的應用程式，並在執行時間中斷它們。API 版本控制對於避免破壞回溯相容性和破壞合約非常重要。

您需要明確的 API 版本控制策略，以協助消費者採用這些策略。使用路徑型 URLs版本控制 APIs 是最直接且常用的方法。在此類型的版本控制中，版本會明確定義為 API URIs的一部分。下列範例 URLs顯示消費者如何使用 URI 為其請求指定 API 版本：

`https://api.example.com/api/v1/orders `

`https://api.example.com/api/v2/orders `

`https://api.example.com/api/vX/orders`

此模式使用 AWS Cloud Development Kit (AWS CDK) 為您的 API 建置、部署和測試可擴展路徑型版本控制解決方案的範例實作。 AWS CDK 是一種開放原始碼軟體開發架構，可使用熟悉的程式設計語言來建模和佈建雲端應用程式資源。

## 先決條件和限制
<a name="implement-path-based-api-versioning-by-using-custom-domains-prereqs"></a>

**先決條件 **
+ 作用中 AWS 帳戶。
+ 需要擁有網域才能使用此模式的範例儲存庫，以及使用 Amazon API Gateway 自訂網域功能。您可以使用 Amazon Route 53 為您的組織建立和管理網域。如需有關如何使用 Route 53 註冊或轉移網域的資訊，請參閱 Route 53 文件中的[註冊新網域](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/domain-register-update.html)。
+ 在設定 API 的自訂網域名稱之前，您必須備妥 [SSL/TLS 憑證](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-specify-certificate-for-custom-domain-name.html) AWS Certificate Manager。
+ 您必須建立或更新 DNS 提供者的資源記錄，以映射至您的 API 端點。如果沒有這類映射，則綁定自訂網域名稱的 API 請求無法到達 API Gateway。

**限制 **
+  AWS 區域 在所有 中，自訂網域名稱必須是唯一的 AWS 帳戶。
+ 若要設定具有多個層級的 API 映射，您必須使用區域性自訂網域名稱和 TLS 1.2 安全政策。
+ 在 API 映射中，自訂網域名稱和映射APIs 必須位於相同的 中 AWS 帳戶。
+ API 映射只能包含字母、數字和下列字元： `$-_.+!*'()/`
+ API 映射中路徑的最大長度為 300 個字元。
+ 您可以為每個域名設定具有 200 個具多個層級的 API 映射。
+ 您只能將 HTTP APIs 映射至具有 TLS 1.2 安全政策的區域性自訂網域名稱。
+ 您無法將 WebSocket APIs對應至與 HTTP API 或 REST API 相同的自訂網域名稱。
+ 有些 AWS 服務 無法全部使用 AWS 區域。如需區域可用性，請參閱[AWS 依區域的服務](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。如需特定端點，請參閱[服務端點和配額](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)，然後選擇服務的連結。

**產品版本**
+ 此範例實作在 [AWS CDK TypeScript 2.149.0 ](https://docs.aws.amazon.com/cdk/v2/guide/work-with-cdk-typescript.html)版中使用 。

## Architecture
<a name="implement-path-based-api-versioning-by-using-custom-domains-architecture"></a>

下圖顯示架構工作流程。

![\[使用 API 映射和自訂網域來實作路徑型 API 版本控制解決方案的工作流程。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/e1b32d2b-410f-4ace-967e-f0b8aaf0304c/images/fa9f04f1-efa6-4fb1-a541-ae3da4076b00.png)


此圖展示了以下要點：

1. API 使用者向 Amazon API Gateway 傳送具有自訂網域名稱的請求。

1. API Gateway 會根據請求 URL 中指定的路徑，將使用者的請求動態路由到 API Gateway 的適當執行個體和階段。下表顯示如何將不同 URL 型路徑路由至不同 API Gateway 執行個體之特定階段的範例。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/implement-path-based-api-versioning-by-using-custom-domains.html)

1. 目的地 API Gateway 執行個體會處理請求，並將結果傳回給使用者。

**自動化和擴展**

我們建議您針對 API 的每個版本使用不同的 AWS CloudFormation 堆疊。透過此方法，您可以在可由自訂網域 APIs 的後端 API 之間進行完全隔離。這種方法的優點是，您可以獨立部署或刪除不同版本的 API，而不會帶來修改其他 API 的風險。這種方法透過隔離 CloudFormation 堆疊來提高彈性。此外，它還為您的 API 提供不同的後端選項 AWS Lambda AWS Fargate，例如 HTTP 端點和 的動作 AWS 服務。

您可以使用 Git 分支策略，例如 [Gitflow](https://docs.aws.amazon.com/prescriptive-guidance/latest/choosing-git-branch-approach/gitflow-branching-strategy.html)，搭配隔離的 CloudFormation 堆疊來管理部署到不同 API 版本的原始碼。透過使用此選項，您可以維護不同版本的 API，而不需要複製新版本的原始程式碼。使用 Gitflow，您可以在執行版本時，將標籤新增至 git 儲存庫中的遞交。因此，您擁有與特定版本相關的原始程式碼的完整快照。由於需要執行更新，您可以查看特定版本的程式碼、進行更新，然後將更新的原始程式碼部署到與對應主要版本一致的 CloudFormation 堆疊。這種方法可降低破壞另一個 API 版本的風險，因為每個 API 版本都有隔離的原始程式碼，並部署到單獨的 CloudFormation 堆疊。

## 工具
<a name="implement-path-based-api-versioning-by-using-custom-domains-tools"></a>

**AWS 服務**
+ [Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html) 可協助您建立、發佈、維護、監控和保護任何規模的 REST、HTTP 和 WebSocket APIs。
+ [AWS Certificate Manager (ACM)](https://docs.aws.amazon.com/acm/latest/userguide/acm-overview.html) 可協助您建立、存放和續約公有和私有 SSL/TLS X.509 憑證和金鑰，以保護 AWS 網站和應用程式。
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html) 是一種開放原始碼軟體開發架構，可讓您在程式碼中定義雲端基礎設施並透過其佈建 CloudFormation。此模式的範例實作使用 [AWS CDK TypeScript 中的](https://docs.aws.amazon.com/cdk/v2/guide/work-with-cdk-typescript.html) 。在 TypeScript AWS CDK 中使用 會使用熟悉的工具，包括 Microsoft TypeScript 編譯器 (`tsc`)、[Node.js](https://nodejs.org/) 和節點套件管理員 (`npm`)。如果您願意，雖然此模式中的範例使用 ，但您可以使用 [Yarn](https://yarnpkg.com/)`npm`。構成[AWS 建構程式庫](https://docs.aws.amazon.com/cdk/v2/guide/libraries.html#libraries-construct)的模組會透過儲存`npm `庫 [npmjs.org](https://docs.npmjs.com/) 進行分發。
+ [CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) 可協助您設定 AWS 資源、快速且一致地佈建資源，以及在整個 AWS 帳戶 和 生命週期中管理資源 AWS 區域。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一項運算服務，可協助您執行程式碼，無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展，因此您只需按使用的運算時間付費。
+ [Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html) 是一種可用性高、可擴展性強的 DNS Web 服務。
+ [AWS WAF](https://docs.aws.amazon.com/waf/latest/developerguide/what-is-aws-waf.html) 是一種 Web 應用程式防火牆，可協助您監控轉送至受保護 Web 應用程式資源的 HTTP 和 HTTPS 請求。

**其他工具**
+ [Bruno](https://www.usebruno.com/) 是開放原始碼且易於 Git 的 API 測試用戶端。
+ [cdk-nag](https://github.com/cdklabs/cdk-nag) 是一種開放原始碼公用程式，可透過使用規則套件來檢查 AWS CDK 應用程式是否有最佳實務。

**程式碼儲存庫**

此模式的程式碼可在 GitHub [path-based-versioning-with-api-gateway](https://github.com/aws-samples/path-based-versioning-with-api-gateway)儲存庫中使用。

## 最佳實務
<a name="implement-path-based-api-versioning-by-using-custom-domains-best-practices"></a>
+ 使用強大的持續整合和持續交付 (CI/CD) 管道，自動化使用 建置之 CloudFormation 堆疊的測試和部署 AWS CDK。如需有關此建議的詳細資訊，請參閱 [AWS Well-Architected DevOps 指南](https://docs.aws.amazon.com/wellarchitected/latest/devops-guidance/devops-guidance.html)。
+ AWS WAF 是受管防火牆，可輕鬆與 Amazon API Gateway 等服務整合。雖然 AWS WAF 不是此版本控制模式運作的必要元件，但我們建議將 做為安全最佳實務， AWS WAF 納入 API Gateway。
+ 鼓勵 API 取用者定期升級至最新版本的 API，以便有效棄用和移除舊版的 API。
+ 在生產設定中使用此方法之前，請為您的 API 實作防火牆和授權策略。
+  AWS 帳戶 使用最低權限存取模型實作對 AWS 資源管理的存取。 [https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)
+ 若要針對使用 建置的應用程式強制執行最佳實務和安全性建議 AWS CDK，建議您使用 [cdk-nag 公用程式](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/check-aws-cdk-applications-or-cloudformation-templates-for-best-practices-by-using-cdk-nag-rule-packs.html)。

## 史詩
<a name="implement-path-based-api-versioning-by-using-custom-domains-epics"></a>

### 準備您的本機環境
<a name="prepare-your-local-environment"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 複製儲存庫。 | 若要複製範例應用程式儲存庫，請執行下列命令：<pre>git clone https://github.com/aws-samples/path-based-versioning-with-api-gateway</pre> | 應用程式開發人員 | 
| 導覽至複製的儲存庫。 | 若要導覽至複製的儲存庫資料夾位置，請執行下列命令：<pre>cd api-gateway-custom-domain-versioning</pre> | 應用程式開發人員 | 
| 安裝所需的依存項目。 | 若要安裝必要的相依性，請執行下列命令：<pre>npm install </pre> | 應用程式開發人員 | 

### 部署 CloudFormation 路由堆疊
<a name="deploy-the-cfnshort-routing-stack"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 啟動路由堆疊的部署。 | 若要啟動 CloudFormation 路由堆疊 的部署`CustomDomainRouterStack`，請執行下列命令，`example.com`將 取代為您擁有的網域名稱：<pre>npx cdk deploy CustomDomainRouterStack --parameters PrerequisiteDomainName=example.com</pre>在下列網域 DNS 驗證任務成功執行之前，堆疊部署不會成功。 | 應用程式開發人員 | 

### 驗證網域所有權
<a name="verify-domain-ownership"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 驗證網域的擁有權。 | 在您證明相關聯網域的擁有權之前，憑證將保持**待定驗證**狀態。若要證明擁有權，請將 CNAME 記錄新增至與網域相關聯的託管區域。如需詳細資訊，請參閱 AWS Certificate Manager 文件中的 [DNS 驗證](https://docs.aws.amazon.com/acm/latest/userguide/dns-validation.html)。新增適當的記錄可讓`CustomDomainRouterStack`部署成功。 | 應用程式開發人員、AWS 系統管理員、網路管理員 | 
| 建立別名記錄以指向您的 API Gateway 自訂網域。 | 成功發出並驗證憑證後，[請建立指向 Amazon API Gateway 自訂網域 URL 的 DNS 記錄](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-regional-api-custom-domain-create.html#apigateway-regional-api-custom-domain-dns-record)。 Amazon API Gateway 自訂網域 URL 由自訂網域的佈建唯一產生，並指定為 CloudFormation 輸出參數。以下是[記錄的範例](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resource-record-sets-values-basic.html)：**路由政策**：簡易路由**記錄名稱**： `demo.api-gateway-custom-domain-versioning.example.com`**Alias (別名)**：是**記錄類型**：指向 AWS 資源的 "A" 類型的 DNS 記錄**Value (值)**：`d-xxxxxxxxxx.execute-api.xx-xxxx-x.amazonaws.com`**TTL （秒）**：300 | 應用程式開發人員、AWS 系統管理員、網路管理員 | 

### 部署 CloudFormation 堆疊並叫用 API
<a name="deploy-cfnshort-stacks-and-invoke-the-api"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 部署`ApiStackV1`堆疊。 | 若要部署`ApiStackV1`堆疊，請使用下列命令：<pre>npm run deploy-v1</pre>下列 CDK 程式碼新增 API 映射：<pre>var apiMapping = new CfnApiMapping(this, "ApiMapping", {<br />      apiId: this.lambdaRestApi.restApiId,<br />      domainName: props.customDomainName.domainName,<br />      stage: "api",<br />      apiMappingKey: "api/v1",<br />    });</pre> | 應用程式開發人員 | 
| 部署`ApiStackV2`堆疊。 | 若要部署`ApiStackV2`堆疊，請使用下列命令：<pre>npm run deploy-v2</pre> | 應用程式開發人員 | 
| 叫用 API。 | 若要使用 Bruno 叫用 API 並測試 API 端點，請參閱[其他資訊](#implement-path-based-api-versioning-by-using-custom-domains-additional)中的指示。 | 應用程式開發人員 | 

### 清除資源
<a name="clean-up-resources"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 清除資源。 | 若要銷毀與此範例應用程式相關聯的資源，請使用下列命令：<pre>npx cdk destroy --all</pre>請務必清除為網域擁有權驗證程序手動新增的任何 Route 53 DNS 記錄。 | 應用程式開發人員 | 

## 疑難排解
<a name="implement-path-based-api-versioning-by-using-custom-domains-troubleshooting"></a>


| 問題 | 解決方案 | 
| --- | --- | 
| 部署`CustomDomainRouterStack`因為無法驗證憑證而逾時。 | 請確定您已新增適當的 DNS 驗證 CNAME 記錄，如先前任務所述。在新增 DNS **驗證**記錄之後，您的新憑證可能會繼續顯示等待驗證狀態長達 30 分鐘。如需詳細資訊，請參閱 AWS Certificate Manager 文件中的 [DNS 驗證](https://docs.aws.amazon.com/acm/latest/userguide/dns-validation.html)。 | 

## 相關資源
<a name="implement-path-based-api-versioning-by-using-custom-domains-resources"></a>
+ [使用 Amazon CloudFront 實作標頭型 API Gateway 版本控制](https://aws.amazon.com/blogs/compute/implementing-header-based-api-gateway-versioning-with-amazon-cloudfront/) – 此 AWS 運算部落格文章提供標頭型版本控制策略，以替代此模式中概述的路徑型版本控制策略。
+ [AWS CDK 研討會](https://cdkworkshop.com/20-typescript.html) – 此簡介研討會著重於 AWS 使用 在 上建置和部署應用程式 AWS Cloud Development Kit (AWS CDK)。此研討會支援 Go、Python 和 TypeScript。

## 其他資訊
<a name="implement-path-based-api-versioning-by-using-custom-domains-additional"></a>

**使用 Bruno 測試您的 API**

我們建議您使用開放原始碼 API 測試工具 [Bruno](https://www.usebruno.com/)，來驗證範例應用程式的路徑型路由是否正常運作。此模式提供範例集合，以協助測試您的範例 API。

若要叫用和測試您的 API，請使用下列步驟：

1. [安裝 Bruno。](https://www.usebruno.com/downloads)

1. 開啟 Bruno。

1. 在此模式的[程式碼儲存庫](https://github.com/aws-samples/path-based-versioning-with-api-gateway)中，選取 **Bruno/Sample-API-Gateway-Custom-Domain-Versioning**，然後開啟集合。

1. 若要查看使用者介面 (UI) 右上角**的環境**下拉式清單，請選取集合中的任何請求。

1. 在**環境**下拉式清單中，選取**設定**。

1. 將 `REPLACE_ME_WITH_YOUR_DOMAIN`值取代為您的自訂網域。

1. 選擇**儲存**，然後關閉**組態**區段。

1. 針對**沙盒環境**，** **確認已選取**作用中**選項。

1. 使用所選請求的 **->** 按鈕調用您的 API。

1. 請注意，與 V1 中如何處理驗證 （傳遞非數值）。 V2

若要查看範例 API 呼叫的螢幕擷取畫面，以及 V1 和 V2 驗證的比較，請參閱此模式[程式碼儲存庫](https://github.com/aws-samples/path-based-versioning-with-api-gateway)中的測試`README.md`檔案中**的範例 API**。

# 將 psycopg2 程式庫匯入 AWS Lambda ，以與您的 PostgreSQL 資料庫互動
<a name="import-psycopg2-library-lambda"></a>

*Louis Hourcade，Amazon Web Services*

## 總結
<a name="import-psycopg2-library-lambda-summary"></a>

[Psycopg](https://www.psycopg.org/docs/) 是適用於 Python 的 PostgresSQL 資料庫轉接器。開發人員使用 `psycopg2`程式庫撰寫與 PostgreSQL 資料庫互動的 Python 應用程式。

在 Amazon Web Services (AWS) 上，開發人員也會使用 [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)來執行應用程式或後端服務的程式碼。Lambda 是一種無伺服器、事件驅動的運算服務，無需佈建或管理伺服器即可執行程式碼。

根據預設，當您建立使用 [Lambda 支援的 Python 執行期](https://docs.aws.amazon.com/lambda/latest/dg/lambda-python.html)的新函數時，Lambda 執行期環境會從 提供的 [Lambda 基礎映像](https://github.com/aws/aws-lambda-base-images)建立 AWS。基本映像`psycopg2`中不包含 `pandas`或 等程式庫。若要使用程式庫，您需要將其封裝在自訂套件中，並將其連接到 Lambda。

有多種方式可以綁定和連接程式庫，包括下列項目：
+ 從 [.zip 檔案封存](https://docs.aws.amazon.com/lambda/latest/dg/configuration-function-zip.html)部署 Lambda 函數。
+ 從自訂容器映像部署 Lambda 函數。
+ 建立 [Lambda 層](https://docs.aws.amazon.com/lambda/latest/dg/chapter-layers.html#lambda-layer-versions)，並將其連接至您的 Lambda 函數。

此模式示範前兩個選項。

使用 .zip 部署套件，將程式`pandas`庫新增至 Lambda 函數相對簡單。在 Linux 機器上建立資料夾、將 Lambda 指令碼與程式`pandas`庫和程式庫的相依性新增至資料夾、壓縮資料夾，並將其做為 Lambda 函數的來源。

雖然使用 .zip 部署套件是常見的做法，但該方法不適用於程式`psycopg2`庫。如果您使用 .zip 部署套件將程式`psycopg2`庫新增至 Lambda 函數，此模式會先顯示您遇到的錯誤。此模式接著會示範如何從 Dockerfile 部署 Lambda，並編輯 Lambda 映像，讓`psycopg2`程式庫運作。

如需模式部署的三個資源的相關資訊，請參閱[其他資訊](#import-psycopg2-library-lambda-additional)一節。

## 先決條件和限制
<a name="import-psycopg2-library-lambda-prereqs"></a>

**先決條件 **
+  AWS 帳戶 具有足夠許可的作用中 ，可部署此模式使用 AWS 的資源
+ AWS Cloud Development Kit (AWS CDK) 透過執行 全域安裝 `npm install -g aws-cdk`
+ Git 用戶端
+ Python
+ Docker

**限制 **
+ 有些 AWS 服務 完全無法使用 AWS 區域。如需區域可用性，請參閱[AWS 服務 依區域](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。如需特定端點，請參閱[服務端點和配額](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)頁面，然後選擇服務的連結。

**產品版本**
+ [Lambda 支援的](https://docs.aws.amazon.com/lambda/latest/dg/lambda-python.html) Python 執行時間版本
+ Psycopg2 2.9.3 版
+ Pandas 1.5.2 版

## Architecture
<a name="import-psycopg2-library-lambda-architecture"></a>

**解決方案概觀 **

為了說明在 Lambda 中使用程式`psycopg2`庫時可能面臨的挑戰， 模式會部署兩個 Lambda 函數：
+ 一個 Lambda 函數，其中包含從 .zip 檔案建立的 Python 執行期。`psycopg2` 和 `pandas`程式庫是使用 [pip](https://pypi.org/project/pip/) 安裝在此 .zip 部署套件中。
+ 一個 Lambda 函數，其中包含從 Dockerfile 建立的 Python 執行期。Dockerfile 會將 `psycopg2`和 `pandas`程式庫安裝到 Lambda 容器映像中。

第一個 Lambda 函數會在 .zip 檔案中安裝程式`pandas`庫及其相依性，Lambda 可以使用該程式庫。

第二個 Lambda 函數示範，透過為 Lambda 函數建置容器映像，您可以在 Lambda 中執行 `pandas`和 `psycopg2`程式庫。

## 工具
<a name="import-psycopg2-library-lambda-tools"></a>

**AWS 服務**
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html) 是一種軟體開發架構，可協助您在程式碼中定義和佈建 AWS 雲端基礎設施。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一項運算服務，可協助您執行程式碼，無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展，因此您只需按使用的運算時間付費。

**其他工具**
+ [Docker](https://www.docker.com/) 是一組平台即服務 (PaaS) 產品，可在作業系統層級使用虛擬化在容器中交付軟體。
+ [pandas](https://pandas.pydata.org/) 是以 Python 為基礎的開放原始碼工具，用於資料分析和操作。
+ [Psycopg](https://www.psycopg.org/docs/) 是適用於 Python 語言的 PostgreSQL 資料庫轉接器，專為多執行緒應用程式而設計。此模式使用 Psycopg 2。
+ [Python](https://www.python.org/) 是一種一般用途的電腦程式設計語言。

**程式碼儲存庫**

此模式的程式碼可在 GitHub 的 [import-psycopg2-in-lambda-to-interact-with-postgres-database](https://github.com/aws-samples/import-psycopg2-in-lambda-to-interact-with-postgres-database) 儲存庫中使用。

## 最佳實務
<a name="import-psycopg2-library-lambda-best-practices"></a>

此模式提供您使用 從 Dockerfile AWS CDK 建立 Lambda 函數的工作範例。如果您在應用程式中重複使用此程式碼，請確定部署的資源符合所有安全需求。使用 [Checkov](https://www.checkov.io/) 等工具，在部署基礎設施之前掃描雲端基礎設施組態以尋找組態錯誤。

## 史詩
<a name="import-psycopg2-library-lambda-epics"></a>

### 複製儲存庫並設定部署
<a name="clone-the-repository-and-configure-the-deployment"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 複製儲存庫。 | 若要在本機電腦上複製 GitHub 儲存庫，請執行下列命令：<pre>git clone https://github.com/aws-samples/import-psycopg2-in-lambda-to-interact-with-postgres-database.git<br />cd AWS-lambda-psycopg2</pre> | 一般 AWS | 
| 設定您的部署。 | 使用下列資訊編輯 `app.py` 檔案 AWS 帳戶：<pre>aws_acccount = "AWS_ACCOUNT_ID"<br />region = "AWS_REGION"<br /># Select the CPU architecture you are using to build the image (ARM or X86)<br />architecture = "ARM"</pre> | 一般 AWS | 

### 引導您的 AWS 帳戶並部署應用程式
<a name="bootstrap-your-aws-account-and-deploy-the-application"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 引導您的 AWS 帳戶。 | 如果您尚未[啟動 AWS 環境](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html)，請使用您 AWS 帳戶的 AWS 登入資料執行下列命令：<pre>cdk bootstrap aws://<tooling-account-id>/<aws-region></pre> | 一般 AWS | 
| 部署程式碼。 | 若要部署 AWS CDK 應用程式，請執行下列命令：<pre>cdk deploy AWSLambdaPyscopg2</pre> | 一般 AWS | 

### 從 AWS 管理主控台測試 Lambda 函數
<a name="test-the-lambda-functions-from-the-aws-management-console"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 測試從 .zip 檔案建立的 Lambda 函數。 | 若要測試從 .zip 檔案建立的 Lambda 函數，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/import-psycopg2-library-lambda.html)由於 Lambda 在預設映像中找不到所需的 PostgreSQL 程式庫，因此無法使用程式`psycopg2`庫。 | 一般 AWS | 
| 測試從 Dockerfile 建立的 Lambda 函數。 | 若要在 Lambda 函數中使用程式`psycopg2`庫，您必須編輯 Lambda Amazon Machine Image (AMI)。若要測試從 Dockerfile 建立的 Lambda 函數，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/import-psycopg2-library-lambda.html)下列程式碼顯示 AWS CDK 範本建立的 Dockerfile：<pre># Start from lambda Python3.13 image<br />FROM public.ecr.aws/lambda/python:3.13<br /><br /># Copy the lambda code, together with its requirements<br />COPY lambda/requirements.txt ${LAMBDA_TASK_ROOT}<br />COPY lambda/lambda_code.py ${LAMBDA_TASK_ROOT}<br /><br /># Install postgresql-devel in your image<br />RUN yum install -y gcc postgresql-devel<br /><br /># install the requirements for the Lambda code<br />RUN pip3 install -r requirements.txt --target "${LAMBDA_TASK_ROOT}"<br /><br /># Command can be overwritten by providing a different command in the template directly.<br />CMD ["lambda_code.handler"]</pre>Dockerfile 會為 Python 執行時間取得 AWS 提供的 Lambda 映像，並安裝 [postgresql-devel](https://yum-info.contradodigital.com/view-package/updates/postgresql-devel/)，其中包含編譯直接與 PostgreSQL 管理伺服器互動之應用程式所需的程式庫。Dockerfile 也會安裝 `pandas`和 `psycopg2`程式庫，這些程式庫會顯示在 `requirements.txt` 檔案中。 | 一般 AWS | 

## 相關資源
<a name="import-psycopg2-library-lambda-resources"></a>
+ [AWS CDK 文件](https://docs.aws.amazon.com/cdk/v2/guide/home.html)
+ [AWS Lambda 文件](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)

## 其他資訊
<a name="import-psycopg2-library-lambda-additional"></a>

在此模式中， AWS CDK 範本會提供具有三個資源的 AWS 堆疊：
+ Lambda 函數的 [AWS Identity and Access Management (IAM) 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)。
+ 具有 Python 執行時間的 Lambda 函數。函數是從部署套件`Constructs/lambda/lambda_deploy.zip`部署。
+ 具有 Python 執行時間的 Lambda 函數。函數是從 `Constructs` 資料夾下的 Dockerfile 部署

兩個 Lambda 函數的指令碼會檢查 `pandas`和 `psycopg2`程式庫是否已成功匯入：

```
import pandas
print("pandas successfully imported")

import psycopg2
print("psycopg2 successfully imported")

def handler(event, context):
    """Function that checks whether psycopg2  and pandas are successfully imported or not"""
    return {"Status": "psycopg2 and pandas successfully imported"}
```

`lambda_deploy.zip` 部署套件是以 `Constructs/lambda/build.sh` bash 指令碼建置。此指令碼會建立資料夾、複製 Lambda 指令碼、安裝 `pandas`和 `psycopg2`程式庫，以及產生 .zip 檔案。若要自行產生 .zip 檔案，請執行此 bash 指令碼並重新部署 AWS CDK 堆疊。

Dockerfile 一開始是使用 Python 執行時間為 Lambda AWS 提供的基礎映像。Dockerfile 會在預設映像上方安裝 `pandas`和 `psycopg2`程式庫。

# 將 Amazon API Gateway 與 Amazon SQS 整合，以處理非同步 REST APIs
<a name="integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis"></a>

*Natalia Colantonio Favero 和 Gustavo Martim，Amazon Web Services*

## 總結
<a name="integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis-summary"></a>

部署 REST APIs 時，有時您需要公開用戶端應用程式可以發佈的訊息佇列。例如，您可能會遇到第三方 APIs 延遲和回應延遲的問題，或者您可能想要避免資料庫查詢的回應時間，或避免在有大量並行 APIs時擴展伺服器。在這些情況下，發佈到佇列的用戶端應用程式只需要知道 API 收到資料，而不是收到資料之後會發生什麼情況。

此模式使用 [Amazon API Gateway](https://aws.amazon.com/api-gateway/) 將訊息傳送至 Amazon Simple Queue Service (Amazon SQS) 來建立 REST API 端點。 [Amazon SQS](https://aws.amazon.com/sqs/) 它會在兩個服務之間建立easy-to-implement的整合，以避免直接存取 SQS 佇列。

## 先決條件和限制
<a name="integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis-prereqs"></a>
+ [作用中 AWS 的帳戶](https://portal.aws.amazon.com/billing/signup/iam)

## Architecture
<a name="integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis-architecture"></a>

![\[整合 API Gateway 與 Amazon SQS 的架構\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/70984dee-e49f-4446-9d52-49ce826c3909/images/737ba0b2-da8f-4478-8c54-0a4835fd69f9.png)


圖表說明這些步驟：

1. 使用 Postman、其他 API 或其他技術等工具請求 POST REST API 端點。

1. API Gateway 會在佇列上張貼在請求內文上接收的訊息。

1. Amazon SQS 會收到訊息，並以成功或失敗代碼傳送答案給 API Gateway。

## 工具
<a name="integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis-tools"></a>
+ [Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html) 可協助您建立、發佈、維護、監控和保護任何規模的 REST、HTTP 和 WebSocket APIs。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 透過控制已驗證並獲授權使用的人員，協助您安全地管理對 AWS 資源的存取。
+ [Amazon Simple Queue Service (Amazon SQS)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html) 提供安全、耐用且可用的託管佇列，可協助您整合和分離分散式軟體系統和元件。  

## 史詩
<a name="integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis-epics"></a>

### 建立 SQS 佇列
<a name="create-an-sqs-queue"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立佇列。 | 若要建立接收來自 REST API 訊息的 SQS 佇列：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis.html) | 應用程式開發人員 | 

### 提供 Amazon SQS 的存取權
<a name="provide-access-to-sqs"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 IAM 角色。 | 此 IAM 角色可讓 API Gateway 資源完整存取 Amazon SQS。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis.html) | 應用程式開發人員、AWS 管理員 | 

### 建立 REST API
<a name="create-a-rest-api"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 REST API。 | 這是傳送 HTTP 請求的 REST API。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis.html) | 應用程式開發人員 | 
| 將 API Gateway 連接至 Amazon SQS。 | 此步驟可讓訊息從 HTTP 請求的內文內部流向 Amazon SQS。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis.html) | 應用程式開發人員 | 

### 測試 REST API
<a name="test-the-rest-api"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 測試 REST API。 | 執行測試以檢查缺少的組態：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis.html) | 應用程式開發人員 | 
| 變更 API 整合以將請求正確轉送至 Amazon SQS。 | 完成組態以修正整合錯誤：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis.html) | 應用程式開發人員 | 
| 在 Amazon SQS 中測試和驗證訊息。 | 執行測試以確認測試已成功完成：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis.html) | 應用程式開發人員 | 
| 使用特殊字元測試 API Gateway。 | 執行測試，其中包含訊息中無法接受的特殊字元 （例如 &)：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis.html)這是因為訊息內文中預設不支援特殊字元。在下一個步驟中，您將設定 API Gateway 以支援特殊字元。如需內容類型轉換的詳細資訊，請參閱 [API Gateway 文件](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-payload-encodings-workflow.html)。 | 應用程式開發人員 | 
| 變更 API 組態以支援特殊字元。 | 調整組態以接受訊息中的特殊字元：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis.html)新訊息應包含特殊字元。 | 應用程式開發人員 | 

### 部署 REST API
<a name="deploy-the-rest-api"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 部署 API。 |  若要部署 REST API：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis.html) | 應用程式開發人員 | 
| 使用外部工具進行測試。 | 使用外部工具執行測試，以確認已成功接收訊息：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis.html) | 應用程式開發人員 | 

### 清除
<a name="clean-up"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 刪除 API。 | 在 [API Gateway 主控台](https://console.aws.amazon.com/apigateway/)上，選擇您建立的 API，然後選擇**刪除**。 | 應用程式開發人員 | 
| 刪除 IAM 角色。 | 在 [IAM 主控台](https://console.aws.amazon.com/iam/)**的角色**窗格中，選取 **AWSGatewayRoleForSQS**，然後選擇**刪除**。 | 應用程式開發人員 | 
| 刪除 SQS 佇列。 | 在 [Amazon SQS 主控台](https://console.aws.amazon.com/sqs/)的**佇列**窗格中，選擇您建立的 SQS 佇列，然後選擇**刪除**。 | 應用程式開發人員 | 

## 相關資源
<a name="integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis-resources"></a>
+ [SQS-SendMessage](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-aws-services-reference.html#SQS-SendMessage) (API Gateway 文件）
+ [API Gateway 中的內容類型轉換](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-payload-encodings-workflow.html) (API Gateway 文件）
+ [\$1util 變數](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html#util-template-reference) (API Gateway 文件）
+ [如何整合 API Gateway REST API 與 Amazon SQS 並解決常見錯誤？](https://repost.aws/knowledge-center/api-gateway-rest-api-sqs-errors)(AWS re：Post 文章）

# 使用 Amazon API Gateway 和 AWS Lambda 非同步處理事件
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda"></a>

*Andrea Meroni、Mariem Kthiri、Nadim Majed 和 Michael Wallner，Amazon Web Services*

## 總結
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-summary"></a>

[Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html) 是一項全受管服務，開發人員可用來建立、發佈、維護、監控和保護任何規模APIs。它會處理涉及接受和處理多達數十萬個並行 API 呼叫的任務。

API Gateway 的重要服務配額是整合逾時。逾時是後端服務必須在 REST API 傳回錯誤之前傳回回應的最長時間。對於同步工作負載，通常可接受 29 秒的硬性限制。不過，該限制對想要將 API Gateway 與非同步工作負載搭配使用的開發人員來說是一項挑戰。

此模式顯示使用 API Gateway 和 以非同步方式處理事件的範例架構 AWS Lambda。架構支援執行長達 15 分鐘的處理任務，並使用基本 REST API 做為界面。

[Projen](https://pypi.org/project/projen/) 用於設定本機開發環境 AWS 帳戶，以及搭配 [AWS Cloud Development Kit (AWS CDK) Toolkit](https://docs.aws.amazon.com/cdk/v2/guide/cli.html)、[Docker](https://docs.docker.com/get-docker/) 和 [Node.js](https://nodejs.org/en/download/) 將範例架構部署至目標。Projen 會自動使用[預先遞交](https://pre-commit.com/)和用於程式碼品質保證、安全掃描和單元測試的工具來設定 [Python](https://www.python.org/downloads/) 虛擬環境。如需詳細資訊，請參閱[工具](#process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-tools)一節。

## 先決條件和限制
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-prereqs"></a>

**先決條件 **
+ 作用中 AWS 帳戶
+ 您的工作站上安裝了下列工具：
  + [AWS Cloud Development Kit (AWS CDK) 工具組](https://docs.aws.amazon.com/cdk/v2/guide/cli.html) 2.85.0 版
  + [Docker](https://docs.docker.com/get-docker/) 20.10.21 版
  + [Node.js](https://nodejs.org/en/download/) 18.13.0 版
  + [Projen](https://pypi.org/project/projen/) 0.71.111 版
  + [Python](https://www.python.org/downloads/) 3.9.16 版

**限制 **
+ 任務的最大執行時間受限於 Lambda 函數的最大執行時間 (15 分鐘）。
+ 並行任務請求的數量上限受限於 Lambda 函數的預留並行。

## Architecture
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-architecture"></a>

下圖顯示任務 API 與事件處理和錯誤處理 Lambda 函數的互動，以及存放在 Amazon EventBridge 事件封存中的事件。

![\[AWS 雲端 architecture showing user interaction with jobs API, Lambda functions, and EventBridge.\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/e027130c-44c1-41ab-bbe9-f196a49bd9ac/images/3c437b65-48e3-477d-aeea-6ff938cc3285.png)


典型的工作流程包含下列步驟：

1. 您可以驗證 AWS Identity and Access Management (IAM) 並取得安全登入資料。

1. 您可以將 HTTP `POST`請求傳送至`/jobs`任務 API 端點，在請求內文中指定任務參數。

1. 任務 API 是一種 API Gateway REST API，會傳回包含任務識別符的 HTTP 回應給您。

1. 任務 API 會以非同步方式叫用事件處理 Lambda 函數。

1. 事件處理函數會處理事件，然後將任務結果放入任務 Amazon DynamoDB 資料表

1. 您可以將 HTTP `GET`請求傳送至`/jobs/{jobId}`任務 API 端點，並將步驟 3 的任務識別符做為 `{jobId}`。

1. 任務 API 會查詢 `jobs` DynamoDB 資料表來擷取任務結果。

1. 任務 API 會傳回包含任務結果的 HTTP 回應。

1. 如果事件處理失敗，事件處理函數會將事件傳送至錯誤處理函數。

1. 錯誤處理函數會將任務參數放在 `jobs` DynamoDB 資料表中。

1. 您可以透過傳送 HTTP `GET`請求至任務 API 端點來擷取`/jobs/{jobId}`任務參數。

1. 如果錯誤處理失敗，錯誤處理函數會將事件傳送至 EventBridge 事件封存。

   您可以使用 EventBridge 重播封存的事件。

## 工具
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-tools"></a>

**AWS 服務**
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html) 是一種軟體開發架構，可協助您在程式碼中定義和佈建 AWS 雲端 基礎設施。
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) 是一種開放原始碼工具，可協助您透過命令列 shell 中的命令與 AWS 服務互動。
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) 是一項全受管 NoSQL 資料庫服務，可提供快速、可預期且可擴展的效能。
+ [Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html) 是一種無伺服器事件匯流排服務，可協助您將應用程式與來自各種來源的即時資料連線。例如，Lambda 函數、使用 API 目的地的 HTTP 調用端點，或其他事件匯流排 AWS 帳戶。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一項運算服務，可協助您執行程式碼，無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展，因此您只需按使用的運算時間付費。

**其他工具**
+ [autopep8](https://github.com/hhatto/autopep8) 會根據 Python Enhancement Proposal (PEP) 8 樣式指南自動格式化 Python 程式碼。
+ [Bandit](https://bandit.readthedocs.io/en/latest/) 會掃描 Python 程式碼以尋找常見的安全問題。
+ [Commitizen](https://commitizen-tools.github.io/commitizen/) 是 Git 遞交檢查程式和`CHANGELOG`產生器。
+ [cfn-lint](https://github.com/aws-cloudformation/cfn-lint) 是 AWS CloudFormation linter
+ [Checkov](https://github.com/bridgecrewio/checkov) 是一種靜態程式碼分析工具，可將基礎設施檢查為程式碼 (IaC) 是否有安全性和合規設定錯誤。
+ [jq](https://stedolan.github.io/jq/download/) 是用於剖析 JSON 的命令列工具。
+ [Postman](https://www.postman.com/) 是 API 平台。
+ [預先遞交](https://pre-commit.com/)是 Git hooks 管理員。
+ [Projen](https://github.com/projen/projen) 是專案產生器。
+ [pytest](https://docs.pytest.org/en/7.2.x/index.html) 是一種 Python 架構，用於撰寫可讀取的小型測試。

**程式碼儲存庫**

您可以在 GitHub [非同步事件處理與 API Gateway 和 Lambda](https://github.com/aws-samples/asynchronous-event-processing-api-gateway-lambda-cdk) 儲存庫中找到此架構程式碼範例。

## 最佳實務
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-best-practices"></a>
+ 此範例架構不包含已部署基礎設施的監控。如果您的使用案例需要監控，請評估新增 [CDK 監控建構](https://constructs.dev/packages/cdk-monitoring-constructs)或其他監控解決方案。
+ 此範例架構使用 [IAM 許可](https://docs.aws.amazon.com/apigateway/latest/developerguide/permissions.html)來控制對任務 API 的存取。有權擔任 的任何人`JobsAPIInvokeRole`都可以叫用任務 API。因此，存取控制機制為二進位。如果您的使用案例需要更複雜的授權模型，請使用不同的[存取控制機制](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-to-api.html)進行評估。
+ 當使用者傳送 HTTP `POST`請求到`/jobs`任務 API 端點時，輸入資料會在兩個不同的層級進行驗證：
  + Amazon API Gateway 負責第一個[請求驗證](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-method-request-validation.html)。
  + 事件處理函數會執行第二個請求。

    當使用者對`/jobs/{jobId}`任務 API 端點提出 HTTP `GET`請求時，不會執行驗證。如果您的使用案例需要額外的輸入驗證並提高安全性，[請使用 AWS WAF 評估 來保護您的 API](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-aws-waf.html)。

## 史詩
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-epics"></a>

### 設定環境
<a name="set-up-the-environment"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 複製儲存庫。 | 若要在本機複製儲存庫，請執行下列命令：<pre>git clone https://github.com/aws-samples/asynchronous-event-processing-api-gateway-lambda-cdk.git</pre> | DevOps 工程師 | 
| 設定專案。 | 使用 [Projen](https://github.com/projen/projen) 將目錄變更為儲存庫根目錄，並設定 Python 虛擬環境和所有工具：<pre>cd asynchronous-event-processing-api-gateway-api-gateway-lambda-cdk<br />npx projen</pre> | DevOps 工程師 | 
| 安裝預先遞交掛鉤。 | 若要安裝預先遞交掛鉤，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda.html) | DevOps 工程師 | 

### 部署範例架構
<a name="deploy-the-example-architecture"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 引導 AWS CDK。 | 若要在 AWS CDK 中引導 AWS 帳戶，請執行下列命令：<pre>AWS_PROFILE=$YOUR_AWS_PROFILE npx projen bootstrap</pre> | AWS DevOps | 
| 部署範例架構。 | 若要在 中部署範例架構 AWS 帳戶，請執行下列命令：<pre>AWS_PROFILE=$YOUR_AWS_PROFILE npx projen deploy</pre> | AWS DevOps | 

### 測試架構
<a name="test-the-architecture"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 安裝測試先決條件。 | 在工作站上安裝 [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)、[Postman](https://www.postman.com/downloads/) 和 [jq](https://jqlang.github.io/jq/)。建議使用 [Postman](https://www.postman.com/downloads/) 測試此範例架構，但不強制。如果您選擇替代 API 測試工具，請確定它支援 [AWS Signature 第 4 版身分驗證](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html)，並參考可透過[匯出 REST API 檢查的公開 API ](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-export-api.html)端點。 | DevOps 工程師 | 
| 擔任 `JobsAPIInvokeRole`。 | [假設](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sts/assume-role.html)`JobsAPIInvokeRole`從部署命令列印為輸出的 ：<pre>CREDENTIALS=$(AWS_PROFILE=$<YOUR_AWS_PROFILE> aws sts assume-role \<br />--no-cli-pager \<br />--role-arn $<JOBS_API_INVOKE_ROLE_ARN> \<br />--role-session-name JobsAPIInvoke)<br />export AWS_ACCESS_KEY_ID=$(cat $CREDENTIALS | jq ‘.Credentials’’.AccessKeyId’)<br />export AWS_SECRET_ACCESS_KEY=$(cat $CREDENTIALS | jq ‘.Credentials’’.SecretAccessKey’)<br />export AWS_SESSION_TOKEN==$(cat $CREDENTIALS | jq ‘.Credentials’’.SessionToken’)</pre> | AWS DevOps | 
| 設定 Postman。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda.html) | AWS DevOps | 
| 測試範例架構。 | 若要測試範例架構，請將[請求傳送至](https://learning.postman.com/docs/sending-requests/requests/#next-steps)任務 API。如需詳細資訊，請參閱 [Postman 文件](https://learning.postman.com/docs/getting-started/first-steps/sending-the-first-request/#send-an-api-request)。 | DevOps 工程師 | 

## 疑難排解
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-troubleshooting"></a>


| 問題 | 解決方案 | 
| --- | --- | 
| 範例架構的銷毀和後續重新部署失敗，因為 [Amazon CloudWatch Logs 日誌群組](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html)`/aws/apigateway/JobsAPIAccessLogs`已存在。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda.html) | 

## 相關資源
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-resources"></a>
+ [API Gateway 映射範本和存取記錄變數參考](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html)
+ [設定後端 Lambda 函數的非同步調用](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-integration-async.html)

# 使用 Amazon API Gateway 和 Amazon DynamoDB Streams 非同步處理事件
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams"></a>

*Andrea Meroni、Mariem Kthiri、Nadim Majed、Alessandro Trisolini 和 Michael Wallner，Amazon Web Services*

## 總結
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-summary"></a>

[Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html) 是一項全受管服務，開發人員可用來建立、發佈、維護、監控和保護任何規模APIs。它會處理涉及接受和處理多達數十萬個並行 API 呼叫的任務。

API Gateway 的一項重要服務配額是整合逾時。逾時是後端服務必須在 REST API 傳回錯誤之前傳回回應的最長時間。對於同步工作負載，通常可接受 29 秒的硬性限制。不過，該限制對想要將 API Gateway 與非同步工作負載搭配使用的開發人員來說是一項挑戰。

此模式顯示使用 API Gateway、Amazon DynamoDB Streams 和 非同步處理事件的範例架構 AWS Lambda。架構支援使用相同的輸入參數執行平行處理任務，並使用基本 REST API 做為界面。在此範例中，使用 Lambda 做為後端會將任務持續時間限制為 15 分鐘。您可以使用替代服務來處理傳入事件 （例如，)，以避免此限制 AWS Fargate。

[Projen](https://pypi.org/project/projen/) 用於設定本機開發環境 AWS 帳戶，以及搭配 [AWS Cloud Development Kit (AWS CDK) Toolkit](https://docs.aws.amazon.com/cdk/v2/guide/cli.html)、[Docker](https://docs.docker.com/get-docker/) 和 [Node.js](https://nodejs.org/en/download/) 將範例架構部署至目標。Projen 會自動使用[預先遞交](https://pre-commit.com/)和用於程式碼品質保證、安全掃描和單元測試的工具來設定 [Python](https://www.python.org/downloads/) 虛擬環境。如需詳細資訊，請參閱[工具](#processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-tools)一節。

## 先決條件和限制
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-prereqs"></a>

**先決條件 **
+ 作用中 AWS 帳戶
+ 工作站上安裝了下列工具：
  + [AWS Cloud Development Kit (AWS CDK) 工具組](https://docs.aws.amazon.com/cdk/v2/guide/cli.html) 2.85.0 版或更新版本
  + [Docker](https://docs.docker.com/get-docker/) 20.10.21 版或更新版本
  + [Node.js](https://nodejs.org/en/download/) 第 18 版或更新版本
  + [Projen](https://pypi.org/project/projen/) 0.71.111 版或更新版本
  + [Python](https://www.python.org/downloads/) 3.9.16 版或更新版本

**限制 **
+ DynamoDB Streams 建議的讀取器數目上限為兩個，以避免限流。
+ 任務的最大執行時間受限於 Lambda 函數的最大執行時間 (15 分鐘）。
+ 並行任務請求的數量上限受限於 Lambda 函數的預留並行。

## Architecture
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-architecture"></a>

**架構**

下圖顯示任務 API 與 DynamoDB Streams 的互動，以及事件處理和錯誤處理 Lambda 函數的互動，以及存放在 Amazon EventBridge 事件封存中的事件。

![\[架構和程序的圖表，步驟列在圖表後面。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/68a46501-16e5-48e4-99c6-fc67a8b4133a/images/29fe6982-ad81-4099-9c65-08b17c96e78f.png)


典型的工作流程包括以下步驟：

1. 您可以驗證 AWS Identity and Access Management (IAM) 並取得安全登入資料。

1. 您可以將 HTTP `POST`請求傳送至`/jobs`任務 API 端點，在請求內文中指定任務參數。

1. 任務 API 會傳回包含任務識別符的 HTTP 回應給您。

1. 任務 API 會將任務參數放在 Amazon DynamoDB `jobs_table` 資料表中。

1. `jobs_table` DynamoDB 資料表 DynamoDB 串流會叫用事件處理 Lambda 函數。

1. 事件處理 Lambda 函數會處理事件，然後將任務結果放入 `jobs_table` DynamoDB 資料表。為了協助確保結果一致，事件處理函數實作[樂觀鎖定](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html)機制。

1. 您可以將 HTTP `GET`請求傳送至`/jobs/{jobId}`任務 API 端點，並將步驟 3 的任務識別符做為 `{jobId}`。

1. 任務 API 會查詢 `jobs_table` DynamoDB 資料表來擷取任務結果。

1. 任務 API 會傳回包含任務結果的 HTTP 回應。

1. 如果事件處理失敗，事件處理函數的來源映射會將事件傳送至錯誤處理 Amazon Simple Notification Service (Amazon SNS) 主題。

1. 錯誤處理 SNS 主題會以非同步方式將事件推送至錯誤處理函數。

1. 錯誤處理函數會將任務參數放在 `jobs_table` DynamoDB 資料表中。

   您可以透過傳送 HTTP `GET`請求至任務 API 端點來擷取`/jobs/{jobId}`任務參數。

1. 如果錯誤處理失敗，錯誤處理函數會將事件傳送至 Amazon EventBridge 封存。

   您可以使用 EventBridge 重播封存的事件。

## 工具
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-tools"></a>

**AWS 服務**
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html) 是一種軟體開發架構，可協助您在程式碼中定義和佈建 AWS 雲端基礎設施。
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) 是一項全受管 NoSQL 資料庫服務，可提供快速、可預期且可擴展的效能。
+ [Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html) 是一種無伺服器事件匯流排服務，可協助您將應用程式與來自各種來源的即時資料連線。例如，AWS Lambda 函數、使用 API 目的地的 HTTP 調用端點，或其他 AWS 帳戶中的事件匯流排。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一項運算服務，可協助您執行程式碼，無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展，因此您只需支付使用的運算時間。
+ [Amazon Simple Notification Service (Amazon SNS)](https://docs.aws.amazon.com/sns/latest/dg/welcome.html) 可協助您協調和管理發佈者和用戶端之間的訊息交換，包括 Web 伺服器和電子郵件地址。

**其他工具**
+ [autopep8](https://github.com/hhatto/autopep8) 會根據 Python Enhancement Proposal (PEP) 8 樣式指南自動格式化 Python 程式碼。
+ [Bandit](https://bandit.readthedocs.io/en/latest/) 會掃描 Python 程式碼以尋找常見的安全問題。
+ [Commitizen](https://commitizen-tools.github.io/commitizen/) 是 Git 遞交檢查程式和`CHANGELOG`產生器。
+ [cfn-lint](https://github.com/aws-cloudformation/cfn-lint) 是 AWS CloudFormation linter
+ [Checkov](https://github.com/bridgecrewio/checkov) 是一種靜態程式碼分析工具，可將基礎設施檢查為程式碼 (IaC) 是否有安全性和合規設定錯誤。
+ [jq](https://stedolan.github.io/jq/download/) 是用於剖析 JSON 的命令列工具。
+ [Postman](https://www.postman.com/) 是 API 平台。
+ [預先遞交](https://pre-commit.com/)是 Git hooks 管理員。
+ [Projen](https://github.com/projen/projen) 是專案產生器。
+ [pytest](https://docs.pytest.org/en/7.2.x/index.html) 是一種 Python 架構，用於撰寫小型、可讀取的測試。

**程式碼儲存庫**

您可以在 GitHub [非同步處理搭配 API Gateway 和 DynamoDB Streams ](https://github.com/aws-samples/asynchronous-event-processing-api-gateway-dynamodb-streams-cdk)儲存庫中找到此架構程式碼範例。

## 最佳實務
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-best-practices"></a>
+ 此範例架構不包含對已部署基礎設施的監控。如果您的使用案例需要監控，請評估新增 [CDK 監控建構](https://constructs.dev/packages/cdk-monitoring-constructs)或其他監控解決方案。
+ 此範例架構使用 [IAM 許可](https://docs.aws.amazon.com/apigateway/latest/developerguide/permissions.html)來控制對任務 API 的存取。有權擔任 的任何人`JobsAPIInvokeRole`都可以叫用任務 API。因此，存取控制機制是二進位。如果您的使用案例需要更複雜的授權模型，請使用不同的[存取控制機制](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-to-api.html)進行評估。
+ 當使用者傳送 HTTP `POST`請求到`/jobs`任務 API 端點時，輸入資料會在兩個不同的層級進行驗證：
  + API Gateway 負責第一個[請求驗證](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-method-request-validation.html)。
  + 事件處理函數會執行第二個請求。

    當使用者對`/jobs/{jobId}`任務 API 端點提出 HTTP `GET`請求時，不會執行驗證。如果您的使用案例需要額外的輸入驗證和更高的安全性，請使用 評估 [AWS WAF 來保護您的 API](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-aws-waf.html)。
+ 為了避免限流，[DynamoDB Streams 文件](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html#Streams.Processing)會阻止使用者從相同串流碎片中讀取兩個以上的取用者。若要擴展消費者數量，建議使用 [Amazon Kinesis Data Streams](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/kds.html)。
+ 此範例中已使用[樂觀鎖定](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html)，以確保 `jobs_table` DynamoDB 資料表中項目的一致更新。根據使用案例需求，您可能需要實作更可靠的鎖定機制，例如漸進式鎖定。

## 史詩
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-epics"></a>

### 設定環境
<a name="set-up-the-environment"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 複製儲存庫。 | 若要在本機複製儲存庫，請執行下列命令：<pre>git clone https://github.com/aws-samples/asynchronous-event-processing-api-gateway-dynamodb-streams-cdk.git</pre> | DevOps 工程師 | 
| 設定專案。 | 將目錄變更為儲存庫根目錄，並使用 [Projen](https://github.com/projen/projen) 設定 Python 虛擬環境和所有工具：<pre>cd asynchronous-event-processing-api-gateway-api-gateway-dynamodb-streams-cdk<br />npx projen</pre> | DevOps 工程師 | 
| 安裝預先遞交掛鉤。 | 若要安裝預先遞交掛鉤，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams.html) | DevOps 工程師 | 

### 部署範例架構
<a name="deploy-the-example-architecture"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 引導 AWS CDK。 | 若要在 [AWS CDK](https://aws.amazon.com/cdk/)中引導 AWS 帳戶，請執行下列命令：<pre>AWS_PROFILE=$YOUR_AWS_PROFILE npx projen bootstrap</pre> | AWS DevOps | 
| 部署範例架構。 | 若要在 中部署範例架構 AWS 帳戶，請執行下列命令：<pre>AWS_PROFILE=$YOUR_AWS_PROFILE npx projen deploy</pre> | AWS DevOps | 

### 測試架構
<a name="test-the-architecture"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 安裝測試先決條件。 | 在工作站上安裝 [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)、[Postman](https://www.postman.com/downloads/) 和 [jq](https://jqlang.github.io/jq/)。建議使用 [Postman](https://www.postman.com/downloads/) 測試此範例架構，但並非強制性。如果您選擇替代 API 測試工具，請確定它支援 [AWS Signature 第 4 版身分驗證](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html)，並參考可透過[匯出 REST API 檢查的公開 API ](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-export-api.html)端點。 | DevOps 工程師 | 
| 擔任 `JobsAPIInvokeRole`。 | [假設](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sts/assume-role.html)`JobsAPIInvokeRole`從 `deploy`命令列印為輸出的 ：<pre>CREDENTIALS=$(AWS_PROFILE=$<YOUR_AWS_PROFILE> aws sts assume-role \<br />--no-cli-pager \<br />--role-arn $<JOBS_API_INVOKE_ROLE_ARN> \<br />--role-session-name JobsAPIInvoke)<br />export AWS_ACCESS_KEY_ID=$(cat $CREDENTIALS | jq ‘.Credentials’’.AccessKeyId’)<br />export AWS_SECRET_ACCESS_KEY=$(cat $CREDENTIALS | jq ‘.Credentials’’.SecretAccessKey’)<br />export AWS_SESSION_TOKEN==$(cat $CREDENTIALS | jq ‘.Credentials’’.SessionToken’)</pre> | AWS DevOps | 
| 設定 Postman。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams.html) | AWS DevOps | 
| 測試範例架構。 | 若要測試範例架構，請將請求傳送至任務 API。如需詳細資訊，請參閱 [Postman 文件](https://learning.postman.com/docs/getting-started/first-steps/sending-the-first-request/#send-an-api-request)。 | DevOps 工程師 | 

## 疑難排解
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-troubleshooting"></a>


| 問題 | 解決方案 | 
| --- | --- | 
| 範例架構的銷毀和後續重新部署失敗，因為 [Amazon CloudWatch Logs 日誌群組](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html)`/aws/apigateway/JobsAPIAccessLogs`已存在。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams.html) | 

## 相關資源
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-resources"></a>
+ [API Gateway 映射範本和存取記錄變數參考](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html)
+ [變更 DynamoDB Streams 的資料擷取](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html)
+ [具有版本編號的樂觀鎖定](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html)
+ [使用 Kinesis Data Streams 擷取對 DynamoDB 的變更](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/kds.html)

# 使用 Amazon API Gateway、Amazon SQS 和 AWS Fargate 非同步處理事件
<a name="process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate"></a>

*Andrea Meroni、Mariem Kthiri、Nadim Majed、Alessandro Trisolini 和 Michael Wallner，Amazon Web Services*

## 總結
<a name="process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate-summary"></a>

[Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html) 是一項全受管服務，開發人員可用來建立、發佈、維護、監控和保護任何規模APIs。它會處理涉及接受和處理多達數十萬個並行 API 呼叫的任務。

API Gateway 的一項重要服務配額是整合逾時。逾時是後端服務必須在 REST API 傳回錯誤之前傳回回應的最長時間。對於同步工作負載，通常可接受 29 秒的硬性限制。不過，該限制對想要將 API Gateway 與非同步工作負載搭配使用的開發人員來說是一項挑戰。

此模式顯示使用 API Gateway、Amazon Simple Queue Service (Amazon SQS) 和 非同步處理事件的範例架構 AWS Fargate。架構支援在沒有持續時間限制的情況下執行處理任務，並使用基本 REST API 做為界面。

[Projen](https://pypi.org/project/projen/) 用於設定本機開發環境 AWS 帳戶，並將範例架構與 [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/cli.html)、[Docker](https://docs.docker.com/get-docker/) 和 [Node.js](https://nodejs.org/en/download/) 結合部署至目標。Projen 會自動使用[預先遞交](https://pre-commit.com/)和用於程式碼品質保證、安全掃描和單元測試的工具來設定 [Python](https://www.python.org/downloads/) 虛擬環境。如需詳細資訊，請參閱[工具](#process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate-tools)一節。

## 先決條件和限制
<a name="process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate-prereqs"></a>

**先決條件**
+ 作用中 AWS 帳戶
+ 工作站上安裝了下列工具：
  + [AWS Cloud Development Kit (AWS CDK) 工具組](https://docs.aws.amazon.com/cdk/v2/guide/cli.html) 2.85.0 版或更新版本
  + [Docker](https://docs.docker.com/get-docker/) 20.10.21 版或更新版本
  + [Node.js](https://nodejs.org/en/download/) 第 18 版或更新版本
  + [Projen](https://pypi.org/project/projen/) 0.71.111 版或更新版本
  + [Python](https://www.python.org/downloads/) 3.9.16 版或更新版本

**限制**
+ 並行任務限制為每分鐘 500 個任務，這是 Fargate 可以佈建的任務數量上限。

## Architecture
<a name="process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate-architecture"></a>

下圖顯示任務 API 與 `jobs` Amazon DynamoDB 資料表、事件處理 Fargate 服務和錯誤處理 AWS Lambda 函數的互動。事件會存放在 Amazon EventBridge 事件存檔中。

![\[結構圖與圖表後面的描述。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/8a03149c-8f34-4593-84d5-accc1800a0a2/images/5e1071aa-4fbc-495c-bc22-8e62a32a136b.png)


典型的工作流程包括以下步驟：

1. 您可以驗證 AWS Identity and Access Management (IAM) 並取得安全登入資料。

1. 您可以將 HTTP `POST`請求傳送至`/jobs`任務 API 端點，在請求內文中指定任務參數。

1. 任務 API 是一種 API Gateway REST API，會傳回包含任務識別符的 HTTP 回應給您。

1. 任務 API 會傳送訊息至 SQS 佇列。

1. Fargate 從 SQS 佇列提取訊息、處理事件，然後將任務結果放入 `jobs` DynamoDB 資料表。

1. 您可以將 HTTP `GET`請求傳送至`/jobs/{jobId}`任務 API 端點，並將步驟 3 的任務識別符做為 `{jobId}`。

1. 任務 API 會查詢 `jobs` DynamoDB 資料表來擷取任務結果。

1. 任務 API 會傳回包含任務結果的 HTTP 回應。

1. 如果事件處理失敗，SQS 佇列會將事件傳送至無效字母佇列 (DLQ)。

1. EventBridge 事件會啟動錯誤處理函數。

1. 錯誤處理函數會將任務參數放在 `jobs` DynamoDB 資料表中。

1. 您可以透過傳送 HTTP `GET`請求至任務 API 端點來擷取`/jobs/{jobId}`任務參數。

1. 如果錯誤處理失敗，錯誤處理函數會將事件傳送至 EventBridge 封存。

   您可以使用 EventBridge 重播封存的事件。

## 工具
<a name="process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate-tools"></a>

**AWS 服務**
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html) 是一種軟體開發架構，可協助您在程式碼中定義和佈建 AWS 雲端 基礎設施。
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) 是一項全受管 NoSQL 資料庫服務，可提供快速、可預期且可擴展的效能。
+ [AWS Fargate](https://docs.aws.amazon.com/AmazonECS/latest/userguide/what-is-fargate.html) 可協助您執行容器，而無需管理伺服器或 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體。它與 Amazon Elastic Container Service (Amazon ECS) 搭配使用。
+ [Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html) 是一種無伺服器事件匯流排服務，可協助您將應用程式與來自各種來源的即時資料連線。例如，Lambda 函數、使用 API 目的地的 HTTP 調用端點，或其他事件匯流排 AWS 帳戶。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一項運算服務，可協助您執行程式碼，無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展，因此您只需支付使用的運算時間。
+ [Amazon Simple Queue Service (Amazon SQS)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html) 提供安全、耐用且可用的託管佇列，可協助您整合和分離分散式軟體系統和元件。

**其他工具**
+ [autopep8](https://github.com/hhatto/autopep8) 會根據 Python Enhancement Proposal (PEP) 8 樣式指南自動格式化 Python 程式碼。
+ [Bandit](https://bandit.readthedocs.io/en/latest/) 會掃描 Python 程式碼來尋找常見的安全問題。
+ [Commitizen](https://commitizen-tools.github.io/commitizen/) 是 Git 遞交檢查程式和`CHANGELOG`產生器。
+ [cfn-lint](https://github.com/aws-cloudformation/cfn-lint) 是 AWS CloudFormation linter
+ [Checkov](https://github.com/bridgecrewio/checkov) 是一種靜態程式碼分析工具，可將基礎設施檢查為程式碼 (IaC) 是否有安全性和合規設定錯誤。
+ [jq](https://stedolan.github.io/jq/download/) 是用於剖析 JSON 的命令列工具。
+ [Postman](https://www.postman.com/) 是 API 平台。
+ [預先遞交](https://pre-commit.com/)是 Git hooks 管理員。
+ [Projen](https://github.com/projen/projen) 是專案產生器。
+ [pytest](https://docs.pytest.org/en/7.2.x/index.html) 是一種 Python 架構，用於撰寫小型且可讀取的測試。

**程式碼儲存庫**

您可以在 GitHub [非同步處理與 API Gateway 和 SQS](https://github.com/aws-samples/asynchronous-event-processing-api-gateway-sqs-cdk) 儲存庫中找到此架構程式碼範例。

## 最佳實務
<a name="process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate-best-practices"></a>
+ 此範例架構不包含對已部署基礎設施的監控。如果您的使用案例需要監控，請評估新增 [CDK 監控建構](https://constructs.dev/packages/cdk-monitoring-constructs)或其他監控解決方案。
+ 此範例架構使用 [IAM 許可](https://docs.aws.amazon.com/apigateway/latest/developerguide/permissions.html)來控制對任務 API 的存取。有權擔任 的任何人`JobsAPIInvokeRole`都可以叫用任務 API。因此，存取控制機制是二進位。如果您的使用案例需要更複雜的授權模型，請使用不同的[存取控制機制](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-to-api.html)進行評估。
+ 當使用者傳送 HTTP `POST`請求到`/jobs`任務 API 端點時，輸入資料會在兩個不同的層級進行驗證：
  + API Gateway 負責第一個[請求驗證](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-method-request-validation.html)。
  + 事件處理函數會執行第二個請求。

    當使用者對`/jobs/{jobId}`任務 API 端點提出 HTTP `GET`請求時，不會執行驗證。如果您的使用案例需要額外的輸入驗證和更高的安全性，請使用 評估 [AWS WAF 來保護您的 API](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-aws-waf.html)。

## 史詩
<a name="process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate-epics"></a>

### 設定環境
<a name="set-up-the-environment"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 複製儲存庫。 | 若要在本機複製儲存庫，請執行下列命令：<pre>git clone https://github.com/aws-samples/asynchronous-event-processing-api-gateway-sqs-cdk.git</pre> | DevOps 工程師 | 
| 設定專案。 | 將目錄變更為儲存庫根目錄，並使用 [Projen](https://github.com/projen/projen) 設定 Python 虛擬環境和所有工具：<pre>cd asynchronous-event-processing-api-gateway-api-gateway-sqs-cdk<br />npx projen</pre> | DevOps 工程師 | 
| 安裝預先遞交掛鉤。 | 若要安裝預先遞交掛鉤，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate.html) | DevOps 工程師 | 

### 部署範例架構
<a name="deploy-the-example-architecture"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 引導 AWS CDK。 | 若要在 [AWS CDK](https://aws.amazon.com/cdk/)中引導 AWS 帳戶，請執行下列命令：<pre>AWS_PROFILE=$YOUR_AWS_PROFILE npx projen bootstrap</pre> | AWS DevOps | 
| 部署範例架構。 | 若要在 中部署範例架構 AWS 帳戶，請執行下列命令：<pre>AWS_PROFILE=$YOUR_AWS_PROFILE npx projen deploy</pre> | AWS DevOps | 

### 測試架構
<a name="test-the-architecture"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 安裝測試先決條件。 | 在工作站上安裝 [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)、[Postman](https://www.postman.com/downloads/) 和 [jq](https://jqlang.github.io/jq/)。建議使用 [Postman](https://www.postman.com/downloads/) 測試此範例架構，但不強制。如果您選擇替代 API 測試工具，請確定它支援 [AWS Signature 第 4 版身分驗證](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html)，並參考可透過[匯出 REST API 檢查的公開 API ](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-export-api.html)端點。 | DevOps 工程師 | 
| 擔任 `JobsAPIInvokeRole`。 | [假設](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sts/assume-role.html)`JobsAPIInvokeRole`從 `deploy`命令列印為輸出的 ：<pre>CREDENTIALS=$(AWS_PROFILE=$<YOUR_AWS_PROFILE> aws sts assume-role \<br />--no-cli-pager \<br />--role-arn $<JOBS_API_INVOKE_ROLE_ARN> \<br />--role-session-name JobsAPIInvoke)<br />export AWS_ACCESS_KEY_ID=$(cat $CREDENTIALS | jq ‘.Credentials’’.AccessKeyId’)<br />export AWS_SECRET_ACCESS_KEY=$(cat $CREDENTIALS | jq ‘.Credentials’’.SecretAccessKey’)<br />export AWS_SESSION_TOKEN==$(cat $CREDENTIALS | jq ‘.Credentials’’.SessionToken’)</pre> | AWS DevOps | 
| 設定 Postman。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate.html) | AWS DevOps | 
| 測試範例架構。 | 若要測試範例架構，請將請求傳送至任務 API。如需詳細資訊，請參閱 [Postman 文件](https://learning.postman.com/docs/getting-started/first-steps/sending-the-first-request/#send-an-api-request)。 | DevOps 工程師 | 

## 疑難排解
<a name="process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate-troubleshooting"></a>


| 問題 | 解決方案 | 
| --- | --- | 
| 範例架構的銷毀和後續重新部署失敗，因為 [Amazon CloudWatch Logs 日誌群組](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html)`/aws/apigateway/JobsAPIAccessLogs`已存在。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate.html) | 
| 範例架構的銷毀和後續重新部署失敗，因為 [CloudWatch Logs 日誌群組](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html)`/aws/ecs/EventProcessingServiceLogs`已存在。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate.html) | 

## 相關資源
<a name="process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate-resources"></a>
+ [API Gateway 映射範本和存取記錄變數參考](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html)
+ [如何將 API Gateway REST API 與 Amazon SQS 整合並解決常見錯誤？](https://aws.amazon.com/premiumsupport/knowledge-center/api-gateway-rest-api-sqs-errors/)

# 從 AWS Step Functions 同步執行 AWS Systems Manager 自動化任務 AWS Step Functions
<a name="run-aws-systems-manager-automation-tasks-synchronously-from-aws-step-functions"></a>

*Elie El khoury，Amazon Web Services*

## 總結
<a name="run-aws-systems-manager-automation-tasks-synchronously-from-aws-step-functions-summary"></a>

此模式說明如何 AWS Step Functions 與 整合 AWS Systems Manager。它使用 AWS SDK 服務整合，從狀態機器工作流程使用任務字符呼叫 Systems Manager **startAutomationExecution** API，並暫停直到字符傳回成功或失敗呼叫。為了示範整合，此模式會實作圍繞 `AWS-RunShellScript`或 文件的自動化`AWS-RunPowerShellScript`文件 （執行手冊） 包裝函式，並使用 `.waitForTaskToken` 同步呼叫 `AWS-RunShellScript`或 `AWS-RunPowerShellScript`。如需 Step Functions 中 AWS SDK 服務整合的詳細資訊，請參閱 [AWS Step Functions 開發人員指南](https://docs.aws.amazon.com/step-functions/latest/dg/supported-services-awssdk.html)。

Step Functions ****是一種低程式碼的視覺化工作流程服務，可用來建置分散式應用程式、自動化 IT 和業務流程，以及使用 AWS 服務建置資料和機器學習管道。工作流程會管理故障、重試、平行化、服務整合和可觀測性，讓您可以專注於更高價值的商業邏輯。

自動化是 的功能 AWS Systems Manager，可簡化常見的維護、部署和修復任務， AWS 服務 例如 Amazon Elastic Compute Cloud (Amazon EC2)、Amazon Relational Database Service (Amazon RDS)、Amazon Redshift 和 Amazon Simple Storage Service (Amazon S3)。自動化可讓您精細控制自動化的並行。例如，您可以指定要同時鎖定多少資源，以及在自動化停止之前可以發生的錯誤數量。

如需實作詳細資訊，包括 Runbook 步驟、參數和範例，請參閱[其他資訊](#run-aws-systems-manager-automation-tasks-synchronously-from-aws-step-functions-additional)一節。

## 先決條件和限制
<a name="run-aws-systems-manager-automation-tasks-synchronously-from-aws-step-functions-prereqs"></a>

**先決條件**
+ 作用中 AWS 的帳戶
+ AWS Identity and Access Management 存取 Step Functions 和 Systems Manager 的 (IAM) 許可
+ [執行個體](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-install-ssm-agent.html)上安裝 Systems Manager Agent (SSM Agent) 的 EC2 執行個體
+ 連接至您計劃執行 Runbook [之執行個體的 Systems Manager IAM 執行個體描述](https://docs.aws.amazon.com/systems-manager/latest/userguide/setup-instance-profile.html)檔
+ 具有下列 IAM 許可的 Step Functions 角色 （遵循最低權限原則）：

```
{
             "Effect": "Allow",
             "Action": "ssm:StartAutomationExecution",
             "Resource": "*"
 }
```

**產品版本**
+ SSM 文件結構描述 0.3 版或更新版本
+ SSM Agent 2.3.672.0 版或更新版本

## Architecture
<a name="run-aws-systems-manager-automation-tasks-synchronously-from-aws-step-functions-architecture"></a>

**目標技術堆疊**
+ AWS Step Functions
+ AWS Systems Manager  自動化

**目標架構**

![\[從 Step Functions 同步執行 Systems Manager 自動化任務的架構\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/47c19e4f-d68d-4f91-bb68-202098757529/images/2d248aae-d858-4565-8af2-593cde0da780.png)


**自動化和擴展**
+ 此模式提供 AWS CloudFormation 範本，可用來在多個執行個體上部署 Runbook。（請參閱 GitHub [Step Functions 和 Systems Manager 實作](https://github.com/aws-samples/amazon-stepfunctions-ssm-waitfortasktoken)儲存庫。)

## 工具
<a name="run-aws-systems-manager-automation-tasks-synchronously-from-aws-step-functions-tools"></a>

**AWS 服務**
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) 可協助您設定 AWS 資源、快速且一致地佈建資源，以及在整個 AWS 帳戶 和 區域的生命週期中管理資源。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 透過控制已驗證並獲授權使用的人員，協助您安全地管理對 AWS 資源的存取。
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html) 是一種無伺服器協同運作服務，可協助您結合 AWS Lambda 函數和其他 AWS 服務 來建置業務關鍵型應用程式。
+ [AWS Systems Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-systems-manager.html) 可協助您管理在 中執行的應用程式和基礎設施 AWS 雲端。它可簡化應用程式和資源管理、縮短偵測和解決操作問題的時間，並協助您大規模安全地管理 AWS 資源。

**Code**

此模式的程式碼可在 GitHub [Step Functions 和 Systems Manager 實作](https://github.com/aws-samples/amazon-stepfunctions-ssm-waitfortasktoken)儲存庫中使用。 

## 史詩
<a name="run-aws-systems-manager-automation-tasks-synchronously-from-aws-step-functions-epics"></a>

### 建立 Runbook
<a name="create-runbooks"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 下載 CloudFormation 範本。 | 從 GitHub 儲存庫的 `cloudformation `資料夾下載`ssm-automation-documents.cfn.json`範本。 | AWS DevOps | 
| 建立 Runbook。 | 登入 AWS 管理主控台，開啟 [CloudFormation 主控台](https://console.aws.amazon.com/cloudformation/)，然後部署 範本。如需部署 CloudFormation 範本的詳細資訊，請參閱 CloudFormation 文件中的[在 CloudFormation 主控台上建立堆疊](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html)。 CloudFormation 範本會部署三個資源：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/run-aws-systems-manager-automation-tasks-synchronously-from-aws-step-functions.html) | AWS DevOps | 

### 建立範例狀態機器
<a name="create-a-sample-state-machine"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立測試狀態機器。 | 遵循 [AWS Step Functions 開發人員指南](https://docs.aws.amazon.com/step-functions/latest/dg/getting-started-with-sfn.html)中的指示來建立和執行狀態機器。針對 定義，請使用下列程式碼。請務必使用帳戶中啟用 Systems Manager 之有效執行個體的 ID 來更新`InstanceIds`值。<pre>{<br />  "Comment": "A description of my state machine",<br />  "StartAt": "StartAutomationWaitForCallBack",<br />  "States": {<br />    "StartAutomationWaitForCallBack": {<br />      "Type": "Task",<br />      "Resource": "arn:aws:states:::aws-sdk:ssm:startAutomationExecution.waitForTaskToken",<br />      "Parameters": {<br />        "DocumentName": "SfnRunCommandByInstanceIds",<br />        "Parameters": {<br />          "InstanceIds": [<br />            "i-1234567890abcdef0"<br />          ],<br />          "taskToken.$": "States.Array($$.Task.Token)",<br />          "workingDirectory": [<br />            "/home/ssm-user/"<br />          ],<br />          "Commands": [<br />            "echo \"This is a test running automation waitForTaskToken\" >> automation.log",<br />            "sleep 100"<br />          ],<br />          "executionTimeout": [<br />              "10800"<br />          ],<br />          "deliveryTimeout": [<br />              "30"<br />          ],<br />          "shell": [<br />              "Shell"<br />          ]<br />            }<br />      },<br />      "End": true<br />    }<br />  }<br />}</pre>此程式碼會呼叫 Runbook 來執行兩個命令，以示範對 Systems Manager Automation 的`waitForTaskToken`呼叫。`shell` 參數值 (`Shell` 或 `PowerShell`) 會決定自動化文件是執行 `AWS-RunShellScript`還是 `AWS-RunPowerShellScript`。任務會將「這是執行自動化 waitForTaskToken」的測試寫入 `/home/ssm-user/automation.log` 檔案，然後休眠 100 秒，再以任務字符回應，並釋出工作流程中的下一個任務。如果您想要改為呼叫 `SfnRunCommandByTargets`Runbook，請將上一個程式碼的 `Parameters`區段取代為下列項目：<pre>"Parameters": {<br />          "Targets": [<br />            {<br />              "Key": "InstanceIds",<br />              "Values": [<br />                "i-02573cafcfEXAMPLE",<br />                "i-0471e04240EXAMPLE"<br />              ]<br />            }<br />          ],</pre> | AWS DevOps | 
| 更新狀態機器的 IAM 角色。 | 上一個步驟會自動為狀態機器建立專用 IAM 角色。不過，它不會授予呼叫 Runbook 的許可。透過新增下列許可來更新角色：<pre>{<br />      "Effect": "Allow",<br />      "Action": "ssm:StartAutomationExecution",<br />      "Resource": "*"<br /> }</pre> | AWS DevOps | 
| 驗證同步呼叫。 | 執行狀態機器以驗證 Step Functions 與 Systems Manager Automation 之間的同步呼叫。 如需範例輸出，請參閱[其他資訊](#run-aws-systems-manager-automation-tasks-synchronously-from-aws-step-functions-additional)一節。  | AWS DevOps | 

## 相關資源
<a name="run-aws-systems-manager-automation-tasks-synchronously-from-aws-step-functions-resources"></a>
+ [入門 AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/getting-started-with-sfn.html)(*AWS Step Functions 開發人員指南*)
+ [使用任務字符等待回呼](https://docs.aws.amazon.com/step-functions/latest/dg/connect-to-resource.html#connect-wait-token) *AWS Step Functions （開發人員指南*，服務整合模式）
+ [send\$1task\$1success](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/stepfunctions/client/send_task_success.html) 和 [send\$1task\$1failure](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/stepfunctions/client/send_task_failure.html) API 呼叫 (Boto3 文件） 
+ [AWS Systems Manager 自動化](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-automation.html) (*AWS Systems Manager 使用者指南*)

## 其他資訊
<a name="run-aws-systems-manager-automation-tasks-synchronously-from-aws-step-functions-additional"></a>

**實作詳細資訊**

此模式提供 CloudFormation 範本，可部署兩個 Systems Manager Runbook：
+ `SfnRunCommandByInstanceIds`會使用執行個體 IDs 執行 `AWS-RunShellScript`或 `AWS-RunPowerShellScript`命令。
+ `SfnRunCommandByTargets`使用目標執行 `AWS-RunShellScript`或 `AWS-RunPowerShellScript`命令。

每個 Runbook 都會實作四個步驟，以在 Step Functions 中使用 `.waitForTaskToken`選項時實現同步呼叫。


| 
| 
| 步驟 | Action | Description | 
| --- |--- |--- |
| **1** | `Branch` | 檢查`shell`參數值 (`Shell` 或 `PowerShell`)，以決定是否要`AWS-RunShellScript`針對 Linux 或 `AWS-RunPowerShellScript` Windows 執行 。 | 
| **2** | `RunCommand_Shell` 或 `RunCommand_PowerShell` | 接受數個輸入並執行 `RunShellScript`或 `RunPowerShellScript`命令。如需詳細資訊，請參閱 Systems Manager 主控台上 `RunCommand_Shell`或`RunCommand_PowerShell`自動化文件**的詳細資訊**索引標籤。 | 
| **3** | `SendTaskFailure` | 步驟 2 中止或取消時執行。它呼叫 Step Functions [send\$1task\$1failure](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/stepfunctions/client/send_task_failure.html) API，接受三個參數做為輸入：狀態機器傳遞的字符、失敗錯誤，以及失敗原因的描述。 | 
| **4** | `SendTaskSuccess` | 步驟 2 成功時執行。它呼叫 Step Functions [send\$1task\$1success](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/stepfunctions/client/send_task_success.html) API，該 API 接受狀態機器傳遞的字符作為輸入。 | 

**Runbook 參數**

`SfnRunCommandByInstanceIds` Runbook：


| 
| 
| 參數名稱 | Type | 選用或必要 | Description | 
| --- |--- |--- |--- |
| `shell` | String | 必要 | 執行個體 shell，用於決定是否`AWS-RunShellScript`要針對 Linux 或 Windows `AWS-RunPowerShellScript` 執行。 | 
| `deliveryTimeout` | Integer | 選用 | 等待命令交付至執行個體上 SSM 代理程式的時間，以秒為單位。此參數的最小值為 30 (0.5 分鐘），最大值為 2592000 (720 小時）。 | 
| `executionTimeout` | String | 選用 | 命令在被視為失敗之前完成的時間，以秒為單位。預設值為 3600 (1 小時）。最大值為 172800 (48 小時）。 | 
| `workingDirectory` | String | 選用 | 在您的執行個體上的工作目錄路徑。 | 
| `Commands` | StringList | 必要 | 要執行的 shell 指令碼或命令。 | 
| `InstanceIds` | StringList | 必要 | 您要執行命令之執行個體的 IDs。 | 
| `taskToken` | String | 必要 | 用於回呼回應的任務字符。 | 

`SfnRunCommandByTargets`Runbook：


| 
| 
| Name | 類型 | 選用或必要 | Description | 
| --- |--- |--- |--- |
| `shell` | String | 必要 | 執行個體 shell，以決定是否`AWS-RunShellScript`要針對 Linux 或 Windows `AWS-RunPowerShellScript` 執行。 | 
| `deliveryTimeout` | Integer | 選用 | 等待命令交付至執行個體上 SSM 代理程式的時間，以秒為單位。此參數的最小值為 30 (0.5 分鐘），最大值為 2592000 (720 小時）。 | 
| `executionTimeout` | Integer | 選用 | 命令在被視為失敗之前完成的時間，以秒為單位。預設值為 3600 (1 小時）。最大值為 172800 (48 小時）。 | 
| `workingDirectory` | String | 選用 | 在您的執行個體上的工作目錄路徑。 | 
| `Commands` | StringList | 必要 | 要執行的 shell 指令碼或命令。 | 
| `Targets` | MapList | 必要 | 使用您指定的鍵值對來識別執行個體的搜尋條件陣列。例如：`[{"Key":"InstanceIds","Values":["i-02573cafcfEXAMPLE","i-0471e04240EXAMPLE"]}]` | 
| `taskToken` | String | 必要 | 用於回呼回應的任務字符。 | 

**範例輸出**

下表提供 步驟函數的範例輸出。它顯示步驟 5 (`TaskSubmitted`) 和步驟 6 () 之間的總執行時間超過 100 秒`TaskSucceeded`。這會示範步驟函數等待`sleep 100`命令完成，然後再移至工作流程中的下一個任務。


| 
| 
| ID | Type | 步驟 | 資源 | 經過時間 （毫秒） | 時間戳記 | 
| --- |--- |--- |--- |--- |--- |
| **1** | `ExecutionStarted` |  | - | 0 | 2022 年 3 月 11 日下午 02：50：34.303 | 
| **2** | `TaskStateEntered` | `StartAutomationWaitForCallBack` | - | 40 | 2022 年 3 月 11 日下午 02：50：34.343 | 
| **3** | `TaskScheduled` | `StartAutomationWaitForCallBack` | - | 40 | 2022 年 3 月 11 日下午 02：50：34.343 | 
| **4** | `TaskStarted` | `StartAutomationWaitForCallBack` | - | 154 | 2022 年 3 月 11 日下午 02：50：34.457 | 
| **5** | `TaskSubmitted` | `StartAutomationWaitForCallBack` | - | 657 | 2022 年 3 月 11 日下午 02：50：34.960 | 
| **6** | `TaskSucceeded` | `StartAutomationWaitForCallBack` | - | 103835 | 2022 年 3 月 11 日下午 02：52：18.138 | 
| **7** | `TaskStateExited` | `StartAutomationWaitForCallBack` | - | 103860 | 2022 年 3 月 11 日下午 02：52：18.163 | 
| **8** | `ExecutionSucceeded` |  | - | 103897 | 2022 年 3 月 11 日下午 02：52：18：200 | 

# 在 AWS Lambda 函數中使用 Python 執行 S3 物件的平行讀取
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function"></a>

*Eduardo Bortoluzzi，Amazon Web Services*

## 總結
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-summary"></a>

您可以使用此模式從 Amazon Simple Storage Service (Amazon S3) 儲存貯體即時擷取和摘要文件清單。模式提供範例程式碼，從 Amazon Web Services () 上的 S3 儲存貯體平行讀取物件AWS。模式示範如何使用 Python 使用 AWS Lambda 函數有效率地執行 I/O 繫結任務。

一家金融公司在互動式解決方案中使用此模式，以即時手動核准或拒絕相互關聯的金融交易。金融交易文件存放在與市場相關的 S3 儲存貯體中。運算子從 S3 儲存貯體中選取文件清單，分析解決方案計算的交易總值，並決定核准或拒絕選取的批次。

I/O 繫結任務支援多個執行緒。在此範例程式碼中，[並行.futures.ThreadPoolExecutor](https://docs.python.org/3.13/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor) 最多可與 30 個同時執行緒搭配使用，即使 Lambda 函數最多支援 1，024 個執行緒 （其中一個執行緒是您的主要程序）。此限制是因為太多執行緒會因為內容切換和運算資源的使用率而產生延遲問題。您也需要在 中增加集區連線上限，`botocore`以便所有執行緒可以同時執行 S3 物件下載。

範例程式碼在 S3 儲存貯體中使用一個 8.3 KB 物件搭配 JSON 資料。物件會多次讀取。Lambda 函數讀取物件後，JSON 資料會解碼為 Python 物件。在 2024 年 12 月，執行此範例後的結果為 2.3 秒內處理的 1，000 次讀取，以及 27 秒內處理的 10，000 次讀取，其使用 Lambda 函數設定為 2，304 MB 記憶體。 AWS Lambda 支援從 128 MB 到 10，240 MB (10 GB) 的記憶體組態，但將 Lambdamemory 增加到超過 2，304 MB 並有助於縮短執行此特定 I/O 繫結任務的時間。

[AWS Lambda Power Tuning](https://github.com/alexcasalboni/aws-lambda-power-tuning) 工具用於測試不同的 Lambda 記憶體組態，並驗證任務的最佳performance-to-cost比。如需測試結果，請參閱[其他資訊](#run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-additional)一節。

## 先決條件和限制
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-prereqs"></a>

**先決條件**
+ 作用中 AWS 帳戶
+ Python 開發的熟練度

**限制**
+ Lambda 函數最多可以有 [1，024 個執行程序或執行緒](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html#function-configuration-deployment-and-execution)。
+ 新 AWS 帳戶 的 Lambda 記憶體限制為 3，008 MB。相應地調整 AWS Lambda Power Tuning 工具。如需詳細資訊，請參閱[疑難排解](#run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-troubleshooting)一節。
+ Amazon S3 [每個分割字首每秒限制 5，500 個 GET/HEAD 請求](https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance.html)。

**產品版本**
+ Python 3.9 或更高版本
+ AWS Cloud Development Kit (AWS CDK) v2
+ AWS Command Line Interface (AWS CLI) 第 2 版
+ AWS Lambda Power Tuning 4.3.6 （選用）

## Architecture
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-architecture"></a>

**目標技術堆疊**
+ AWS Lambda
+ Amazon S3
+ AWS Step Functions （如果已部署 AWS Lambda 電源調校）

**目標架構**

下圖顯示從 S3 儲存貯體平行讀取物件的 Lambda 函數。此圖表也有 Step Functions 工作流程，可供 AWS Lambda Power Tuning 工具微調 Lambda 函數記憶體。這種微調有助於在成本和效能之間取得良好的平衡。

![\[顯示 Lambda 函數、S3 儲存貯體和 AWS Step Functions 的圖表。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/b46e9b16-9842-4291-adfa-3ef012b89aec/images/828696e2-6df7-4536-9205-951c99449f4e.png)


**自動化和擴展**

Lambda 函數會在需要時快速擴展。為了避免 Amazon S3 在高需求期間發生 503 緩慢下降錯誤，我們建議對擴展設定一些限制。

## 工具
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-tools"></a>

**AWS 服務**
+ [AWS Cloud Development Kit (AWS CDK) v2](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html) 是一種軟體開發架構，可協助您在程式碼中定義和佈建 AWS 雲端 基礎設施。已建立要部署的範例基礎設施 AWS CDK。
+ [AWS Command Line InterfaceAWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) 是一種開放原始碼工具，可協助您 AWS 服務 透過命令列 shell 中的命令與 互動。在此模式中，第 2 AWS CLI 版用於上傳範例 JSON 檔案。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一項運算服務，可協助您執行程式碼，無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展，因此您只需支付使用的運算時間。
+ [Amazon Simple Storage Service Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) 是一種雲端型物件儲存服務，可協助您存放、保護和擷取任意數量的資料。
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html) 是一種無伺服器協同運作服務，可協助您結合 AWS Lambda 函數和其他 AWS 服務來建置業務關鍵應用程式。

**其他工具**
+ [Python](https://www.python.org/) 是一種一般用途的電腦程式設計語言。Python 3.8 版中推出了[閒置工作者執行緒的重複使用](https://docs.python.org/3.8/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor)，此模式中的 Lambda 函數程式碼是針對 Python 3.9 版和更新版本建立的。

**程式碼儲存庫**

此模式的程式碼可在 [aws-lambda-parallel-download](https://github.com/aws-samples/aws-lambda-parallel-download) GitHub 儲存庫中使用。

## 最佳實務
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-best-practices"></a>
+ 此 AWS CDK 建構倚賴 AWS 帳戶您 的使用者許可來部署基礎設施。如果您打算使用 AWS CDK 管道或跨帳戶部署，請參閱[堆疊合成器](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html#bootstrapping-synthesizers)。
+ 此範例應用程式未在 S3 儲存貯體啟用存取日誌。最佳實務是在生產程式碼中啟用存取日誌。

## 史詩
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-epics"></a>

### 準備開發環境
<a name="prepare-the-development-environment"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 檢查 Python 安裝的版本。 | 此程式碼已專門在 Python 3.9 和 Python 3.13 上進行測試，且應適用於這些版本之間的所有版本。若要檢查您的 Python 版本，請在終端機`python3 -V`中執行 ，並視需要安裝較新的版本。若要驗證已安裝必要的模組，請執行 `python3 -c "import pip, venv"`。沒有錯誤訊息表示模組已正確安裝，您已準備好執行此範例。 | 雲端架構師 | 
| 安裝 AWS CDK。 | 若要在尚未安裝 AWS CDK 時安裝 ，請遵循 [入門 AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html)中的指示。若要確認已安裝的 AWS CDK 版本是 2.0 或更新版本，請執行 `cdk –version`。 | 雲端架構師 | 
| 引導您的環境。 | 若要引導您的環境，如果尚未完成，請依照[引導環境的指示搭配 使用 AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping-env.html)。 | 雲端架構師 | 

### 複製範例儲存庫
<a name="clone-the-example-repository"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 複製儲存庫。 | 若要複製最新版本的儲存庫，請執行下列命令：<pre>git clone --depth 1 --branch v1.2.0 \<br />git@github.com:aws-samples/aws-lambda-parallel-download.git</pre> | 雲端架構師 | 
| 將工作目錄變更為複製的儲存庫。 | 執行以下命令：<pre>cd aws-lambda-parallel-download</pre> | 雲端架構師 | 
| 建立 Python 虛擬環境。 | 若要建立 Python 虛擬環境，請執行下列命令：<pre>python3 -m venv .venv</pre> | 雲端架構師 | 
| 啟用虛擬環境。 | 若要啟用虛擬環境，請執行下列命令：<pre>source .venv/bin/activate</pre> | 雲端架構師 | 
| 安裝相依性。 | 若要安裝 Python 相依性，請執行 `pip`命令：<pre>pip install -r requirements.txt</pre> | 雲端架構師 | 
| 瀏覽程式碼。 | （選用） 從 S3 儲存貯體下載物件的範例程式碼位於 `resources/parallel.py`。基礎設施程式碼位於 `parallel_download` 資料夾中。 | 雲端架構師 | 

### 部署和測試應用程式
<a name="deploy-and-test-the-app"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 部署應用程式。 | 執行 `cdk deploy`。寫下 AWS CDK 輸出：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function.html) | 雲端架構師 | 
| 上傳範例 JSON 檔案。 | 儲存庫包含約 9 KB 的範例 JSON 檔案。若要將檔案上傳至已建立堆疊的 S3 儲存貯體，請執行下列命令：<pre>aws s3 cp sample.json s3://<ParallelDownloadStack.SampleS3BucketName></pre>`<ParallelDownloadStack.SampleS3BucketName>` 將 取代為 AWS CDK 輸出中的對應值。 | 雲端架構師 | 
| 執行應用程式。 | 若要執行應用程式，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function.html) | 雲端架構師 | 
| 新增下載次數。 | （選用） 若要執行 1，500 取得物件呼叫，請在 `Test` 參數的事件 JSON 中使用**下列 JSON**：<pre>{"repeat": 1500, "objectKey": "sample.json"}</pre> | 雲端架構師 | 

### 選用：執行 AWS Lambda 電源調校
<a name="optional-run-lamlong-power-tuning"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 執行 AWS Lambda Power Tuning 工具。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function.html)在執行結束時，結果會在**執行輸入和輸出**索引標籤上。 | 雲端架構師 | 
| 在圖形中檢視 AWS Lambda 電源調校結果。 | 在**執行輸入和輸出**索引標籤上，複製 `visualization` 屬性連結，並將其貼入新的瀏覽器索引標籤。 | 雲端架構師 | 

### 清除
<a name="clean-up"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 從 S3 儲存貯體移除物件。 | 在您銷毀已部署的資源之前，請先從 S3 儲存貯體移除所有物件：<pre>aws s3 rm s3://<ParallelDownloadStack.SampleS3BucketName> \<br />--recursive</pre>請記得將 取代`<ParallelDownloadStack.SampleS3BucketName>`為 AWS CDK 輸出中的 值。 | 雲端架構師 | 
| 銷毀資源。 | 若要銷毀為此試驗建立的所有資源，請執行下列命令：<pre>cdk destroy</pre> | 雲端架構師 | 

## 疑難排解
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-troubleshooting"></a>


| 問題 | 解決方案 | 
| --- | --- | 
| `'MemorySize' value failed to satisfy constraint: Member must have value less than or equal to 3008` | 對於新帳戶，您可能無法在 Lambda 函數中設定超過 3，008 MB。若要使用 AWS Lambda Power Tuning 進行測試，請在啟動 Step Functions 執行時，在輸入 JSON 新增下列屬性：<pre>"powerValues": [<br />    512,<br />    1024,<br />    1536,<br />    2048,<br />    2560,<br />    3008<br />  ]</pre> | 

## 相關資源
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-resources"></a>
+ [Python – concurrent.futures.ThreadPoolExecutor](https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor)
+ [Lambda 配額 – 函數組態、部署和執行](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html#function-configuration-deployment-and-execution)
+ [在 Python AWS CDK 中使用](https://docs.aws.amazon.com/cdk/v2/guide/work-with-cdk-python.html)
+ [使用 AWS Lambda Power Tuning 分析函數](https://docs.aws.amazon.com/lambda/latest/operatorguide/profile-functions.html)

## 其他資訊
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-additional"></a>

**Code**

下列程式碼片段會執行平行 I/O 處理：

```
with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor:
  for result in executor.map(a_function, (the_arguments)):
    ...
```

當執行緒可用時， 會`ThreadPoolExecutor`重複使用執行緒。

**測試和結果**

這些測試是在 2024 年 12 月進行。

第一個測試處理了 2，500 個物件讀取，結果如下。

![\[呼叫時間下降，且呼叫成本隨著記憶體增加而上升。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/b46e9b16-9842-4291-adfa-3ef012b89aec/images/f6743412-1e52-4c4c-a51c-ac0f75b3b998.png)


從 3，009 MB 開始，處理時間層級在任何記憶體增加時幾乎保持不變，但成本會隨著記憶體大小增加而增加。

另一項測試使用 256 MB 的倍數和處理 10，000 個物件讀取的值，調查了介於 1，536 MB 和 3，072 MB 之間的記憶體範圍，結果如下。

![\[減少調用時間下降和調用成本上升之間的差異。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/b46e9b16-9842-4291-adfa-3ef012b89aec/images/c75d4443-74d8-4b93-9b4d-b2640869381e.png)


最佳performance-to-cost比率是使用 2，304 MB 記憶體 Lambda 組態。

為了進行比較，2，500 個物件讀取的循序程序需要 47 秒。使用 2，304 MB Lambda 組態的平行程序需要 7 秒，減少 85%。

![\[圖表顯示從循序處理切換到平行處理的時間減少。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/b46e9b16-9842-4291-adfa-3ef012b89aec/images/f3dcc44d-ac20-4b75-897d-1d71f0d59781.png)


# 將遙測資料從 AWS Lambda 傳送至 OpenSearch，以進行即時分析和視覺化
<a name="send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization"></a>

*Tabby Ward、Guy Bachar 和 David Kilzer，Amazon Web Services*

## 總結
<a name="send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization-summary"></a>

現代應用程式越來越分散和事件驅動，這加強了即時監控和可觀測性的需求。 AWS Lambda 是一種無伺服器運算服務，在建置可擴展性和事件驅動型架構方面扮演關鍵角色。不過，如果您只依賴 Amazon CloudWatch Logs，監控和疑難排解 Lambda 函數可能具有挑戰性，這可能會導致延遲和有限的保留期。

為了解決此挑戰， AWS 推出了 Lambda 遙測 API，可讓 Lambda 函數將遙測資料直接傳送到第三方監控和可觀測性工具。此 API 支援日誌、指標和追蹤的即時串流，並提供 Lambda 函數效能和運作狀態的完整及時檢視。

此模式說明如何整合 Lambda 遙測 API 與 [OpenSearch](https://opensearch.org/docs/latest/)，這是一種開放原始碼的分散式搜尋和分析引擎。OpenSearch 提供強大且可擴展的平台，用於擷取、儲存和分析大量資料，這使得它成為 Lambda 遙測資料的理想選擇。具體而言，此模式示範如何使用 提供的 Lambda 擴充功能，將日誌從以 Python 撰寫的 Lambda 函數直接傳送至 OpenSearch 叢集 AWS。此解決方案靈活且可自訂，因此您可以建立自己的 Lambda 延伸模組，或變更範例原始程式碼，視需要變更輸出格式。

模式說明如何設定和設定 Lambda 遙測 API 與 OpenSearch 的整合，並包含安全性、成本最佳化和可擴展性的最佳實務。目標是協助您深入了解 Lambda 函數，並增強無伺服器應用程式的整體可觀測性。


| 
| 
| 注意：此模式著重於整合 Lambda 遙測 API 與受管 OpenSearch。不過，討論的原則和技術也適用於自我管理的 OpenSearch 和 Elasticsearch。 | 
| --- |

## 先決條件和限制
<a name="send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization-prereqs"></a>

開始整合程序之前，請確定您已備妥下列先決條件：

**AWS 帳戶**：具備適當許可 AWS 帳戶 的作用中 ，可建立和管理下列 AWS 資源：
+ AWS Lambda
+ AWS Identity and Access Management (IAM)
+ Amazon OpenSearch Service （如果您使用受管 OpenSearch 叢集）

**OpenSearch 叢集**：
+ 您可以使用現有的自我管理 OpenSearch 叢集或受管服務，例如 OpenSearch Service。
+ 如果您使用的是 OpenSearch Service，請依照 OpenSearch Service 文件中的 [Amazon OpenSearch Service 入門](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/gsg.html)中的指示來設定 OpenSearch 叢集。
+ 請確定 OpenSearch 叢集可從 Lambda 函數存取，並使用存取政策、加密和身分驗證等必要的安全設定進行設定。
+ 使用必要的索引映射和設定來設定 OpenSearch 叢集，以擷取 Lambda 遙測資料。如需詳細資訊，請參閱 [ OpenSearch Service 文件中的將串流資料載入 Amazon](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/integrations.html) OpenSearch Service。

**網路連線**：
+ 確保您的 Lambda 函數具有存取 OpenSearch 叢集所需的網路連線能力。如需如何設定虛擬私有雲端 (VPC) 設定的指引，請參閱 [ OpenSearch Service 文件中的在 VPC 內啟動 Amazon OpenSearch Service 網域](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/vpc.html)。 OpenSearch 

**IAM 角色和政策**：
+ 建立具有 Lambda 函數必要許可的 IAM 角色，以存取 OpenSearch 叢集並存取存放在其中的登入資料 AWS Secrets Manager。
+ 將適當的 IAM 政策連接到角色，例如`AWSLambdaBasicExecutionRole`政策以及與 OpenSearch 互動所需的任何其他許可。
+ 確認授予 Lambda 函數的 IAM 許可允許它將資料寫入 OpenSearch 叢集。如需有關管理 IAM 許可的資訊，請參閱 [Lambda 文件中的使用 執行角色定義 Lambda 函數許可](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)。

**程式設計語言知識**：
+ 您需要 Python （或您選擇的程式設計語言） 的基本知識，才能了解和修改 Lambda 函數和 Lambda 延伸模組的範例程式碼。

**開發環境**：
+ 使用建置和部署 Lambda 函數和延伸所需的工具和相依性來設定本機開發環境。

**AWS CLI 或 AWS 管理主控台**：
+ 安裝並設定 [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)，或使用 AWS 管理主控台 具有適當登入資料的 與所需的 互動 AWS 服務。

**監控和記錄**：
+ 熟悉 的監控和記錄最佳實務 AWS，包括 Amazon CloudWatch 等服務，以及 AWS CloudTrail 用於監控和稽核目的。
+ 檢查您的 Lambda 函數的 CloudWatch Logs，以識別與 Lambda 遙測 API 整合相關的任何錯誤或例外狀況。如需疑難排解指引，請參閱 [Lambda 遙測 API 文件](https://docs.aws.amazon.com/lambda/latest/dg/telemetry-api.html)。

## Architecture
<a name="send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization-architecture"></a>

此模式使用 OpenSearch Service 來存放由 Lambda 函數產生的日誌和遙測資料。此方法可讓您將日誌直接快速串流至 OpenSearch 叢集，進而減少使用 CloudWatch Logs 做為中介裝置的延遲和相關成本。


| 
| 
| 您的 Lambda 延伸程式碼可以直接使用 OpenSearch API 或使用 OpenSearch [用戶端程式庫，將遙測推送至 OpenSearch ](https://opensearch.org/docs/latest/clients/index/)Service。Lambda 延伸模組可以使用 OpenSearch API 支援的大量操作，將遙測事件批次在一起，並在單一請求中將其傳送至 OpenSearch Service。 | 
| --- |

下列工作流程圖說明當您使用 OpenSearch 叢集做為端點時，Lambda 函數的日誌工作流程。

![\[將遙測資料傳送至 OpenSearch 叢集的工作流程。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/57fe8796-9f36-46cf-8304-f506242b9f04/images/283ccdcd-a0e1-40a2-a95a-3bd046bfa8ca.png)


架構包含下列元件：
+ Lambda 函數：在執行期間產生日誌和遙測資料的無伺服器函數。
+ Lambda 延伸模組：Python 型延伸模組，使用 Lambda 遙測 API 直接與 OpenSearch 叢集整合。此延伸項目會在相同的執行環境中與 Lambda 函數一起執行。
+ Lambda 遙測 API：此 API 可讓 Lambda 延伸模組直接將遙測資料傳送至第三方監控和可觀測性工具，包括日誌、指標和追蹤。
+ Amazon OpenSearch Service 叢集：託管於 的受管 OpenSearch 叢集 AWS。此叢集負責透過 Lambda 延伸來擷取、儲存和索引從 Lambda 函數串流的日誌資料。

工作流程包含下列步驟：

1. Lambda 函數稱為 ，並在其執行期間產生日誌和遙測資料。

1. Lambda 延伸項目會與 函數一起執行，以使用 Lambda 遙測 API 擷取日誌和遙測資料。

1. Lambda 擴充功能會與 OpenSearch Service 叢集建立安全連線，並即時串流日誌資料。

1. OpenSearch Service 叢集會擷取、編製索引和存放日誌資料，以便透過使用 Kibana 或其他相容應用程式等工具進行搜尋、分析和視覺化。

透過規避 CloudWatch Logs 並將日誌資料直接傳送到 OpenSearch 叢集，此解決方案提供數種優點：
+ 即時日誌串流和分析，可更快速進行故障診斷並改善可觀測性。
+ 減少與 CloudWatch Logs 相關的延遲和潛在的保留限制。
+ 自訂 Lambda 延伸模組或為特定輸出格式或其他處理建立您自己的延伸模組的彈性。
+ 與 OpenSearch Service 的搜尋、分析和視覺化功能整合，以進行日誌分析和監控。

[Epics](#send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization-epics) 區段提供step-by-step說明。 OpenSearch 如需監控和疑難排解解決方案的安全考量、成本最佳化策略和秘訣，請參閱[最佳實務](#send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization-best-practices)一節。

## 工具
<a name="send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization-tools"></a>

**AWS 服務**
+ [AWS Lambda](https://aws.amazon.com/lambda/) 是一種運算服務，讓您無需設定或管理伺服器即可運行程式碼。Lambda 只有在需要時才會執行程式碼，可自動從每天數項請求擴展成每秒數千項請求。
+ [Amazon OpenSearch Service](https://aws.amazon.com/opensearch-service/) 是 提供的全受管服務 AWS ，可讓您輕鬆地在雲端中部署、操作和擴展 OpenSearch 叢集。
+ [Lambda 延伸](https://docs.aws.amazon.com/lambda/latest/dg/lambda-extensions.html)模組透過執行自訂程式碼來擴展 Lambda 函數的功能。您可以使用 Lambda 擴充功能，將 Lambda 與各種監控、可觀測性、安全性和控管工具整合。
+ [AWS Lambda 遙測 API](https://docs.aws.amazon.com/lambda/latest/dg/telemetry-api.html) 可讓您使用擴充功能直接從 Lambda 擷取增強型監控和可觀測性資料，並將其傳送至您選擇的目的地。
+ [CloudFormation](https://aws.amazon.com/cloudformation/) 可協助您建立和設定 AWS 資源的模型，以減少管理這些資源的時間，並有更多時間專注於您的應用程式。

**程式碼儲存庫**
+ [AWS Lambda 延伸](https://github.com/aws-samples/aws-lambda-extensions)項目包含來自 和 AWS 合作夥伴的示範 AWS 和範例專案，協助您開始建置自己的延伸項目。
+ [適用於 OpenSearch 的 Lambda 遙測整合範例](https://github.com/aws-samples/aws-lambda-extensions/tree/main/python-example-telemetry-opensearch-extension)提供 Lambda 延伸範例，示範如何將日誌從 Lambda 函數傳送至 OpenSearch 叢集。

**其他工具**
+ [OpenSearch](https://opensearch.org/faq/) 是一種開放原始碼分散式搜尋和分析引擎，提供強大的平台，用於擷取、儲存和分析大量資料。
+ Kibana 是一種開放原始碼資料視覺化和探勘工具，可與 OpenSearch 搭配使用。請注意，視覺化和分析的實作超出此模式的範圍。如需詳細資訊，請參閱 [Kibana 文件](https://www.elastic.co/guide/en/kibana/current/index.html)和其他資源。

## 最佳實務
<a name="send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization-best-practices"></a>

當您將 Lambda 遙測 API 與 OpenSearch 整合時，請考慮下列最佳實務。

**安全性和存取控制**
+ **安全通訊**：使用 HTTPS 加密 Lambda 函數與 OpenSearch 叢集之間的所有通訊。在 Lambda 延伸模組和 OpenSearch 組態中設定必要的 SSL/TLS 設定。
+ **IAM 許可**：
  + 延伸模組會在與 Lambda 函數相同的執行環境中執行，因此會繼承相同層級的資源存取權，例如檔案系統、聯網和環境變數。
  + 將最低必要 IAM 許可授予 Lambda 函數，以存取 Lambda 遙測 API 並將資料寫入 OpenSearch 叢集。使用[最低權限原則](https://docs.aws.amazon.com/lambda/latest/operatorguide/least-privilege.html)來限制許可範圍。
+ **OpenSearch 存取控制**：在您的 OpenSearch 叢集中實作精細存取控制，以限制對敏感資料的存取。使用 OpenSearch 中的內建安全功能，例如使用者身分驗證、角色型存取控制和索引層級許可。
+ **信任的延伸**模組：一律只從信任的來源安裝延伸模組。使用基礎設施做為程式碼 (IaC) 工具，例如 CloudFormation ，以簡化將相同的延伸組態，包括 IAM 許可連接至多個 Lambda 函數的程序。IaC 工具也提供先前使用的擴充功能和版本的稽核記錄。
+ **敏感資料處理**：建置擴充功能時，請避免記錄敏感資料。在記錄或保留承載和中繼資料以進行稽核之前，請對其進行清理。

**成本最佳化**
+ **監控和提醒**：設定監控和提醒機制，以追蹤從 Lambda 函數傳送至 OpenSearch 的資料量。這將協助您識別和解決任何潛在的成本超支。
+ **資料保留**：仔細考慮 OpenSearch 中 Lambda 遙測資料的適當資料保留期間。較長的保留期可能會增加儲存成本，因此在可觀測性需求與成本最佳化之間取得平衡。
+ **壓縮和索引**：啟用資料壓縮並最佳化 OpenSearch 索引策略，以減少 Lambda 遙測資料的儲存體使用量。
+ **減少對 CloudWatch 的依賴**：透過直接整合 Lambda 遙測 API 與 OpenSearch，您可以減少對 CloudWatch Logs 的依賴，進而節省成本。這是因為 Lambda 遙測 API 可讓您將日誌直接傳送至 OpenSearch，而不需要在 CloudWatch 中存放和處理資料。

**可擴展性和可靠性**
+ **非同步處理**：使用非同步處理模式，例如 Amazon Simple Queue Service (Amazon SQS) 或 Amazon Kinesis，將 Lambda 函數執行與 OpenSearch 資料擷取分離。這有助於維持 Lambda 函數的回應能力，並改善系統的整體可靠性。
+ **OpenSearch 叢集擴展**：監控 OpenSearch 叢集的效能和資源使用率，並視需要進行擴展或縮減，以處理不斷增加的 Lambda 遙測資料量。
+ **容錯移轉和災難復原**：為您的 OpenSearch 叢集實作強大的災難復原策略，包括定期備份，以及在發生故障時快速還原資料的能力。

**可觀測性和監控**
+ **儀表板和視覺化**：使用 Kibana 或其他儀表板工具建立自訂儀表板和視覺化，根據 OpenSearch 中的遙測資料，提供 Lambda 函數效能和運作狀態的洞見。
+ **警示和通知**：設定警示和通知，以主動監控 Lambda 函數中的異常、錯誤或效能問題。將這些提醒和通知與您現有的事件管理程序整合。
+ **追蹤和相互關聯**：確保您的 Lambda 遙測資料包含相關的追蹤資訊，例如請求 IDs 或相互關聯 IDs，以便在分散式無伺服器應用程式中啟用end-to-end可觀測性和故障診斷。

透過遵循這些最佳實務，您可以確保 Lambda 遙測 API 與 OpenSearch 的整合安全、經濟實惠且可擴展，並為無伺服器應用程式提供全方位的可觀測性。

## 史詩
<a name="send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization-epics"></a>

### 建置和部署 Lambda 延伸層
<a name="build-and-deploy-the-lam-extension-layer"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 下載原始程式碼。 | 從延伸模組儲存庫下載範例[AWS Lambda 延伸模組](https://github.com/aws-samples/aws-lambda-extensions)。 | 應用程式開發人員、雲端架構師 | 
| 導覽至 `python-example-telemetry-opensearch-extension` 資料夾。 | 您下載[AWS Lambda 的延伸](https://github.com/aws-samples/aws-lambda-extensions)模組儲存庫包含多個使用案例和語言執行時間的許多範例。導覽至 [python-example-telemetry-opensearch-extension](https://github.com/aws-samples/aws-lambda-extensions/tree/main/python-example-telemetry-opensearch-extension) 資料夾，以使用 Python OpenSearch 延伸模組，將日誌傳送至 OpenSearch。 | 應用程式開發人員、雲端架構師 | 
| 新增執行延伸端點的許可。 | 執行下列命令，讓延伸端點可執行：<pre>chmod +x python-example-telemetry-opensearch-extension/extension.py</pre> | 應用程式開發人員、雲端架構師 | 
| 在本機安裝延伸模組相依性。 | 執行下列命令來安裝 Python 程式碼的本機相依性：<pre>pip3 install -r python-example-telemetry-opensearch-extension/requirements.txt -t ./python-example-telemetry-opensearch-extension/</pre>這些相依性將與延伸程式碼一起掛載。 | 應用程式開發人員、雲端架構師 | 
| 為延伸項目建立 .zip 套件，以將其部署為 layer。 | 副檔名 .zip 檔案應該包含一個名為 的根目錄`extensions/`，其中副檔名可執行檔名所在的位置，以及另一個名為 的根目錄`python-example-telemetry-opensearch-extension/`，其中副檔名的核心邏輯及其相依性所在的位置。為擴充功能建立 .zip 套件：<pre>chmod +x extensions/python-example-telemetry-opensearch-extension<br />zip -r extension.zip extensions python-example-telemetry-opensearch-extension</pre> | 應用程式開發人員、雲端架構師 | 
| 將延伸模組部署為 Lambda 層。 | 使用您的副檔名 .zip 檔案和下列命令發佈 layer：<pre>aws lambda publish-layer-version \<br />--layer-name "python-example-telemetry-opensearch-extension" \<br />--zip-file "fileb://extension.zip"</pre> | 應用程式開發人員、雲端架構師 | 

### 將延伸模組整合到您的 函數
<a name="integrate-the-extension-into-your-function"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 將圖層新增到您的函式中。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization.html)如需將圖層新增至 Lambda 函數的詳細資訊，請參閱 [Lambda 文件](https://docs.aws.amazon.com/lambda/latest/dg/adding-layers.html)。 | 應用程式開發人員、雲端架構師 | 
| 設定 函數的環境變數。 | 在函數頁面上，選擇**組態**索引標籤，並將下列環境變數新增至函數：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization.html) | 應用程式開發人員、雲端架構師 | 

### 新增記錄陳述式並測試您的函數
<a name="add-logging-statements-and-test-your-function"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 將記錄陳述式新增至函數。 | 使用其中一個[內建記錄機制或您選擇的記錄模組，將記錄陳述式](https://docs.aws.amazon.com/lambda/latest/dg/python-logging.html)新增至函數。以下是在 Python 中記錄訊息的範例：<pre>print("Your Log Message Here")<br />logger = logging.getLogger(__name__)<br /><br />logger.info("Test Info Log.")<br />logger.error("Test Error Log.")</pre> | 應用程式開發人員、雲端架構師 | 
| 測試您的函數 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization.html)您應該會看到**執行函數：如果一切正常運作，則表示成功**。 | 應用程式開發人員、雲端架構師 | 

### 在 OpenSearch 中檢視您的日誌
<a name="view-your-logs-in-opensearch"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 查詢您的索引。 | 在 OpenSearch 中，執行下列命令來查詢索引：<pre>SELECT * FROM index-name</pre>您的日誌應該會顯示在查詢結果中。 | 雲端架構師 | 

## 疑難排解
<a name="send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization-troubleshooting"></a>


| 問題 | 解決方案 | 
| --- | --- | 
| 連線問題 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization.html) | 
| 資料擷取錯誤 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization.html) | 

## 相關資源
<a name="send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization-resources"></a>
+ [OpenSearch 的 Lambda 遙測整合範例](https://github.com/aws-samples/aws-lambda-extensions/tree/main/python-example-telemetry-opensearch-extension) (GitHub 儲存庫）
+ [使用 Lambda 延伸模組增強 Lambda 函數 ](https://docs.aws.amazon.com/lambda/latest/dg/lambda-extensions.html)(Lambda 文件）
+ [Lambda 遙測 API](https://docs.aws.amazon.com/lambda/latest/dg/telemetry-api.html) (Lambda 文件）
+ [介紹 AWS Lambda 遙測 API ](https://aws.amazon.com/blogs/compute/introducing-the-aws-lambda-telemetry-api/)(AWS 部落格文章）
+ [將 AWS Lambda 遙測 API 與 Prometheus 和 OpenSearch 整合](https://aws.amazon.com/blogs/opensource/integrating-the-aws-lambda-telemetry-api-with-prometheus-and-opensearch) (AWS 部落格文章）

## 其他資訊
<a name="send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization-additional"></a>

**變更日誌結構**

根據預設，延伸模組會將日誌作為巢狀文件傳送至 OpenSearch。這可讓您執行巢狀查詢來擷取個別資料欄值。

如果預設日誌輸出不符合您的特定需求，您可以透過修改由 提供的 Lambda 延伸模組的原始程式碼來自訂它 AWS。 AWS encourages 客戶可根據其業務需求調整輸出。若要變更日誌輸出，請在副檔名的原始程式碼中找到 `telemetry_dispatcher.py` 檔案中的 `dispatch_to_opensearch`函數，並進行必要的變更。

# 為以儲存格為基礎的架構設定無伺服器儲存格路由器
<a name="serverless-cell-router-architecture"></a>

*Mian Tariq 和 Ioannis Lioupras，Amazon Web Services*

## 總結
<a name="serverless-cell-router-architecture-summary"></a>

做為全域儲存格型應用程式系統的進入點，儲存格路由器負責將使用者有效率地指派給適當的儲存格，並將端點提供給使用者。儲存格路由器會處理 函數，例如儲存user-to-cell的映射、監控儲存格容量，以及在需要時請求新的儲存格。在潛在中斷期間維護儲存格路由器功能非常重要。

此模式中的儲存格路由器設計架構著重於彈性、可擴展性和整體效能最佳化。模式使用靜態路由，其中用戶端會在初始登入時快取端點，並直接與儲存格通訊。此解耦透過協助確保在儲存格路由器受損期間，以儲存格為基礎的應用程式不中斷功能，來增強系統彈性。

此模式使用 AWS CloudFormation 範本來部署架構。如需範本部署內容的詳細資訊，或使用 部署相同的組態 AWS 管理主控台，請參閱[其他資訊](#serverless-cell-router-architecture-additional)一節。

**重要**  
此模式中顯示的示範、程式碼和 CloudFormation 範本僅供說明之用。提供的資料僅用於說明設計模式和協助理解。示範和程式碼尚未可供生產使用，不應用於任何即時生產活動。任何在生產環境中使用程式碼或示範的嘗試，都強烈建議您自行承擔風險。我們建議諮詢適當的專業人員，並在生產設定中實作此模式或其任何元件之前執行徹底的測試。

## 先決條件和限制
<a name="serverless-cell-router-architecture-prereqs"></a>

**先決條件**
+ 作用中的 Amazon Web Services (AWS) 帳戶
+ 最新版本的 [AWS Command Line Interface (AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html))
+ 具有建立 CloudFormation 堆疊、 AWS Lambda 函數和相關資源所需許可的 [AWS 登入](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html)資料

**產品版本**
+ Python 3.12

## Architecture
<a name="serverless-cell-router-architecture-architecture"></a>

下圖顯示儲存格路由器的高階設計。

![\[儲存格路由器的五個步驟程序。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/fd2fbf9d-9ae4-4c27-bc32-cf117350137a/images/feb90b51-dd91-483b-b5a3-b0a5359686e3.png)


圖表會逐步完成下列工作流程：

1. 使用者聯絡 Amazon API Gateway，做為儲存格路由器 API 端點的前端。

1. Amazon Cognito 會處理身分驗證和授權。

1.  AWS Step Functions 工作流程包含下列元件：
   + **Orchestrator** ‒ `Orchestrator`使用 來 AWS Step Functions 建立工作流程或狀態機器。工作流程是由儲存格路由器 API 觸發。會根據資源路徑`Orchestrator`執行 Lambda 函數。
   + **Dispatcher** `Dispatcher`‒ Lambda 函數會識別並為每個註冊的新使用者指派一個靜態儲存格。函數會搜尋使用者數目最少的儲存格，將其指派給使用者，然後傳回端點。
   + **Mapper** ‒ `Mapper`操作會在 CloudFormation 範本建立的 `RoutingDB` Amazon DynamoDB 資料庫中處理user-to-cell的映射。觸發時， `Mapper`函數會提供已指派的使用者其端點。
   + **Scaler** ‒ `Scaler`函數會追蹤儲存格佔用和可用容量。如有需要，`Scaler`函數可以透過 Amazon Simple Queue Service (Amazon SQS) 將請求傳送至佈建和部署層，以請求新的儲存格。
   + **驗證器** ‒ `Validator`函數會驗證儲存格端點並偵測任何潛在問題。

1. `RoutingDB` 存放儲存格資訊和屬性 (API 端點、 AWS 區域狀態、指標）。

1. 當儲存格的可用容量超過閾值時，儲存格路由器會透過 Amazon SQS 請求佈建和部署服務，以建立新的儲存格。

建立新儲存格時， `RoutingDB`會從佈建和部署層更新。不過，該程序超出此模式的範圍。如需儲存格型架構設計內部部署的概觀，以及此模式中所用儲存格路由器設計的詳細資訊，請參閱[其他資訊](#serverless-cell-router-architecture-additional)一節。

## 工具
<a name="serverless-cell-router-architecture-tools"></a>

**AWS 服務**
+ [Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html) 可協助您建立、發佈、維護、監控和保護任何規模的 REST、HTTP 和 WebSocket APIs。
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) 可協助您設定 AWS 資源、快速且一致地佈建資源，以及在整個 AWS 帳戶 和 生命週期中管理資源 AWS 區域。
+ [Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html) 為 Web 和行動應用程式提供身分驗證、授權和使用者管理。
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) 是一項全受管 NoSQL 資料庫服務，可提供快速、可預期且可擴展的效能。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一項運算服務，可協助您執行程式碼，無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展，因此您只需按使用的運算時間付費。
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) 是一種雲端型物件儲存服務，可協助您儲存、保護和擷取任何數量的資料。
+ [Amazon Simple Queue Service (Amazon SQS)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html) 提供安全、耐用且可用的託管佇列，可協助您整合和分離分散式軟體系統和元件。
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html) 是一種無伺服器協同運作服務，可協助您結合 Lambda 函數和其他 AWS 服務 來建置業務關鍵應用程式。

**其他工具**
+ [Python](https://www.python.org/) 是一種一般用途的電腦程式設計語言。

**程式碼儲存庫**

此模式的程式碼可在 GitHub [Serverless-Cell-Router](https://github.com/aws-samples/Serverless-Cell-Router/) 儲存庫中使用。

## 最佳實務
<a name="serverless-cell-router-architecture-best-practices"></a>

如需建置以儲存格為基礎的架構時的最佳實務，請參閱下列 AWS Well-Architected 指引：
+ [使用以儲存格為基礎的架構減少影響範圍](https://docs.aws.amazon.com/wellarchitected/latest/reducing-scope-of-impact-with-cell-based-architecture/reducing-scope-of-impact-with-cell-based-architecture.html)
+ [AWS Well-Architected Framework 可靠性支柱：REL10-BP04 使用大量架構來限制影響範圍](https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/rel_fault_isolation_use_bulkhead.html)

## 史詩
<a name="serverless-cell-router-architecture-epics"></a>

### 準備來源檔案
<a name="prepare-source-files"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 複製範例程式碼儲存庫。 | 若要將 Serverless-Cell-Router GitHub 儲存庫複製到您的電腦，請使用下列命令：<pre>git clone https://github.com/aws-samples/Serverless-Cell-Router/</pre> | 開發人員 | 
| 設定 AWS CLI 臨時登入資料。 |  AWS CLI 使用 的登入資料來設定 AWS 帳戶。本演練使用 IAM Identity Center Command AWS 行或程式設計存取選項提供的臨時憑證。 ****這會設定具有適當登入資料的 `AWS_SECRET_ACCESS_KEY`、 `AWS_ACCESS_KEY_ID`和 `AWS_SESSION_TOKEN` AWS 環境變數，以便與 搭配使用 AWS CLI。 | 開發人員 | 
| 建立 S3 儲存貯體。 | 建立 S3 儲存貯體，用於存放和存取 Serverless-Cell-Router Lambda 函數，以供 CloudFormation 範本部署。若要建立 S3 儲存貯體，請使用下列命令：<pre>aws s3api create-bucket --bucket <bucket name> --region eu-central-1 --create-bucket-configuration LocationConstraint=eu-central-1</pre> | 開發人員 | 
| 建立 .zip 檔案。 | 為位於 [Functions ](https://github.com/aws-samples/Serverless-Cell-Router/tree/main/Functions)目錄中的每個 Lambda 函數建立一個 .zip 檔案。這些 .zip 檔案將用於部署 Lambda 函數。在 Mac 上，使用下列`zip`命令：<pre>zip -j mapper-scr.zip Functions/Mapper.py<br />zip -j dispatcher-scr.zip Functions/Dispatcher.py<br />zip -j scaler-scr.zip Functions/Scaler.py<br />zip -j cp validator-scr.zip Functions/Validator.py<br />zip -j dynamodbDummyData-scr.zip Functions/DynamodbDummyData.py</pre> | 開發人員 | 
| 將 .zip 檔案複製到 S3 儲存貯體。 | 若要將所有 Lambda 函數 .zip 檔案複製到 S3 儲存貯體，請使用下列命令：<pre>aws s3 cp mapper-scr.zip s3://<bucket name><br />aws s3 cp dispatcher-scr.zip s3://<bucket name><br />aws s3 cp scaler-scr.zip s3://<bucket name><br />aws s3 cp validator-scr.zip s3://<bucket name><br />aws s3 cp dynamodbDummyData-scr.zip s3://<bucket name></pre> | 開發人員 | 

### 建立 CloudFormation 堆疊
<a name="create-the-cfn-stack"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 部署 CloudFormation 範本。 | 若要部署 CloudFormation 範本，請執行下列 AWS CLI 命令：<pre>aws cloudformation create-stack --stack-name serverless.cell-router \<br />--template-body file://Serverless-Cell-Router-Stack-v10.yaml \<br />--capabilities CAPABILITY_IAM \<br />--parameters ParameterKey=LambdaFunctionMapperS3KeyParameterSCR,ParameterValue=mapper-scr.zip \<br />ParameterKey=LambdaFunctionDispatcherS3KeyParameterSCR,ParameterValue=dispatcher-scr.zip \<br />ParameterKey=LambdaFunctionScalerS3KeyParameterSCR,ParameterValue=scaler-scr.zip \<br />ParameterKey=LambdaFunctionAddDynamoDBDummyItemsS3KeyParameterSCR,ParameterValue=dynamodbDummyData-scr.zip \<br />ParameterKey=LambdaFunctionsS3BucketParameterSCR,ParameterValue=<S3 bucket storing lambda zip files> \<br />ParameterKey=CognitoDomain,ParameterValue=<Cognito Domain Name> \<br />--region <enter your aws region id, e.g. "eu-central-1"></pre> | 開發人員 | 
| 檢查進度。 | 登入 AWS 管理主控台，開啟位於 https：//[https://console.aws.amazon.com/cloudformation/]() 的 CloudFormation 主控台，並檢查堆疊開發的進度。當狀態為 時`CREATE_COMPLETE`，堆疊已成功部署。 | 開發人員 | 

### 評估和驗證
<a name="assess-and-verify"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 將儲存格指派給使用者。 | 若要啟動 `Orchestrator`，請執行下列 curl 命令：<pre>curl -X POST \<br />-H "Authorization: Bearer {User id_token}" \<br />https://xxxxxx.execute-api.eu-central-1.amazonaws.com/Cell_Router_Development/cells</pre>會`Orchestrator`觸發 `Dispatcher`函數的執行。`Dispatcher`然後， 會驗證使用者的存在。如果找到使用者， 會`Dispatcher`傳回相關聯的儲存格 ID 和端點 URLs。如果找不到使用者， 會將儲存格`Dispatcher`配置給使用者，並將儲存格 ID 傳送至 `Scaler`函數，以評估指派的儲存格剩餘容量。`Scaler` 函數的回應如下：`"cellID : cell-0002 , endPoint_1 : https://xxxxx.execute-api.eu-north-1.amazonaws.com/ , endPoint_2 : https://xxxxxxx.execute-api.eu-central-1.amazonaws.com/"` | 開發人員 | 
| 擷取使用者儲存格。 | 若要使用 `Orchestrator`執行 `Mapper`函數，請執行下列命令：<pre>curl -X POST \<br />-H "Authorization: Bearer {User id_token}" \<br />https://xxxxxxxxx.execute-api.eu-central-1.amazonaws.com/Cell_Router_Development/mapper</pre>`Orchestrator` 會搜尋指派給使用者的儲存格，並在下列回應中傳回儲存格 ID URLs：`"cellID : cell-0002 , endPoint_1 : https://xxxxx.execute-api.eu-north-1.amazonaws.com/ , endPoint_2 : https://xxxxxxx.execute-api.eu-central-1.amazonaws.com/"` | 開發人員 | 

### 清除
<a name="clean-up"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 清除資源。 | 若要避免在您的帳戶中產生額外費用，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/serverless-cell-router-architecture.html) | 應用程式開發人員 | 

## 相關資源
<a name="serverless-cell-router-architecture-resources"></a>

**參考**
+ [使用可用區域實現靜態穩定性](https://aws.amazon.com/builders-library/static-stability-using-availability-zones/)
+ [AWS 故障隔離界限：靜態穩定性](https://docs.aws.amazon.com/whitepapers/latest/aws-fault-isolation-boundaries/static-stability.html)

**影片**

[Physalia：在 Amazon EBS 上提供更高可用性的儲存格型架構](https://www.youtube.com/watch?v=6IknqRZMFic) 




[https://www.youtube-nocookie.com/embed/6IknqRZMFic?controls=0](https://www.youtube-nocookie.com/embed/6IknqRZMFic?controls=0)

## 其他資訊
<a name="serverless-cell-router-architecture-additional"></a>

**以儲存格為基礎的架構設計內部部署**

雖然此模式著重於儲存格路由器，但請務必了解整個環境。環境分為三個離散圖層：
+ 路由層，或包含儲存格路由器的精簡層
+ 儲存格層，包含各種儲存格
+ 佈建和部署層，可佈建儲存格和部署應用程式

即使影響其他 layer 的受損，每個 layer 也會維持功能。 AWS 帳戶 做為故障隔離界限。

下圖顯示高層級的圖層。儲存格層和佈建和部署層超出此模式的範圍。

![\[路由層、具有多個儲存格帳戶的儲存格層，以及佈建和部署層。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/fd2fbf9d-9ae4-4c27-bc32-cf117350137a/images/137ac34d-43c3-42b6-95de-a365ff611ce8.png)


如需儲存格型架構的詳細資訊，請參閱[使用儲存格型架構降低影響範圍：儲存格路由](https://docs.aws.amazon.com/wellarchitected/latest/reducing-scope-of-impact-with-cell-based-architecture/cell-routing.html)。

**儲存格路由器設計模式**

儲存格路由器是跨儲存格的共用元件。為了減輕潛在的影響，路由層必須使用盡可能精簡且水平可擴展的設計。作為系統的進入點，路由層僅包含有效將使用者指派給適當儲存格所需的元件。此層中的元件不會參與儲存格的管理或建立。

此模式使用靜態路由，這表示用戶端會在初次登入時快取端點，然後與儲存格建立直接通訊。用戶端與儲存格路由器之間的定期互動會啟動，以確認目前狀態或擷取任何更新。此刻意解耦可在儲存格路由器停機時為現有使用者啟用不間斷的操作，並在系統內提供持續的功能和彈性。

在此模式中，儲存格路由器支援下列功能：
+ 從佈建和部署層中的儲存格資料庫擷取儲存格資料，以及儲存或更新本機資料庫。
+ 使用儲存格指派演算法，將儲存格指派給應用程式的每個新註冊使用者。
+ 將user-to-cells映射存放在本機資料庫中。
+ 在使用者指派期間檢查儲存格的容量，並將自動販賣機的事件引發至佈建和部署層以建立儲存格。
+ 使用儲存格建立條件演算法來提供此功能。
+ 透過提供靜態儲存格URLs 來回應新註冊的使用者請求。這些 URLs會以存留時間 (TTL) 快取在用戶端上。
+ 提供新的或更新的 URL，以回應無效 URL 的現有使用者請求。

若要進一步了解 CloudFormation 範本設定的示範儲存格路由器，請檢閱下列元件和步驟：

1. 設定 Amazon Cognito 使用者集區。

1. 設定和設定儲存格路由器的 API Gateway API。

1. 建立 DynamoDB 資料表。

1. 建立和設定 SQS 佇列。

1. 實作 `Orchestrator`。

1. 實作 Lambda 函數：`Dispatcher`、`Scaler`、`Mapper`、`Validator`。

1. 評估和驗證。

預先假設是佈建和部署層已建立。其實作詳細資訊超出此成品的範圍。

由於這些元件是由 CloudFormation 範本設定，因此下列步驟會以描述性和高層級顯示。假設您具備完成設定和組態所需的 AWS 技能。

*1。設定 Amazon Cognito 使用者集區*

登入 AWS 管理主控台，並在 [https://console.aws.amazon.com/cognito/]()：// 開啟 Amazon Cognito 主控台。使用應用程式整合`CellRouterPool`、託管 UI 和必要的許可，設定名為 的 Amazon Cognito 使用者集區。

*2. 設定和設定儲存格路由器的 API Gateway API*

在以下網址開啟 API Gateway 主控台：[https://console.aws.amazon.com/apigateway/]()。使用與 Amazon Cognito 使用者集區 整合的 Amazon Cognito 授權方`CellRouter`，設定名為 的 API`CellRouterPool`。實作下列元素：
+ `CellRouter` API 資源，包括`POST`方法
+ 與步驟 5 中實作的 Step Functions 工作流程整合
+ 透過 Amazon Cognito 授權方的授權
+ 整合請求和回應映射
+ 配置必要的許可

*3. 建立 DynamoDB 資料表*

在 [https://console.aws.amazon.com/dynamodb/]()：// 開啟 DynamoDB 主控台，並使用`tbl_router`下列組態建立名為 的標準 DynamoDB 資料表：
+ **分割區索引鍵** `marketId`‒
+ **排序索引鍵** `cellId`‒
+ **容量模式** ‒ 佈建
+ **Point-in-time(PITR)** ‒ 關閉

在**索引**索引標籤上，建立名為 的全域次要索引`marketId-currentCapacity-index`。`Scaler` Lambda 函數將使用 索引，對指派使用者數目最低的儲存格進行有效的搜尋。

使用下列屬性建立資料表結構：
+ `marketId` ‒ 歐洲
+ `cellId` ‒ cell-0002
+ `currentCapacity` ‒ 2
+ `endPoint_1` ‒ <第一個區域的端點>
+ `endPoint_2` ‒ <第二個區域的端點>
+ `IsHealthy` ‒ True
+ `maxCapacity` ‒ 10
+ `regionCode_1` ‒ `eu-north-1`
+ `regionCode_2` ‒ `eu-central-1`
+ `userIds` ‒ <您的電子郵件地址>

*4. 建立和設定 SQS 佇列*

在 [https://console.aws.amazon.com/sqs/]()：// 開啟 Amazon SQS 主控台，並建立名為 的標準 SQS 佇列，以 **Amazon SQS 金鑰**加密`CellProvisioning`設定。

*5. 實作協調器*

開發 Step Functions 工作流程，做為路由器`Orchestrator`的 。工作流程可透過儲存格路由器 API 呼叫。工作流程會根據資源路徑執行指定的 Lambda 函數。將步驟函數與儲存格路由器 的 API Gateway API 整合`CellRouter`，並設定呼叫 Lambda 函數所需的許可。

下圖顯示工作流程。選擇狀態會叫用其中一個 Lambda 函數。如果 Lambda 函數成功，工作流程會結束。如果 Lambda 函數失敗，則會呼叫失敗狀態。

![\[工作流程圖表，其中包含四個函數，並以失敗狀態結束。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/fd2fbf9d-9ae4-4c27-bc32-cf117350137a/images/cfe8d029-6f30-49a1-aaad-cad503bdcbae.png)


*6. 實作 Lambda 函數*

實作 `Dispatcher`、`Scaler`、 `Mapper`和 `Validator`函數。當您在示範中設定每個函數時，請定義函數的角色，並指派在 DynamoDB 資料表 上執行必要操作的必要許可`tbl_router`。此外，將每個 函數整合到工作流程 `Orchestrator`。

*Dispatcher 函數*

`Dispatcher` 函數負責識別和指派每個新註冊使用者的單一靜態儲存格。當新使用者向 全域應用程式註冊時，請求會移至 `Dispatcher`函數。函數會使用預先定義的評估條件來處理請求，如下所示：

1. **區域** ‒ 選取使用者所在市場中的儲存格。例如，如果使用者從歐洲存取 全域應用程式，請選取 AWS 區域 在歐洲使用 的儲存格。

1. **鄰近性或延遲** ‒ 選取最接近使用者的儲存格 例如，如果使用者從荷蘭存取應用程式，則函數會考慮使用法蘭克福和愛爾蘭的儲存格。有關哪個儲存格最接近的決定是根據指標，例如使用者位置與儲存格區域之間的延遲。在此範例模式中，資訊會從佈建和部署層靜態饋送。

1. **運作**狀態 ‒ `Dispatcher`函數會根據提供的儲存格狀態檢查選取的儲存格是否正常運作 （運作狀態 = true 或 false)。

1. **容量** ‒ 使用者分佈是以*儲存格邏輯中最少的使用者數量*為基礎，因此會將使用者指派給擁有最少使用者數量的儲存格。

**注意**  
這些條件僅用於解釋此範例模式。對於實際的儲存格路由器實作，您可以定義更精簡和使用案例型條件。

會`Orchestrator`叫用 Dispatcher 函數，將使用者指派給儲存格。在此示範函數中，市場值是定義為 的靜態參數`europe`。

`Dispatcher` 函數會評估儲存格是否已指派給使用者。如果已指派儲存格，則`Dispatcher`函數會傳回儲存格的端點。如果未將儲存格指派給使用者，則函數會搜尋使用者數目最少的儲存格，將其指派給使用者，並傳回端點。使用全域次要索引來最佳化儲存格搜尋查詢的效率。

*Mapper 函數*

`Mapper` 函數會監督資料庫中user-to-cell映射的儲存和維護。單一儲存格會配置給每個已註冊的使用者。每個儲存格有兩個不同的 URLs每個 AWS 區域各一個。做為 API Gateway 上託管的 API 端點，這些 URLs 可做為全域應用程式的傳入點。

當`Mapper`函數從用戶端應用程式接收請求時，它會在 DynamoDB 資料表上執行查詢`tbl_router`，以擷取與提供的電子郵件 ID 相關聯的user-to-cell映射。如果找到指派的儲存格，`Mapper`函數會立即提供儲存格的兩個 URLs。該`Mapper`函數也會主動監控儲存格 URLs 的變更，並啟動使用者設定的通知或更新。

*Scaler 函數*

`Scaler` 函數會管理儲存格的剩餘容量。對於每個新的使用者註冊請求，`Scaler`函數會評估`Dispatcher`函數指派給使用者的儲存格的可用容量。如果儲存格已根據指定的評估條件達到其預定限制，則函數會透過 Amazon SQS 佇列向佈建和部署層啟動請求，請求佈建和部署新儲存格。儲存格的擴展可以根據一組評估條件執行，如下所示：

1. **使用者上限** ‒ 每個儲存格最多可有 500 個使用者。

1. **緩衝容量** ‒ 每個儲存格的緩衝容量為 20%，這表示每個儲存格可以隨時指派給 400 個使用者。剩餘的 20% 緩衝區容量會保留給未來的使用案例和非預期案例的處理 （例如，當儲存格建立和佈建服務無法使用時）。

1. **儲存格建立** – 只要現有儲存格達到容量的 70%，就會觸發 請求來建立額外的儲存格。

**注意**  
這些條件僅用於解釋此範例模式。對於實際的儲存格路由器實作，您可以定義更精簡和使用案例型條件。

示範`Scaler`程式碼會在 `Dispatcher`成功將儲存格指派給新註冊的使用者`Orchestrator`後，由 執行。從 收到儲存格 ID 時`Scaler`， 會根據預先定義的評估條件，`Dispatcher`評估指定的儲存格是否有足夠的容量可容納其他使用者。如果儲存格容量不足，`Scaler`函數會將訊息分派給 Amazon SQS 服務。佈建和部署層內的服務會擷取此訊息，以啟動新儲存格的佈建。

**驗證器函數**

此`Validator`函數可識別並解決與儲存格存取相關的問題。當使用者登入全域應用程式時，應用程式會從使用者設定檔設定擷取儲存格的 URLs，並將使用者請求路由到儲存格中兩個指派區域的其中之一。如果無法存取 URLs，應用程式可以將驗證 URL 請求分派至儲存格路由器。cell-router 會`Orchestrator`叫用 `Validator`。會`Validator`啟動驗證程序。除了其他檢查之外，驗證可能包括下列項目：
+ 請求中的交互參考儲存格 URLs 與存放在資料庫中URLs，以識別和處理潛在的更新
+ 執行深層運作狀態檢查 （例如，對儲存格端點的`HTTP GET`請求）

總之， `Validator`函數會回應用戶端應用程式請求，並提供驗證狀態以及任何必要的修補步驟。

`Validator` 旨在增強使用者體驗。假設某些使用者在存取全域應用程式時遇到困難，因為事件導致儲存格暫時無法使用。`Validator` 函數可以提供教學性的修復步驟，而不是呈現一般錯誤。這些步驟可能包括下列動作：
+ 將事件通知使用者。
+ 在服務可用性之前提供大約的等待時間。
+ 提供用於取得其他資訊的支援聯絡電話。

`Validator` 函數的示範程式碼會驗證請求中使用者提供的儲存格 URLs 是否符合`tbl_router`資料表中存放的記錄。`Validator` 函數也會檢查儲存格是否正常運作。

# 透過 VPC 端點設定 Amazon S3 儲存貯體的私有存取權
<a name="set-up-private-access-to-an-amazon-s3-bucket-through-a-vpc-endpoint"></a>

*Martin Maritsch、Nicoras Jacob Baer、Gabriel Rodriguez Garcia、Shukhrat Khodjaev、Mohan Gowda Purushothama 和 Joaquin Rinaudo、Amazon Web Services*

## 總結
<a name="set-up-private-access-to-an-amazon-s3-bucket-through-a-vpc-endpoint-summary"></a>

在 Amazon Simple Storage Service (Amazon S3) 中，預先簽章URLs 可讓您與目標使用者共用任意大小的檔案。根據預設，Amazon S3 預先簽章URLs 可在過期時段內從網際網路存取，這使得它們易於使用。不過，企業環境通常需要存取 Amazon S3 預先簽章URLs，才能僅限於私有網路。

此模式提供無伺服器解決方案，可透過使用來自私有網路且沒有網際網路周遊的預先簽章 URLs，安全地與 S3 物件互動。在 架構中，使用者可透過內部網域名稱存取 Application Load Balancer。流量會透過 Amazon API Gateway 和 S3 儲存貯體的虛擬私有雲端 (VPC) 端點在內部路由。 AWS Lambda 函數會透過私有 VPC 端點產生檔案下載的預先簽章 URLs，這有助於增強敏感資料的安全性和隱私權。

## 先決條件和限制
<a name="set-up-private-access-to-an-amazon-s3-bucket-through-a-vpc-endpoint-prereqs"></a>

**先決條件**
+ 包含部署在 中子網路的 VPC AWS 帳戶 ，該子網路連接到公司網路 （例如，透過 AWS Direct Connect)。

**限制**
+ S3 儲存貯體的名稱必須與網域相同，因此建議您檢查 [Amazon S3 儲存貯體命名規則。](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html)
+ 此範例架構不包含已部署基礎設施的監控功能。如果您的使用案例需要監控，請考慮新增[AWS 監控服務](https://docs.aws.amazon.com/prescriptive-guidance/latest/implementing-logging-monitoring-cloudwatch/welcome.html)。
+ 此範例架構不包含輸入驗證。如果您的使用案例需要輸入驗證並提高安全性，請考慮[使用 AWS WAF 來保護您的 API](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-aws-waf.html)。
+ 此範例架構不包含 Application Load Balancer 的存取記錄。如果您的使用案例需要存取記錄，請考慮啟用[負載平衡器存取日誌](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html)。

**版本**
+ Python 3.11 版或更新版本
+ Terraform 1.6 版或更新版本

## Architecture
<a name="set-up-private-access-to-an-amazon-s3-bucket-through-a-vpc-endpoint-architecture"></a>

**目標技術堆疊**

目標技術堆疊中會使用下列 AWS 服務：
+ **Amazon S3** 是核心儲存服務，用於安全地上傳、下載和儲存檔案。
+ **Amazon API Gateway** 公開與 S3 儲存貯體互動的資源和端點。此服務在產生預先簽章URLs 以下載或上傳資料時扮演重要角色。
+ **AWS Lambda** 會產生預先簽章URLs，以便從 Amazon S3 下載檔案。API Gateway 呼叫 Lambda 函數。
+ **Amazon VPC** 在 VPC 中部署資源以提供網路隔離。VPC 包含子網路和路由表，以控制流量流程。
+ **Application Load Balancer** 會將傳入流量路由至 API Gateway 或 S3 儲存貯體的 VPC 端點。它允許來自公司網路的使用者在內部存取資源。
+ **Amazon S3 的 VPC 端點**可在 VPC 和 Amazon S3 中的資源之間進行直接的私有通訊，而不會周遊公有網際網路。
+ **AWS Identity and Access Management (IAM)** 控制對 AWS 資源的存取。設定許可以確保與 API 和其他 服務的安全互動。

**目標架構**

![\[透過 VPC 終端設定 S3 儲存貯體的私有存取權\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/683ca6a1-789c-4444-bcbf-e4e80d253df3/images/1ca7ee17-d346-4eb9-bf61-ccf42528a401.png)


此圖展示了以下要點：

1. 企業網路的使用者可以透過內部網域名稱存取 Application Load Balancer。我們假設公司網路與 中的內部網路子網路之間存在連線 AWS 帳戶 （例如，透過 Direct Connect 連線）。

1. Application Load Balancer 會將傳入流量路由至 API Gateway，以產生預先簽章URLs，將資料下載或上傳至 Amazon S3 或 S3 儲存貯體的 VPC 端點。在這兩種情況下，請求都會在內部路由，不需要周遊網際網路。

1. API Gateway 會公開要與 S3 儲存貯體互動的資源和端點。在此範例中，我們提供端點，以從 S3 儲存貯體下載檔案，但也可以進行擴充以提供上傳功能。

1. Lambda 函數會產生預先簽章的 URL，Amazon S3以使用 Application Load Balancer 的網域名稱而非公有 Amazon S3 網域，從 Amazon S3 下載檔案。

1. 使用者會收到預先簽章的 URL，並使用 Application Load Balancer 從 Amazon S3 下載檔案。負載平衡器包含預設路由，可將不適用於 API 的流量傳送至 S3 儲存貯體的 VPC 端點。

1. VPC 端點會將具有自訂網域名稱的預先簽章 URL 路由至 S3 儲存貯體。S3 儲存貯體必須具有與網域相同的名稱。

**自動化和擴展**

此模式使用 Terraform 將基礎設施從程式碼儲存庫部署到 AWS 帳戶。

## 工具
<a name="set-up-private-access-to-an-amazon-s3-bucket-through-a-vpc-endpoint-tools"></a>

**工具**
+ [Python](https://www.python.org/) 是一種一般用途的電腦程式設計語言。
+ [Terraform](https://www.terraform.io/) 是 HashiCorp 的基礎設施即程式碼 (IaC) 工具，可協助您建立和管理雲端和內部部署資源。
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) 是一種開放原始碼工具，可協助您透過命令列 shell 中的命令與 AWS 服務互動。

**程式碼儲存庫**

此模式的程式碼可在 GitHub 儲存庫中取得，網址為 https：//[https://github.com/aws-samples/private-s3-vpce](https://github.com/aws-samples/private-s3-vpce)。

## 最佳實務
<a name="set-up-private-access-to-an-amazon-s3-bucket-through-a-vpc-endpoint-best-practices"></a>

此模式的範例架構使用 [IAM 許可](https://docs.aws.amazon.com/apigateway/latest/developerguide/permissions.html)來控制對 API 的存取。擁有有效 IAM 登入資料的任何人都可以呼叫 API。如果您的使用案例需要更複雜的授權模型，建議您[使用不同的存取控制機制](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-to-api.html)。

## 史詩
<a name="set-up-private-access-to-an-amazon-s3-bucket-through-a-vpc-endpoint-epics"></a>

### 在 中部署解決方案 AWS 帳戶
<a name="deploy-the-solution-in-an-aws-account"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 取得 AWS 登入資料。 | 檢閱您的 AWS 登入資料和對帳戶的存取。如需說明，請參閱 AWS CLI 文件中的[組態和登入資料檔案設定](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html)。 | AWS DevOps、一般 AWS | 
| 複製儲存庫。 | 複製此模式隨附的 GitHub 儲存庫：<pre>git clone https://github.com/aws-samples/private-s3-vpce</pre> | AWS DevOps、一般 AWS | 
| 設定變數。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/set-up-private-access-to-an-amazon-s3-bucket-through-a-vpc-endpoint.html) | AWS DevOps、一般 AWS | 
| 部署解決方案。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/set-up-private-access-to-an-amazon-s3-bucket-through-a-vpc-endpoint.html) | AWS DevOps、一般 AWS | 

### 測試解決方案
<a name="test-the-solution"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立測試檔案。 | 將檔案上傳至 Amazon S3，以建立檔案下載的測試案例。您可以使用 [Amazon S3 主控台](https://console.aws.amazon.com/s3/)或下列 AWS CLI 命令：<pre>aws s3 cp /path/to/testfile s3://your-bucket-name/testfile</pre> | AWS DevOps、一般 AWS | 
| 測試預先簽章的 URL 功能。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/set-up-private-access-to-an-amazon-s3-bucket-through-a-vpc-endpoint.html) | AWS DevOps、一般 AWS | 
| 清除。 | 請務必在不再需要資源時將其移除：<pre>terraform destroy</pre> | AWS DevOps、一般 AWS | 

## 疑難排解
<a name="set-up-private-access-to-an-amazon-s3-bucket-through-a-vpc-endpoint-troubleshooting"></a>


| 問題 | 解決方案 | 
| --- | --- | 
| S3 物件金鑰名稱具有特殊字元，例如數字符號 (\$1) 會中斷 URL 參數並導致錯誤。 | 正確編碼 URL 參數，並確保 S3 物件金鑰名稱遵循 [Amazon S3 準則](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html)。 | 

## 相關資源
<a name="set-up-private-access-to-an-amazon-s3-bucket-through-a-vpc-endpoint-resources"></a>

Amazon S3：
+ [使用預先簽章URLs 共用物件](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html)
+ [使用儲存貯體政策控制 VPC 端點的存取](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies-vpc-endpoint.html)

Amazon API Gateway：
+ [針對 APIs中的私有 API 使用 VPC 端點政策](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-vpc-endpoint-policies.html)

Application Load Balancer：
+ [使用 ALB、S3 和 PrivateLink 託管內部 HTTPS 靜態網站](https://aws.amazon.com/blogs/networking-and-content-delivery/hosting-internal-https-static-websites-with-alb-s3-and-privatelink/) (AWS 部落格文章）

# AWS Step Functions 使用 Amazon Bedrock 對 中的狀態進行故障診斷
<a name="troubleshooting-states-in-aws-step-functions"></a>

*Aniket Kurzadkar 和 Sangam Kushwaha，Amazon Web Services*

## 摘要
<a name="troubleshooting-states-in-aws-step-functions-summary"></a>

AWS Step Functions 錯誤處理功能可協助您看到[工作流程](https://docs.aws.amazon.com/step-functions/latest/dg/concepts-statemachines.html)中狀態期間發生的錯誤，但仍可能難以找出錯誤的根本原因並進行偵錯。此模式可解決挑戰，並顯示 Amazon Bedrock 如何協助您解決 Step Functions 中狀態期間發生的錯誤。

Step Functions 提供工作流程協同運作，讓開發人員更輕鬆地自動化程序。Step Functions 也提供錯誤處理功能，提供下列優點：
+ 開發人員可以建立更具彈性的應用程式，在發生錯誤時不會完全失敗。
+ 工作流程可以包含條件式邏輯，以不同方式處理不同類型的錯誤。
+ 系統可以自動重試失敗的操作，可能具有指數退避。
+ 您可以針對錯誤案例定義替代執行路徑，讓工作流程調整並繼續處理。

當 Step Functions 工作流程發生錯誤時，此模式會顯示錯誤訊息和內容如何傳送至基礎模型 (FM)，例如 Step Functions 支援的 Claude 3。FM 可以分析錯誤、分類錯誤，並建議潛在的修補步驟。

## 先決條件和限制
<a name="troubleshooting-states-in-aws-step-functions-prereqs"></a>

**先決條件**
+ 作用中 AWS 帳戶
+ 對 [AWS Step Functions 和 工作流程](https://docs.aws.amazon.com/step-functions/latest/dg/concepts-statemachines.html)的基本了解
+ Amazon Bedrock [API 連線](https://docs.aws.amazon.com/bedrock/latest/userguide/getting-started-api.html)

**限制**
+ 您可以針對各種 使用此模式的方法 AWS 服務。不過，結果可能會根據後續由 Amazon Bedrock 評估而建立 AWS Lambda 的提示而有所不同。
+ 有些 AWS 服務 無法全部使用 AWS 區域。如需區域可用性，請參閱[依區域的 AWS 服務](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。如需特定端點，請參閱[服務端點和配額](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)，然後選擇服務的連結。

## Architecture
<a name="troubleshooting-states-in-aws-step-functions-architecture"></a>

下圖顯示此模式的工作流程和架構元件。

![\[使用 Step Functions、Amazon Bedrock 和 Amazon SNS 處理錯誤和通知的工作流程。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/78f86c74-c9de-4562-adcc-105b87a77a54/images/d8eda499-ea1d-45e5-8a36-e04a44ad5c4b.png)


圖表顯示 Step Functions 狀態機器中錯誤處理和通知的自動化工作流程：

1. 開發人員會啟動狀態機器的執行。

1. Step Functions 狀態機器會開始處理其狀態。有兩種可能的結果：
   + (a) 如果所有狀態都成功執行，工作流程會直接前往 Amazon SNS 傳送電子郵件成功通知。
   + (b) 如果任何狀態失敗，工作流程會移至錯誤處理 Lambda 函數。

1. 如果發生錯誤，會發生下列情況：
   + (a) 觸發 Lambda 函數 （錯誤處理常式）。Lambda 函數會從 Step Functions 狀態機器傳遞的事件資料中擷取錯誤訊息。然後，Lambda 函數會根據此錯誤訊息準備提示，並將提示傳送至 Amazon Bedrock。提示請求與遇到的特定錯誤相關的解決方案和建議。
   + (b) 託管生成式 AI 模型的 Amazon Bedrock 會處理輸入提示。（此模式使用 Anthropic Claude 3 基礎模型 (FM)，這是 Amazon Bedrock 支援的許多 FMs之一。) AI 模型會分析錯誤內容。然後，模型會產生回應，其中包含錯誤發生原因的說明、解決錯誤的潛在解決方案，以及避免未來發生相同錯誤的建議。

     Amazon Bedrock 會將其 AI 產生的回應傳回 Lambda 函數。Lambda 函數會處理回應，可能將其格式化或擷取金鑰資訊。然後，Lambda 函數會將回應傳送至狀態機器輸出。

1. 在錯誤處理或成功執行後，工作流程會透過觸發 Amazon SNS 傳送電子郵件通知來結束。

## 工具
<a name="troubleshooting-states-in-aws-step-functions-tools"></a>

**AWS 服務**
+ [Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/what-is-bedrock.html) 是一項全受管服務，可讓您透過統一 API 使用來自領導 AI 新創公司的高效能基礎模型 (FMs) 和 Amazon。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一項運算服務，可協助您執行程式碼，無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展，因此您只需按使用的運算時間付費。
+ [Amazon Simple Notification Service (Amazon SNS)](https://docs.aws.amazon.com/sns/latest/dg/welcome.html) 可協助您協調和管理發佈者和用戶端之間的訊息交換，包括 Web 伺服器和電子郵件地址。
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html) 是一種無伺服器協同運作服務，可協助您結合 AWS Lambda 函數和其他 AWS 服務 來建置業務關鍵型應用程式。

## 最佳實務
<a name="troubleshooting-states-in-aws-step-functions-best-practices"></a>
+ 由於 Amazon Bedrock 是從訓練資料中學習的生成式 AI 模型，它也會使用該資料來訓練和產生內容。最佳實務是隱藏任何可能導致資料外洩問題的私有資訊。
+ 雖然生成式 AI 可以提供寶貴的洞見，但重要的錯誤處理決策仍應涉及人為監督，尤其是在生產環境中。

## 史詩
<a name="troubleshooting-states-in-aws-step-functions-epics"></a>

### 為您的工作流程建立狀態機器
<a name="create-a-state-machine-for-your-workflow"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立狀態機器。 | 若要建立適合您工作流程的狀態機器，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/troubleshooting-states-in-aws-step-functions.html) | AWS DevOps | 

### 建立 Lambda 函式
<a name="create-a-lam-function"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 Lambda 函式。 | 若要建立 Lambda 函數，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/troubleshooting-states-in-aws-step-functions.html) | AWS DevOps | 
| 在 Lambda 程式碼中設定所需的邏輯。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/troubleshooting-states-in-aws-step-functions.html)<pre>client = boto3.client(<br />        service_name="bedrock-runtime", region_name="selected-region"<br />    )<br /><br />    # Invoke Claude 3 with the text prompt<br />    model_id = "your-model-id" # Select your Model ID, Based on the Model Id, Change the body format<br /><br />    try:<br />        response = client.invoke_model(<br />            modelId=model_id,<br />            body=json.dumps(<br />                {<br />                    "anthropic_version": "bedrock-2023-05-31",<br />                    "max_tokens": 1024,<br />                    "messages": [<br />                        {<br />                            "role": "user",<br />                            "content": [{"type": "text", "text": prompt}],<br />                        }<br />                    ],<br />                }<br />            ),<br />        )<br /></pre>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/troubleshooting-states-in-aws-step-functions.html) | AWS DevOps | 

### 將 Step Functions 與 Lambda 整合
<a name="integrate-sfn-with-lam"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定 Lambda 來處理 Step Functions 中的錯誤。 | 若要設定 Step Functions 來處理錯誤而不中斷工作流程，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/troubleshooting-states-in-aws-step-functions.html) | AWS DevOps | 

## 疑難排解
<a name="troubleshooting-states-in-aws-step-functions-troubleshooting"></a>


| 問題 | 解決方案 | 
| --- | --- | 
| Lambda 無法存取 Amazon Bedrock API （未授權執行） | 當 Lambda 角色沒有存取 Amazon Bedrock API 的許可時，會發生此錯誤。若要解決此問題，請新增 Lambda 角色`AmazonBedrockFullAccess`的政策。如需詳細資訊，請參閱《 *AWS 受管政策參考指南*》中的 [AmazonBedrockFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonBedrockFullAccess.html)。 | 
| Lambda 逾時錯誤 | 有時可能需要超過 30 秒才能產生回應並將其傳回，視提示而定。若要解決此問題，請增加組態時間。如需詳細資訊，請參閱《 *AWS Lambda 開發人員指南*》中的[設定 Lambda 函數逾時](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonBedrockFullAccess.html)。 | 

## 相關資源
<a name="troubleshooting-states-in-aws-step-functions-resources"></a>
+ [Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/what-is-bedrock.html)
+ [Amazon Bedrock API 存取](https://docs.aws.amazon.com/bedrock/latest/userguide/getting-started-api.html)
+ [建立您的第一個 Lambda 函數](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html)
+ [使用 Step Functions 開發工作流程](https://docs.aws.amazon.com/step-functions/latest/dg/developing-workflows.html#development-run-debug)
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html) 

# 更多模式
<a name="serverless-more-patterns-pattern-list"></a>

**Topics**
+ [使用 Athena 存取、查詢和聯結 Amazon DynamoDB 資料表](access-query-and-join-amazon-dynamodb-tables-using-athena.md)
+ [使用 GitHub 動作自動化 AWS CDK Python 應用程式的 Amazon CodeGuru 檢閱](automate-amazon-codeguru-reviews-for-aws-cdk-python-applications.md)
+ [自動化 AWS 資源評估](automate-aws-resource-assessment.md)
+ [使用 AWS SAM 自動化巢狀應用程式的部署](automate-deployment-of-nested-applications-using-aws-sam.md)
+ [使用 GitHub Actions、Artifactory 和 Terraform 在多儲存庫設定中自動化 AWS Supply Chain 資料湖的部署](automate-the-deployment-of-aws-supply-chain-data-lakes.md)
+ [自動化跨 的 Amazon RDS 執行個體複寫 AWS 帳戶](automate-the-replication-of-amazon-rds-instances-across-aws-accounts.md)
+ [使用 DynamoDB TTL 自動將項目封存至 Amazon S3](automatically-archive-items-to-amazon-s3-using-dynamodb-ttl.md)
+ [在 CodeCommit 中自動偵測變更並啟動單一儲存庫的不同 CodePipeline 管道 CodeCommit](automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit.md)
+ [在 Amazon OpenSearch Service 中建置多租戶無伺服器架構](build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service.md)
+ [在 AWS 雲端中建置進階大型主機檔案檢視器](build-an-advanced-mainframe-file-viewer-in-the-aws-cloud.md)
+ [使用 AWS 服務計算風險值 (VaR)](calculate-value-at-risk-var-by-using-aws-services.md)
+ [將 AWS Service Catalog 產品複製到不同的 AWS 帳戶和 AWS 區域](copy-aws-service-catalog-products-across-different-aws-accounts-and-aws-regions.md)
+ [自動為 Java 和 Python 專案建立動態 CI 管道](create-dynamic-ci-pipelines-for-java-and-python-projects-automatically.md)
+ [使用 CQRS 和事件來源將整體分解為微服務](decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.md)
+ [將以 React 為基礎的單一頁面應用程式部署至 Amazon S3 和 CloudFront](deploy-a-react-based-single-page-application-to-amazon-s3-and-cloudfront.md)
+ [使用私有端點和 Application Load Balancer 在內部網站上部署 Amazon API Gateway API](deploy-an-amazon-api-gateway-api-on-an-internal-website-using-private-endpoints-and-an-application-load-balancer.md)
+ [使用基礎設施做為程式碼，在 AWS 雲端上部署和管理無伺服器資料湖](deploy-and-manage-a-serverless-data-lake-on-the-aws-cloud-by-using-infrastructure-as-code.md)
+ [AWS 使用 Terraform 和 Amazon Bedrock 在 上部署 RAG 使用案例](deploy-rag-use-case-on-aws.md)
+ [使用 Amazon Bedrock 代理程式和知識庫開發全自動聊天式助理](develop-a-fully-automated-chat-based-assistant-by-using-amazon-bedrock-agents-and-knowledge-bases.md)
+ [使用 RAG 和 ReAct 提示，開發進階生成式 AI 聊天式助理](develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting.md)
+ [使用 Step Functions 透過 IAM Access Analyzer 動態產生 IAM 政策](dynamically-generate-an-iam-policy-with-iam-access-analyzer-by-using-step-functions.md)
+ [使用 Amazon Cognito 和 IaC 自動化將 Amazon Quick Sight 視覺化元件內嵌至 Web 應用程式 IaC](embed-quick-sight-visual-components-into-web-apps-cognito-iac.md)
+ [確保在啟動時啟用對 Amazon S3 的 Amazon EMR 記錄](ensure-amazon-emr-logging-to-amazon-s3-is-enabled-at-launch.md)
+ [預估 DynamoDB 資料表的隨需容量成本](estimate-the-cost-of-a-dynamodb-table-for-on-demand-capacity.md)
+ [使用 Amazon Personalize 產生個人化和重新排名的建議](generate-personalized-and-re-ranked-recommendations-using-amazon-personalize.md)
+ [使用 AWS Glue 任務和 Python 產生測試資料](generate-test-data-using-an-aws-glue-job-and-python.md)
+ [從 SQL Server 遷移至 PostgreSQL 時，實作 PII 資料的 SHA1 雜湊](implement-sha1-hashing-for-pii-data-when-migrating-from-sql-server-to-postgresql.md)
+ [使用 AWS Step Functions 實作無伺服器 saga 模式](implement-the-serverless-saga-pattern-by-using-aws-step-functions.md)
+ [使用 AWS CDK 跨多個 AWS 區域、帳戶和 OUs 啟用 Amazon DevOps Guru，以改善營運效能](improve-operational-performance-by-enabling-amazon-devops-guru-across-multiple-aws-regions-accounts-and-ous-with-the-aws-cdk.md)
+ [使用 Step Functions 和 Lambda 代理函數跨 AWS 帳戶啟動 CodeBuild 專案](launch-a-codebuild-project-across-aws-accounts-using-step-functions-and-a-lambda-proxy-function.md)
+ [使用 AWS Glue 將 Apache Cassandra 工作負載遷移至 Amazon Keyspaces](migrate-apache-cassandra-workloads-to-amazon-keyspaces-by-using-aws-glue.md)
+ [跨多個 監控共用 Amazon Machine Image 的使用 AWS 帳戶](monitor-use-of-a-shared-amazon-machine-image-across-multiple-aws-accounts.md)
+ [使用 AWS CDK 和 GitHub Actions 工作流程最佳化多帳戶無伺服器部署](optimize-multi-account-serverless-deployments.md)
+ [使用 透過驗證、轉換和分割來協調 ETL 管道 AWS Step Functions](orchestrate-an-etl-pipeline-with-validation-transformation-and-partitioning-using-aws-step-functions.md)
+ [使用 Amazon Athena 查詢具有 SQL 的 Amazon DynamoDB 資料表](query-amazon-dynamodb-tables-sql-amazon-athena.md)
+ [使用 AWS Fargate 大規模執行事件驅動和排程工作負載](run-event-driven-and-scheduled-workloads-at-scale-with-aws-fargate.md)
+ [將自訂屬性傳送至 Amazon Cognito，並將其插入字符](send-custom-attributes-cognito.md)
+ [使用 Amazon CloudFront 在 Amazon S3 儲存貯體中透過 VPC 提供靜態內容](serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront.md)
+ [使用自動化工作流程簡化 Amazon Lex 機器人開發和部署](streamline-amazon-lex-bot-development-and-deployment-using-an-automated-workflow.md)
+ [使用 AWS Lambda 在六邊形架構中建構 Python 專案](structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.md)
+ [將自然語言轉換為查詢 DSL for OpenSearch 和 Elasticsearch 查詢](translate-natural-language-query-dsl-opensearch-elasticsearch.md)
+ [將資料從 Amazon Redshift 叢集跨帳戶卸載至 Amazon S3](unload-data-from-amazon-redshift-cross-accounts-to-amazon-s3.md)
+ [使用 AWS Fargate WaitCondition 勾點建構來協調資源相依性和任務執行](use-the-aws-fargate-waitcondition-hook-construct.md)
+ [使用 Amazon Bedrock 代理程式，透過文字型提示在 Amazon EKS 中自動建立存取項目控制項](using-amazon-bedrock-agents-to-automate-creation-of-access-entry-controls-in-amazon-eks.md)

# 聯網
<a name="networking-pattern-list"></a>

**Topics**
+ [使用 AWS Transit Gateway 自動化區域間對等互連的設定](automate-the-setup-of-inter-region-peering-with-aws-transit-gateway.md)
+ [使用 AWS Transit Gateway 集中網路連線](centralize-network-connectivity-using-aws-transit-gateway.md)
+ [使用 Application Load Balancer 在 Oracle WebLogic 上設定 Oracle JD Edwards EnterpriseOne 的 HTTPS 加密](configure-https-encryption-for-oracle-jd-edwards-enterpriseone-on-oracle-weblogic-by-using-an-application-load-balancer.md)
+ [透過私有網路連線至 Application Migration Service 資料和控制平面](connect-to-application-migration-service-data-and-control-planes-over-a-private-network.md)
+ [使用 AWS CloudFormation 自訂資源和 Amazon SNS 建立 Infoblox 物件](create-infoblox-objects-using-aws-cloudformation-custom-resources-and-amazon-sns.md)
+ [AWS 使用 Terraform 在 上建立階層式多區域 IPAM 架構](multi-region-ipam-architecture.md)
+ [自訂 的 Amazon CloudWatch 提醒 AWS Network Firewall](customize-amazon-cloudwatch-alerts-for-aws-network-firewall.md)
+ [使用 Terraform 在 AWS Wavelength 區域中部署資源](deploy-resources-wavelength-zone-using-terraform.md)
+ [將大量 DNS 記錄遷移至 Amazon Route 53 私有託管區域](migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone.md)
+ [當您從 F5 遷移到 AWS 上的 Application Load Balancer 時修改 HTTP 標頭](modify-http-headers-when-you-migrate-from-f5-to-an-application-load-balancer-on-aws.md)
+ [為多個 中的傳入網際網路存取建立 Network Access Analyzer 調查結果報告 AWS 帳戶](create-a-report-of-network-access-analyzer-findings-for-inbound-internet-access-in-multiple-aws-accounts.md)
+ [在多帳戶 AWS 環境中設定混合網路的 DNS 解析](set-up-dns-resolution-for-hybrid-networks-in-a-multi-account-aws-environment.md)
+ [確認 ELB 負載平衡器需要終止 TLS](verify-that-elb-load-balancers-require-tls-termination.md)
+ [使用 Splunk 檢視 AWS Network Firewall 日誌和指標](view-aws-network-firewall-logs-and-metrics-by-using-splunk.md)
+ [更多模式](networking-more-patterns-pattern-list.md)

# 使用 AWS Transit Gateway 自動化區域間對等互連的設定
<a name="automate-the-setup-of-inter-region-peering-with-aws-transit-gateway"></a>

*Ram Kandaswamy，Amazon Web Services*

## 總結
<a name="automate-the-setup-of-inter-region-peering-with-aws-transit-gateway-summary"></a>

AWS Transit Gateway 透過中央中樞連接虛擬私有雲端 (VPCs) 和內部部署網路。Transit Gateway 流量一律保留在全球 Amazon Web Services (AWS) 骨幹上，不會周遊公有網際網路，這可減少威脅向量，例如常見的入侵和分散式拒絕服務 (DDoS) 攻擊。

如果您需要在兩個或多個 AWS 區域之間通訊，您可以使用區域間傳輸閘道對等互連，在不同區域中的傳輸閘道之間建立對等互連。不過，使用 Transit Gateway 手動設定區域間對等互連可能是具有多個步驟的耗時程序。此模式提供自動化程序，透過使用程式碼來執行對等互連來移除這些手動步驟。如果您必須在多區域組織設定期間重複設定多個區域和 AWS 帳戶，則可以使用此方法。

此模式使用 AWS CloudFormation 堆疊，其中包含 Amazon CloudWatch Logs 中的 AWS Step Functions 工作流程、AWS Lambda 函數、AWS Identity and Access Management (IAM) 角色和日誌群組。然後，您可以啟動 Step Functions 執行，並為傳輸閘道建立區域間對等互連。若要手動設定區域間對等互連，請參閱[使用 AWS Transit Gateway 在不同 AWS 區域中的對等 VPCs](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/peer-vpcs-different-regions-transit-gateway.html)。

## 先決條件和限制
<a name="automate-the-setup-of-inter-region-peering-with-aws-transit-gateway-prereqs"></a>

**先決條件**
+ 作用中的 AWS 帳戶
+ 現有的 Amazon Simple Storage Service (Amazon S3) 儲存貯體。
+ 在請求者區域和接受者區域中建立和設定的傳輸閘道。*請求者*區域是產生對等請求的地方，接受*者*區域接受對等請求。如需詳細資訊，請參閱 Amazon [VPC 文件中的建立和接受 VPC 對等互連](https://docs.aws.amazon.com/vpc/latest/peering/create-vpc-peering-connection.html)。
+ 在接受者和請求者區域中安裝和設定的 VPCs。如需建立 VPC 的步驟，請參閱 [Amazon VPC 文件中的](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-getting-started.html#getting-started-create-vpc)[從 Amazon VPC 入門](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-getting-started.html)建立 VPC。
+ VPCs 必須使用 `addToTransitGateway`標籤和 `true` 值。
+ VPCs 的安全群組和網路存取控制清單 (ACLs)，根據您的需求設定。如需詳細資訊，請參閱 Amazon [VPC 文件中的 VPC 和網路 ACL 的安全群組](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html)。 [ ACLs](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html) 

 

**AWS 區域和限制**
+ 只有特定 AWS 區域支援區域間對等互連。如需支援區域間對等互連的區域完整清單，請參閱 [AWS Transit Gateway FAQs](https://aws.amazon.com/transit-gateway/faqs/)。
+ 在連接的範本程式碼中，請求者區域假設為 `us-east-2`，接受者區域假設為 `us-west-2`。如果您想要設定不同的區域，您必須在所有 Python 檔案中編輯這些值。若要實作涉及兩個以上區域的更複雜設定，您可以變更 Step Function，將區域做為參數傳遞給 Lambda 函數，並為每個組合執行函數。

## Architecture
<a name="automate-the-setup-of-inter-region-peering-with-aws-transit-gateway-architecture"></a>

![\[Step Functions 狀態機器使用 Lambda 函數為傳輸閘道建立對等連線。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/b678bb87-c7b9-4f7b-b26e-eaac650e5d1b/images/d58f0586-659d-4111-b3a8-2fe23d578fef.png)


 

圖表顯示具有下列步驟的工作流程：

1. 使用者會建立 AWS CloudFormation 堆疊。

1. AWS CloudFormation 會建立使用 Lambda 函數的 Step Functions 狀態機器。如需詳細資訊，請參閱 AWS Step Functions [Step Functions 文件中的建立使用 Lambda 的 Step Functions 狀態機器](https://docs.aws.amazon.com/step-functions/latest/dg/tutorial-creating-lambda-state-machine.html)。

1. Step Functions 會呼叫 Lambda 函數進行對等互連。 

1. Lambda 函數會在傳輸閘道之間建立對等連線。

1. Step Functions 會呼叫 Lambda 函數來修改路由表。

1. Lambda 函數透過新增 VPCs 的無類別網域間路由 (CIDR) 區塊來修改路由表。

**Step Functions 工作流程**

![\[Step Functions 工作流程可呼叫 Lambda 函數來修改傳輸閘道對等的路由表。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/b678bb87-c7b9-4f7b-b26e-eaac650e5d1b/images/2f235f47-5d68-492c-b954-7dc170939cae.png)


 

圖表顯示下列 Step Functions 工作流程：

1. Step Functions 工作流程會呼叫傳輸閘道對等的 Lambda 函數。 

1. 有一個計時器呼叫要等待一分鐘。

1. 對等狀態會擷取並傳送至條件區塊。區塊負責循環。 

1. 如果不符合成功條件，工作流程會編碼為進入計時器階段。 

1. 如果符合成功條件，則會呼叫 Lambda 函數來修改路由表。在此呼叫之後，Step Functions 工作流程會結束。

## 工具
<a name="automate-the-setup-of-inter-region-peering-with-aws-transit-gateway-tools"></a>
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) – AWS CloudFormation 是一項服務，可協助您建立 AWS 資源的模型和設定。
+ [Amazon CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) – CloudWatch Logs 可協助您集中所有系統、應用程式和您使用的 AWS 服務的日誌。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) – IAM 是一種 Web 服務，可安全地控制對 AWS 服務的存取。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) – Lambda 會在高可用性運算基礎設施上執行您的程式碼，並執行運算資源的所有管理。
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html) – Step Functions 可讓您輕鬆地協調分散式應用程式的元件，做為視覺化工作流程中的一系列步驟。 

## 史詩
<a name="automate-the-setup-of-inter-region-peering-with-aws-transit-gateway-epics"></a>

### 自動化對等互連
<a name="automate-peering"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 將連接的檔案上傳至 S3 儲存貯體。 | 登入 AWS 管理主控台，開啟 Amazon S3 主控台，然後將 `modify-transit-gateway-routes.zip`、 `peer-transit-gateway.zip`和 `get-transit-gateway-peering-status.zip` 檔案 （已連接） 上傳到您的 S3 儲存貯體。 | 一般 AWS | 
| 建立 AWS CloudFormation 堆疊。 | 執行下列命令，使用 `transit-gateway-peering.json` 檔案 （已連接） 建立 AWS CloudFormation 堆疊：`aws cloudformation create-stack --stack-name myteststack --template-body file://sampletemplate.json`AWS CloudFormation 堆疊會建立 Step Functions 工作流程、Lambda 函數、IAM 角色和 CloudWatch 日誌群組。請確定 AWS CloudFormation 範本參考的 S3 儲存貯體包含您先前上傳的檔案。您也可以使用 AWS CloudFormation 主控台建立堆疊。如需詳細資訊，請參閱 [ AWS CloudFormation 文件中的在 AWS CloudFormation 主控台上建立堆疊](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html)。 AWS CloudFormation  | DevOps 工程師 | 
| 在 Step Functions 中啟動新的執行。 | 開啟 Step Functions 主控台並啟動新的執行。Step Functions 會呼叫 Lambda 函數，並為傳輸閘道建立對等連線。您不需要輸入 JSON 檔案。確認附件可用，且連線類型為**對等**。如需詳細資訊，請參閱 [ AWS Step Functions 文件中的從 AWS Step Functions 入門](https://docs.aws.amazon.com/step-functions/latest/dg/getting-started.html)[開始新的執行](https://docs.aws.amazon.com/step-functions/latest/dg/getting-started.html#start-new-execution)。 | DevOps 工程師，一般 AWS | 
| 驗證路由表中的路由。 | 在傳輸閘道之間建立區域間對等互連。路由表會以對等區域 VPC 的 IPv4 CIDR 區塊範圍更新。 開啟 Amazon VPC 主控台，然後在對應至傳輸閘道連接的路由表中選擇**關聯**索引標籤。驗證對等區域的 VPC CIDR 區塊範圍。 如需詳細步驟和說明，請參閱 Amazon VPC 文件中的[關聯傳輸閘道路由表](https://docs.aws.amazon.com/vpc/latest/tgw/tgw-route-tables.html#associate-tgw-route-table)。 | 網路管理員 | 

## 相關資源
<a name="automate-the-setup-of-inter-region-peering-with-aws-transit-gateway-resources"></a>
+ [在 Step Functions 中的執行](https://docs.aws.amazon.com/step-functions/latest/dg/concepts-state-machine-executions.html)
+ [傳輸閘道對等互連附件](https://docs.aws.amazon.com/vpc/latest/tgw/tgw-peering.html)
+ [使用 AWS Transit Gateway 在不同 AWS 區域中的對等 VPCs ](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/peer-vpcs-different-regions-transit-gateway.html)
+ [使用 AWS Transit Gateway - 示範 （影片） 跨 AWS 區域互連 VPCs ](https://www.youtube.com/watch?v=cj1rQqLxXU8) 

## 附件
<a name="attachments-b678bb87-c7b9-4f7b-b26e-eaac650e5d1b"></a>

若要存取與本文件相關聯的其他內容，請解壓縮下列檔案： [attachment.zip](samples/p-attach/b678bb87-c7b9-4f7b-b26e-eaac650e5d1b/attachments/attachment.zip)

# 使用 AWS Transit Gateway 集中網路連線
<a name="centralize-network-connectivity-using-aws-transit-gateway"></a>

*Mydhili Palagummi 和 Nikhil Marrapu，Amazon Web Services*

## 總結
<a name="centralize-network-connectivity-using-aws-transit-gateway-summary"></a>

此模式描述最簡單的組態，其中 AWS Transit Gateway 可用來將內部部署網路連線到 AWS 區域內多個 AWS 帳戶中的虛擬私有雲端 (VPCs)。使用此設定，您可以建立混合網路，連接區域中的多個 VPC 網路和內部部署網路。這可透過使用傳輸閘道和虛擬私有網路 (VPN) 連線至內部部署網路來完成。

## 先決條件和限制
<a name="centralize-network-connectivity-using-aws-transit-gateway-prereqs"></a>

**先決條件**
+ 託管網路服務的帳戶，作為 AWS Organizations 中組織的成員帳戶進行管理
+ 多個 AWS 帳戶中VPCs，沒有重疊的無類別網域間路由 (CIDR) 區塊

**限制**

此模式不支援隔離特定 VPCs或內部部署網路之間的流量。連接到傳輸閘道的所有網路將能夠互相連接。若要隔離流量，您需要在傳輸閘道上使用自訂路由表。此模式只會使用單一預設傳輸閘道路由表來連接 VPCs 和內部部署網路，這是最簡單的組態。

## Architecture
<a name="centralize-network-connectivity-using-aws-transit-gateway-architecture"></a>

**目標技術堆疊**
+ AWS Transit Gateway
+ AWS Site-to-Site VPN
+ VPC
+ AWS Resource Access Manager (AWS RAM)

 

**目標架構**

![\[AWS Transit Gateway 會將內部部署網路連接到區域內多個 AWS 帳戶中VPCs。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/e23f5faf-e75e-42a3-80e3-142516a2db4e/images/1ecf7e04-bbf8-4304-88c8-6aceb7271d1e.jpeg)


## 工具
<a name="centralize-network-connectivity-using-aws-transit-gateway-tools"></a>

**AWS 服務**
+ [AWS Resource Access Manager (AWS RAM)](https://docs.aws.amazon.com/ram/latest/userguide/what-is.html) 可協助您在 AWS 帳戶、組織單位或整個組織中安全地共用資源 AWS Organizations 。
+ [AWS Transit Gateway](https://docs.aws.amazon.com/vpc/latest/tgw/what-is-transit-gateway.html) 是中央中樞，可連接虛擬私有雲端 (VPCs) 和內部部署網路。

## 史詩
<a name="centralize-network-connectivity-using-aws-transit-gateway-epics"></a>

### 在網路服務帳戶中建立傳輸閘道
<a name="create-a-transit-gateway-in-the-network-services-account"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立傳輸閘道。 | 在您要託管網路服務的 AWS 帳戶中，在目標 AWS 區域中建立傳輸閘道。如需說明，請參閱[建立傳輸閘道](https://docs.aws.amazon.com/vpc/latest/tgw/tgw-transit-gateways.html#create-tgw)。注意下列事項：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/centralize-network-connectivity-using-aws-transit-gateway.html) | 網路管理員 | 

### 將傳輸閘道連接至您的內部部署網路
<a name="connect-the-transit-gateway-to-your-on-premises-network"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定 VPN 連線的客戶閘道裝置。 | 客戶閘道裝置連接到傳輸閘道與內部部署網路之間Site-to-Site連線的內部部署端。如需詳細資訊，請參閱 AWS Site-to-Site VPN 文件中的[您的客戶閘道裝置](https://docs.aws.amazon.com/vpn/latest/s2svpn/your-cgw.html)。識別或啟動支援的現場部署客戶裝置，並記下其公有 IP 地址。VPN 組態稍後在此史詩中完成。 | 網路管理員 | 
| 在網路服務帳戶中，建立傳輸閘道的 VPN 連接。 | 若要設定連線，請為傳輸閘道建立 VPN 連接。如需說明，請參閱[傳輸閘道 VPN 連接](https://docs.aws.amazon.com/vpc/latest/tgw/tgw-vpn-attachments.html)。 | 網路管理員 | 
| 在內部部署網路的客戶閘道裝置上設定 VPN。 | 下載與傳輸閘道相關聯的Site-to-Site連線組態檔案，並在客戶閘道裝置上設定 VPN 設定。如需說明，請參閱[下載組態檔案](https://docs.aws.amazon.com/vpn/latest/s2svpn/SetUpVPNConnections.html#vpn-download-config)。 | 網路管理員 | 

### 將網路服務帳戶中的傳輸閘道分享給其他 AWS 帳戶或您的組織
<a name="share-the-transit-gateway-in-the-network-services-account-to-other-aws-accounts-or-your-organization"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 在 AWS Organizations 管理帳戶中，開啟共用。 | 若要與您的組織或特定組織單位共用傳輸閘道，請在 AWS Organizations 中開啟共用。否則，您需要個別共用每個帳戶的傳輸閘道。如需說明，請參閱在 [ AWS Organizations 中啟用資源共用](https://docs.aws.amazon.com/ram/latest/userguide/getting-started-sharing.html#getting-started-sharing-orgs)。 | AWS 系統管理員 | 
| 在網路服務帳戶中建立傳輸閘道資源共享。 | 若要允許組織中其他 AWS 帳戶中VPCs 連線至傳輸閘道，請在網路服務帳戶中使用 AWS RAM 主控台來共用傳輸閘道資源。如需說明，請參閱[建立資源共享](https://docs.aws.amazon.com/ram/latest/userguide/getting-started-sharing.html#getting-started-sharing-create)。 | AWS 系統管理員 | 

### 將 VPCs連接至傳輸閘道
<a name="connect-vpcs-to-the-transit-gateway"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 在個別帳戶中建立 VPC 連接。 | 在已共用傳輸閘道的帳戶中，建立傳輸閘道 VPC 連接。如需說明，請參閱[建立傳輸閘道連接至 VPC](https://docs.aws.amazon.com/vpc/latest/tgw/tgw-vpc-attachments.html#create-vpc-attachment)。 | 網路管理員 | 
| 接受 VPC 連接請求。 | 在網路服務帳戶中，接受傳輸閘道 VPC 連接請求。如需說明，請參閱[接受共用附件](https://docs.aws.amazon.com/vpc/latest/tgw/tgw-transit-gateways.html#tgw-accept-shared-attachment)。 | 網路管理員 | 

### 設定路由
<a name="configure-routing"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 在個別帳戶 VPCs中設定路由。 | 在每個個別帳戶 VPC 中，使用傳輸閘道做為目標，將路由新增至內部部署網路和其他 VPC 網路。如需說明，請參閱[從路由表新增和移除路由](https://docs.aws.amazon.com/vpc/latest/userguide/WorkWithRouteTables.html#AddRemoveRoutes)。 | 網路管理員 | 
| 在傳輸閘道路由表中設定路由。 | 來自 VPCs和 VPN 連接的路由應傳播，並應顯示在傳輸閘道預設路由表中。如有需要，請在傳輸閘道預設路由表中建立任何靜態路由 （其中一個範例是靜態 VPN 連接的靜態路由）。如需說明，請參閱[建立靜態路由](https://docs.aws.amazon.com/vpc/latest/tgw/tgw-route-tables.html#tgw-create-static-route)。 | 網路管理員 | 
| 新增安全群組和網路存取控制清單 (ACL) 規則。 | 對於 VPC 中的 EC2 執行個體和其他資源，請確保安全群組規則和網路 ACL 規則允許 VPCs 與內部部署網路之間的流量。如需說明，請參閱[使用安全群組控制資源的流量](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules)，以及[從 ACL 新增和刪除規則](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html#Rules)。 | 網路管理員 | 

### 測試連線能力
<a name="test-connectivity"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 測試 VPCs之間的連線。 | 確保網路 ACL 和安全群組允許網際網路控制訊息通訊協定 (ICMP) 流量，然後從 VPC 中的執行個體 ping 到另一個也連接到傳輸閘道的 VPC。 | 網路管理員 | 
| 測試 VPCs與內部部署網路之間的連線。 | 確保網路 ACL 規則、安全群組規則和任何防火牆允許 ICMP 流量，然後 ping 內部部署網路和 VPCs 中的 EC2 執行個體之間。您必須先從內部部署網路啟動網路通訊，才能讓 VPN 連線進入 `UP` 狀態。 | 網路管理員 | 

## 相關資源
<a name="centralize-network-connectivity-using-aws-transit-gateway-resources"></a>
+ [建置可擴展且安全的多 VPC AWS 網路基礎設施](https://d1.awsstatic.com/whitepapers/building-a-scalable-and-secure-multi-vpc-aws-network-infrastructure.pdf) (AWS 白皮書）
+ [使用共用資源](https://docs.aws.amazon.com/ram/latest/userguide/working-with.html) (AWS RAM 文件）
+ [使用傳輸閘道 ](https://docs.aws.amazon.com/vpc/latest/tgw/working-with-transit-gateways.html)(AWS Transit Gateway 文件）

# 使用 Application Load Balancer 在 Oracle WebLogic 上設定 Oracle JD Edwards EnterpriseOne 的 HTTPS 加密
<a name="configure-https-encryption-for-oracle-jd-edwards-enterpriseone-on-oracle-weblogic-by-using-an-application-load-balancer"></a>

*Thanigaivel Thirumalai，Amazon Web Services*

## 總結
<a name="configure-https-encryption-for-oracle-jd-edwards-enterpriseone-on-oracle-weblogic-by-using-an-application-load-balancer-summary"></a>

此模式說明如何為 Oracle WebLogic 工作負載上的 Oracle JD Edwards EnterpriseOne 中的 SSL 卸載設定 HTTPS 加密。此方法會加密使用者瀏覽器和負載平衡器之間的流量，以消除 EnterpriseOne 伺服器的加密負擔。

許多使用者使用 AWS Application Load Balancer 水平擴展 EnterpriseOne JAVA 虛擬機器 (JVM) 層。 [ Application Load Balancer ](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html)負載平衡器可做為用戶端的單一聯絡點，並將傳入流量分配到多個 JVMs。或者，負載平衡器可以將流量分散到多個可用區域，並提高 EnterpriseOne 的可用性。

此模式中描述的程序會設定瀏覽器和負載平衡器之間的加密，而不是加密負載平衡器和 EnterpriseOne JVMs之間的流量。此方法稱為 *SSL 卸載*。將 SSL 解密程序從 EnterpriseOne Web 或應用程式伺服器卸載至 Application Load Balancer，可減輕應用程式端的負擔。在負載平衡器終止 SSL 之後，未加密的流量會路由到 AWS 上的應用程式。

[Oracle JD Edwards EnterpriseOne](https://www.oracle.com/applications/jd-edwards-enterpriseone/) 是企業資源規劃 (ERP) 解決方案，適用於生產、建構、分發、服務或管理產品或實體資產的組織。JD Edwards EnterpriseOne 支援各種硬體、作業系統和資料庫平台。

## 先決條件和限制
<a name="configure-https-encryption-for-oracle-jd-edwards-enterpriseone-on-oracle-weblogic-by-using-an-application-load-balancer-prereqs"></a>

**先決條件**
+ 作用中的 AWS 帳戶
+ AWS Identity and Access Management (IAM) 角色，具有發出 AWS 服務呼叫和管理 AWS 資源的許可
+ SSL 憑證

**產品版本**
+ 此模式已使用 Oracle WebLogic 12c 進行測試，但您也可以使用其他版本。

## Architecture
<a name="configure-https-encryption-for-oracle-jd-edwards-enterpriseone-on-oracle-weblogic-by-using-an-application-load-balancer-architecture"></a>

執行 SSL 卸載的方法有多種。此模式使用 Application Load Balancer 和 Oracle HTTP Server (OHS)，如下圖所示。

![\[使用負載平衡器和 OHS 卸載 SSL\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/c62b976b-31e4-42ca-b7e8-13f7c9d9a187/images/2ae2d0eb-b9f3-41f8-ad86-9af3aade7072.png)


下圖顯示 JD Edwards EnterpriseOne、Application Load Balancer 和 Java Application Server (JAS) JVM 配置。

![\[EnterpriseOne、負載平衡器和 JAS JVM 配置\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/c62b976b-31e4-42ca-b7e8-13f7c9d9a187/images/72ea35b0-2907-48b3-aeb7-0c5d9a3b831b.png)


## 工具
<a name="configure-https-encryption-for-oracle-jd-edwards-enterpriseone-on-oracle-weblogic-by-using-an-application-load-balancer-tools"></a>

**AWS 服務**
+ [Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/) 會將傳入的應用程式流量分散到多個可用區域中的多個目標，例如 Amazon Elastic Compute Cloud (Amazon EC2 執行個體）。
+ [AWS Certificate Manager (ACM)](https://docs.aws.amazon.com/acm/latest/userguide/acm-overview.html) 可協助您建立、存放和續約公有和私有 SSL/TLS X.509 憑證和金鑰，以保護 AWS 網站和應用程式。
+ [Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html) 是一種可用性高、可擴展性強的 DNS Web 服務。

## 最佳實務
<a name="configure-https-encryption-for-oracle-jd-edwards-enterpriseone-on-oracle-weblogic-by-using-an-application-load-balancer-best-practices"></a>
+ 如需 ACM 最佳實務，請參閱 [ACM 文件。](https://docs.aws.amazon.com/acm/latest/userguide/acm-bestpractices.html)

## 史詩
<a name="configure-https-encryption-for-oracle-jd-edwards-enterpriseone-on-oracle-weblogic-by-using-an-application-load-balancer-epics"></a>

### 設定 WebLogic 和 OHS
<a name="set-up-weblogic-and-ohs"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 安裝和設定 Oracle 元件。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/configure-https-encryption-for-oracle-jd-edwards-enterpriseone-on-oracle-weblogic-by-using-an-application-load-balancer.html) | JDE CNC、WebLogic 管理員 | 
| 在網域層級啟用 WebLogic 外掛程式。 | 負載平衡需要 WebLogic 外掛程式。若要啟用外掛程式：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/configure-https-encryption-for-oracle-jd-edwards-enterpriseone-on-oracle-weblogic-by-using-an-application-load-balancer.html) | JDE CNC、WebLogic 管理員 | 
| 編輯組態檔案。 | `mod_wl_ohs.conf` 檔案會設定從 OHS 到 WebLogic 的代理請求。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/configure-https-encryption-for-oracle-jd-edwards-enterpriseone-on-oracle-weblogic-by-using-an-application-load-balancer.html)<pre><VirtualHost *:8000><br /><Location /jde><br />WLSRequest On<br />SetHandler weblogic-handler<br />WebLogicHost localhost<br />WebLogicPort 8000<br />WLProxySSL On<br />WLProxySSLPassThrough On<br /></Location><br /></VirtualHost></pre> | JDE CNC、WebLogic 管理員 | 
| 使用 Enterprise Manager 啟動 OHS。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/configure-https-encryption-for-oracle-jd-edwards-enterpriseone-on-oracle-weblogic-by-using-an-application-load-balancer.html) | JDE CNC、WebLogic 管理員 | 

### 設定 Application Load Balancer
<a name="configure-the-application-load-balancer"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定目標群組。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/configure-https-encryption-for-oracle-jd-edwards-enterpriseone-on-oracle-weblogic-by-using-an-application-load-balancer.html)如需詳細說明，請參閱 [Elastic Load Balancing 文件](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/create-target-group.html)。 | AWS 管理員 | 
| 設定負載平衡器。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/configure-https-encryption-for-oracle-jd-edwards-enterpriseone-on-oracle-weblogic-by-using-an-application-load-balancer.html) | AWS 管理員 | 
| 新增 Route 53 (DNS) 記錄。 | （選用） 您可以為子網域新增 Amazon Route 53 DNS 記錄。此記錄會指向您的 Application Load Balancer。如需說明，請參閱 [Route 53 文件](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resource-record-sets-creating.html)。 | AWS 管理員 | 

## 疑難排解
<a name="configure-https-encryption-for-oracle-jd-edwards-enterpriseone-on-oracle-weblogic-by-using-an-application-load-balancer-troubleshooting"></a>


| 問題 | 解決方案 | 
| --- | --- | 
| HTTP 伺服器不會顯示。 | 如果 **HTTP 伺服器**未出現在 Enterprise Manager 主控台**的目標導覽**清單中，請依照下列步驟執行：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/configure-https-encryption-for-oracle-jd-edwards-enterpriseone-on-oracle-weblogic-by-using-an-application-load-balancer.html)建立執行個體並啟用變更後，您就可以在**目標導覽**面板中看到 HTTP 伺服器。 | 

## 相關資源
<a name="configure-https-encryption-for-oracle-jd-edwards-enterpriseone-on-oracle-weblogic-by-using-an-application-load-balancer-resources"></a>

**AWS 文件**
+ [Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html)
+ [使用公有託管區域](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/AboutHZWorkingWith.html)
+ [使用私有託管區域](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zones-private.html)

**Oracle 文件：**
+ [Oracle WebLogic Server Proxy 外掛程式概觀](https://docs.oracle.com/middleware/1221/webtier/develop-plugin/overview.htm#PLGWL391)
+ [使用 Infrastructure Installer 安裝 WebLogic Server](https://www.oracle.com/webfolder/technetwork/tutorials/obe/fmw/wls/12c/12_2_1/02-01-004-InstallWLSInfrastructure/installweblogicinfrastructure.html)
+ [安裝和設定 Oracle HTTP 伺服器 ](https://docs.oracle.com/middleware/1221/core/install-ohs/toc.htm)

# 透過私有網路連線至 Application Migration Service 資料和控制平面
<a name="connect-to-application-migration-service-data-and-control-planes-over-a-private-network"></a>

*Dipin Jain 和 Mike Kuznetsov，Amazon Web Services*

## 總結
<a name="connect-to-application-migration-service-data-and-control-planes-over-a-private-network-summary"></a>

此模式說明如何使用介面 VPC 端點，連線到私有安全網路上 AWS Application Migration Service 的資料平面和控制平面。

Application Migration Service 是高度自動化lift-and-shift（重新託管） 解決方案，可簡化、加速和降低將應用程式遷移至 的成本 AWS。它可讓公司重新託管大量實體、虛擬或雲端伺服器，而不會發生相容性問題、效能中斷或長切換時段。Application Migration Service 可從 取得 AWS 管理主控台。這可與其他 無縫整合 AWS 服務，例如 AWS CloudTrail Amazon CloudWatch 和 AWS Identity and Access Management (IAM)。

您可以透過使用 Site-to-Site VPN 服務或 Application Migration Service 中的 VPC 對等互連 AWS Direct Connect，從來源資料中心連線到資料平面，也就是做為目的地 VPC 中資料複寫之暫存區域的子網路。您也可以使用 支援的[介面 VPC 端點](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html) AWS PrivateLink ，透過私有網路連線至 Application Migration Service 控制平面。 

## 先決條件和限制
<a name="connect-to-application-migration-service-data-and-control-planes-over-a-private-network-prereqs"></a>

**先決條件**
+ **預備區域子網路** – 在您設定 Application Migration Service 之前，請建立子網路，做為從來源伺服器複寫至 AWS （即資料平面） 之資料的預備區域。首次存取 Application Migration Service 主控台時，您必須在[複寫設定範本](https://docs.aws.amazon.com/mgn/latest/ug/template-vs-server.html)中指定此子網路。您可以在複寫設定範本中覆寫特定來源伺服器的此子網路。雖然您可以在 中使用現有的子網路 AWS 帳戶，但我們建議您為此建立新的專用子網路。
+ **網路需求** – Application Migration Service 在預備區域子網路中啟動的複寫伺服器必須能夠將資料傳送至位於 的 Application Migration Service API 端點`https://mgn.<region>.amazonaws.com/`，其中 `<region>`是 AWS 區域 您要複寫之 的程式碼 （例如 `https://mgn.us-east-1.amazonaws.com`)。下載 Application Migration Service 軟體時，需要 Amazon Simple Storage Service (Amazon S3) 服務 URLs。
  +  AWS 複寫代理程式安裝程式應可存取 AWS 區域 與 Application Migration Service 搭配使用之 的 Amazon Simple Storage Service (Amazon S3) 儲存貯體 URL。
  + 預備區域子網路應可存取 Amazon S3。
  + 安裝 AWS 複寫代理程式的來源伺服器必須能夠將資料傳送至預備區域子網路中的複寫伺服器，以及傳送至位於 的 Application Migration Service API 端點`https://mgn.<region>.amazonaws.com/`。

下表列出所需的連接埠。


| 
| 
| 來源 | 目標 | 站點 | 如需詳細資訊，請參閱 | 
| --- |--- |--- |--- |
| 來源資料中心 | Amazon S3 URLs | 443 (TCP) | [透過 TCP 連接埠 443 的通訊](https://docs.aws.amazon.com/mgn/latest/ug/Network-Requirements.html#TCP-443) | 
| 來源資料中心 | AWS 區域 Application Migration Service 的 特定主控台地址 | 443 (TCP) | [透過 TCP 連接埠 443 的來源伺服器與 Application Migration Service 之間的通訊](https://docs.aws.amazon.com/mgn/latest/ug/Network-Requirements.html#Source-Manager-TCP-443) | 
| 來源資料中心 | 暫存區域子網路 | 1500 (TCP) | [透過 TCP 連接埠 1500 的來源伺服器與預備區域子網路之間的通訊](https://docs.aws.amazon.com/mgn/latest/ug/Network-Requirements.html#Communication-TCP-1500) | 
| 暫存區域子網路 | AWS 區域 Application Migration Service 的 特定主控台地址 | 443 (TCP) | [透過 TCP 連接埠 443 的預備區域子網路與 Application Migration Service 之間的通訊](https://docs.aws.amazon.com/mgn/latest/ug/Network-Requirements.html#Communication-TCP-443-Staging) | 
| 暫存區域子網路 | Amazon S3 URLs | 443 (TCP) | [透過 TCP 連接埠 443 的通訊](https://docs.aws.amazon.com/mgn/latest/ug/Network-Requirements.html#TCP-443) | 
| 暫存區域子網路 | 子網路的 Amazon Elastic Compute Cloud (Amazon EC2) 端點 AWS 區域 | 443 (TCP) | [透過 TCP 連接埠 443 的通訊](https://docs.aws.amazon.com/mgn/latest/ug/Network-Requirements.html#TCP-443) | 

**限制**

Application Migration Service 目前無法在所有 AWS 區域 和 作業系統中使用。
+ [支援的 AWS 區域](https://docs.aws.amazon.com/mgn/latest/ug/supported-regions.html)
+ [支援的作業系統](https://docs.aws.amazon.com/mgn/latest/ug/Supported-Operating-Systems.html)

## Architecture
<a name="connect-to-application-migration-service-data-and-control-planes-over-a-private-network-architecture"></a>

下圖說明典型遷移的網路架構。如需此架構的詳細資訊，請參閱 [Application Migration Service 文件](https://docs.aws.amazon.com/mgn/latest/ug/Network-Settings-Video.html)和 [Application Migration Service 架構和網路架構影片](https://youtu.be/ao8geVzmmRo)。

![\[典型遷移的 Application Migration Service 網路架構\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/21346c0f-0643-4f4f-b21f-fdfe24fc6a8f/images/546598b2-8026-4849-a441-eaa2bc2bf6bb.png)


下列詳細檢視顯示預備區域 VPC 中連接 Amazon S3 和 Application Migration Service 的介面 VPC 端點組態。

![\[Application Migration Service 的典型遷移網路架構 - 詳細檢視\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/21346c0f-0643-4f4f-b21f-fdfe24fc6a8f/images/bd0dfd42-4ab0-466f-b696-804dedcf4513.png)


## 工具
<a name="connect-to-application-migration-service-data-and-control-planes-over-a-private-network-tools"></a>
+ [AWS Application Migration Service](https://docs.aws.amazon.com/mgn/latest/ug/what-is-application-migration-service.html) 簡化、加速並降低重新託管應用程式的成本 AWS。
+ [介面 VPC 端點](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html)可讓您連線至由 提供支援的服務， AWS PrivateLink 而不需要網際網路閘道、NAT 裝置、VPN 連線或 AWS Direct Connect 連線。VPC 中的執行個體不需要公有 IP 地址，即可與服務中的資源通訊。VPC 與另一個服務之間的流量都會保持在 Amazon 網路的範圍內。

## 史詩
<a name="connect-to-application-migration-service-data-and-control-planes-over-a-private-network-epics"></a>

### 建立 Application Migration Service、Amazon EC2 和 Amazon S3 的端點
<a name="create-endpoints-for-mgn-ec2-and-s3"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定 Application Migration Service 的介面端點。 | 來源資料中心和預備區域 VPC 會透過您在目標預備區域 VPC 中建立的介面端點，私下連線至 Application Migration Service 控制平面。若要建立端點：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/connect-to-application-migration-service-data-and-control-planes-over-a-private-network.html)如需詳細資訊，請參閱[《Amazon VPC 文件》中的 AWS 服務 使用介面 VPC 端點存取](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html) 。 | 遷移潛在客戶 | 
| 設定 Amazon EC2 的介面端點。 | 預備區域 VPC 會透過您在目標預備區域 VPC 中建立的介面端點，私下連線至 Amazon EC2 API。若要建立端點，請遵循上一個案例提供的指示。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/connect-to-application-migration-service-data-and-control-planes-over-a-private-network.html) | 遷移潛在客戶 | 
| 設定 Amazon S3 的介面端點。 | 來源資料中心和預備區域 VPC 會透過您在目標預備區域 VPC 中建立的介面端點，私下連線至 Amazon S3 API。若要建立端點，請遵循第一個案例提供的指示。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/connect-to-application-migration-service-data-and-control-planes-over-a-private-network.html)您使用界面端點，因為閘道端點連線無法從 VPC 延伸。（如需詳細資訊，請參閱 [AWS PrivateLink 文件](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-gateway.html)。) | 遷移潛在客戶 | 
| 設定 Amazon S3 Gateway 端點。 | 在組態階段，複寫伺服器必須連線至 S3 AWS 儲存貯體，才能下載複寫伺服器的軟體更新。不過，Amazon S3 介面端點不支援私有 DNS 名稱*，*而且無法將 Amazon S3 端點 DNS 名稱提供給複寫伺服器。 若要緩解此問題，您可以在預備區域子網路所屬的 VPC 中建立 Amazon S3 閘道端點，並使用相關路由更新預備子網路的路由表。如需詳細資訊，請參閱 AWS PrivateLink 文件中的[建立閘道端點](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-s3.html#create-gateway-endpoint-s3)。 | 雲端管理員 | 
| 設定內部部署 DNS 以解析端點的私有 DNS 名稱。 | Application Migration Service 和 Amazon EC2 的介面端點具有可在 VPC 中解析的私有 DNS 名稱。不過，您也需要設定內部部署伺服器來解析這些介面端點的私有 DNS 名稱。設定這些伺服器的方法有多種。在此模式中，我們透過將內部部署 DNS 查詢轉送到暫存區域 VPC 中的 Amazon Route 53 Resolver 傳入端點來測試此功能。如需詳細資訊，請參閱 Route 53 文件中的[解決 VPCs 與網路之間的 DNS 查詢](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resolver-overview-DSN-queries-to-vpc.html)。 | 遷移工程師 | 

### 透過私有連結連線至 Application Migration Service 控制平面
<a name="connect-to-the-mgn-control-plane-over-a-private-link"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 使用 AWS 安裝複寫代理程式 AWS PrivateLink。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/connect-to-application-migration-service-data-and-control-planes-over-a-private-network.html)以下是 Linux 的範例：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/connect-to-application-migration-service-data-and-control-planes-over-a-private-network.html)在您與 Application Migration Service AWS 建立連線並安裝複寫代理程式之後，請依照 [Application Migration Service 文件](https://docs.aws.amazon.com/mgn/latest/ug/migration-workflow-gs.html)的指示，將來源伺服器遷移至目標 VPC 和子網路。 | 遷移工程師 | 

## 相關資源
<a name="connect-to-application-migration-service-data-and-control-planes-over-a-private-network-resources"></a>

**Application Migration Service 文件**
+ [概念](https://docs.aws.amazon.com/mgn/latest/ug/CloudEndure-Concepts.html)
+ [遷移工作流程](https://docs.aws.amazon.com/mgn/latest/ug/migration-workflow-gs.html)
+ [快速入門指南](https://docs.aws.amazon.com/mgn/latest/ug/quick-start-guide-gs.html)
+ [常見問答集](https://docs.aws.amazon.com/mgn/latest/ug/FAQ.html)
+ [疑難排解](https://docs.aws.amazon.com/mgn/latest/ug/troubleshooting.html)

**其他資源**
+ [AWS 使用 VPC 介面端點在 上的多帳戶架構中重新託管您的應用程式](https://docs.aws.amazon.com/prescriptive-guidance/latest/rehost-multi-account-architecture-interface-endpoints/) (AWS 方案指引指南）
+ [AWS Application Migration Service – 技術簡介](https://www.aws.training/Details/eLearning?id=71732) (AWS 培訓和認證演練）
+ [AWS Application Migration Service 架構和網路架構](https://youtu.be/ao8geVzmmRo) （影片）

## 其他資訊
<a name="connect-to-application-migration-service-data-and-control-planes-over-a-private-network-additional"></a>

針對 **Linux 伺服器上的複寫代理程式安裝****進行故障診斷 ***AWS *

如果您在 Amazon Linux 伺服器上收到 **gcc** 錯誤，請設定套件儲存庫，並使用下列命令：

```
## sudo yum groupinstall "Development Tools"
```

# 使用 AWS CloudFormation 自訂資源和 Amazon SNS 建立 Infoblox 物件
<a name="create-infoblox-objects-using-aws-cloudformation-custom-resources-and-amazon-sns"></a>

*Tim Sutton，Amazon Web Services*

## 總結
<a name="create-infoblox-objects-using-aws-cloudformation-custom-resources-and-amazon-sns-summary"></a>

**注意**： AWS Cloud9 不再提供給新客戶。的現有客戶 AWS Cloud9 可以繼續正常使用服務。[進一步了解](https://aws.amazon.com/blogs/devops/how-to-migrate-from-aws-cloud9-to-aws-ide-toolkits-or-aws-cloudshell/)

Infoblox 網域名稱系統 (DNS)、動態主機組態通訊協定 (DHCP) 和 IP 地址管理 ([Infoblox DDI](https://www.infoblox.com/products/ddi/)) 可讓您集中並有效控制複雜的混合環境。使用 Infoblox DDI，除了使用相同的設備管理內部部署和 Amazon Web Services (AWS) 雲端上的 DNS 之外，您還可以在一個授權 IP 地址管理 (IPAM) 資料庫中探索和記錄所有網路資產。

此模式說明如何透過呼叫 Infoblox WAPI API，使用 AWS CloudFormation 自訂資源來建立 Infoblox 物件 （例如 DNS 記錄或 IPAM 物件）。如需 Infoblox WAPI 的詳細資訊，請參閱 Infoblox [文件中的 WAPI](https://www.infoblox.com/wp-content/uploads/infoblox-deployment-infoblox-rest-api.pdf) 文件。

透過使用此模式的方法，除了移除建立記錄和佈建網路的手動程序之外，您還可以取得 AWS 和內部部署環境的 DNS 記錄和 IPAM 組態的統一檢視。您可以針對下列使用案例使用此模式的方法：
+ 在建立 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體之後新增 A 記錄 
+ 在建立 Application Load Balancer 之後新增 CNAME 記錄
+ 在建立虛擬私有雲端 (VPC) 之後新增網路物件
+ 提供下一個網路範圍，並使用該範圍來建立子網路

您也可以擴展此模式並使用其他 Infoblox 裝置功能，例如新增不同的 DNS 記錄類型或設定 Infoblox vDiscovery。 

模式使用中hub-and-spoke設計，其中中樞需要連線至 AWS 雲端或內部部署上的 Infoblox 設備，並使用 AWS Lambda 呼叫 Infoblox API。輪輻位於 AWS Organizations 中相同組織的相同或不同帳戶中，並使用 AWS CloudFormation 自訂資源呼叫 Lambda 函數。

## 先決條件和限制
<a name="create-infoblox-objects-using-aws-cloudformation-custom-resources-and-amazon-sns-prereqs"></a>

**先決條件**
+ 安裝在 AWS 雲端、內部部署或兩者上的現有 Infoblox 設備或網格，並使用可管理 IPAM 和 DNS 動作的管理員使用者進行設定。如需詳細資訊，請參閱 Infoblox 文件中的[關於管理員帳戶](https://docs.infoblox.com/display/nios86/About+Admin+Accounts)。 
+ 您要在 Infoblox 設備上新增記錄的現有 DNS 授權區域。如需詳細資訊，請參閱 Infoblox 文件中的[設定授權區域](https://docs.infoblox.com/display/nios86/Configuring+Authoritative+Zones)。 
+ AWS Organizations 中的兩個作用中 AWS 帳戶。一個帳戶是中樞帳戶，另一個帳戶是輻條帳戶。
+ 中樞和輻條帳戶必須位於相同的 AWS 區域。 
+ 中樞帳戶的 VPC 必須連線至 Infoblox 設備；例如，使用 AWS Transit Gateway 或 VPC 對等互連。
+ [AWS Serverless Application Model (AWS SAM)](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html)，使用 AWS Cloud9 或 AWS CloudShell 在本機安裝和設定。
+ `Infoblox-Hub.zip` 和 `ClientTest.yaml` 檔案 （已連接），下載至包含 AWS SAM 的本機環境。

**限制**
+ AWS CloudFormation 自訂資源的服務權杖必須來自建立堆疊的相同區域。我們建議您在每個區域中使用中樞帳戶，而不是在一個區域中建立 Amazon Simple Notification Service (Amazon SNS) 主題，並在另一個區域中呼叫 Lambda 函數。

**產品版本**
+ Infoblox WAPI 2.7 版

## Architecture
<a name="create-infoblox-objects-using-aws-cloudformation-custom-resources-and-amazon-sns-architecture"></a>

下圖顯示此模式的工作流程。 

![\[使用 AWS CloudFormation 自訂資源和 Amazon SNS 建立 Infoblox 物件。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/8d609d3f-6f5e-4084-849f-ca191db8055e/images/3594a064-e103-4211-84b7-da67c41ebb15.png)


下圖顯示此模式解決方案的下列元件：

1. AWS CloudFormation 自訂資源可讓您在AWS CloudFormation、更新或刪除堆疊時執行的範本中撰寫自訂佈建邏輯。當您建立堆疊時，AWS CloudFormation 會將`create`請求傳送至由 EC2 執行個體上執行之應用程式監控的 SNS 主題。

1. 來自 AWS CloudFormation 自訂資源的 Amazon SNS 通知會透過特定 AWS Key Management Service (AWS KMS) 金鑰加密，且存取權僅限於 Organizations 中組織中的帳戶。SNS 主題會啟動呼叫 Infoblox WAPI API 的 Lambda 資源。

1. Amazon SNS 會叫用下列 Lambda 函數，以使用 Infoblox WAPI URL、使用者名稱和密碼 AWS Secrets Manager Amazon Resource Name (ARNs) 做為環境變數： 
   + `dnsapi.lambda_handler` – 從 AWS CloudFormation `DNSName`自訂資源接收 `DNSType`、 和 `DNSValue`值，並使用它們來建立 DNS A 記錄和 CNAMES。
   + `ipaddr.lambda_handler` – 從 AWS CloudFormation 自訂資源接收 `VPCCIDR`、`SubnetPrefix`、 `Type`和 `Network Name`值，並使用這些資料將網路資料新增至 Infoblox IPAM 資料庫，或為自訂資源提供可用於建立新子網路的下一個可用網路。
   + `describeprefixes.lambda_handler` – 使用`"com.amazonaws."+Region+".s3"`篩選條件來擷取所需的 ，以呼叫 `describe_managed_prefix_lists` AWS API`prefix ID`。
**重要**  
這些 Lambda 函數是以 Python 撰寫，彼此類似，但呼叫不同的 APIs。

1. 您可以將 Infoblox 網格部署為實體、虛擬或雲端型網路設備。 它可以使用一系列 Hypervisor 部署在內部部署或做為虛擬設備，包括 VMware ESXi、Microsoft Hyper-V、Linux KVM 和 Xen。您也可以使用 Amazon Machine Image (AMI) 在 AWS 雲端上部署 Infoblox 網格。

1. 此圖顯示 Infoblox 網格的混合解決方案，它將 DNS 和 IPAM 提供給 AWS 雲端和內部部署上的資源。

**技術堆疊**
+ AWS CloudFormation
+ IAM
+ AWS KMS
+ AWS Lambda
+ AWS SAM
+ AWS Secrets Manager
+ Amazon SNS
+ Amazon VPC 

## 工具
<a name="create-infoblox-objects-using-aws-cloudformation-custom-resources-and-amazon-sns-tools"></a>
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) 可協助您設定 AWS 資源、快速且一致地佈建資源，以及在整個 AWS 帳戶和區域的生命週期中管理這些資源。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 可透過控制已驗證並獲授權使用的人員，協助您安全地管理對 AWS 資源的存取。
+ [AWS Key Management Service (AWS KMS)](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) 可協助您建立和控制密碼編譯金鑰，以協助保護您的資料。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一種運算服務，可協助您執行程式碼，而無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展，因此您只需按使用的運算時間付費。
+ [AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html) 是一種帳戶管理服務，可協助您將多個 AWS 帳戶合併到您建立並集中管理的組織。
+ [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) 可協助您以 API 呼叫 Secrets Manager，以程式設計方式擷取秘密，取代程式碼中的硬式編碼登入資料，包括密碼。
+ [AWS Serverless Application Model (AWS SAM)](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html) 是一種開放原始碼架構，可協助您在 AWS 雲端中建置無伺服器應用程式。
+ [Amazon Simple Notification Service (Amazon SNS)](https://docs.aws.amazon.com/sns/latest/dg/welcome.html) 可協助您協調和管理發佈者和用戶端之間的訊息交換，包括 Web 伺服器和電子郵件地址。
+ [Amazon Virtual Private Cloud (Amazon VPC)](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) 可協助您在已定義的虛擬網路中啟動 AWS 資源。這個虛擬網路類似於您在自己的資料中心內操作的傳統網路，具有使用可擴展的 AWS 基礎設施的優勢。

**Code**

您可以使用`ClientTest.yaml`範例 AWS CloudFormation 範本 （已連接） 來測試 Infoblox 中樞。您可以自訂 AWS CloudFormation 範本，以包含下表中的自訂資源。


|  | 
| --- |
| 使用 Infoblox 輻條自訂資源建立 A 記錄 | 傳回值： `infobloxref ` – Infoblox 參考資源範例：

```
ARECORDCustomResource:

  Type: "Custom::InfobloxAPI"

  Properties:

    ServiceToken: !Sub  arn:aws:sns:${AWS::Region}:${HubAccountID}:RunInfobloxDNSFunction

    DNSName: 'arecordtest.company.com'

    DNSType: 'ARecord' 

    DNSValue: '10.0.0.1'
``` | 
| --- |--- |
| 使用 Infoblox 語音自訂資源建立 CNAME 記錄 | **傳回值**： `infobloxref ` – Infoblox 參考**資源範例**：<pre>CNAMECustomResource:<br /><br />  Type: "Custom::InfobloxAPI"<br /><br />  Properties:<br /><br />    ServiceToken: !Sub arn:aws:sns:${AWS::Region}:${HubAccountID}:RunInfoblox    <br /><br />    DNSFunction<br /><br />    DNSName: 'cnametest.company.com'<br /><br />    DNSType: 'cname' <br /><br />    DNSValue: 'aws.amazon.com'</pre> | 
| 使用 Infoblox 輻條自訂資源建立網路物件 | **傳回值：**`infobloxref ` – Infoblox 參考`network` – 網路範圍 （與 相同`VPCCIDR`)**資源範例：**<pre>VPCCustomResource:<br /><br />  Type: 'Custom::InfobloxAPI'<br /><br />  Properties:<br /><br />    ServiceToken: !Sub  arn:aws:sns:${AWS::Region}:${HubAccountID}:RunInfobloxNextSubnetFunction<br /><br />    VPCCIDR: !Ref VpcCIDR<br /><br />    Type: VPC<br /><br />    NetworkName: My-VPC</pre> | 
| 使用 Infoblox 輻條自訂資源擷取下一個可用的子網路 | **傳回值：**`infobloxref` – Infoblox 參考`network ` – 子網路的網路範圍**資源範例：**<pre>Subnet1CustomResource:<br /><br />  Type: 'Custom::InfobloxAPI'<br /><br />  DependsOn: VPCCustomResource<br /><br />  Properties:<br /><br />    ServiceToken: !Sub  arn:aws:sns:${AWS::Region}:${HubAccountID}:RunInfobloxNextSubnetFunction<br /><br />    VPCCIDR: !Ref VpcCIDR<br /><br />    Type: Subnet<br /><br />    SubnetPrefix: !Ref SubnetPrefix<br /><br />NetworkName: My-Subnet</pre> | 

## 史詩
<a name="create-infoblox-objects-using-aws-cloudformation-custom-resources-and-amazon-sns-epics"></a>

### 建立和設定中樞帳戶的 VPC
<a name="create-and-configure-the-hub-accountrsquor-s-vpc"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立與 Infoblox 設備連線的 VPC。 | 登入您中樞帳戶的 AWS 管理主控台，並依照 AWS Quick [Starts 中 AWS Cloud Quick Start 參考部署上的 Amazon VPC](https://aws-quickstart.github.io/quickstart-aws-vpc/) 中的步驟建立 VPC。VPC 必須具有與 Infoblox 設備的 HTTPS 連線，建議您為此連線使用私有子網路。 | 網路管理員、系統管理員 | 
| （選用） 建立私有子網路的 VPC 端點。 | VPC 端點為您的私有子網路提供公有服務的連線。需要下列端點：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-infoblox-objects-using-aws-cloudformation-custom-resources-and-amazon-sns.html)如需為私有子網路建立端點的詳細資訊，請參閱 Amazon [VPC 文件中的 VPC 端點](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints.html)。 | 網路管理員、系統管理員 | 

### 部署 Infoblox 中樞
<a name="deploy-the-infoblox-hub"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建置 AWS SAM 範本。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-infoblox-objects-using-aws-cloudformation-custom-resources-and-amazon-sns.html) | 開發人員、系統管理員 | 
| 部署 AWS SAM 範本。 | `sam deploy` 命令會取得必要的參數並將其儲存至 `samconfig.toml` 檔案、將 AWS CloudFormation 範本和 Lambda 函數存放在 S3 儲存貯體，然後將 AWS CloudFormation 範本部署到您的中樞帳戶。 下列範例程式碼示範如何部署 AWS SAM 範本：<pre>$ sam deploy --guided<br /><br />Configuring SAM deploy<br />======================<br />        Looking for config file [samconfig.toml] :  Found<br />        Reading default arguments  :  Success<br />        Setting default arguments for 'sam deploy'<br />        =========================================<br />        Stack Name [Infoblox-Hub]:<br />        AWS Region [eu-west-1]:<br />        Parameter InfobloxUsername:<br />        Parameter InfobloxPassword:<br />        Parameter InfobloxIPAddress [xxx.xxx.xx.xxx]:<br />        Parameter AWSOrganisationID [o-xxxxxxxxx]:<br />        Parameter VPCID [vpc-xxxxxxxxx]:<br />        Parameter VPCCIDR [xxx.xxx.xxx.xxx/16]:<br />        Parameter VPCSubnetID1 [subnet-xxx]:<br />        Parameter VPCSubnetID2 [subnet-xxx]:<br />        Parameter VPCSubnetID3 [subnet-xxx]:<br />        Parameter VPCSubnetID4 []: <br />        #Shows you resources changes to be deployed and require a 'Y' to initiate deploy<br />        Confirm changes before deploy [Y/n]: y<br />        #SAM needs permission to be able to create roles to connect to the resources in your template<br />Allow SAM CLI IAM role creation [Y/n]: n<br />Capabilities [['CAPABILITY_NAMED_IAM']]:<br />        Save arguments to configuration file [Y/n]: y<br />        SAM configuration file [samconfig.toml]:<br />        SAM configuration environment [default]: </pre>您每次都必須使用 `--guided`選項，因為 Infoblox 登入憑證不會存放在 `samconfig.toml` 檔案中。 | 開發人員、系統管理員 | 

## 相關資源
<a name="create-infoblox-objects-using-aws-cloudformation-custom-resources-and-amazon-sns-resources"></a>
+ [使用 Postman 開始使用 WAPIs ](https://blogs.infoblox.com/community/getting-started-with-wapis-using-postman/) (Infoblox 部落格）
+ [使用 BYOL 模型佈建 AWS 的 vNIOS ](https://docs.infoblox.com/display/NAIG/Provisioning+vNIOS+for+AWS+Using+the+BYOL+Model)(Infoblox 文件）
+ [quickstart-aws-vpc](https://github.com/aws-quickstart/quickstart-aws-vpc) (GitHub 儲存庫）
+ [describe\$1managed\$1prefix\$1lists](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2.html#EC2.Client.describe_managed_prefix_lists) （適用於 Python 的 AWS 開發套件文件）

## 附件
<a name="attachments-8d609d3f-6f5e-4084-849f-ca191db8055e"></a>

若要存取與本文件相關聯的其他內容，請解壓縮下列檔案： [attachment.zip](samples/p-attach/8d609d3f-6f5e-4084-849f-ca191db8055e/attachments/attachment.zip)

# AWS 使用 Terraform 在 上建立階層式多區域 IPAM 架構
<a name="multi-region-ipam-architecture"></a>

*Donny Schreiber，Amazon Web Services*

## 總結
<a name="multi-region-ipam-architecture-summary"></a>

*IP 地址管理 (IPAM)* 是網路管理的關鍵元件，隨著組織擴展其雲端基礎設施而變得越來越複雜。如果沒有適當的 IPAM，組織會面臨 IP 地址衝突、地址空間浪費，以及可能導致中斷和應用程式停機的複雜故障診斷的風險。此模式示範如何使用 HashiCorp Terraform 為 AWS 企業環境實作全面的 IPAM 解決方案。它可協助組織建立階層式多區域 IPAM 架構，以促進組織中所有 AWS 帳戶 的集中式 IP 地址管理[AWS](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_getting-started_concepts.html#organization-structure)。

此模式可協助您使用複雜的四層集區階層實作 [Amazon VPC IP Address Manager](https://docs.aws.amazon.com/vpc/latest/ipam/what-it-is-ipam.html)：頂層集區、區域集區、業務單位集區和環境特定集區。此結構支援適當的 IP 地址控管，同時啟用將 IP 管理委派給組織內適當的團隊。解決方案使用 AWS Resource Access Manager (AWS RAM) 在整個組織中無縫共用 IP Address Manager 集區。 AWS RAM 集中和標準化 IPAM 規格，團隊可以在所有受管帳戶中建置這些規格。

此模式可協助您達成下列目標：
+ 自動化跨 AWS 區域、業務單位和環境的 IP 地址配置。
+ 透過程式設計驗證強制執行組織網路政策。
+ 隨著業務需求的演進，有效率地擴展網路基礎設施。
+ 透過集中管理 IP 地址空間來降低營運開銷。
+ 使用自助式 CIDR 範圍配置加速雲端原生工作負載部署。
+ 透過以政策為基礎的控制和驗證來防止解決衝突。

## 先決條件和限制
<a name="multi-region-ipam-architecture-prereqs"></a>

**先決條件**
+ 一或多個 AWS 帳戶，以組織身分管理 AWS Organizations。
+ 做為 IP Address Manager 委派管理員的網路中樞或網路管理帳戶。
+ AWS Command Line Interface (AWS CLI)，[已安裝](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)並[設定](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)。
+ [已安裝](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli) Terraform 1.5.0 版或更新版本。
+ AWS Terraform 的提供者，[已設定](https://registry.terraform.io/providers/hashicorp/aws/latest/docs)。
+ 管理 [IP Address Manager](https://docs.aws.amazon.com/vpc/latest/ipam/iam-ipam.html)、 [AWS RAM](https://docs.aws.amazon.com/ram/latest/userguide/security-iam.html)和[虛擬私有雲端 (VPCs](https://docs.aws.amazon.com/vpc/latest/userguide/security-iam.html)許可，已在 AWS Identity and Access Management (IAM) 中設定。

**限制**
+ IP Address Manager [受限於服務配額](https://docs.aws.amazon.com/vpc/latest/ipam/quotas-ipam.html)。集區的預設服務配額為每個範圍 50 個。為 6 個區域、2 個業務單位和 4 個環境執行此部署會建立 67 個集區。因此，可能需要增加配額。
+ 在配置資源之後修改或刪除 IP Address Manager 集區可能會導致相依性問題。您必須先[釋出配置](https://docs.aws.amazon.com/vpc/latest/ipam/release-alloc-ipam.html)，才能刪除集區。
+ 在 IP Address Manager 中，[資源監控](https://docs.aws.amazon.com/vpc/latest/ipam/monitor-cidr-compliance-ipam.html)可能會在反映資源變更時發生些微延遲。此延遲可能約為 20 分鐘。
+ IP Address Manager 無法自動強制執行不同範圍的 IP 地址唯一性。
+ 自訂標籤必須遵循[AWS 標記最佳實務](https://docs.aws.amazon.com/whitepapers/latest/tagging-best-practices/tagging-best-practices.html)。例如，每個金鑰都必須是唯一的，且不能以 開頭`aws:`。
+ 將 IP Address Manager 與組織外部的帳戶整合時，有一些[考量和限制](https://docs.aws.amazon.com/vpc/latest/ipam/enable-integ-ipam-outside-org-considerations.html)。

## Architecture
<a name="multi-region-ipam-architecture-architecture"></a>

**目標架構**

*IP Address Manager 組態和集區階層*

下圖顯示目標架構的邏輯建構。*範圍*是 IP Address Manager 中的最高層級容器。每個範圍代表單一網路的 IP 地址空間。*集區*是範圍內連續 IP 地址範圍 （或 CIDR 範圍） 的集合。集區可協助您根據您的路由和安全需求組織 IP 地址。此圖表顯示四個層級的集區：頂層集區、區域集區、業務單位集區和環境集區。

![\[網路帳戶中單一 AWS 區域中的私有範圍和四個層級的集區。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/780e344e-37f7-4b70-8d7c-94ec67a29305/images/1e23b2a7-a274-4a19-9097-61d8a31dfbf8.png)


此解決方案會建立清晰的 IP Address Manager 集區階層：

1. 最上層集區包含整個組織 IP 地址空間，例如 `10.176.0.0/12`。

1. 區域集區適用於區域特定的配置，例如 `10.176.0.0/15` `us-east-1`。

1. 業務單位集區是每個集區中的特定網域配置 AWS 區域。例如， `us-east-1`區域中的財務業務單位可能會有 `10.176.0.0/16`。

1. 環境集區是不同環境的特定用途配置。例如， `us-east-1`區域中的財務業務單位可能具有生產環境`10.176.0.0/18`的 。

此部署拓撲會在地理上分配 IP Address Manager 資源，同時維持集中式控制。以下是其功能：
+ IP Address Manager 部署在單一主要節點中 AWS 區域。
+ 其他區域會註冊為[操作區域](https://docs.aws.amazon.com/vpc/latest/ipam/mod-ipam-region.html)，其中 IP Address Manager 可以管理資源。
+ 每個操作區域都會從最上層集區接收專用地址集區。
+ 所有操作區域中的資源都會透過主要區域中的 IP Address Manager 集中管理。
+ 每個區域集區都有與其區域繫結的區域設定屬性，協助您正確配置資源。

*進階 CIDR 範圍驗證*

此解決方案旨在防止部署無效的組態。當您透過 Terraform 部署集區時，會在 Terraform 計劃階段驗證下列項目：
+ 驗證所有環境 CIDR 範圍都包含在其父業務單位 CIDR 範圍內
+ 確認所有業務單位 CIDR 範圍都包含在其父區域 CIDR 範圍內
+ 驗證所有區域 CIDR 範圍是否包含在最上層 CIDR 範圍內
+ 檢查相同階層層級內是否有重疊的 CIDR 範圍
+ 驗證環境與其個別業務單位的適當映射

*CIDR 範圍配置*

下圖顯示開發人員或管理員如何建立新的 VPCs 並從集區層級配置 IP 地址的範例。

![\[網路帳戶中單一 AWS 區域中的私有範圍和四個層級的集區。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/780e344e-37f7-4b70-8d7c-94ec67a29305/images/7c3de2e3-e71b-4fc0-abcd-7e88cfab5c87.png)


該圖顯示以下工作流程：

1. 透過 AWS 管理主控台、 或透過基礎設施即程式碼 (IaC) AWS CLI，開發人員或管理員會請求`AY3`環境集區中下一個可用的 CIDR 範圍。

1. IP Address Manager 會將該集區中的下一個可用 CIDR 範圍配置給 `AY3-4` VPC。無法再使用此 CIDR 範圍。

**自動化和擴展**

此解決方案專為可擴展性而設計，如下所示：
+ **區域擴展** – 透過使用其他區域集區項目擴展 Terraform 組態來新增區域。
+ **業務單位成長** – 透過將新業務單位新增至 BU 組態映射來支援新業務單位。
+ **環境彈性** – 根據組織需求設定不同的環境類型，例如開發或生產。
+ **多帳戶支援** – 透過 將集區分享到組織中的所有帳戶 AWS RAM。
+ **自動化 VPC 佈建** – 與 VPC 佈建工作流程整合，以自動化 CIDR 範圍配置。

階層結構也允許不同規模的委派和控制，如下所示：
+ 網路管理員可能會管理最上層和區域集區。
+ 業務單位 IT 團隊可能已委派控制各自的集區。
+ 應用程式團隊可能會使用其指定環境集區的 IP 地址。

**注意**  
您也可以將此解決方案與 [AWS Control Tower Account Factory for Terraform (AFT)](https://docs.aws.amazon.com/controltower/latest/userguide/aft-overview.html) 整合。如需詳細資訊，請參閱此模式[額外資訊](#multi-region-ipam-architecture-additional)區段中的*與 AFT 整合*。

## 工具
<a name="multi-region-ipam-architecture-tools"></a>

**AWS 服務**
+ [Amazon CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html) 可協助您 AWS 即時監控 AWS 資源的指標，以及您在 上執行的應用程式。
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) 是一種開放原始碼工具，可協助您 AWS 服務 透過命令列 shell 中的命令與 互動。
+ [AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html) 是一種帳戶管理服務，可協助您將多個 合併 AWS 帳戶 到您建立並集中管理的組織。
+ [AWS Resource Access Manager (AWS RAM)](https://docs.aws.amazon.com/ram/latest/userguide/what-is.html) 可協助您安全地跨 共用資源 AWS 帳戶 ，以減少營運開銷並提供可見性和可稽核性。
+ [Amazon Virtual Private Cloud (Amazon VPC)](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) 可協助您在已定義的虛擬網路中啟動 AWS 資源。此虛擬網路與您在自己的資料中心中操作的傳統網路相似，且具備使用 AWS可擴展基礎設施的優勢。[IP Address Manager](https://docs.aws.amazon.com/vpc/latest/ipam/what-it-is-ipam.html) 是 Amazon VPC 的一項功能。它可協助您規劃、追蹤和監控 AWS 工作負載的 IP 地址。

**其他工具**
+ [HashiCorp Terraform](https://www.terraform.io/docs) 是一種基礎設施即程式碼 (IaC) 工具，可協助您使用程式碼來佈建和管理雲端基礎設施和資源。

**程式碼儲存庫**

此模式的程式碼可在 GitHub 上儲存庫[的階層式 IPAM 實作範例 AWS](https://github.com/aws-samples/sample-amazon-vpc-ipam-terraform)** **中取得。儲存庫結構包括：
+ **根模組** – 部署協同運作和輸入變數。
+ **IPAM 模組** – 此模式中所述架構的核心實作。
+ **標籤模組** – 所有資源的標準化標記。

## 最佳實務
<a name="multi-region-ipam-architecture-best-practices"></a>

請考慮下列網路規劃的最佳實務：
+ **先規劃** – 在部署之前徹底規劃 IP 地址空間。如需詳細資訊，請參閱[規劃 IP 地址佈建](https://docs.aws.amazon.com/vpc/latest/ipam/planning-ipam.html)。
+ **避免重疊的 CIDR 範圍** – 確保每個層級的 CIDR 範圍不會重疊。
+ **預留緩衝空間** – 一律配置比立即所需更大的 CIDR 範圍，以適應成長。
+ **文件 IP 地址配置** – 維護 IP 地址配置策略的文件。

請考慮下列部署最佳實務：
+ **從非生產開始** – 首先在非生產環境中部署。
+ **使用 Terraform 狀態管理** – 實作遠端狀態儲存和鎖定。如需詳細資訊，請參閱 Terraform 文件中的[狀態儲存和鎖定](https://developer.hashicorp.com/terraform/language/state/backends)。
+ **實作版本控制** – 版本控制所有 Terraform 程式碼。
+ **實作 CI/CD 整合** – 使用持續整合和持續交付 (CI/CD) 管道進行可重複的部署。

請考慮下列操作最佳實務：
+ **啟用自動匯入** – 設定 IP Address Manager 集區以自動探索和匯入現有資源。依照[編輯 IPAM 集區](https://docs.aws.amazon.com/vpc/latest/ipam/mod-pool-ipam.html)中的指示開啟自動匯入。
+ **監控 IP 地址使用率** – 設定 IP 地址使用率閾值的警示。如需詳細資訊，請參閱[使用 Amazon CloudWatch 監控 IPAM](https://docs.aws.amazon.com/vpc/latest/ipam/cloudwatch-ipam.html)。
+ **定期稽核** – 定期稽核 IP 地址使用情況和合規性。如需詳細資訊，請參閱[追蹤 IPAM 中的 IP 地址用量](https://docs.aws.amazon.com/vpc/latest/ipam/tracking-ip-addresses-ipam.html)。
+ **清除未使用的配置** – 解除委任資源時釋出 IP 地址配置。如需詳細資訊，請參閱[從集區取消佈建 CIDRs](https://docs.aws.amazon.com/vpc/latest/ipam/depro-pool-cidr-ipam.html)。

請考慮下列安全最佳實務：
+ **實作最低權限** – 使用具有最低必要許可的 IAM 角色。如需詳細資訊，請參閱 [IAM 中的安全最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)和 [IPAM 中的身分和存取管理](https://docs.aws.amazon.com/vpc/latest/ipam/iam-ipam.html)。
+ **使用服務控制政策** – 實作服務控制政策 SCPs)，以在組織中強制執行 IP Address Manager 用量。如需詳細資訊，請參閱[使用 SCPs 強制使用 IPAM 建立 VPC](https://docs.aws.amazon.com/vpc/latest/ipam/scp-ipam.html)。
+ **控制資源共用** – 仔細管理其中 IP Address Manager 資源共用的範圍 AWS RAM。如需詳細資訊，請參閱[使用 共用 IPAM 集區 AWS RAM](https://docs.aws.amazon.com/vpc/latest/ipam/share-pool-ipam.html)。
+ **強制標記** – 對與 IP Address Manager 相關的所有資源實作強制標記。如需詳細資訊，請參閱[其他資訊](#multi-region-ipam-architecture-additional)區段中的*標記策略*。

## 史詩
<a name="multi-region-ipam-architecture-epics"></a>

### 設定 IP Address Manager 的委派管理員帳戶
<a name="set-up-a-delegated-administrator-account-for-ip-address-manager"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 啟用 AWS Organizations 功能。 | 確定 AWS Organizations 已啟用所有功能。如需說明，請參閱 AWS Organizations 文件中的[為使用 的組織啟用所有功能 AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_org_support-all-features.html)。 | AWS 管理員 | 
| 在 中啟用資源共用 AWS RAM。 | 使用 AWS CLI，輸入下列命令為您的組織啟用 AWS RAM 資源共用：<pre>aws ram enable-sharing-with-aws-organization</pre>如需詳細資訊，請參閱 AWS RAM 文件中的在 [中啟用資源共用 AWS Organizations](https://docs.aws.amazon.com/ram/latest/userguide/getting-started-sharing.html#getting-started-sharing-orgs)。 | AWS 管理員 | 
| 指定 IP Address Manager 的管理員。 | 從組織的管理帳戶中，使用 AWS CLI輸入下列命令，其中 `123456789012`是將管理 IP Address Manager 的帳戶 ID：<pre>aws ec2 enable-ipam-organization-admin-account \<br />    --delegated-admin-account-id 123456789012</pre>一般而言，網路或網路中樞帳戶會用作 IP Address Manager 的委派管理員。如需詳細資訊，請參閱 [IP Address Manager 文件中的將 IPAM 與 AWS Organization 中的帳戶整合](https://docs.aws.amazon.com/vpc/latest/ipam/enable-integ-ipam.html)。 | AWS 管理員 | 

### 部署基礎設施
<a name="deploy-the-infrastructure"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 定義網路架構。 | 定義並記錄您的網路架構，包括區域、業務單位和環境的 CIDR 範圍。如需詳細資訊，請參閱 [IP Address Manager 文件中的規劃 IP 地址佈建](https://docs.aws.amazon.com/vpc/latest/ipam/planning-ipam.html)。 | 網路工程師 | 
| 複製儲存庫。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/multi-region-ipam-architecture.html) | DevOps 工程師 | 
| 設定變數。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/multi-region-ipam-architecture.html) | Terraform 網路工程師 | 
| 部署 IP Address Manager 資源。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/multi-region-ipam-architecture.html) | Terraform | 
| 驗證部署。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/multi-region-ipam-architecture.html) | General AWS，網路工程師 | 

### 建立 VPCs並設定監控
<a name="create-vpcs-and-set-up-monitoring"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 VPC。 | 請遵循 Amazon [VPC 文件中建立](https://docs.aws.amazon.com/vpc/latest/userguide/create-vpc.html) VPC 中的步驟。當您達到為 VPC 選擇 CIDR 範圍的步驟時，請從您的區域、業務單位和環境集區配置下一個可用的範圍。 | 一般 AWS、網路管理員、網路工程師 | 
| 驗證 CIDR 範圍配置。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/multi-region-ipam-architecture.html) | 一般 AWS、網路管理員、網路工程師 | 
| 監控 IP Address Manager。 | 設定與 IP Address Manager 資源配置相關的監控和警示。如需詳細資訊和指示，請參閱 [IP Address Manager 文件中的使用 Amazon CloudWatch 監控 IPAM](https://docs.aws.amazon.com/vpc/latest/ipam/cloudwatch-ipam.html) 和[依資源監控 CIDR 用量](https://docs.aws.amazon.com/vpc/latest/ipam/monitor-cidr-compliance-ipam.html)。 | 一般 AWS | 
| 強制使用 IP Address Manager。 | 在 中建立服務控制政策 (SCP) AWS Organizations ，要求組織中的成員在建立 VPC 時使用 IP Address Manager。如需說明，請參閱 [IP Address Manager 文件中的強制使用 IPAM 搭配 SCPs 建立 VPC](https://docs.aws.amazon.com/vpc/latest/ipam/scp-ipam.html)。 | General AWS、AWS 管理員 | 

## 疑難排解
<a name="multi-region-ipam-architecture-troubleshooting"></a>


| 問題 | 解決方案 | 
| --- | --- | 
| 找不到 IP Address Manager 資源時 Terraform 失敗 | 請確定 IP Address Manager 管理員帳戶已正確委派，且您的 AWS 提供者已向該帳戶進行身分驗證。 | 
| CIDR 範圍配置失敗 | 檢查請求的 CIDR 範圍是否在 IP Address Manager 集區的可用範圍內，且未與現有的配置重疊。 | 
| AWS RAM 共用問題 | 確認您的 AWS Organization 已啟用資源共用。確認 AWS RAM 共享中使用了正確的主體，即組織 Amazon Resource Name (ARN)。 | 
| 集區階層驗證錯誤 | 請確定子集區 CIDR 範圍已正確包含在其父集區 CIDR 範圍內，且不會與同級集區重疊。 | 
| 超過 IP Address Manager 配額限制 | 請求提高 IP Address Manager 集區的配額。如需詳細資訊，請參閱「Service Quotas 使用者指南」**中的[請求提高配額](https://docs.aws.amazon.com/servicequotas/latest/userguide/request-quota-increase.html)。 | 

## 相關資源
<a name="multi-region-ipam-architecture-resources"></a>

**AWS 服務 文件**
+ [Amazon VPC IP Address Manager 文件](https://docs.aws.amazon.com/vpc/latest/ipam/what-it-is-ipam.html)
+ [AWS Resource Access Manager 文件](https://docs.aws.amazon.com/ram/latest/userguide/what-is.html)
+ [AWS Organizations 文件](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html)

**AWS 部落格文章**
+ [使用 Amazon VPCs IP Address Manager 管理跨 VPC 和區域的 IP 集區](https://aws.amazon.com/blogs/networking-and-content-delivery/managing-ip-pools-across-vpcs-and-regions-using-amazon-vpc-ip-address-manager/)
+ [使用 Amazon VPC IP Address Manager 進行大規模的網路地址管理和稽核](https://aws.amazon.com/blogs/aws/network-address-management-and-auditing-at-scale-with-amazon-vpc-ip-address-manager/)

**影片和教學課程**
+ [AWS re：Invent 2022：Amazon VPC 設計和 IPAM (NET310) 的最佳實務](https://www.youtube.com/watch?v=XrEHsy_8RYs)
+ [AWS re：Invent 2022：進階 VPC 設計和新功能 (NET401)](https://www.youtube.com/watch?v=tbXTVpwx87o)

## 其他資訊
<a name="multi-region-ipam-architecture-additional"></a>

**與 AFT 整合**

您可以將此解決方案與 AWS Control Tower Account Factory for Terraform (AFT) 整合，以確保新佈建的帳戶自動接收適當的網路組態。透過在網路中樞帳戶中部署此 IPAM 解決方案，透過 AFT 建立的新帳戶可以在建立 VPCs 時參考共用 IP Address Manager 集區。

下列程式碼範例示範使用 AWS Systems Manager 參數存放區在帳戶自訂中的 AFT 整合：

```
# Get the IP Address Manager pool ID from Parameter Store
data "aws_ssm_parameter" "dev_ipam_pool_id" {
  name = "/org/network/ipam/finance/dev/pool-id"
}

# Create a VPC using the IP Address Manager pool
resource "aws_vpc" "this" {
  ipv4_ipam_pool_id   = data.aws_ssm_parameter.dev_ipam_pool_id.value
  ipv4_netmask_length = 24
  
  tags = {
    Name = "aft-account-vpc"
  }
}
```

**標記策略**

解決方案實作全方位的標記策略，以促進資源管理。下列程式碼範例示範如何使用：

```
# Example tag configuration
module "tags" {
  source = "./modules/tags"
  
  # Required tags
  product_name  = "enterprise-network"
  feature_name  = "ipam"
  org_id        = "finance"
  business_unit = "network-operations"
  owner         = "network-team"
  environment   = "prod"
  repo          = "https://github.com/myorg/ipam-terraform"
  branch        = "main"
  cost_center   = "123456"
  dr_tier       = "tier1"
  
  # Optional tags
  optional_tags = {
    "project"    = "network-modernization"
    "stack_role" = "infrastructure"
  }
}
```

這些標籤會自動套用至所有 IP Address Manager 資源。這有助於一致的控管、成本分配和資源管理。

# 自訂 的 Amazon CloudWatch 提醒 AWS Network Firewall
<a name="customize-amazon-cloudwatch-alerts-for-aws-network-firewall"></a>

*Jason Owens，Amazon Web Services*

## 總結
<a name="customize-amazon-cloudwatch-alerts-for-aws-network-firewall-summary"></a>

模式可協助您自訂由 產生的 Amazon CloudWatch 警示 AWS Network Firewall。您可以使用預先定義的規則，或建立自訂規則來判斷提醒的訊息、中繼資料和嚴重性。然後，您可以對這些提醒採取行動，或自動回應其他 Amazon 服務，例如 Amazon EventBridge。

在此模式中，您會產生 Suricata 相容防火牆規則。[Suricata](https://suricata.io/) 是一種開放原始碼威脅偵測引擎。您首先建立簡單的規則，然後測試它們以確認產生並記錄 CloudWatch 提醒。成功測試規則後，您可以修改規則以定義自訂訊息、中繼資料和嚴重性，然後再次測試以確認更新。

## 先決條件和限制
<a name="customize-amazon-cloudwatch-alerts-for-aws-network-firewall-prereqs"></a>

**先決條件**
+ 作用中 AWS 帳戶。
+ AWS Command Line Interface (AWS CLI) 在 Linux、macOS 或 Windows 工作站上安裝和設定。如需詳細資訊，請參閱[安裝或更新最新版本的 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。
+ AWS Network Firewall 已安裝並設定為使用 CloudWatch Logs。如需詳細資訊，請參閱[從 記錄網路流量 AWS Network Firewall](https://docs.aws.amazon.com/network-firewall/latest/developerguide/firewall-logging.html)。
+ 受 Network Firewall 保護之虛擬私有雲端 (VPC) 私有子網路中的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體。

**產品版本**
+ 對於 第 1 版 AWS CLI，請使用 1.18.180 或更新版本。對於 第 2 版 AWS CLI，請使用 2.1.2 或更新版本。
+ 來自 Suricata 5.0.2 版的 classification.config 檔案。如需此組態檔案的副本，請參閱[其他資訊](#customize-amazon-cloudwatch-alerts-for-aws-network-firewall-additional)一節。

## Architecture
<a name="customize-amazon-cloudwatch-alerts-for-aws-network-firewall-architecture"></a>

![\[EC2 執行個體請求會在 Network Firewall 中產生警示，將警示轉送至 CloudWatch\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/da6087a9-e942-4cfe-85e3-3b08de6f3ba5/images/778d85cd-bc87-4ed0-a161-d35eb5daa694.png)


架構圖顯示下列工作流程：

1. 私有子網路中的 Amazon EC2 執行個體會使用 [curl](https://curl.se/) 或 [Wget](https://www.gnu.org/software/wget/) 提出請求。

1. Network Firewall 會處理流量並產生提醒。

1. Network Firewall 會將記錄的警示傳送至 CloudWatch Logs。

## 工具
<a name="customize-amazon-cloudwatch-alerts-for-aws-network-firewall-tools"></a>

**AWS 服務**
+ [Amazon CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html) 可協助您 AWS 即時監控 AWS 資源的指標，以及您在 上執行的應用程式。
+ [Amazon CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) 可協助您集中所有系統、應用程式的日誌， AWS 服務 以便您可以監控日誌並將其安全地存檔。
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) 是一種開放原始碼工具，可協助您 AWS 服務 透過命令列 shell 中的命令與 互動。
+ [AWS Network Firewall](https://docs.aws.amazon.com/network-firewall/latest/developerguide/what-is-aws-network-firewall.html) 是 AWS 雲端中的虛擬私有雲端 (VPC) 的有狀態、受管網路防火牆以及入侵偵測和預防服務。 

**其他工具**
+ [curl](https://curl.se/) 是開放原始碼命令列工具和程式庫。
+ [GNU Wget](https://www.gnu.org/software/wget/) 是免費命令列工具。

## 史詩
<a name="customize-amazon-cloudwatch-alerts-for-aws-network-firewall-epics"></a>

### 建立防火牆規則和規則群組
<a name="create-the-firewall-rules-and-rule-group"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立規則。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/customize-amazon-cloudwatch-alerts-for-aws-network-firewall.html) | AWS 系統管理員、網路管理員 | 
| 建立規則群組。 | 在 中 AWS CLI，輸入下列命令。這會建立規則群組。<pre>❯ aws network-firewall create-rule-group \<br />        --rule-group-name custom --type STATEFUL \<br />        --capacity 10 --rules file://custom.rules \<br />        --tags Key=environment,Value=development</pre>以下為範例輸出。請記下`RuleGroupArn`您在後續步驟中需要的 。<pre>{<br />    "UpdateToken": "4f998d72-973c-490a-bed2-fc3460547e23",<br />    "RuleGroupResponse": {<br />        "RuleGroupArn": "arn:aws:network-firewall:us-east-2:1234567890:stateful-rulegroup/custom",<br />        "RuleGroupName": "custom",<br />        "RuleGroupId": "238a8259-9eaf-48bb-90af-5e690cf8c48b",<br />        "Type": "STATEFUL",<br />        "Capacity": 10,<br />        "RuleGroupStatus": "ACTIVE",<br />        "Tags": [<br />            {<br />                "Key": "environment",<br />                "Value": "development"<br />            }<br />        ]<br />    }</pre> | AWS 系統管理員 | 

### 更新防火牆政策
<a name="update-the-firewall-policy"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 取得防火牆政策的 ARN。 | 在 中 AWS CLI，輸入下列命令。這會傳回防火牆政策的 Amazon Resource Name (ARN)。記錄 ARN 以供稍後在此模式中使用。<pre>❯ aws network-firewall describe-firewall \<br />    --firewall-name aws-network-firewall-anfw \<br />    --query 'Firewall.FirewallPolicyArn'</pre>以下是此命令傳回的範例 ARN。<pre>"arn:aws:network-firewall:us-east-2:1234567890:firewall-policy/firewall-policy-anfw"</pre> | AWS 系統管理員 | 
| 更新防火牆政策。 | 在文字編輯器中，複製貼上下列程式碼。`<RuleGroupArn>` 將 取代為您在上一個 epic 中記錄的值。儲存檔案為 `firewall-policy-anfw.json`。<pre>{<br />    "StatelessDefaultActions": [<br />        "aws:forward_to_sfe"<br />    ],<br />    "StatelessFragmentDefaultActions": [<br />        "aws:forward_to_sfe"<br />    ],<br />    "StatefulRuleGroupReferences": [<br />        {<br />            "ResourceArn": "<RuleGroupArn>"<br />        }<br />    ]<br />}</pre>在 中輸入下列命令 AWS CLI。此命令需要[更新字符](https://docs.aws.amazon.com/cli/latest/reference/network-firewall/update-firewall-policy.html)才能新增新規則。字符用於確認自您上次擷取以來，政策尚未變更。<pre>UPDATETOKEN=(`aws network-firewall describe-firewall-policy \<br />              --firewall-policy-name firewall-policy-anfw \<br />              --output text --query UpdateToken`)<br /> <br /> aws network-firewall update-firewall-policy \<br /> --update-token $UPDATETOKEN \<br /> --firewall-policy-name firewall-policy-anfw \<br /> --firewall-policy file://firewall-policy-anfw.json</pre> | AWS 系統管理員 | 
| 確認政策更新。 | （選用） 如果您想要確認已新增規則並檢視政策格式，請在 中輸入下列命令 AWS CLI。<pre>❯ aws network-firewall describe-firewall-policy \<br />  --firewall-policy-name firewall-policy-anfw \<br />  --query FirewallPolicy</pre>以下為範例輸出。<pre>{<br />    "StatelessDefaultActions": [<br />        "aws:forward_to_sfe"<br />    ],<br />    "StatelessFragmentDefaultActions": [<br />        "aws:forward_to_sfe"<br />    ],<br />    "StatefulRuleGroupReferences": [<br />        {<br />            "ResourceArn": "arn:aws:network-firewall:us-east-2:1234567890:stateful-rulegroup/custom"<br />        }<br />    ]<br />}</pre> | AWS 系統管理員 | 

### 測試提醒功能
<a name="test-alert-functionality"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 產生測試提醒。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/customize-amazon-cloudwatch-alerts-for-aws-network-firewall.html) | AWS 系統管理員 | 
| 驗證是否已記錄提醒。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/customize-amazon-cloudwatch-alerts-for-aws-network-firewall.html) | AWS 系統管理員 | 

### 更新防火牆規則和規則群組
<a name="update-the-firewall-rules-and-rule-group"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 更新防火牆規則。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/customize-amazon-cloudwatch-alerts-for-aws-network-firewall.html) | AWS 系統管理員 | 
| 更新規則群組。 | 在 中 AWS CLI，執行下列命令。使用防火牆政策的 ARN。這些命令會取得更新字符，並使用規則變更來更新規則群組。<pre>❯ UPDATETOKEN=(`aws network-firewall \<br />                describe-rule-group \<br />--rule-group-arn arn:aws:network-firewall:us-east-2:123457890:stateful-rulegroup/custom \<br />--output text --query UpdateToken`)</pre><pre> ❯ aws network-firewall update-rule-group \<br />  --rule-group-arn arn:aws:network-firewall:us-east-2:1234567890:stateful-rulegroup/custom \<br />--rules file://custom.rules \<br />--update-token $UPDATETOKEN</pre>以下為範例輸出。<pre>{<br />    "UpdateToken": "7536939f-6a1d-414c-96d1-bb28110996ed",<br />    "RuleGroupResponse": {<br />        "RuleGroupArn": "arn:aws:network-firewall:us-east-2:1234567890:stateful-rulegroup/custom",<br />        "RuleGroupName": "custom",<br />        "RuleGroupId": "238a8259-9eaf-48bb-90af-5e690cf8c48b",<br />        "Type": "STATEFUL",<br />        "Capacity": 10,<br />        "RuleGroupStatus": "ACTIVE",<br />        "Tags": [<br />            {<br />                "Key": "environment",<br />                "Value": "development"<br />            }<br />        ]<br />    }<br />}</pre> | AWS 系統管理員 | 

### 測試更新的提醒功能
<a name="test-the-updated-alert-functionality"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 產生測試提醒。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/customize-amazon-cloudwatch-alerts-for-aws-network-firewall.html) | AWS 系統管理員 | 
| 驗證已變更的提醒。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/customize-amazon-cloudwatch-alerts-for-aws-network-firewall.html) | AWS 系統管理員 | 

## 相關資源
<a name="customize-amazon-cloudwatch-alerts-for-aws-network-firewall-resources"></a>

**參考**
+ [從 傳送提醒 AWS Network Firewall 到 Slack 頻道](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/send-alerts-from-aws-network-firewall-to-a-slack-channel.html) (AWS 方案指引）
+ [AWS 使用 Suricata 在 上擴展威脅預防 ](https://aws.amazon.com/blogs/opensource/scaling-threat-prevention-on-aws-with-suricata/)(AWS 部落格文章）
+ [的部署模型 AWS Network Firewall](https://aws.amazon.com/blogs/networking-and-content-delivery/deployment-models-for-aws-network-firewall/) (AWS 部落格文章）
+ [Suricata 中繼金鑰 ](https://suricata.readthedocs.io/en/suricata-6.0.1/rules/meta.html)(Suricata 文件）

**教學課程和影片**
+ [AWS Network Firewall 研討會](https://networkfirewall.workshop.aws/)

## 其他資訊
<a name="customize-amazon-cloudwatch-alerts-for-aws-network-firewall-additional"></a>

以下是來自 Suricata 5.0.2 的分類組態檔案。建立防火牆規則時會使用這些分類。

```
# config classification:shortname,short description,priority
 
config classification: not-suspicious,Not Suspicious Traffic,3
config classification: unknown,Unknown Traffic,3
config classification: bad-unknown,Potentially Bad Traffic, 2
config classification: attempted-recon,Attempted Information Leak,2
config classification: successful-recon-limited,Information Leak,2
config classification: successful-recon-largescale,Large Scale Information Leak,2
config classification: attempted-dos,Attempted Denial of Service,2
config classification: successful-dos,Denial of Service,2
config classification: attempted-user,Attempted User Privilege Gain,1
config classification: unsuccessful-user,Unsuccessful User Privilege Gain,1
config classification: successful-user,Successful User Privilege Gain,1
config classification: attempted-admin,Attempted Administrator Privilege Gain,1
config classification: successful-admin,Successful Administrator Privilege Gain,1
 
# NEW CLASSIFICATIONS
config classification: rpc-portmap-decode,Decode of an RPC Query,2
config classification: shellcode-detect,Executable code was detected,1
config classification: string-detect,A suspicious string was detected,3
config classification: suspicious-filename-detect,A suspicious filename was detected,2
config classification: suspicious-login,An attempted login using a suspicious username was detected,2
config classification: system-call-detect,A system call was detected,2
config classification: tcp-connection,A TCP connection was detected,4
config classification: trojan-activity,A Network Trojan was detected, 1
config classification: unusual-client-port-connection,A client was using an unusual port,2
config classification: network-scan,Detection of a Network Scan,3
config classification: denial-of-service,Detection of a Denial of Service Attack,2
config classification: non-standard-protocol,Detection of a non-standard protocol or event,2
config classification: protocol-command-decode,Generic Protocol Command Decode,3
config classification: web-application-activity,access to a potentially vulnerable web application,2
config classification: web-application-attack,Web Application Attack,1
config classification: misc-activity,Misc activity,3
config classification: misc-attack,Misc Attack,2
config classification: icmp-event,Generic ICMP event,3
config classification: inappropriate-content,Inappropriate Content was Detected,1
config classification: policy-violation,Potential Corporate Privacy Violation,1
config classification: default-login-attempt,Attempt to login by a default username and password,2
 
# Update
config classification: targeted-activity,Targeted Malicious Activity was Detected,1
config classification: exploit-kit,Exploit Kit Activity Detected,1
config classification: external-ip-check,Device Retrieving External IP Address Detected,2
config classification: domain-c2,Domain Observed Used for C2 Detected,1
config classification: pup-activity,Possibly Unwanted Program Detected,2
config classification: credential-theft,Successful Credential Theft Detected,1
config classification: social-engineering,Possible Social Engineering Attempted,2
config classification: coin-mining,Crypto Currency Mining Activity Detected,2
config classification: command-and-control,Malware Command and Control Activity Detected,1
```

# 使用 Terraform 在 AWS Wavelength 區域中部署資源
<a name="deploy-resources-wavelength-zone-using-terraform"></a>

*Zahoor Chaudhrey 和 Luca Iannario，Amazon Web Services*

## 總結
<a name="deploy-resources-wavelength-zone-using-terraform-summary"></a>

[AWS Wavelength](https://docs.aws.amazon.com/wavelength/latest/developerguide/what-is-wavelength.html) 可協助您建置針對多存取邊緣運算 (MEC) 應用程式最佳化的基礎設施。*Wavelength 區域*是 AWS 基礎設施部署，可將 AWS 運算和儲存服務嵌入通訊服務供應商 (CSP) 5G 網路。來自 5G 裝置的應用程式流量會到達在 Wavelength 區域中執行的應用程式伺服器，而不會離開電信網路。以下內容有助於透過 Wavelength 進行網路連線：
+ **虛擬私有雲端 (VPCs)** – 中的 VPCs AWS 帳戶 可以延伸到多個可用區域，包括 Wavelength 區域。Amazon Elastic Compute Cloud (Amazon EC2) 執行個體和相關服務會顯示為區域 VPC 的一部分。VPCs是在 [Amazon Virtual Private Cloud (Amazon VPC)](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) 中建立和管理。
+ **電信業者閘道** – 電信業者閘道可透過 CSP 的網路，從 Wavelength 區域中的子網路連線至 CSP 網路、網際網路或 AWS 區域 。電信業者閘道有兩個用途。它允許來自特定位置 CSP 網路的傳入流量，並允許傳出流量到電信網路和網際網路。

此模式及其相關聯的 Terraform 程式碼可協助您在 Wavelength 區域中啟動資源，例如 Amazon EC2 執行個體、Amazon Elastic Block Store (Amazon EBS) 磁碟區、VPCs、子網路和電信業者閘道。

## 先決條件和限制
<a name="deploy-resources-wavelength-zone-using-terraform-prereqs"></a>

**先決條件**
+ 作用中 AWS 帳戶
+ 整合式開發環境 (IDE)
+ [選擇加入](https://docs.aws.amazon.com/wavelength/latest/developerguide/get-started-wavelength.html#enable-zone-group)目標 Wavelength 區域
+ AWS Command Line Interface (AWS CLI)，[已安裝](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)並[設定](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)
+ Terraform 1.8.4 版或更新版本，[已安裝](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli) (Terraform 文件）
+ Terraform AWS Provider 5.32.1 版或更新版本，[已設定](https://hashicorp.github.io/terraform-provider-aws/) (Terraform 文件）
+ Git，[已安裝](https://github.com/git-guides/install-git) (GitHub)
+ 建立 Amazon VPC、Wavelength 和 Amazon EC2 資源[的許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html) 

**限制**

並非所有 都 AWS 區域 支援 Wavelength 區域。如需詳細資訊，請參閱 [Wavelength 文件中的可用 Wavelength 區域](https://docs.aws.amazon.com/wavelength/latest/developerguide/available-wavelength-zones.html)。

## Architecture
<a name="deploy-resources-wavelength-zone-using-terraform-architecture"></a>

下圖顯示如何在 Wavelength 區域中建立子網路 AWS 和資源。在 Wavelength 區域中包含子網路的 VPCs 可以連接到電信業者閘道。電信業者閘道可讓您連線至下列資源：
+ 電信業者網路上的 4G/LTE 和 5G 裝置。
+ 已修正特定 Wavelength Zone 合作夥伴的無線存取。如需詳細資訊，請參閱[多重存取 AWS Wavelength](https://docs.aws.amazon.com/wavelength/latest/developerguide/multi-access.html)。
+ 將流量傳出至公有網際網路資源。

![\[電信業者閘道會將 Wavelength 區域中的 AWS 資源連線至 CSP 網路。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/8c507de1-208c-4563-bb58-52388ab2fa6d/images/a4cc0699-0cbc-4f15-ab14-3ae569ced7f4.png)


## 工具
<a name="deploy-resources-wavelength-zone-using-terraform-tools"></a>

**AWS 服務**
+ [Amazon Virtual Private Cloud (Amazon VPC)](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) 可協助您在已定義的虛擬網路中啟動 AWS 資源。此虛擬網路與您在自己的資料中心中操作的傳統網路相似，且具備使用 AWS可擴展基礎設施的優勢。
+ [AWS Wavelength](https://docs.aws.amazon.com/wavelength/latest/developerguide/what-is-wavelength.html) 將 AWS 雲端 基礎設施擴展到電信供應商的 5G 網路。這可協助您建置應用程式，為行動裝置和最終使用者提供極低延遲。

**其他工具**
+ [Terraform](https://www.terraform.io/) 是 HashiCorp 的基礎設施即程式碼 (IaC) 工具，可協助您建立和管理雲端和內部部署資源。

**程式碼儲存庫**

此模式的程式碼可在 GitHub [使用 Terraform 建立 AWS Wavelength 基礎設施](https://github.com/aws-samples/terraform-wavelength-infrastructure)儲存庫中取得。Terraform 程式碼會部署下列基礎設施和資源：
+ VPC
+ Wavelength 區域
+ Wavelength 區域中的 pubic 子網路
+ Wavelength 區域中的電信業者閘道
+ Wavelength 區域中的 Amazon EC2 執行個體

## 最佳實務
<a name="deploy-resources-wavelength-zone-using-terraform-best-practices"></a>
+ 部署之前，請確認您使用的是最新版本的 Terraform 和 AWS CLI。
+ 使用持續整合和持續交付 (CI/CD) 管道來部署 IaC。如需詳細資訊，請參閱 AWS 部落格上 [AWS CI/CD 管道中管理 Terraform 狀態檔案的最佳實務](https://aws.amazon.com/blogs/devops/best-practices-for-managing-terraform-state-files-in-aws-ci-cd-pipeline/)。

## 史詩
<a name="deploy-resources-wavelength-zone-using-terraform-epics"></a>

### 佈建 基礎設施
<a name="provision-the-infrastructure"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 複製儲存庫。 | 輸入下列命令，將[使用 Terraform 儲存庫建立 AWS Wavelength 基礎設施](https://github.com/aws-samples/terraform-wavelength-infrastructure)複製到您的環境。`git clone git@github.com:aws-samples/terraform-wavelength-infrastructure.git` | DevOps 工程師 | 
| 更新變數。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-resources-wavelength-zone-using-terraform.html) | DevOps 工程師，Terraform | 
| 初始化組態。 | 輸入下列命令來初始化工作目錄。<pre>terraform init</pre> | DevOps 工程師，Terraform | 
| 預覽 Terraform 計劃。 | 輸入下列命令，將目標狀態與您 AWS 環境的目前狀態進行比較。此命令會產生將設定的資源預覽。<pre>terraform plan</pre> | DevOps 工程師，Terraform | 
| 驗證和部署。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-resources-wavelength-zone-using-terraform.html) | DevOps 工程師，Terraform | 

### 驗證和清除
<a name="validate-and-clean-up"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 驗證基礎設施部署。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-resources-wavelength-zone-using-terraform.html) | AWS DevOps，DevOps 工程師 | 
| （選用） 清除基礎設施。 | 如果您需要刪除 Terraform 佈建的所有資源，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-resources-wavelength-zone-using-terraform.html) | DevOps 工程師，Terraform | 

## 疑難排解
<a name="deploy-resources-wavelength-zone-using-terraform-troubleshooting"></a>


| 問題 | 解決方案 | 
| --- | --- | 
| 連線至 中的 Amazon EC2 執行個體 AWS 區域。 | 請參閱[連線 Linux 執行個體的故障診斷](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/TroubleshootingInstancesConnecting.html)或[連線 Windows 執行個體的故障診斷](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/troubleshooting-windows-instances.html)。 | 
| 連線至 Wavelength 區域中的 Amazon EC2 執行個體。 | 請參閱[疑難排解在 Wavelength 區域中啟動之 EC2 執行個體的 SSH 或 RDP 連線](https://repost.aws/knowledge-center/ec2-wavelength-zone-connection-errors)。 | 
| Wavelength 區域中的容量。 | 請參閱 [Wavelength 區域的配額和考量](https://docs.aws.amazon.com/wavelength/latest/developerguide/wavelength-quotas.html)。 | 
| 從電信業者網路到 的行動或電信業者連線 AWS 區域。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-resources-wavelength-zone-using-terraform.html) | 

## 相關資源
<a name="deploy-resources-wavelength-zone-using-terraform-resources"></a>
+ [什麼是 AWS Wavelength？](https://docs.aws.amazon.com/wavelength/latest/developerguide/what-is-wavelength.html)
+ [AWS Wavelength 運作方式](https://docs.aws.amazon.com/wavelength/latest/developerguide/how-wavelengths-work.html)
+ [中的彈性 AWS Wavelength](https://docs.aws.amazon.com/wavelength/latest/developerguide/disaster-recovery-resiliency.html)

# 將大量 DNS 記錄遷移至 Amazon Route 53 私有託管區域
<a name="migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone"></a>

*Ram Kandaswamy，Amazon Web Services*

## 總結
<a name="migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone-summary"></a>

網路工程師和雲端管理員需要有效率且簡單的方法，將網域名稱系統 (DNS) 記錄新增至 Amazon Route 53 中的私有託管區域。使用手動方法將項目從 Microsoft Excel 工作表複製到 Route 53 主控台中的適當位置很繁瑣且容易出錯。此模式描述自動化方法，可減少新增多個記錄所需的時間和精力。它也為多個託管區域建立提供一組可重複的步驟。

此模式使用 Amazon Simple Storage Service (Amazon S3) 來存放記錄。為了有效率地使用資料，模式使用 JSON 格式，因為它簡單且能夠支援 Python 字典 (`dict` 資料類型）。

**注意**  
如果您可以從系統產生區域檔案，請考慮改用 [Route 53 匯入功能](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resource-record-sets-creating-import.html)。

## 先決條件和限制
<a name="migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone-prereqs"></a>

**先決條件**
+ 包含私有託管區域記錄的 Excel 工作表
+ 熟悉不同類型的 DNS 記錄，例如 A 記錄、Name Authority Pointer (NAPTR) 記錄和 SRV 記錄 （請參閱[支援的 DNS 記錄類型](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/ResourceRecordTypes.html))
+ 熟悉 Python 語言及其程式庫

**限制**
+ 模式不會為所有使用案例案例提供廣泛的涵蓋範圍。例如，[Change\$1resource\$1record\$1sets](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/route53.html#Route53.Client.change_resource_record_sets) 呼叫不會使用 API 的所有可用屬性。
+ 在 Excel 工作表中，假設每一列中的值是唯一的。每個完整網域名稱 (FQDN) 的多個值預期會出現在相同的資料列中。如果不正確，您應該修改此模式中提供的程式碼，以執行必要的串連。
+ 模式使用適用於 Python 的 AWS 開發套件 (Boto3) 直接呼叫 Route 53 服務。您可以增強程式碼以使用 `create_stack`和 `update_stack`命令的 AWS CloudFormation 包裝函式，並使用 JSON 值填入範本資源。

## Architecture
<a name="migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone-architecture"></a>

**技術堆疊**
+ 用於路由流量的 Route 53 私有託管區域
+ 用於儲存輸出 JSON 檔案的 Amazon S3 

![\[將大量 DNS 記錄遷移至 Route 53 私有託管區域的工作流程。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/a81c29ea-f0c5-4d4a-ba87-93111a0f1ee9/images/2ada844b-4147-4f9f-8883-d22605aa42d8.png)


工作流程包含這些步驟，如上圖所示，並在 *Epics* 章節中討論：

1. 將具有記錄集資訊的 Excel 工作表上傳至 S3 儲存貯體。

1. 建立並執行 Python 指令碼，將 Excel 資料轉換為 JSON 格式。

1. 從 S3 儲存貯體讀取記錄並清除資料。

1. 在私有託管區域中建立記錄集。

## 工具
<a name="migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone-tools"></a>
+ [Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html) –Amazon Route 53 是高度可用且可擴展的 DNS Web 服務，可處理網域註冊、DNS 路由和運作狀態檢查。
+ [Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) – Amazon Simple Storage Service (Amazon S3) 是一種物件儲存服務。您可以使用 Amazon S3 隨時從 Web 任何地方存放和擷取任意資料量。

## 史詩
<a name="migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone-epics"></a>

### 準備資料以進行自動化
<a name="prepare-data-for-automation"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 為您的記錄建立 Excel 檔案。 | 使用您從目前系統匯出的記錄來建立 Excel 工作表，其中包含記錄的必要資料欄，例如完整網域名稱 (FQDN)、記錄類型、存留時間 (TTL) 和值。對於 NAPTR 和 SRV 記錄，值是多個屬性的組合，因此請使用 Excel 的 `concat`方法來合併這些屬性。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone.html) | 資料工程師、Excel 技能 | 
| 驗證工作環境。 | 在您的 IDE 中，建立 Python 檔案，將 Excel 輸入工作表轉換為 JSON 格式。（您也可以使用 Amazon SageMaker 筆記本來使用 Python 程式碼，而不是 IDE。)確認您使用的 Python 版本是 3.7 版或更新版本。<pre> python3 --version</pre>安裝 **pandas** 套件。<pre> pip3 install pandas --user</pre> | 一般 AWS | 
| 將 Excel 工作表資料轉換為 JSON。 | 建立 Python 檔案，其中包含要從 Excel 轉換為 JSON 的下列程式碼。<pre>import pandas as pd<br />data=pd.read_excel('./Book1.xls')<br />data.to_json(path_or_buf='my.json',orient='records')</pre>其中 `Book1`是 Excel 工作表的名稱，而 `my.json`是輸出 JSON 檔案的名稱。 | 資料工程師、Python 技能 | 
| 將 JSON 檔案上傳至 S3 儲存貯體。 | 上傳 `my.json` 至 S3 儲存貯體。如需詳細資訊，請參閱 Amazon S3 文件中的[建立儲存貯](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)體。 | 應用程式開發人員 | 
| FqdnName | RecordType | Value | TTL | 
| something.example.org | A | 1.1.1.1 | 900 | 

### 插入記錄
<a name="insert-records"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立私有託管區域。 | 使用 [create\$1hosted\$1zone](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/route53.html#Route53.Client.create_hosted_zone) API 和下列 Python 範例程式碼來建立私有託管區域。將參數 `hostedZoneName`、 `vpcRegion`和 取代`vpcId`為您自己的值。<pre>import boto3<br />import random<br />hostedZoneName ="xxx"<br />vpcRegion = "us-east-1"<br />vpcId="vpc-xxxx"<br />route53_client = boto3.client('route53')<br />response = route53_client.create_hosted_zone(<br />        Name= hostedZoneName,<br />        VPC={<br />            'VPCRegion: vpcRegion,<br />            'VPCId': vpcId<br />        },<br />        CallerReference=str(random.random()*100000),<br />        HostedZoneConfig={<br />            'Comment': "private hosted zone created by automation",<br />            'PrivateZone': True<br />        }<br />    )<br /> print(response)</pre>您也可以使用基礎設施即程式碼 (IaC) 工具，例如 AWS CloudFormation，將這些步驟取代為使用適當資源和屬性建立堆疊的範本。 | 雲端架構師、網路管理員、Python 技能 | 
| 從 Amazon S3 擷取做為字典的詳細資訊。 | 使用下列程式碼從 S3 儲存貯體讀取，並以 Python 字典的形式取得 JSON 值。 <pre>fileobj = s3_client.get_object(<br />        Bucket=bucket_name,<br />        Key='my.json'<br />        )<br />    filedata = fileobj['Body'].read()<br />    contents = filedata.decode('utf-8')<br />    json_content=json.loads(contents)<br />    print(json_content)</pre>其中 `json_content`包含 Python 字典。 | 應用程式開發人員、Python 技能 | 
| 清除空格和 Unicode 字元的資料值。 | 為了確保資料正確性的安全措施，請使用下列程式碼對 中的值執行條紋操作`json_content`。此程式碼會移除每個字串前面和結尾的空格字元。它也會使用 `replace`方法來移除硬 （不中斷） 空格 (`\xa0`字元）。<pre>for item in json_content:<br />    fqn_name = unicodedata.normalize("NFKD",item["FqdnName"].replace("u'", "'").replace('\xa0', '').strip())<br />    rec_type = item["RecordType"].replace('\xa0', '').strip()<br />    res_rec = {<br />                 'Value': item["Value"].replace('\xa0', '').strip()<br />                }</pre> | 應用程式開發人員、Python 技能 | 
| 插入記錄。 | 使用以下程式碼做為上一個`for`迴圈的一部分。<pre>change_response = route53_client.change_resource_record_sets(<br />            HostedZoneId="xxxxxxxx",<br />            ChangeBatch={<br />                'Comment': 'Created by automation',<br />                'Changes': [<br />                    {<br />                        'Action': 'UPSERT',<br />                        'ResourceRecordSet': {<br />                            'Name': fqn_name,<br />                            'Type': rec_type,<br />                            'TTL': item["TTL"],<br />                            'ResourceRecords': res_rec<br />                        }<br />                    }<br />                ]<br />            }<br />    )</pre>其中 `xxxxxxx`是此史詩中第一個步驟的託管區域 ID。 | 應用程式開發人員、Python 技能 | 

## 相關資源
<a name="migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone-resources"></a>

**參考**
+ [透過匯入區域檔案建立記錄 ](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resource-record-sets-creating-import.html)(Amazon Route 53 文件）
+ [create\$1hosted\$1zone 方法](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/route53.html#Route53.Client.create_hosted_zone) (Boto3 文件）
+ [change\$1resource\$1record\$1sets 方法](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/route53.html#Route53.Client.change_resource_record_sets) (Boto3 文件）

**教學課程和影片**
+ [Python 教學課程](https://docs.python.org/3/tutorial/) (Python 文件）
+ [使用 Amazon Route 53 的 DNS 設計](https://www.youtube.com/watch?v=2y_RBjDkRgY) (YouTube 影片、*AWS Online Tech Talks*)

# 當您從 F5 遷移到 AWS 上的 Application Load Balancer 時修改 HTTP 標頭
<a name="modify-http-headers-when-you-migrate-from-f5-to-an-application-load-balancer-on-aws"></a>

*Sachin Trivedi，Amazon Web Services*

## 總結
<a name="modify-http-headers-when-you-migrate-from-f5-to-an-application-load-balancer-on-aws-summary"></a>

當您將使用 F5 Load Balancer 的應用程式遷移至 Amazon Web Services (AWS)，並想要在 AWS 上使用 Application Load Balancer 時，遷移 F5 規則以進行標頭修改是常見的問題。Application Load Balancer 不支援標頭修改，但您可以使用 Amazon CloudFront 做為內容交付網路 (CDN) 和 Lambda@Edge 來修改標頭。

此模式說明必要的整合，並透過使用 AWS CloudFront 和 Lambda@Edge 提供標頭修改的範例程式碼。

## 先決條件和限制
<a name="modify-http-headers-when-you-migrate-from-f5-to-an-application-load-balancer-on-aws-prereqs"></a>

**先決條件**
+ 內部部署應用程式，使用 F5 負載平衡器搭配使用 取代 HTTP 標頭值的組態`if, else`。如需此組態的詳細資訊，請參閱 F5 產品文件中的 [HTTP：：header](https://clouddocs.f5.com/api/irules/HTTP__header.html)。 

**限制**
+ 此模式適用於 F5 負載平衡器標頭自訂。對於其他第三方負載平衡器，請檢查負載平衡器文件以取得支援資訊。
+ 您用於 Lambda@Edge 的 Lambda 函數必須位於美國東部 （維吉尼亞北部） 區域。

## Architecture
<a name="modify-http-headers-when-you-migrate-from-f5-to-an-application-load-balancer-on-aws-architecture"></a>

下圖顯示 AWS 上的架構，包括 CDN 和其他 AWS 元件之間的整合流程。

![\[使用 Amazon CloudFront 和 Lambda@Edge 修改標頭的架構\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/00abbe3c-2453-4291-9b24-b488dced4868/images/4ee9a19e-6da2-4c5a-a8bc-19d3918a166e.png)


## 工具
<a name="modify-http-headers-when-you-migrate-from-f5-to-an-application-load-balancer-on-aws-tools"></a>

**AWS 服務**
+ [Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html) - Application Load Balancer 是一種 AWS 全受管負載平衡服務，可在開放系統互連 (OSI) 模型的第七層運作。它平衡多個目標的流量，並支援基於 HTTP 標頭和方法、查詢字串以及主機型或路徑型路由的進階路由請求。
+ [Amazon CloudFront](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Introduction.html) – Amazon CloudFront 是一種 Web 服務，可加速將靜態和動態 Web 內容，例如 .html、.css、.js 和映像檔案分發給使用者。CloudFront 透過稱為節點的全球資料中心網路提供內容，以降低延遲並改善效能。
+ [Lambda@Edge](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html) ─ Lambda@Edge 是 AWS Lambda 的延伸，可讓您執行函數來自訂 CloudFront 提供的內容。您可以在美國東部 （維吉尼亞北部） 區域中編寫函數，然後將函數與 CloudFront 分佈建立關聯，以在全球各地自動複寫程式碼，而無需佈建或管理伺服器。這可減少延遲並改善使用者體驗。

**Code**

下列範例程式碼提供修改 CloudFront 回應標頭的藍圖。遵循 *Epics* 區段中的指示來部署程式碼。

```
exports.handler = async (event, context) => {
    const response = event.Records[0].cf.response;
    const headers = response.headers;


    const headerNameSrc = 'content-security-policy';
    const headerNameValue = '*.xyz.com';


    if (headers[headerNameSrc.toLowerCase()]) {
        headers[headerNameSrc.toLowerCase()] = [{
            key: headerNameSrc,
            value: headerNameValue,
        }];
        console.log(`Response header "${headerNameSrc}" was set to ` +
                    `"${headers[headerNameSrc.toLowerCase()][0].value}"`);
    }
    else {
            headers[headerNameSrc.toLowerCase()] = [{
            key: headerNameSrc,
            value: headerNameValue,
            }];
    }
    return response;
};
```

## 史詩
<a name="modify-http-headers-when-you-migrate-from-f5-to-an-application-load-balancer-on-aws-epics"></a>

### 建立 CDN 分佈
<a name="create-a-cdn-distribution"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 CloudFront Web 分佈。 | 在此步驟中，您會建立 CloudFront 分佈，以告知 CloudFront 您要從何處交付內容，以及如何追蹤和管理內容交付的詳細資訊。若要使用主控台建立分佈，請登入 AWS 管理主控台，開啟 [CloudFront 主控台](https://console.aws.amazon.com/cloudfront/v3/home)，然後遵循 [CloudFront 文件](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-creating-console.html)中的步驟。 | 雲端管理員 | 

### 建立和部署 Lambda@Edge 函數
<a name="create-and-deploy-the-lambda-edge-function"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立和部署 Lambda@Edge 函數。 | 您可以使用修改 CloudFront 回應標頭的藍圖來建立 Lambda@Edge 函數。（其他 bluePrints 適用於不同的使用案例；如需詳細資訊，請參閱 CloudFront 文件中的 [Lambda@Edge 範例函數](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-examples.html)。) 若要建立 Lambda@Edge 函數：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/modify-http-headers-when-you-migrate-from-f5-to-an-application-load-balancer-on-aws.html) | AWS 管理員 | 
| 部署 Lambda@Edge 函數。 | 遵循教學課程[的步驟 4](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-edge-how-it-works-tutorial.html#lambda-edge-how-it-works-tutorial-add-trigger)：在 Amazon CloudFront 文件中建立簡單的 Lambda@Edge 函數，以設定 CloudFront 觸發並部署函數。 ** | AWS 管理員 | 

## 相關資源
<a name="modify-http-headers-when-you-migrate-from-f5-to-an-application-load-balancer-on-aws-resources"></a>

**CloudFront 文件**
+ [自訂原始伺服器的請求和回應行為](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html) 
+ [使用分佈](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-working-with.html) 
+ [Lambda@Edge 範例函數](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-examples.html) 
+ [使用 Lambda@Edge 在邊緣自訂](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html)
+ [教學課程：建立簡單的 Lambda@Edge 函數](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-edge-how-it-works-tutorial.html)

# 為多個 中的傳入網際網路存取建立 Network Access Analyzer 調查結果報告 AWS 帳戶
<a name="create-a-report-of-network-access-analyzer-findings-for-inbound-internet-access-in-multiple-aws-accounts"></a>

*Mike Virgilio，Amazon Web Services*

## 總結
<a name="create-a-report-of-network-access-analyzer-findings-for-inbound-internet-access-in-multiple-aws-accounts-summary"></a>

意外的傳入網際網路存取 AWS 資源可能會對組織的資料周邊造成風險。[Network Access Analyzer](https://docs.aws.amazon.com/vpc/latest/network-access-analyzer/what-is-network-access-analyzer.html) 是一種 Amazon Virtual Private Cloud (Amazon VPC) 功能，可協助您識別對 Amazon Web Services () 上資源的意外網路存取AWS。您可以使用 Network Access Analyzer 來指定網路存取需求，並識別不符合指定需求的潛在網路路徑。您可以使用 Network Access Analyzer 執行下列動作：

1. 識別可透過網際網路閘道存取網際網路 AWS 的資源。

1. 驗證您的虛擬私有雲端 (VPCs) 是否已適當分割，例如隔離生產和開發環境，以及分隔交易工作負載。

Network Access Analyzer 會分析end-to-end網路連線能力條件，而不只是單一元件。為了判斷資源是否可存取網際網路，Network Access Analyzer 會評估網際網路閘道、VPC 路由表、網路存取控制清單 (ACLs)、彈性網路介面上的公有 IP 地址，以及安全群組。如果任何這些元件阻止網際網路存取，Network Access Analyzer 不會產生問題清單。例如，如果 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體有一個開放的安全群組，允許來自 的流量，`0/0`但執行個體位於無法從任何網際網路閘道路由的私有子網路中，則 Network Access Analyzer 不會產生問題清單。這可提供高逼真度的結果，讓您可以識別可從網際網路真正存取的資源。

當您執行 Network Access Analyzer 時，您可以使用 [Network Access Scopes](https://docs.aws.amazon.com/vpc/latest/network-access-analyzer/what-is-network-access-analyzer.html#concepts) 來指定您的網路存取需求。此解決方案可識別網際網路閘道和彈性網路界面之間的網路路徑。在此模式中，您會在 AWS 帳戶 組織中的集中式 中部署解決方案，並由 管理， AWS Organizations並分析 AWS 區域組織中任何帳戶中的所有 帳戶。

此解決方案的設計考量如下：
+  AWS CloudFormation 範本可減少在此模式中部署 AWS 資源所需的工作量。
+ 您可以在部署時調整 CloudFormation 範本和 **naa-script.sh** 指令碼中的參數，為您的環境自訂參數。
+ Bash 指令碼會自動平行佈建和分析多個帳戶的網路存取範圍。
+ Python 指令碼會處理問題清單、擷取資料，然後合併結果。您可以選擇檢閱 CSV 格式或 中的 Network Access Analyzer 調查結果合併報告 AWS Security Hub CSPM。CSV 報告的範例可在此模式的其他資訊[其他資訊](#create-a-report-of-network-access-analyzer-findings-for-inbound-internet-access-in-multiple-aws-accounts-additional)區段中取得。
+ 您可以修復問題清單，也可以將問題清單新增至 **naa-exclusions.csv** 檔案，將其排除在未來的分析之外。

## 先決條件和限制
<a name="create-a-report-of-network-access-analyzer-findings-for-inbound-internet-access-in-multiple-aws-accounts-prereqs"></a>

**先決條件**
+  AWS 帳戶 用於託管安全服務和工具的 ，以組織的成員帳戶的形式進行管理 AWS Organizations。在此模式中，此帳戶稱為安全帳戶。
+ 在安全帳戶中，您必須擁有具有傳出網際網路存取權的私有子網路。如需說明，請參閱 Amazon VPC 文件中的[建立子網路](https://docs.aws.amazon.com/vpc/latest/userguide/create-subnets.html)。您可以使用 [NAT 閘道](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)或[界面 VPC 端點](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html)來建立網際網路存取。
+ 存取 AWS Organizations 管理帳戶或具有 CloudFormation 委派管理員許可的帳戶。如需說明，請參閱 CloudFormation 文件中的[註冊委派管理員](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-orgs-delegated-admin.html)。
+ 啟用 AWS Organizations 和 CloudFormation 之間的受信任存取。如需說明，請參閱 CloudFormation 文件中的[使用 啟用受信任存取 AWS Organizations](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-orgs-enable-trusted-access.html)。
+ 如果您要將調查結果上傳至 Security Hub CSPM，則必須在帳戶和佈建 Amazon EC2 執行個體 AWS 區域 的帳戶中啟用 Security Hub CSPM。如需詳細資訊，請參閱[設定 AWS Security Hub CSPM](https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-settingup.html)。

**限制**
+ 由於 Network Access Analyzer 功能的限制，目前不會分析跨帳戶網路路徑。
+ 目標 AWS 帳戶 必須以組織身分管理 AWS Organizations。如果您未使用 AWS Organizations，您可以更新您環境的 **naa-execrole.yaml** CloudFormation 範本和 **naa-script.sh** 指令碼。反之，您可以提供您要執行指令碼 AWS 帳戶 IDs 和區域的清單。
+ CloudFormation 範本旨在將 Amazon EC2 執行個體部署在具有傳出網際網路存取的私有子網路中。 AWS Systems Manager 代理程式 (SSM 代理程式） 需要傳出存取權才能到達 Systems Manager 服務端點，而您需要傳出存取權才能複製程式碼儲存庫並安裝相依性。如果您想要使用公有子網路，您必須修改 **naa-resources.yaml** 範本，將[彈性 IP 地址](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html)與 Amazon EC2 執行個體建立關聯。

## Architecture
<a name="create-a-report-of-network-access-analyzer-findings-for-inbound-internet-access-in-multiple-aws-accounts-architecture"></a>

**目標架構**

*選項 1：存取 Amazon S3 儲存貯體中的調查結果*

![\[存取 Amazon S3 儲存貯體中 Network Access Analyzer 調查結果報告的架構圖\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/eda6abba-632a-4e3d-92b9-31848fa6dead/images/d0b08437-e5b0-47a1-abdd-040c67b5da8f.png)


圖表顯示下列程序：

1. 如果您手動執行解決方案，使用者會使用 Session Manager 驗證 Amazon EC2 執行個體，然後執行 **naa-script.sh** 指令碼。此 shell 指令碼會執行步驟 2–7。

   如果您自動執行解決方案，**naa-script.sh** 指令碼會根據您在 cron 表達式中定義的排程自動啟動。此 shell 指令碼會執行步驟 2–7。如需詳細資訊，請參閱本節結尾的*自動化和擴展*。

1. Amazon EC2 執行個體會從 Amazon S3 儲存貯體下載最新的 **naa-exception.csv** 檔案。此檔案稍後會在 Python 指令碼處理排除的程序中使用。

1. Amazon EC2 執行個體會擔任 `NAAEC2Role` AWS Identity and Access Management (IAM) 角色，授予存取 Amazon S3 儲存貯體的許可，並擔任組織中其他帳戶中的 `NAAExecRole` IAM 角色。

1. Amazon EC2 執行個體會在組織的管理帳戶中擔任 `NAAExecRole` IAM 角色，並在組織中產生帳戶清單。

1. Amazon EC2 執行個體會擔任組織成員帳戶中的 `NAAExecRole` IAM 角色 （在架構圖中稱為*工作負載帳戶*)，並在每個帳戶中執行安全評估。調查結果會以 JSON 檔案形式存放在 Amazon EC2 執行個體上。

1. Amazon EC2 執行個體使用 Python 指令碼來處理 JSON 檔案、擷取資料欄位，以及建立 CSV 報告。

1. Amazon EC2 執行個體會將 CSV 檔案上傳至 Amazon S3 儲存貯體。

1. Amazon EventBridge 規則會偵測檔案上傳，並使用 Amazon SNS 主題來傳送電子郵件，通知使用者報告已完成。

1. 使用者從 Amazon S3 儲存貯體下載 CSV 檔案。使用者將結果匯入 Excel 範本並檢閱結果。

*選項 2：存取 中的問題清單 AWS Security Hub CSPM*

![\[透過 AWS Security Hub 存取 Network Access Analyzer 調查結果的架構圖\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/eda6abba-632a-4e3d-92b9-31848fa6dead/images/9cb4f059-dfb6-4a33-9f8d-159fe5df0d64.png)


圖表顯示下列程序：

1. 如果您手動執行解決方案，使用者會使用 Session Manager 驗證 Amazon EC2 執行個體，然後執行 **naa-script.sh** 指令碼。此 shell 指令碼會執行步驟 2–7。

   如果您自動執行解決方案，**naa-script.sh** 指令碼會根據您在 cron 表達式中定義的排程自動啟動。此 shell 指令碼會執行步驟 2–7。如需詳細資訊，請參閱本節結尾的*自動化和擴展*。

1. Amazon EC2 執行個體會從 Amazon S3 儲存貯體下載最新的 **naa-exception.csv** 檔案。此檔案稍後會在 Python 指令碼處理排除的程序中使用。

1. Amazon EC2 執行個體會擔任 `NAAEC2Role` IAM 角色，授予存取 Amazon S3 儲存貯體和在組織中其他帳戶中擔任 `NAAExecRole` IAM 角色的許可。

1. Amazon EC2 執行個體會在組織的管理帳戶中擔任 `NAAExecRole` IAM 角色，並在組織中產生帳戶清單。

1. Amazon EC2 執行個體會擔任組織成員帳戶中的 `NAAExecRole` IAM 角色 （在架構圖中稱為*工作負載帳戶*)，並在每個帳戶中執行安全評估。調查結果會以 JSON 檔案形式存放在 Amazon EC2 執行個體上。

1. Amazon EC2 執行個體使用 Python 指令碼來處理 JSON 檔案，並擷取資料欄位以匯入 Security Hub CSPM。

1. Amazon EC2 執行個體會將 Network Access Analyzer 調查結果匯入 Security Hub CSPM。

1. Amazon EventBridge 規則會偵測匯入，並使用 Amazon SNS 主題來傳送電子郵件，通知使用者程序已完成。

1. 使用者會在 Security Hub CSPM 中檢視問題清單。

**自動化和擴展**

您可以排程此解決方案，以自訂排程自動執行 **naa-script.sh** 指令碼。若要設定自訂排程，請在 **naa-resources.yaml** CloudFormation 範本中修改 `CronScheduleExpression` 參數。例如， 的預設值會在每週日午夜`0 0 * * 0`執行解決方案。的值`0 0 * 1-12 0`會在每月第一個星期日的午夜執行解決方案。如需使用 Cron 表達式的詳細資訊，請參閱 Systems Manager 文件中的 [Cron 和 Rate 表達](https://docs.aws.amazon.com/systems-manager/latest/userguide/reference-cron-and-rate-expressions.html)式。

如果您想要在部署`NAA-Resources`堆疊之後調整排程，您可以在 中手動編輯 Cron 排程`/etc/cron.d/naa-schedule`。

## 工具
<a name="create-a-report-of-network-access-analyzer-findings-for-inbound-internet-access-in-multiple-aws-accounts-tools"></a>

**AWS 服務**
+ [Amazon Elastic Compute Cloud (Amazon EC2)](https://docs.aws.amazon.com/ec2/) 在 AWS 雲端中提供可擴展的運算容量。您可以視需要啟動任意數量的虛擬伺服器，，並快速進行擴展或縮減。
+ [Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html) 是一種無伺服器事件匯流排服務，可協助您將應用程式與來自各種來源的即時資料連線。例如， AWS Lambda 函數、使用 API 目的地的 HTTP 調用端點，或其他事件匯流排 AWS 帳戶。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 透過控制已驗證並獲授權使用的人員，協助您安全地管理對 AWS 資源的存取。
+ [AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html) 是一種帳戶管理服務，可協助您將多個 合併 AWS 帳戶 到您建立並集中管理的組織。
+ [AWS Security Hub CSPM](https://docs.aws.amazon.com/securityhub/latest/userguide/what-is-securityhub.html) 提供 中安全狀態的完整檢視 AWS。它還可協助您根據安全產業標準和最佳實務來檢查 AWS 環境。
+ [Amazon Simple Notification Service (Amazon SNS)](https://docs.aws.amazon.com/sns/latest/dg/welcome.html) 可協助您協調和管理發佈者和用戶端之間的訊息交換，包括 Web 伺服器和電子郵件地址。
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) 是一種雲端型物件儲存服務，可協助您儲存、保護和擷取任何數量的資料。
+ [AWS Systems Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-systems-manager.html) 可協助您管理在 中執行的應用程式和基礎設施 AWS 雲端。它可簡化應用程式和資源管理、縮短偵測和解決操作問題的時間，並協助您大規模安全地管理 AWS 資源。此模式使用 Systems Manager 的功能 Session Manager。

**程式碼儲存庫**

此模式的程式碼可在 GitHub [Network Access Analyzer 多帳戶分析](https://github.com/aws-samples/network-access-analyzer-multi-account-analysis)儲存庫中使用。程式碼儲存庫包含下列檔案：
+ **naa-script.sh** – 此 bash 指令碼用於 AWS 帳戶平行啟動多個 Network Access Analyzer 分析。如 **naa-resources.yaml** CloudFormation 範本中所定義，此指令碼會自動部署到 Amazon EC2 執行個體上的 `/usr/local/naa` 資料夾。
+ **naa-resources.yaml** – 您可以使用此 CloudFormation 範本在組織的安全帳戶中建立堆疊。此範本會部署此帳戶所有必要的資源，以支援解決方案。此堆疊必須部署在 **naa-execrole.yaml** 範本之前。
**注意**  
如果刪除並重新部署此堆疊，您必須重建`NAAExecRole`堆疊集，才能在 IAM 角色之間重建跨帳戶相依性。
+ **naa-execrole.yaml** – 您可以使用此 CloudFormation 範本建立堆疊集，在組織中的所有帳戶中部署 `NAAExecRole` IAM 角色，包括 管理帳戶。
+ **naa-processfindings.py** – **naa-script.sh **指令碼會自動呼叫此 Python 指令碼來處理 Network Access Analyzer JSON 輸出、排除 **naa-exclusions.csv** 檔案中任何已知良好的資源，然後產生合併結果的 CSV 檔案，或將結果匯入 Security Hub CSPM。

## 史詩
<a name="create-a-report-of-network-access-analyzer-findings-for-inbound-internet-access-in-multiple-aws-accounts-epics"></a>

### 準備部署
<a name="prepare-for-deployment"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 複製程式碼儲存庫。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-a-report-of-network-access-analyzer-findings-for-inbound-internet-access-in-multiple-aws-accounts.html) | AWS DevOps | 
| 檢閱範本。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-a-report-of-network-access-analyzer-findings-for-inbound-internet-access-in-multiple-aws-accounts.html) | AWS DevOps | 

### 建立 CloudFormation 堆疊
<a name="create-the-cfnshort-stacks"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 佈建安全帳戶中的資源。 | 使用 **naa-resources.yaml** 範本，您可以建立 CloudFormation 堆疊，以部署安全帳戶中所有必要的資源。如需說明，請參閱 CloudFormation 文件中的[建立堆疊](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html)。部署此範本時，請注意下列事項：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-a-report-of-network-access-analyzer-findings-for-inbound-internet-access-in-multiple-aws-accounts.html)[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-a-report-of-network-access-analyzer-findings-for-inbound-internet-access-in-multiple-aws-accounts.html) | AWS DevOps | 
| 在成員帳戶中佈建 IAM 角色。 | 在 AWS Organizations 管理帳戶或具有 CloudFormation 委派管理員許可的帳戶中，使用 **naa-execrole.yaml** 範本建立 CloudFormation 堆疊集。堆疊集會在組織中的所有成員帳戶中部署 `NAAExecRole` IAM 角色。如需說明，請參閱 CloudFormation 文件中的[建立具有服務受管許可的堆疊集](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-getting-started-create.html#stacksets-orgs-associate-stackset-with-org)。部署此範本時，請注意下列事項：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-a-report-of-network-access-analyzer-findings-for-inbound-internet-access-in-multiple-aws-accounts.html) | AWS DevOps | 
| 在管理帳戶中佈建 IAM 角色。 | 使用 **naa-execrole.yaml** 範本，您可以建立 CloudFormation 堆疊，在組織的管理帳戶中部署 `NAAExecRole` IAM 角色。您先前建立的堆疊集不會在管理帳戶中部署 IAM 角色。如需說明，請參閱 CloudFormation 文件中的[建立堆疊](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html)。部署此範本時，請注意下列事項：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-a-report-of-network-access-analyzer-findings-for-inbound-internet-access-in-multiple-aws-accounts.html) | AWS DevOps | 

### 執行分析
<a name="perform-the-analysis"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 自訂 shell 指令碼。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-a-report-of-network-access-analyzer-findings-for-inbound-internet-access-in-multiple-aws-accounts.html) | AWS DevOps | 
| 分析目標帳戶。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-a-report-of-network-access-analyzer-findings-for-inbound-internet-access-in-multiple-aws-accounts.html) | AWS DevOps | 
| 選項 1 – 從 Amazon S3 儲存貯體擷取結果。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-a-report-of-network-access-analyzer-findings-for-inbound-internet-access-in-multiple-aws-accounts.html) | AWS DevOps | 
| 選項 2 – 在 Security Hub CSPM 中檢閱結果。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-a-report-of-network-access-analyzer-findings-for-inbound-internet-access-in-multiple-aws-accounts.html) | AWS DevOps | 

### 修復和排除問題清單
<a name="remediate-and-exclude-findings"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 修復問題清單。 | 修復您要解決的任何問題清單。如需如何在 AWS 身分、資源和網路周圍建立周邊的詳細資訊和最佳實務，請參閱[在 上建立資料周邊 AWS](https://docs.aws.amazon.com/whitepapers/latest/building-a-data-perimeter-on-aws/building-a-data-perimeter-on-aws.html) (AWS 白皮書）。 | AWS DevOps | 
| 排除具有已知良好網路路徑的資源。 | 如果 Network Access Analyzer 產生應可從網際網路存取的資源調查結果，則您可以將這些資源新增至排除清單。下次 Network Access Analyzer 執行時，不會產生該資源的問題清單。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-a-report-of-network-access-analyzer-findings-for-inbound-internet-access-in-multiple-aws-accounts.html) | AWS DevOps | 

### （選用） 更新 naa-script.sh 指令碼
<a name="optional-update-the-naa-script-sh-script"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 更新 naa-script.sh 指令碼。 | 如果您想要將 **naa-script.sh** 指令碼更新至儲存庫中的最新版本，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-a-report-of-network-access-analyzer-findings-for-inbound-internet-access-in-multiple-aws-accounts.html) | AWS DevOps | 

### (選用) 清除
<a name="optional-clean-up"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 刪除所有部署的資源。 | 您可以在帳戶中保留部署的資源。如果您想要取消佈建所有資源，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-a-report-of-network-access-analyzer-findings-for-inbound-internet-access-in-multiple-aws-accounts.html) | AWS DevOps | 

## 疑難排解
<a name="create-a-report-of-network-access-analyzer-findings-for-inbound-internet-access-in-multiple-aws-accounts-troubleshooting"></a>


| 問題 | 解決方案 | 
| --- | --- | 
| 無法使用 Session Manager 連線至 Amazon EC2 執行個體。 | SSM Agent 必須能夠與 Systems Manager 端點通訊。請執行下列操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/create-a-report-of-network-access-analyzer-findings-for-inbound-internet-access-in-multiple-aws-accounts.html) | 
| 部署堆疊集時，CloudFormation 主控台會提示您使用 `Enable trusted access with AWS Organizations to use service-managed permissions`。 | 這表示 AWS Organizations 和 CloudFormation 之間尚未啟用受信任的存取。部署服務受管堆疊集需要信任的存取權。選擇按鈕以啟用受信任的存取。如需詳細資訊，請參閱 CloudFormation 文件中的[啟用受信任存取](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-orgs-enable-trusted-access.html)。 | 

## 相關資源
<a name="create-a-report-of-network-access-analyzer-findings-for-inbound-internet-access-in-multiple-aws-accounts-resources"></a>
+ [新增 – Amazon VPC Network Access Analyzer](https://aws.amazon.com/blogs/aws/new-amazon-vpc-network-access-analyzer/) (AWS 部落格文章）
+ [AWS re：Inforce 2022 - 驗證 AWS (NIS202) （影片） 上的有效網路存取控制](https://youtu.be/aN2P2zeQek0) 
+ [示範 - 使用 Network Access Analyzer 進行全組織的網際網路傳入資料路徑分析](https://youtu.be/1IFNZWy4iy0) （影片）

## 其他資訊
<a name="create-a-report-of-network-access-analyzer-findings-for-inbound-internet-access-in-multiple-aws-accounts-additional"></a>

**範例主控台輸出**

以下範例顯示產生目標帳戶清單和分析目標帳戶的輸出。

```
[root@ip-10-10-43-82 naa]# ./naa-script.sh
download: s3://naa-<account ID>-us-east-1/naa-exclusions.csv to ./naa-exclusions.csv

AWS Management Account: <Management account ID>

AWS Accounts being processed...
<Account ID 1> <Account ID 2> <Account ID 3>

Assessing AWS Account: <Account ID 1>, using Role: NAAExecRole
Assessing AWS Account: <Account ID 2>, using Role: NAAExecRole
Assessing AWS Account: <Account ID 3>, using Role: NAAExecRole
Processing account: <Account ID 1> / Region: us-east-1
Account: <Account ID 1> / Region: us-east-1 – Detecting Network Analyzer scope...
Processing account: <Account ID 2> / Region: us-east-1
Account: <Account ID 2> / Region: us-east-1 – Detecting Network Analyzer scope...
Processing account: <Account ID 3> / Region: us-east-1
Account: <Account ID 3> / Region: us-east-1 – Detecting Network Analyzer scope...
Account: <Account ID 1> / Region: us-east-1 – Network Access Analyzer scope detected.
Account: <Account ID 1> / Region: us-east-1 – Continuing analyses with Scope ID. Accounts with many resources may take up to one hour
Account: <Account ID 2> / Region: us-east-1 – Network Access Analyzer scope detected.
Account: <Account ID 2> / Region: us-east-1 – Continuing analyses with Scope ID. Accounts with many resources may take up to one hour
Account: <Account ID 3> / Region: us-east-1 – Network Access Analyzer scope detected.
Account: <Account ID 3> / Region: us-east-1 – Continuing analyses with Scope ID. Accounts with many resources may take up to one hour
```

**CSV 報告範例**

下圖是 CSV 輸出的範例。

![\[此解決方案產生的 CSV 報告範例 1。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/eda6abba-632a-4e3d-92b9-31848fa6dead/images/55e02e61-054e-4da6-aaae-c9a8b6f4f272.png)


![\[此解決方案產生的 CSV 報告範例 2。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/eda6abba-632a-4e3d-92b9-31848fa6dead/images/95f980ad-92c1-4392-92d4-9c742755aab2.png)


# 在多帳戶 AWS 環境中設定混合網路的 DNS 解析
<a name="set-up-dns-resolution-for-hybrid-networks-in-a-multi-account-aws-environment"></a>

*Anvesh Koganti，Amazon Web Services*

## 總結
<a name="set-up-dns-resolution-for-hybrid-networks-in-a-multi-account-aws-environment-summary"></a>

此模式提供全方位解決方案，可在包含多個 Amazon Web Services (AWS) 帳戶的混合網路環境中設定 DNS 解析。它可透過 Amazon Route 53 Resolver 端點在內部部署網路和 AWS 環境之間啟用雙向 DNS 解析。模式提供兩種解決方案，可在[多帳戶集中式架構](https://docs.aws.amazon.com/whitepapers/latest/hybrid-cloud-dns-options-for-vpc/scaling-dns-management-across-multiple-accounts-and-vpcs.html#multi-account-centralized)中啟用 DNS 解析：
+ *基本設定*不使用 Route 53 Profiles。它有助於最佳化低複雜度的中小型部署的成本。
+ *增強型設定*使用 Route 53 Profiles 來簡化操作。它最適合大型或更複雜的 DNS 部署。

**注意**  
在實作之前，請檢閱*限制*一節，了解服務限制和配額。當您做出決策時，請考慮管理開銷、成本、營運複雜性和團隊專業知識等因素。

## 先決條件和限制
<a name="set-up-dns-resolution-for-hybrid-networks-in-a-multi-account-aws-environment-prereqs"></a>

**先決條件**
+ 跨共用服務和工作負載帳戶部署 Amazon Virtual Private Cloud (Amazon VPC) 的 AWS 多帳戶環境 （最好遵循帳戶結構的[AWS 最佳實務，透過 AWS Control Tower](https://docs.aws.amazon.com/controltower/latest/userguide/aws-multi-account-landing-zone.html) 設定）。
+ 現場部署網路與 AWS 環境之間的現有混合連線 (AWS Direct Connect 或 AWS Site-to-Site VPN)。
+ Amazon VPC 對等 AWS Transit Gateway互連，或適用於 VPCs AWS 雲端 WAN。（應用程式流量需要此連線。 DNS 解析不需要它。 DNS 解析的運作與 VPCs.)
+ 在內部部署環境中執行的 DNS 伺服器。

**限制**
+ Route 53 Resolver 端點、規則和設定檔是區域性建構， AWS 區域 可能需要針對全球組織複寫多個 。
+ 如需 Route 53 Resolver、私有託管區域和設定檔的服務配額完整清單，請參閱 Route 53 文件中的[配額](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/DNSLimitations.html)。

## Architecture
<a name="set-up-dns-resolution-for-hybrid-networks-in-a-multi-account-aws-environment-architecture"></a>

**目標技術堆疊**
+ Route 53 傳出和傳入端點
+ 條件式轉送的 Route 53 Resolver 規則
+ AWS Resource Access Manager (AWS RAM)
+ Route 53 私有託管區域

**目標架構**

**傳出和傳入端點**

下圖顯示從 AWS 到內部部署的 DNS 解析流程。這是網域託管在內部部署的傳出解析度的連線設定。以下是設定此設定所涉及程序的高階概觀。如需詳細資訊，請參閱 [Epics](#set-up-dns-resolution-for-hybrid-networks-in-a-multi-account-aws-environment-epics) 區段。

1. 在共用服務 VPC 中部署傳出 Route 53 Resolver 端點。

1. 在共用服務帳戶中為內部部署託管的網域建立 Route 53 Resolver 規則 （轉送規則）。

1. 在需要解析內部部署託管網域的其他 帳戶中，共用規則並將其與 VPCs 建立關聯。這可以根據您的使用案例以不同的方式完成，如本節稍後所述。

![\[AWS 中的傳入和傳出端點到內部部署 DNS 解析流程。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/01e700cd-be8c-4a5d-bc89-b901a260d045/images/d69d4cad-5e2c-4481-9370-2708e8a4f8c1.png)


設定連線後，傳出解析中涉及的步驟如下：

1. Amazon Elastic Compute Cloud (Amazon EC2) 執行個體會將 的 DNS 解析請求`db.onprem.example.com`傳送至 VPC\$12 地址的 VPC Route 53 Resolver。

1. Route 53 Resolver 會檢查 Resolver 規則，並使用傳出端點將請求轉送至內部部署 DNS 伺服器 IPs。

1. 傳出端點會將請求轉送至內部部署 DNS IPs。流量會經過共用服務 VPC 與內部部署資料中心之間已建立的混合網路連線。

1. 內部部署 DNS 伺服器會回應傳出端點，然後將回應轉送回 VPC 的 Route 53 Resolver。Resolver 會將回應傳回 EC2 執行個體。

下圖顯示從內部部署環境到 的 DNS 解析流程 AWS。這是網域託管所在之傳入解析度的連線設定 AWS。以下是設定此設定所涉及程序的高階概觀。如需詳細資訊，請參閱 [Epics](#set-up-dns-resolution-for-hybrid-networks-in-a-multi-account-aws-environment-epics) 區段。

1. 在共用服務 VPC 中部署傳入解析程式端點。

1. 在共用服務帳戶中建立私有託管區域 （集中式方法）。

1. 將私有託管區域與共用服務 VPC 建立關聯。共用這些區域並將其與跨帳戶 VPCs建立關聯，以進行 VPC-to-VPC DNS 解析。這可以根據您的使用案例以不同的方式完成，如本節稍後所述。

![\[內部部署中傳入和傳出端點到 AWS DNS 解析流程。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/01e700cd-be8c-4a5d-bc89-b901a260d045/images/a6f5348c-2041-453e-8939-2b4ee0b7ebd8.png)


設定連線後，傳入解析中涉及的步驟如下：

1. 內部部署資源會將 的 DNS 解析請求`ec2.prod.aws.example.com`傳送至內部部署 DNS 伺服器。

1. 內部部署 DNS 伺服器會透過混合網路連線，將請求轉送至共用服務 VPC 中的傳入解析程式端點。

1. 在 VPC Route 53 Resolver 的協助下，傳入解析程式端點會在相關聯的私有託管區域中查詢請求，並取得適當的 IP 地址。

1. 這些 IP 地址會傳回現場部署 DNS 伺服器，將回應傳回現場部署資源。

此組態可讓內部部署資源透過傳入端點將查詢路由到適當的 AWS 私有託管區域，來解析私有網域名稱。在此架構中，私有託管區域集中在共用服務 VPC 中，允許單一團隊進行中央 DNS 管理。這些區域可以與許多 VPCs相關聯，以解決 VPC-to-VPC解析使用案例。或者，您可能想要將 DNS 網域擁有權和管理委派給每個網域 AWS 帳戶。在這種情況下，每個帳戶都會管理自己的私有託管區域，並將每個區域與中央共用服務 VPC 建立關聯，以便與內部部署環境統一解析。此分散式方法超出此模式的範圍。如需詳細資訊，請參閱 Amazon [ VPCs 混合雲端 DNS 選項白皮書中的跨多個帳戶和 VPC 擴展](https://docs.aws.amazon.com/whitepapers/latest/hybrid-cloud-dns-options-for-vpc/scaling-dns-management-across-multiple-accounts-and-vpcs.html) DNS 管理。 **

當您使用解析程式端點建立基本 DNS 解析流程時，您需要判斷如何管理解析程式規則和跨 私有託管區域的共用和關聯 AWS 帳戶。您可以透過兩種方式處理此問題：透過使用 AWS RAM 共用解析程式規則和直接私有託管區域關聯的自我管理共用，如*基本設定*章節所述，或透過 Route 53 設定檔，如*增強型設定*章節所述。選擇取決於組織的 DNS 管理偏好設定和操作需求。下列架構圖說明擴展的環境，其中包含跨不同帳戶的多個 VPCs，代表典型的企業部署。

**基本設定**

在基本設定中，多帳戶 AWS 環境中混合 DNS 解析的實作會使用 AWS RAM 來共用解析程式轉送規則和私有託管區域關聯，以管理內部部署 AWS 和資源之間的 DNS 查詢。此方法使用共用服務 VPC 中連線至內部部署網路的集中式 Route 53 Resolver 端點，以有效率地處理傳入和傳出 DNS 解析。
+ 對於傳出解決方案，解析程式轉送規則會在共用服務帳戶中建立，然後使用 AWS 帳戶 與其他 共用 AWS RAM。此共用僅限於相同區域內的帳戶。然後，目標帳戶可以將這些規則與其 VPCs建立關聯，並讓這些 VPCs中的資源解析內部部署網域名稱。
+ 對於傳入解析度，私有託管區域會在共用服務帳戶中建立，並與共用服務 VPC 相關聯。這些區域接著可以使用 Route 53 API、 AWS SDKs 或 AWS Command Line Interface () 與其他VPCs 建立關聯AWS CLI。然後，相關聯 VPCs 中的資源可以解析私有託管區域中定義的 DNS 記錄，這會在整個 AWS 環境中建立統一的 DNS 檢視。

下圖顯示此基本設定中的 DNS 解析流程。

![\[在多帳戶 AWS 環境中使用混合 DNS 解析的基本設定。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/01e700cd-be8c-4a5d-bc89-b901a260d045/images/258e4bcd-e9c6-43b5-bab8-856ca22206b9.png)


當您在有限的規模上使用 DNS 基礎設施時，此設定可正常運作。不過，隨著環境的成長，管理 可能會變得具有挑戰性。管理私有託管區域和解析程式規則的共用和關聯方式的操作開銷會隨著規模VPCs而個別大幅增加。此外，每個私有託管區域的 300 個 VPC 關聯限制等服務配額，可能會成為大規模部署的限制因素。增強型設定可解決這些挑戰。

**增強型設定**

Route 53 Profiles 提供簡化的解決方案，可跨多個混合網路管理 DNS 解析 AWS 帳戶。除了個別管理私有託管區域和解析程式規則之外，您可以將 DNS 組態分組為單一容器，以便在區域中VPCs 和帳戶之間輕鬆共用和套用。此設定會在共用服務 VPC 中維護集中式 Resolver 端點架構，同時大幅簡化 DNS 組態的管理。

下圖顯示增強型設定中的 DNS 解析流程。

![\[在多帳戶 AWS 環境中使用 Route 53 Profiles 進行混合 DNS 解析的進階設定。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/01e700cd-be8c-4a5d-bc89-b901a260d045/images/55b9681d-ddb4-4a55-b4ec-fc9afa9870fa.png)


Route 53 Profiles 可讓您將私有託管區域關聯、解析程式轉送規則和 DNS 防火牆規則封裝為單一可共用的單位。您可以在共用服務帳戶中建立設定檔，並使用 與成員帳戶共用 AWS RAM。當設定檔共用並套用至目標 VPCs時，服務會自動處理所有必要的關聯和組態。這可大幅降低 DNS 管理的操作負荷，並為不斷成長的環境提供絕佳的可擴展性。

**自動化和擴展**

使用基礎設施做為程式碼 (IaC) 工具，例如 CloudFormation 或 Terraform，以自動佈建和管理 Route 53 Resolver 端點、規則、私有託管區域和設定檔。將 DNS 組態與持續整合和持續交付 (CI/CD) 管道整合，以實現一致性、可重複性和快速更新。

## 工具
<a name="set-up-dns-resolution-for-hybrid-networks-in-a-multi-account-aws-environment-tools"></a>

**AWS 服務**
+ [AWS Resource Access Manager (AWS RAM)](https://docs.aws.amazon.com/ram/latest/userguide/what-is.html) 可協助您安全地跨 共用資源 AWS 帳戶 ，以減少營運開銷並提供可見性和可稽核性。
+ [Amazon Route 53 Resolver](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resolver.html) 會以遞迴方式回應來自 AWS 資源的 DNS 查詢，且預設可在所有 VPCs 中使用。您可以建立解析程式端點和條件式轉送規則，以解析內部部署資料中心和 VPCs 之間的 DNS 命名空間。
+ [Amazon Route 53 私有託管區域](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zones-private.html)是容器，其中包含您希望 Route 53 如何回應網域及其子網域的 DNS 查詢的相關資訊。
+ [Amazon Route 53 Profiles](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/profiles.html) 可讓您以 AWS 帳戶 簡化的方式跨多個 VPCs 套用和管理 DNS 相關的 Route 53 組態。

## 最佳實務
<a name="set-up-dns-resolution-for-hybrid-networks-in-a-multi-account-aws-environment-best-practices"></a>

本節提供最佳化 Route 53 Resolver 的一些最佳實務。這些代表 Route 53 最佳實務的子集。如需完整清單，請參閱 [Amazon Route 53 的最佳實務](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/best-practices.html)。

**使用解析程式端點避免迴圈組態**
+ 仔細規劃 VPC 關聯，設計您的 DNS 架構以防止遞迴路由。當 VPC 託管傳入端點時，請避免將其與可建立循環參考的解析程式規則建立關聯。
+ 當您跨帳戶共用 DNS 資源時， AWS RAM 請策略性地使用 ，以維持乾淨的路由路徑。

如需詳細資訊，請參閱 Route 53 文件中的使用[解析程式端點避免迴圈組態](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/best-practices-resolver-endpoints.html)。

**擴展解析程式端點**
+ 對於需要每秒大量查詢 (QPS) 的環境，請注意端點中的每個 ENI 限制為 10，000 個 QPS。您可以將更多 ENIs新增至端點，以擴展 DNS QPS。
+ Amazon CloudWatch 提供 `InboundQueryVolume`和 `OutboundQueryVolume`指標 （請參閱 [CloudWatch 文件](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/monitoring-resolver-with-cloudwatch.html))。建議您設定監控規則，以便在閾值超過特定值 （例如 10，000 QPS 的 80%) 時提醒您。
+ 設定 Resolver 端點的狀態安全群組規則，以防止連線追蹤限制在大量流量期間造成 DNS 查詢限流。若要進一步了解連線追蹤如何在安全群組中運作，請參閱 [Amazon EC2 文件中的 Amazon EC2 安全群組連線追蹤](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-connection-tracking.html)。 Amazon EC2 

如需詳細資訊，請參閱 Route 53 文件中的[解析程式端點擴展](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/best-practices-resolver-endpoint-scaling.html)。

**為解析程式端點提供高可用性**
+ 在至少兩個可用區域中建立 IP 地址的傳入端點以進行備援。
+ 佈建其他網路介面，以確保在維護或流量激增期間可用性。

如需詳細資訊，請參閱 Route 53 文件中的[解析程式端點高可用性](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/best-practices-resolver-endpoint-high-availability.html)。

## 史詩
<a name="set-up-dns-resolution-for-hybrid-networks-in-a-multi-account-aws-environment-epics"></a>

### 部署 Route 53 Resolver 端點
<a name="deploy-r53r-endpoints"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 部署傳入端點。 | Route 53 Resolver 使用傳入端點從內部部署 DNS 解析程式接收 DNS 查詢。如需說明，請參閱 Route 53 文件中的[轉送傳入 DNS 查詢到您的 VPCs](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resolver-forwarding-inbound-queries.html)。記下傳入端點 IP 地址。 | AWS 管理員、雲端管理員 | 
| 部署傳出端點。 | Route 53 Resolver 使用傳出端點將 DNS 查詢傳送至內部部署 DNS 解析程式。如需說明，請參閱 Route 53 文件中的[轉送傳出 DNS 查詢到您的網路](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resolver-forwarding-outbound-queries.html)。記下輸出端點 ID。 | AWS 管理員、雲端管理員 | 

### 設定和共用 Route 53 私有託管區域
<a name="configure-and-share-r53-private-hosted-zones"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 為託管的網域建立私有託管區域 AWS。 | 此區域會保留 AWS託管網域 （例如 `prod.aws.example.com`) 中資源的 DNS 記錄，這些記錄應從內部部署環境解析。如需說明，請參閱 Route 53 文件中的[建立私有託管區域](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zone-private-creating.html)。建立私有託管區域時，您必須將 VPC 與相同帳戶擁有的託管區域建立關聯。為此選取共用服務 VPC。 | AWS 管理員、雲端管理員 | 
| 基本設定：將私有託管區域與其他帳戶中VPCs 建立關聯。 | 如果您使用的是基本設定 （請參閱[架構](#set-up-dns-resolution-for-hybrid-networks-in-a-multi-account-aws-environment-architecture)一節）：若要啟用成員帳戶 VPCs來解析此私有託管區域中的 DNS 記錄，您必須將 VPCs與託管區域建立關聯。您必須授權關聯，然後以程式設計方式建立關聯。如需說明，請參閱 Route 53 文件中的[關聯 Amazon VPC 和您使用不同 建立的私有託管區域 AWS 帳戶](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zone-private-associate-vpcs-different-accounts.html)。 | AWS 管理員、雲端管理員 | 
| 增強型設定：設定和共用 Route 53 設定檔。 | 如果您使用的是增強型設定 （請參閱[架構](#set-up-dns-resolution-for-hybrid-networks-in-a-multi-account-aws-environment-architecture)一節）：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/set-up-dns-resolution-for-hybrid-networks-in-a-multi-account-aws-environment.html)視組織的結構和 DNS 需求而定，您可能需要為不同的帳戶或工作負載建立和管理多個設定檔。 | AWS 管理員、雲端管理員 | 

### 設定和共用 Route 53 Resolver 轉送規則
<a name="configure-and-share-r53r-forwarding-rules"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 為內部部署託管的網域建立轉送規則。 | 此規則會指示 Route 53 Resolver 將內部部署網域 （例如 `onprem.example.com`) 的任何 DNS 查詢轉送至內部部署 DNS 解析程式。若要建立此規則，您需要內部部署 DNS 解析程式的 IP 地址和傳出端點 ID。如需說明，請參閱 Route 53 文件中的[建立轉送規則](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resolver-rules-managing-creating-rules.html)。 | AWS 管理員、雲端管理員 | 
| 基本設定：與其他帳戶中VPCs 共用和建立轉送規則的關聯。 | 如果您使用的是基本設定：若要讓轉送規則生效，您必須與其他帳戶中VPCs 共用並建立規則的關聯。Route 53 Resolver 接著會在解析網域時考慮規則。如需說明，請參閱 Route 53 文件中的[與其他 共用解析程式規則 AWS 帳戶 和使用共用規則](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resolver-rules-managing-sharing.html)，以及[將轉送規則與 VPC 建立關聯](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resolver-rules-managing-associating-rules.html)。 | AWS 管理員、雲端管理員 | 
| 增強型設定：設定和共用 Route 53 設定檔。 | 如果您使用的是增強型設定：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/set-up-dns-resolution-for-hybrid-networks-in-a-multi-account-aws-environment.html)視組織的結構和 DNS 需求而定，您可能需要為不同的帳戶或工作負載建立和管理多個設定檔。 | AWS 管理員、雲端管理員 | 

### 設定內部部署 DNS 解析程式以進行 AWS 整合
<a name="configure-on-premises-dns-resolvers-for-aws-integration"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
|  在內部部署 DNS 解析程式中設定條件式轉送。 | 若要 AWS 從內部部署環境傳送至 以進行解析的 DNS 查詢，您必須在內部部署 DNS 解析程式中設定條件式轉送，以指向傳入端點 IP 地址。這會指示 DNS 解析程式將所有 AWS託管網域的 DNS 查詢 （例如，針對 `prod.aws.example.com`) 轉送至傳入端點 IP 地址，以供 Route 53 Resolver 解析。 | 網路管理員 | 

### 在混合環境中驗證end-to-end解析
<a name="verify-end-to-end-dns-resolution-in-a-hybrid-environment"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 測試從 AWS 到內部部署環境的 DNS 解析。 | 從 VPC 中具有與其相關聯之轉送規則的執行個體，執行內部部署託管網域的 DNS 查詢 （例如，針對 `db.onprem.example.com`)。 | 網路管理員 | 
| 從現場部署環境測試 DNS 解析 AWS。 | 從內部部署伺服器，執行託管網域 AWS的 DNS 解析 （例如，針對 `ec2.prod.aws.example.com`)。 | 網路管理員 | 

## 相關資源
<a name="set-up-dns-resolution-for-hybrid-networks-in-a-multi-account-aws-environment-resources"></a>
+ [Amazon VPC 的混合雲端 DNS 選項](https://docs.aws.amazon.com/whitepapers/latest/hybrid-cloud-dns-options-for-vpc/hybrid-cloud-dns-options-for-vpc.html) (AWS 白皮書）
+ [使用私有託管區域](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zones-private.html) (Route 53 文件）
+ [Route 53 Resolver 入門](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resolver-getting-started.html)(Route 53 文件）
+ [使用 Route 53 Resolver（部落格文章） 簡化多帳戶環境中的 DNS 管理](https://aws.amazon.com/blogs/security/simplify-dns-management-in-a-multiaccount-environment-with-route-53-resolver/)AWS 
+ [使用具有多個 VPCs和 （部落格文章） 的 Amazon Route 53 設定檔統一 DNS 管理 AWS 帳戶](https://aws.amazon.com/blogs/aws/unify-dns-management-using-amazon-route-53-profiles-with-multiple-vpcs-and-aws-accounts/)AWS 
+ [將多帳戶 DNS 環境遷移至 Amazon Route 53 Profiles](https://aws.amazon.com/blogs/networking-and-content-delivery/migrating-your-multi-account-dns-environment-to-amazon-route-53-profiles/) (AWS 部落格文章）
+ [將 Amazon Route 53 Profiles 用於可擴展的多帳戶 AWS 環境](https://aws.amazon.com/blogs/networking-and-content-delivery/using-amazon-route-53-profiles-for-scalable-multi-account-aws-environments/) (AWS 部落格文章）

 

# 確認 ELB 負載平衡器需要終止 TLS
<a name="verify-that-elb-load-balancers-require-tls-termination"></a>

*Priyanka Chaudhary，Amazon Web Services*

## 總結
<a name="verify-that-elb-load-balancers-require-tls-termination-summary"></a>

在 Amazon Web Services (AWS) 雲端上，Elastic Load Balancing (ELB) 會自動將傳入的應用程式流量分散到多個目標，例如 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體、容器、IP 地址和 AWS Lambda 函數。負載平衡器使用接聽程式來定義負載平衡器用來接受來自使用者的流量的連接埠和通訊協定。Application Load Balancer 在應用程式層進行路由決策，並使用 HTTP/HTTPS 通訊協定。Classic Load Balancer 會在傳輸層、使用 TCP 或 Secure Sockets Layer (SSL) 通訊協定，或使用 HTTP/HTTPS 在應用程式層進行路由決策。

此模式提供安全性控制，可檢查 Application Load Balancer 和 Classic Load Balancer 的多種事件類型。叫用函數時，AWS Lambda 會檢查事件，並確保負載平衡器合規。

函數會在下列 API 呼叫上啟動 Amazon CloudWatch Events 事件：[CreateLoadBalancer](https://docs.aws.amazon.com/elasticloadbalancing/2012-06-01/APIReference/API_CreateLoadBalancer.html)、[CreateLoadBalancerListeners](https://docs.aws.amazon.com/elasticloadbalancing/2012-06-01/APIReference/API_CreateLoadBalancerListeners.html)、[DeleteLoadBalancerListeners](https://docs.aws.amazon.com/elasticloadbalancing/2012-06-01/APIReference/API_DeleteLoadBalancerListeners.html)、[CreateLoadBalancerPolicy](https://docs.aws.amazon.com/elasticloadbalancing/2012-06-01/APIReference/API_CreateLoadBalancerPolicy.html)、[SetLoadBalancerPoliciesOfListener](https://docs.aws.amazon.com/elasticloadbalancing/2012-06-01/APIReference/API_SetLoadBalancerPoliciesOfListener.html)、[CreateListener](https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_CreateListener.html)、[DeleteListener](https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DeleteListener.html) 和 [ModifyListener](https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_ModifyListener.html)。當事件偵測到其中一個 APIs時，它會呼叫執行 Python 指令碼的 AWS Lambda。Python 指令碼會評估 以查看接聽程式是否包含 SSL 憑證，以及套用的政策是否使用 Transport Layer Security (TLS)。如果 SSL 政策確定為 TLS 以外的任何項目，則函數會傳送 Amazon Simple Notification Service (Amazon SNS) 通知給使用者，其中包含相關資訊。 

## 先決條件和限制
<a name="verify-that-elb-load-balancers-require-tls-termination-prereqs"></a>

**先決條件**
+ 作用中的 AWS 帳戶

**限制**
+ 除非更新負載平衡器接聽程式，否則此安全控制不會檢查現有的負載平衡器。
+ 此安全控制是區域性的。您必須將其部署到您要監控的每個 AWS 區域。

## Architecture
<a name="verify-that-elb-load-balancers-require-tls-termination-architecture"></a>

**目標架構**

![\[確保負載平衡器需要終止 TLS。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/da99cda2-ac34-4791-a2bd-d37264d8d3d9/images/af92b3c8-32bb-45eb-a2a8-d8276fb3e824.png)


**自動化和擴展**
+ 如果您使用的是 [AWS Organizations](https://aws.amazon.com/organizations/)，則可以使用 [AWS Cloudformation StackSets](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/what-is-cfnstacksets.html)，將此範本部署到您要監控的多個帳戶中。

## 工具
<a name="verify-that-elb-load-balancers-require-tls-termination-tools"></a>

**AWS 服務**
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) – AWS CloudFormation 可協助您建立模型和設定 AWS 資源、快速一致地佈建資源，以及在整個生命週期中管理資源。您可以使用範本來描述資源及其相依性，並將它們一起啟動和設定為堆疊，而不是個別管理資源。
+ [Amazon CloudWatch Events](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/WhatIsCloudWatchEvents.html) – Amazon CloudWatch Events 提供近乎即時的系統事件串流，說明 AWS 資源的變更。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) – AWS Lambda 是一種運算服務，支援執行程式碼，無需佈建或管理伺服器。
+ [Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/dev/Welcome.html) – Amazon Simple Storage Service (Amazon S3) 是一種高度可擴展的物件儲存服務，可用於各種儲存解決方案，包括網站、行動應用程式、備份和資料湖。
+ [Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/welcome.html) – Amazon Simple Notification Service (Amazon SNS) 會協調和管理發佈者和用戶端之間的訊息傳遞或傳送，包括 Web 伺服器和電子郵件地址。訂閱者會收到發佈到所訂閱主題的所有訊息，且某一主題的所有訂閱者均會收到相同訊息。

**Code**

此模式包含下列附件：
+ `ELBRequirestlstermination.zip` – 用於安全控制的 Lambda 程式碼。
+ `ELBRequirestlstermination.yml` – 設定事件和 Lambda 函數的 CloudFormation 範本。

## 史詩
<a name="verify-that-elb-load-balancers-require-tls-termination-epics"></a>

### 設定 S3 儲存貯體
<a name="set-up-the-s3-bucket"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 定義 S3 儲存貯體。 | 在 [Amazon S3 主控台](https://console.aws.amazon.com/s3/)上，選擇或建立 S3 儲存貯體以託管 Lambda 程式碼 .zip 檔案。此 S3 儲存貯體必須與您要評估的負載平衡器位於相同的 AWS 區域。S3 儲存貯體名稱全域唯一，且命名空間由所有 AWS 帳戶共用。S3 儲存貯體名稱不能包含正斜線。 | 雲端架構師 | 
| 上傳 Lambda 程式碼。 | 將*附件*區段中提供的 Lambda 程式碼 (`ELBRequirestlstermination.zip` 檔案） 上傳至 S3 儲存貯體。 | 雲端架構師 | 

### 部署 CloudFormation 範本
<a name="deploy-the-cloudformation-template"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 啟動 AWS CloudFormation 範本。 | 在與 S3 儲存貯體相同的 AWS 區域中開啟 [AWS CloudFormation 主控台](https://console.aws.amazon.com/cloudformation/)，並部署連接的範本 `ELBRequirestlstermination.yml`。如需部署 AWS CloudFormation 範本的詳細資訊，請參閱 CloudFormation 文件中的[在 AWS CloudFormation 主控台上建立堆疊](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html)。 CloudFormation  | 雲端架構師 | 
| 完成範本中的參數。 | 當您啟動範本時，系統會提示您輸入下列資訊：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/verify-that-elb-load-balancers-require-tls-termination.html) | 雲端架構師 | 

### 確認訂閱
<a name="confirm-the-subscription"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 確認訂閱。 | 當 CloudFormation 範本成功部署時，它會傳送訂閱電子郵件到您提供的電子郵件地址。您必須確認此電子郵件訂閱，才能開始接收違規通知。 | 雲端架構師 | 

## 相關資源
<a name="verify-that-elb-load-balancers-require-tls-termination-resources"></a>
+ [在 AWS CloudFormation 主控台上建立堆疊](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html) (AWS CloudFormation 文件）
+ [什麼是 AWS Lambda？](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) (AWS Lambda 文件）
+ [什麼是 Classic Load Balancer？](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/introduction.html) (ELB 文件）
+ [什麼是 Application Load Balancer？](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html) (ELB 文件）

## 附件
<a name="attachments-da99cda2-ac34-4791-a2bd-d37264d8d3d9"></a>

若要存取與本文件相關聯的其他內容，請解壓縮下列檔案： [attachment.zip](samples/p-attach/da99cda2-ac34-4791-a2bd-d37264d8d3d9/attachments/attachment.zip)

# 使用 Splunk 檢視 AWS Network Firewall 日誌和指標
<a name="view-aws-network-firewall-logs-and-metrics-by-using-splunk"></a>

*Ivo Pinto，Amazon Web Services*

## 摘要
<a name="view-aws-network-firewall-logs-and-metrics-by-using-splunk-summary"></a>

許多組織使用 [Splunk Enterprise](https://www.splunk.com/en_us/products/splunk-enterprise.html) 做為來自不同來源的日誌和指標的集中彙整和視覺化工具。 此模式可協助您設定 Splunk 使用 Splunk Add-On for [AWS 從 Amazon CloudWatch Logs 擷取 AWS Network Firewall](https://docs.aws.amazon.com/network-firewall/latest/developerguide/what-is-aws-network-firewall.html) 日誌和指標。 [Amazon CloudWatch ](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html)  

若要達成此目的，您可以建立唯讀 AWS Identity and Access Management (IAM) 角色。Splunk Add-On for AWS 使用此角色存取 CloudWatch。您可以設定 Splunk Add-On for AWS 以從 CloudWatch 擷取指標和日誌。最後，您可以從擷取的日誌資料和指標，在 Splunk 中建立視覺化效果。

## 先決條件和限制
<a name="view-aws-network-firewall-logs-and-metrics-by-using-splunk-prereqs"></a>

**先決條件**
+ [Splunk](https://www.splunk.com/) 帳戶
+ Splunk Enterprise 執行個體，8.2.2 版或更新版本 
+ 作用中的 AWS 帳戶
+ Network Firewall，[設定](https://docs.aws.amazon.com/network-firewall/latest/developerguide/getting-started.html)並[設定](https://docs.aws.amazon.com/network-firewall/latest/developerguide/logging-cw-logs.html) 將日誌傳送至 CloudWatch Logs

**限制**
+ Splunk Enterprise 必須部署為 AWS 雲端中的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體叢集。
+ AWS 中國區域不支援使用自動探索的 Amazon EC2 IAM 角色收集資料。

## Architecture
<a name="view-aws-network-firewall-logs-and-metrics-by-using-splunk-architecture"></a>

![\[AWS Network Firewall 和 Splunk 記錄架構\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/c6ce254a-841f-4bed-8f9f-b35e99f22e56/images/3dd420e9-70af-4a42-b24d-c54872c55e0b.png)


此圖展示了以下要點：

1. Network Firewall 會將日誌發佈至 CloudWatch Logs。

1. Splunk Enterprise 從 CloudWatch 擷取指標和日誌。

若要在此架構中填入範例指標和日誌，工作負載會產生通過 Network Firewall 端點的流量，以前往網際網路。這是透過使用[路由表](https://docs.aws.amazon.com/network-firewall/latest/developerguide/vpc-config.html#vpc-config-route-tables)來實現的。 雖然此模式使用單一 Amazon EC2 執行個體做為工作負載，但只要 Network Firewall 設定為將日誌傳送至 CloudWatch Logs，此模式就可以套用至任何架構。

此架構也會在另一個虛擬私有雲端 (VPC) 中使用 Splunk Enterprise 執行個體。不過，Splunk 執行個體可以位於另一個位置，例如與工作負載相同的 VPC，只要它可以到達 CloudWatch APIs。

## 工具
<a name="view-aws-network-firewall-logs-and-metrics-by-using-splunk-tools"></a>

**AWS 服務**
+ [Amazon CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) 可協助您集中所有系統、應用程式和 AWS 服務的日誌，以便您可以監控日誌並將其安全地存檔。
+ [Amazon Elastic Compute Cloud (Amazon EC2)](https://docs.aws.amazon.com/ec2/) 在 AWS 雲端中提供可擴展的運算容量。您可以視需要啟動任意數量的虛擬伺服器，，並快速進行擴展或縮減。
+ [AWS Network Firewall](https://docs.aws.amazon.com/network-firewall/latest/developerguide/what-is-aws-network-firewall.html) 是 AWS 雲端中 VPCs 具狀態、受管的網路防火牆和入侵偵測和預防服務。

**其他工具**
+ [Splunk](https://www.splunk.com/) 可協助您監控、視覺化和分析日誌資料。

## 史詩
<a name="view-aws-network-firewall-logs-and-metrics-by-using-splunk-epics"></a>

### 建立 IAM 角色
<a name="create-an-iam-role"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 IAM 政策。 | 遵循[使用 JSON 編輯器建立政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html#access_policies_create-json-editor)中的指示，建立授予 CloudWatch Logs 資料和 CloudWatch 指標唯讀存取權的 IAM 政策。將以下 政策貼到 JSON 編輯器。<pre>{<br />    "Statement": [<br />        {<br />            "Action": [<br />                "cloudwatch:List*",<br />                "cloudwatch:Get*",<br />                "network-firewall:List*",<br />                "logs:Describe*",<br />                "logs:Get*",<br />                "logs:List*",<br />                "logs:StartQuery",<br />                "logs:StopQuery",<br />                "logs:TestMetricFilter",<br />                "logs:FilterLogEvents",<br />                "network-firewall:Describe*"<br />            ],<br />            "Effect": "Allow",<br />            "Resource": "*"<br />        }<br />    ],<br />    "Version": "2012-10-17"<br />}</pre> | AWS 管理員 | 
| 建立新的 IAM 角色。 | 遵循[建立角色以委派許可給 AWS 服務](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)中的指示，以建立 Splunk Add-On for AWS 用來存取 CloudWatch 的 IAM 角色。針對**許可政策**，選擇您先前建立的政策。 | AWS 管理員 | 
| 將 IAM 角色指派給 Splunk 叢集中的 EC2 執行個體。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/view-aws-network-firewall-logs-and-metrics-by-using-splunk.html) | AWS 管理員 | 

### 安裝適用於 AWS 的 Splunk 附加元件
<a name="install-the-splunk-add-on-for-aws"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 安裝 附加元件。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/view-aws-network-firewall-logs-and-metrics-by-using-splunk.html) | Splunk 管理員 | 
| 設定 AWS 登入資料。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/view-aws-network-firewall-logs-and-metrics-by-using-splunk.html)如需詳細資訊，請參閱 Splunk 文件中的[在 Splunk 平台執行個體中尋找 IAM 角色](https://splunk.github.io/splunk-add-on-for-amazon-web-services/#Find_an_IAM_role_within_your_Splunk_platform_instance)。 | Splunk 管理員 | 

### 設定 Splunk 對 CloudWatch 的存取
<a name="configure-splunk-access-to-cloudwatch"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定從 CloudWatch Logs 擷取 Network Firewall 日誌。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/view-aws-network-firewall-logs-and-metrics-by-using-splunk.html)根據預設，Splunk 每 10 分鐘擷取一次日誌資料。這是**進階設定**下的可設定參數。如需詳細資訊，請參閱 Splunk 文件中的[使用 Splunk Web 設定 CloudWatch Logs 輸入](https://splunk.github.io/splunk-add-on-for-amazon-web-services/#Configure_a_CloudWatch_Logs_input_using_Splunk_Web)。 | Splunk 管理員 | 
| 設定從 CloudWatch 擷取 Network Firewall 指標。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/view-aws-network-firewall-logs-and-metrics-by-using-splunk.html)根據預設，Splunk 每 5 分鐘擷取一次指標資料。這是**進階設定**下的可設定參數。如需詳細資訊，請參閱 Splunk 文件中的[使用 Splunk Web 設定 CloudWatch 輸入](https://splunk.github.io/splunk-add-on-for-amazon-web-services/#Configure_a_CloudWatch_input_using_Splunk_Web)。 | Splunk 管理員 | 

### 使用查詢建立 Splunk 視覺化
<a name="create-splunk-visualizations-by-using-queries"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 檢視最高來源 IP 地址。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/view-aws-network-firewall-logs-and-metrics-by-using-splunk.html) | Splunk 管理員 | 
| 檢視封包統計資料。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/view-aws-network-firewall-logs-and-metrics-by-using-splunk.html) | Splunk 管理員 | 
| 檢視最常用的來源連接埠。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/view-aws-network-firewall-logs-and-metrics-by-using-splunk.html) | Splunk 管理員 | 

## 相關資源
<a name="view-aws-network-firewall-logs-and-metrics-by-using-splunk-resources"></a>

**AWS 文件**
+ [建立角色以委派許可給 AWS 服務](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html) (IAM 文件）
+ [建立 IAM 政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html#access_policies_create-start) (IAM 文件）
+ 在 [AWS Network Firewall 中記錄和監控](https://docs.aws.amazon.com/network-firewall/latest/developerguide/logging-monitoring.html) (Network Firewall 文件）
+ [AWS Network Firewall 的路由表組態](https://docs.aws.amazon.com/network-firewall/latest/developerguide/route-tables.html) (Network Firewall 文件）

**AWS 部落格文章**
+ [AWS Network Firewall 部署模型](https://aws.amazon.com/pt/blogs/networking-and-content-delivery/deployment-models-for-aws-network-firewall/)

**AWS Marketplace**
+ [Splunk Enterprise Amazon Machine Image (AMI)](https://aws.amazon.com/marketplace/pp/prodview-l6oos72bsyaks)

# 更多模式
<a name="networking-more-patterns-pattern-list"></a>

**Topics**
+ [使用 Session Manager 和 Amazon EC2 Instance Connect 存取堡壘主機](access-a-bastion-host-by-using-session-manager-and-amazon-ec2-instance-connect.md)
+ [使用 AWS Fargate、AWS PrivateLink 和 Network Load Balancer，在 Amazon ECS 上私下存取容器應用程式](access-container-applications-privately-on-amazon-ecs-by-using-aws-fargate-aws-privatelink-and-a-network-load-balancer.md)
+ [使用 AWS PrivateLink 和 Network Load Balancer 在 Amazon ECS 上私下存取容器應用程式](access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer.md)
+ [使用 AWS Managed Microsoft AD 和內部部署 Microsoft Active Directory 集中 DNS 解析](centralize-dns-resolution-by-using-aws-managed-microsoft-ad-and-on-premises-microsoft-active-directory.md)
+ [使用、 AWS Amplify Angular 和 Module Federation 建立微型前端的入口網站](create-amplify-micro-frontend-portal.md)
+ [使用私有端點和 Application Load Balancer 在內部網站上部署 Amazon API Gateway API](deploy-an-amazon-api-gateway-api-on-an-internal-website-using-private-endpoints-and-an-application-load-balancer.md)
+ [使用 部署公有子網路的偵測屬性型存取控制 AWS Config](deploy-detective-attribute-based-access-controls-for-public-subnets-by-using-aws-config.md)
+ [部署公有子網路的預防性屬性型存取控制](deploy-preventative-attribute-based-access-controls-for-public-subnets.md)
+ [在 Amazon RDS 中啟用 PostgreSQL 資料庫執行個體的加密連線](enable-encrypted-connections-for-postgresql-db-instances-in-amazon-rds.md)
+ [使用 AWS Transit Gateway Connect 將 VRFs 擴展至 AWS AWS Transit Gateway](extend-vrfs-to-aws-by-using-aws-transit-gateway-connect.md)
+ [在 上將 F5 BIG-IP 工作負載遷移至 F5 BIG-IP VE AWS 雲端](migrate-an-f5-big-ip-workload-to-f5-big-ip-ve-on-the-aws-cloud.md)
+ [啟用 Amazon EKS Auto 模式時遷移 NGINX 傳入控制器](migrate-nginx-ingress-controller-eks-auto-mode.md)
+ [在非工作負載子網路的多帳戶 VPC 設計中保留可路由 IP 空間](preserve-routable-ip-space-in-multi-account-vpc-designs-for-non-workload-subnets.md)
+ [使用服務控制政策，防止帳戶層級的網際網路存取](prevent-internet-access-at-the-account-level-by-using-a-service-control-policy.md)
+ [從 AWS Network Firewall 傳送提醒到 Slack 頻道](send-alerts-from-aws-network-firewall-to-a-slack-channel.md)
+ [使用 Amazon CloudFront 在 Amazon S3 儲存貯體中透過 VPC 提供靜態內容](serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront.md)
+ [使用 AWS Elastic Disaster Recovery 為 Oracle JD Edwards EnterpriseOne 設定災難復原](set-up-disaster-recovery-for-oracle-jd-edwards-enterpriseone-with-aws-elastic-disaster-recovery.md)
+ [使用 BMC Discovery 查詢來擷取遷移資料以進行遷移規劃](use-bmc-discovery-queries-to-extract-migration-data-for-migration-planning.md)
+ [使用 Network Firewall 從傳出流量的伺服器名稱指示擷取 DNS 網域名稱](use-network-firewall-to-capture-the-dns-domain-names-from-the-server-name-indication-sni-for-outbound-traffic.md)

# 內容交付
<a name="contentdelivery-pattern-list"></a>

**Topics**
+ [使用 AWS Firewall Manager 和 Amazon Data Firehose 將 AWS WAF 日誌傳送至 Splunk](send-aws-waf-logs-to-splunk-by-using-aws-firewall-manager-and-amazon-data-firehose.md)
+ [使用 Amazon CloudFront 在 Amazon S3 儲存貯體中透過 VPC 提供靜態內容](serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront.md)
+ [更多模式](contentdelivery-more-patterns-pattern-list.md)

# 使用 AWS Firewall Manager 和 Amazon Data Firehose 將 AWS WAF 日誌傳送至 Splunk
<a name="send-aws-waf-logs-to-splunk-by-using-aws-firewall-manager-and-amazon-data-firehose"></a>

*Michael Friedenthal、Aman Kaur Gandhi 和 JJ Johnson，Amazon Web Services*

## 總結
<a name="send-aws-waf-logs-to-splunk-by-using-aws-firewall-manager-and-amazon-data-firehose-summary"></a>

從歷史上看，有兩種方式可將資料移至 Splunk：推送或提取架構。*提取架構*透過重試提供交付資料保證，但需要 Splunk 中輪詢資料的專用資源。由於輪詢，提取架構通常不是即時的。中的*推送架構*通常具有較低的延遲、更具可擴展性，並降低操作複雜性和成本。不過，它不保證交付，通常需要客服人員。

Splunk 與 Amazon Data Firehose 整合，可透過 HTTP 事件收集器 (HEC) 將即時串流資料交付至 Splunk。此整合提供推送和提取架構的優點，可保證透過重試交付資料、近乎即時、低延遲和低複雜性。HEC 會透過 HTTP 或 HTTPS 將資料直接快速有效地傳送至 Splunk。HECs以字符為基礎，無需在應用程式或支援檔案中硬式編碼登入資料。

在 AWS Firewall Manager 政策中，您可以為所有帳戶中的所有 AWS WAF Web ACL 流量設定記錄，然後使用 Firehose 交付串流將該記錄資料傳送至 Splunk 以進行監控、視覺化和分析。此解決方案提供下列優點：
+ 所有帳戶中 AWS WAF Web ACL 流量的集中管理和記錄
+ Splunk 與單一 整合 AWS 帳戶
+ 可擴展性
+ 近乎即時的日誌資料交付
+ 透過使用無伺服器解決方案進行成本最佳化，因此您不需要支付未使用的資源。

## 先決條件和限制
<a name="send-aws-waf-logs-to-splunk-by-using-aws-firewall-manager-and-amazon-data-firehose-prereqs"></a>

**先決條件**
+ 屬於 組織一部分 AWS 帳戶 的作用中 AWS Organizations。
+ 您必須擁有下列許可，才能使用 Firehose 啟用記錄：
  + `iam:CreateServiceLinkedRole`
  + `firehose:ListDeliveryStreams`
  + `wafv2:PutLoggingConfiguration`
+ AWS WAF 必須設定 及其 Web ACLs。如需說明，請參閱 [入門 AWS WAF](https://docs.aws.amazon.com/waf/latest/developerguide/getting-started.html)。
+ AWS Firewall Manager 必須設定 。如需說明，請參閱[AWS Firewall Manager 先決條件](https://docs.aws.amazon.com/waf/latest/developerguide/fms-prereq.html)。
+  AWS WAF 必須設定 的 Firewall Manager 安全政策。如需說明，請參閱 [AWS Firewall ManagerAWS WAF 政策入門](https://docs.aws.amazon.com/waf/latest/developerguide/getting-started-fms.html)。
+ Splunk 必須使用 Firehose 可存取的公有 HTTP 端點進行設定。

**限制**
+  AWS 帳戶 必須在 的單一組織中進行管理 AWS Organizations。
+ Web ACL 必須位於與交付串流相同的區域。如果您要擷取 Amazon CloudFront 的日誌，請在美國東部 （維吉尼亞北部） 區域 建立 Firehose 交付串流。 `us-east-1`
+ Splunk 附加元件 for Firehose 適用於付費 Splunk Cloud 部署、分散式 Splunk Enterprise 部署和單一執行個體 Splunk Enterprise 部署。免費試用 Splunk Cloud 部署不支援此附加元件。

## Architecture
<a name="send-aws-waf-logs-to-splunk-by-using-aws-firewall-manager-and-amazon-data-firehose-architecture"></a>

**目標技術堆疊**
+ Firewall Manager
+ Firehose
+ Amazon Simple Storage Service (Amazon S3)
+ AWS WAF
+ Splunk

**目標架構**

下圖顯示如何使用 Firewall Manager 集中記錄 AWS WAF 所有資料，並透過 Firehose 將其傳送至 Splunk。

![\[架構圖顯示透過 Amazon Data Firehose 將 AWS WAF 日誌資料傳送至 Splunk\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/3dfeaae0-985a-42b8-91c4-ece081f0b51b/images/669169b1-caa4-419b-9988-19806ded54eb.png)


1.  AWS WAF Web ACLs 會將防火牆日誌資料傳送至 Firewall Manager。

1. Firewall Manager 會將日誌資料傳送至 Firehose。

1. Firehose 交付串流會將日誌資料轉送至 Splunk 和 S3 儲存貯體。S3 儲存貯體會在 Firehose 交付串流發生錯誤時做為備份。

**自動化和擴展**

此解決方案旨在擴展和容納組織內的所有 AWS WAF Web ALCs。您可以設定所有 Web ACLs使用相同的 Firehose 執行個體。不過，如果您想要設定和使用多個 Firehose 執行個體，您可以這麼做。

## 工具
<a name="send-aws-waf-logs-to-splunk-by-using-aws-firewall-manager-and-amazon-data-firehose-tools"></a>

**AWS 服務**
+ [AWS Firewall Manager](https://docs.aws.amazon.com/waf/latest/developerguide/fms-chapter.html) 是一種安全管理服務，可協助您集中設定和管理帳戶和應用程式中的防火牆規則 AWS Organizations。
+ [Amazon Data Firehose](https://docs.aws.amazon.com/firehose/latest/dev/what-is-this-service.html) 可協助您將即時[串流資料](https://aws.amazon.com/streaming-data/)交付至其他 AWS 服務自訂 HTTP 端點，以及受支援的第三方服務供應商所擁有的 HTTP 端點，例如 Splunk。
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) 是一種雲端型物件儲存服務，可協助您儲存、保護和擷取任何數量的資料。
+ [AWS WAF](https://docs.aws.amazon.com/waf/latest/developerguide/what-is-aws-waf.html) 是一種 Web 應用程式防火牆，可協助您監控轉送至受保護 Web 應用程式資源的 HTTP 和 HTTPS 請求。

**其他工具**
+ [Splunk](https://docs.splunk.com/Documentation) 可協助您監控、視覺化和分析日誌資料。

## 史詩
<a name="send-aws-waf-logs-to-splunk-by-using-aws-firewall-manager-and-amazon-data-firehose-epics"></a>

### 設定 Splunk
<a name="configure-splunk"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 安裝 Splunk 應用程式 AWS。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/send-aws-waf-logs-to-splunk-by-using-aws-firewall-manager-and-amazon-data-firehose.html) | 安全管理員、Splunk 管理員 | 
| 安裝 的附加元件 AWS WAF。 | 重複上述指示以安裝適用於 Splunk 的 **AWS Web Application Firewall 附加元件**。 | 安全管理員、Splunk 管理員 | 
| 安裝和設定 Splunk 附加元件 for Firehose。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/send-aws-waf-logs-to-splunk-by-using-aws-firewall-manager-and-amazon-data-firehose.html) | 安全管理員、Splunk 管理員 | 

### 建立 Firehose 交付串流
<a name="create-the-akf-delivery-stream"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 授予 Firehose 存取 Splunk 目的地的權限。 | 設定允許 Firehose 存取 Splunk 目的地並將日誌資料備份到 S3 儲存貯體的存取政策。如需詳細資訊，請參閱[授予 Firehose 存取 Splunk 目的地](https://docs.aws.amazon.com/firehose/latest/dev/controlling-access.html#using-iam-splunk)。 | 安全管理員 | 
| 建立 Firehose 交付串流。 | 在您管理 Web ACLs的相同帳戶中 AWS WAF，在 Firehose 中建立交付串流。您在建立交付串流時必須擁有 IAM 角色。Firehose 假設 IAM 角色並取得指定 S3 儲存貯體的存取權。如需說明，請參閱[建立交付串流](https://docs.aws.amazon.com/firehose/latest/dev/basic-create.html)。注意下列事項：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/send-aws-waf-logs-to-splunk-by-using-aws-firewall-manager-and-amazon-data-firehose.html)針對您在 HTTP 事件收集器中設定的每個字符重複此程序。 | 安全管理員 | 
| 測試交付串流。 | 測試交付串流，以驗證其已正確設定。如需說明，請參閱 Firehose 文件中的[測試使用 Splunk 做為目的地](https://docs.aws.amazon.com/firehose/latest/dev/test-drive-firehose.html#test-drive-destination-splunk)。 | 安全管理員 | 

### 設定 Firewall Manager 記錄資料
<a name="configure-firewall-manager-to-log-data"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定 Firewall Manager 政策。 | Firewall Manager 政策必須設定為啟用記錄，並將日誌轉送至正確的 Firehose 交付串流。如需詳細資訊和說明，請參閱[設定 AWS WAF 政策的記錄](https://docs.aws.amazon.com/waf/latest/developerguide/waf-policies.html#waf-policies-logging-config)。 | 安全管理員 | 

## 相關資源
<a name="send-aws-waf-logs-to-splunk-by-using-aws-firewall-manager-and-amazon-data-firehose-resources"></a>

**AWS resources**
+ [記錄 Web ACL 流量](https://docs.aws.amazon.com/waf/latest/developerguide/logging.html) (AWS WAF 文件）
+ [設定 AWS WAF 政策的記錄 ](https://docs.aws.amazon.com/waf/latest/developerguide/waf-policies.html#waf-policies-logging-config)(AWS WAF 文件）
+ [教學課程：使用 Amazon Data Firehose 將 VPC 流程日誌傳送至 Splunk ](https://docs.aws.amazon.com/firehose/latest/dev/vpc-splunk-tutorial.html)(Firehose 文件）
+ [如何使用 Amazon Data Firehose 將 VPC 流程日誌推送至 Splunk？](https://aws.amazon.com/premiumsupport/knowledge-center/push-flow-logs-splunk-firehose/) (AWS 知識中心）
+ [使用 Amazon Data Firehose 將資料擷取至 Splunk ](https://aws.amazon.com/blogs/big-data/power-data-ingestion-into-splunk-using-amazon-kinesis-data-firehose/)(AWS 部落格文章）

**Splunk 文件**
+ [適用於 Amazon Data Firehose 的 Splunk 附加元件](https://docs.splunk.com/Documentation/AddOns/released/Firehose/About)

# 使用 Amazon CloudFront 在 Amazon S3 儲存貯體中透過 VPC 提供靜態內容
<a name="serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront"></a>

*Angel Emmanuel Hernandez Cebrian，Amazon Web Services*

## 總結
<a name="serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront-summary"></a>

當您提供託管在 Amazon Web Services (AWS) 上的靜態內容時，建議方法是使用 Amazon Simple Storage Service (S3) 儲存貯體做為原始伺服器，並使用 Amazon CloudFront 來分發內容。此解決方案有兩個主要優點：在節點快取靜態內容的便利性，以及為 CloudFront 分佈定義 [Web 存取控制清單](https://docs.aws.amazon.com/waf/latest/developerguide/web-acl.html) (Web ACLs) 的功能，可協助您以最少的組態和管理開銷保護對內容的請求。

不過，標準建議的方法有常見的架構限制。在某些環境中，您希望在虛擬私有雲端 (VPC) 中部署的虛擬防火牆設備檢查所有內容，包括靜態內容。標準方法不會透過 VPC 路由流量以進行檢查。此模式提供替代的架構解決方案。您仍然會使用 CloudFront 分佈來提供 S3 儲存貯體中的靜態內容，但流量會使用 Application Load Balancer 透過 VPC 路由。然後AWS Lambda 函數會從 S3 儲存貯體擷取並傳回內容。

## 先決條件和限制
<a name="serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront-prereqs"></a>

**先決條件**
+ 作用中的 AWS 帳戶
+ S3 儲存貯體中託管的靜態網站內容。

**限制**
+ 此模式中的資源必須位於單一 AWS 區域，但可以在不同的 AWS 帳戶中佈建。
+ 限制適用於 Lambda 函數可分別接收和傳送的最大請求和回應大小。如需詳細資訊，請參閱 Lambda 函數中的*限制*做為目標 (Elastic Load Balancing 文件）。 [https://docs.aws.amazon.com/elasticloadbalancing/latest/application/lambda-functions.html](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/lambda-functions.html)
+ 使用此方法時，請務必在效能、可擴展性、安全性和成本效益之間取得良好的平衡。儘管 Lambda 具有高可擴展性，但如果並行 Lambda 調用的數量超過最大配額，則會調節某些請求。如需詳細資訊，請參閱 Lambda 配額 (Lambda 文件）。使用 Lambda 時，您也需要考慮定價。若要將 Lambda 調用降至最低，請確定您已正確定義 CloudFront 分佈的快取。如需詳細資訊，請參閱[最佳化快取和可用性 ](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/ConfiguringCaching.html)(CloudFront 文件）。

## Architecture
<a name="serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront-architecture"></a>

**目標技術堆疊**
+ CloudFront
+ Amazon Virtual Private Cloud (Amazon VPC)
+ Application Load Balancer
+ Lambda
+ Amazon S3

**目標架構**

當您需要使用 CloudFront 透過 VPC 從 S3 儲存貯體提供靜態內容時，下圖會顯示建議的架構。

![\[流量流經 VPC 中的 Application Load Balancer 至 Lambda 函數。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/e0dd6928-4fe0-47ab-954f-9de5563349d8/images/b42c7dd9-4a72-4998-bf88-195c8f90ed3e.png)


1. 用戶端請求 CloudFront 分佈的 URL，以取得 S3 儲存貯體中的特定網站檔案。

1. CloudFront 會將請求傳送至 AWS WAF。AWS WAF 會使用套用至 CloudFront 分佈的 Web ACLs 來篩選請求。如果請求被判定為有效，流程會繼續。如果請求被判定為無效，用戶端會收到 403 錯誤。

1. CloudFront 會檢查其內部快取。如果有符合傳入請求的有效金鑰，則會將關聯的值傳回給用戶端做為回應。如果沒有，流程會繼續。

1. CloudFront 會將請求轉送至指定 Application Load Balancer 的 URL。

1. Application Load Balancer 具有以 Lambda 函數為基礎的與目標群組相關聯的接聽程式。Application Load Balancer 會叫用 Lambda 函數。

1. Lambda 函數會連線至 S3 儲存貯體、對其執行`GetObject`操作，並將內容傳回為回應。

**自動化和擴展**

若要使用此方法自動部署靜態內容，請建立 CI/CD 管道來更新託管網站的 Amazon S3 儲存貯體。

Lambda 函數會自動擴展，以在服務的配額和限制內處理並行請求。如需詳細資訊，請參閱 [Lambda 函數擴展](https://docs.aws.amazon.com/lambda/latest/dg/invocation-scaling.html)和 [Lambda 配額](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html) (Lambda 文件）。對於其他 AWS 服務和功能，例如 CloudFront 和 Application Load Balancer，AWS 會自動擴展這些服務和功能。

## 工具
<a name="serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront-tools"></a>
+ [Amazon CloudFront](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Introduction.html) 透過全球資料中心網路提供 Web 內容，從而降低延遲並改善效能，從而加快 Web 內容的發佈速度。
+ [Elastic Load Balancing (ELB)](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html) 會將傳入的應用程式或網路流量分配到多個目標。在此模式中，您可以使用透過 Elastic Load Balancing 佈建的 [Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html)，將流量導向 Lambda 函數。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一種運算服務，可協助您執行程式碼，而無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展，因此您只需按使用的運算時間付費。
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) 是一種雲端型物件儲存服務，可協助您儲存、保護和擷取任何數量的資料。
+ [Amazon Virtual Private Cloud (Amazon VPC)](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) 可協助您在已定義的虛擬網路中啟動 AWS 資源。這個虛擬網路類似於您在自己的資料中心內操作的傳統網路，具有使用可擴展的 AWS 基礎設施的優勢。

## 史詩
<a name="serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront-epics"></a>

### 使用 CloudFront 透過 VPC 從 Amazon S3 提供靜態內容
<a name="use-cloudfront-to-serve-static-content-from-amazon-s3-through-a-vpc"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 VPC。 | 建立 VPC 以託管在此模式中部署的資源，例如 Application Load Balancer 和 Lambda 函數。 如需說明，請參閱[建立 VPC](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-vpcs.html#Create-VPC) (Amazon VPC 文件）。 | 雲端架構師 | 
| 建立 AWS WAF Web ACL。 | 建立 AWS WAF Web ACL。稍後在此模式中，您會將此 Web ACL 套用至 CloudFront 分佈。如需說明，請參閱[建立 Web ACL](https://docs.aws.amazon.com/waf/latest/developerguide/web-acl-creating.html) (AWS WAF 文件）。 | 雲端架構師 | 
| 建立 Lambda 函數。 | 建立 Lambda 函數，以網站形式提供 S3 儲存貯體中託管的靜態內容。使用此模式[額外資訊](#serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront-additional)區段中提供的程式碼。自訂程式碼以識別您的目標 S3 儲存貯體。 | 一般 AWS | 
| 上傳 Lambda 函數。 | 輸入下列命令，將 Lambda 函數程式碼上傳至 Lambda 中的 .zip 檔案封存。<pre>aws lambda update-function-code \<br />--function-name  \ <br />--zip-file fileb://lambda-alb-s3-website.zip</pre> | 一般 AWS | 
| 建立 Application Load Balancer。 | 建立指向 Lambda 函數的面向網際網路的 Application Load Balancer。如需說明，請參閱[建立 Lambda 函數的目標群組](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/lambda-functions.html#register-lambda-function) (Elastic Load Balancing 文件）。如需高可用性組態，請建立 Application Load Balancer，並將其連接至不同可用區域中的私有子網路。 | 雲端架構師 | 
| 建立 CloudFront 分佈。 | 建立指向您建立之 Application Load Balancer 的 CloudFront 分佈。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront.html) | 雲端架構師 | 

## 相關資源
<a name="serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront-resources"></a>

**AWS 文件**
+ [最佳化快取和可用性 ](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/ConfiguringCaching.html)(CloudFront 文件）
+ [Lambda 函數做為目標](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/lambda-functions.html) (Elastic Load Balancing 文件）
+ [Lambda 配額](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html) (Lambda 文件）

**AWS 服務網站**
+ [Application Load Balancer](https://aws.amazon.com/es/elasticloadbalancing/application-load-balancer/)
+ [Lambda](https://aws.amazon.com/en/lambda/)
+ [CloudFront](https://aws.amazon.com/en/cloudfront/)
+ [Amazon S3](https://aws.amazon.com/en/s3/)
+ [AWS WAF](https://aws.amazon.com/en/waf/)
+ [Amazon VPC](https://aws.amazon.com/en/vpc/)

## 其他資訊
<a name="serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront-additional"></a>

**Code**

下列範例 Lambda 函數是以 Node.js 撰寫。此 Lambda 函數充當 Web 伺服器，對包含網站資源的 S3 儲存貯體執行`GetObject`操作。

```
/**

 * This is an AWS Lambda function created for demonstration purposes.

 * It retrieves static assets from a defined Amazon S3 bucket.

 * To make the content available through a URL, use an Application Load Balancer with a Lambda integration.
 * 
 * Set the S3_BUCKET environment variable in the Lambda function definition.
 */

var AWS = require('aws-sdk');

exports.handler = function(event, context, callback) {

    var bucket = process.env.S3_BUCKET;    
    var key = event.path.replace('/', '');
    
    if (key == '') {
        key = 'index.html';
    }

    // Fetch from S3
    var s3 = new AWS.S3();
    return s3.getObject({Bucket: bucket, Key: key},
       function(err, data) {

            if (err) {
                return err;
            }

            var isBase64Encoded = false;
            var encoding = 'utf8';
            
            if (data.ContentType.indexOf('image/') > -1) {
                isBase64Encoded = true;
                encoding = 'base64'
            }
    
            var resp = {
                statusCode: 200,
                headers: {
                    'Content-Type': data.ContentType,
                },
                body: new Buffer(data.Body).toString(encoding),
                isBase64Encoded: isBase64Encoded
            };

            callback(null, resp);
        }
    );
};
```

# 更多模式
<a name="contentdelivery-more-patterns-pattern-list"></a>

**Topics**
+ [檢查 Amazon CloudFront 分佈是否有存取記錄、HTTPS 和 TLS 版本](check-an-amazon-cloudfront-distribution-for-access-logging-https-and-tls-version.md)
+ [在 Amazon EKS 叢集上部署以 gRPC 為基礎的應用程式，並使用 Application Load Balancer 存取它](deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer.md)
+ [部署公有子網路的預防性屬性型存取控制](deploy-preventative-attribute-based-access-controls-for-public-subnets.md)
+ [使用 Terraform 在 AWS Wavelength 區域中部署資源](deploy-resources-wavelength-zone-using-terraform.md)
+ [使用 Terraform 部署 AWS WAF 解決方案的安全自動化](deploy-the-security-automations-for-aws-waf-solution-by-using-terraform.md)
+ [為以儲存格為基礎的架構設定無伺服器儲存格路由器](serverless-cell-router-architecture.md)
+ [使用 Amazon Q Developer 作為編碼助理，以提高您的生產力](use-q-developer-as-coding-assistant-to-increase-productivity.md)
+ [使用 Splunk 檢視 AWS Network Firewall 日誌和指標](view-aws-network-firewall-logs-and-metrics-by-using-splunk.md)