

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

# Amazon ECS 任務的儲存選項
<a name="using_data_volumes"></a>

Amazon ECS 會依據您的需求，提供彈性、具成本效益且易於使用的資料儲存選項。Amazon ECS 支援容器的下列資料磁碟區選項：


| 資料量 | 支援的容量 | 支援的作業系統 | 儲存持續性 | 使用案例 | 
| --- | --- | --- | --- | --- | 
| Amazon Elastic Block Store (Amazon EBS) | Fargate、Amazon EC2、Amazon ECS 受管執行個體 | Linux、Windows (僅限於 Amazon EC2) | 連接至獨立任務時，可為持續性儲存。連接至由服務維護的任務時，則為暫時性儲存。 | Amazon EBS 磁碟區為資料密集型容器化工作負載，提供具成本效益、持久且高效能的區塊儲存服務。常見使用案例包括交易型工作負載 (如資料庫、虛擬桌面與根磁碟區)，以及輸送量密集型工作負載 (如日誌處理與 ETL 工作負載)。如需詳細資訊，請參閱[將 Amazon EBS 磁碟區與 Amazon ECS 搭配使用](ebs-volumes.md)。 | 
| Amazon Elastic File System (Amazon EFS) | Fargate、Amazon EC2、Amazon ECS 受管執行個體 | Linux | 持續 | Amazon EFS 磁碟區提供可用於 Amazon ECS 任務的簡單、可擴展且持續性的共用檔案儲存服務，該服務會隨著您新增或刪除檔案自動擴容與縮容。Amazon EFS 磁碟區支援並行操作，適用於需水平擴展且需要低延遲、高輸送量與寫後讀一致性等儲存功能的容器化應用程式。常見使用案例包括資料分析、媒體處理、內容管理與 Web 服務等工作負載。如需詳細資訊，請參閱[將 Amazon EFS 磁碟區與 Amazon ECS 搭配使用](efs-volumes.md)。 | 
| Amazon FSx for Windows File Server | Amazon EC2 | Windows | 持續 | FSx for Windows File Server 磁碟區提供全受管 Windows 檔案伺服器，可用於對需要持續性、分散式、共用且靜態檔案儲存的 Windows 任務進行佈建。常見使用案例包括 .NET 應用程式，這類應用程式可能需要將本機資料夾作為持續性儲存空間來儲存應用程式輸出內容。Amazon FSx for Windows File Server 會在容器中提供一個本機資料夾，支援多個容器在由「SMB 共用」提供支援的同一檔案系統中進行讀寫操作。如需詳細資訊，請參閱[搭配 Amazon ECS 使用 FSx for Windows File Server 磁碟區](wfsx-volumes.md)。 | 
| Amazon FSx for NetApp ONTAP | Amazon EC2 | Linux | 持續 | Amazon FSx for NetApp ONTAP 磁碟區提供全受管 NetApp ONTAP 檔案系統，可用於對需要持久性、高效能且功能豐富的共用檔案儲存的 Linux 任務進行佈建。Amazon FSx for NetApp ONTAP 支援 NFS 與 SMB 通訊協定，並提供快照、複製及重複資料刪除等企業級功能。常見使用案例包括高效能運算工作負載、內容儲存庫，以及需要符合 POSIX 標準之共用儲存的應用程式。如需詳細資訊，請參閱 [Mounting Amazon FSx for NetApp ONTAP file systems from Amazon ECS containers](https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/mount-ontap-ecs-containers.html)。 | 
| Docker 磁碟區 | Amazon EC2 | Windows，Linux | 持續 | Docker 磁碟區是 Docker 容器執行時期的一項功能，允許容器透過掛載主機檔案系統中的目錄來實現資料持久化。Docker 磁碟區驅動程式 (也稱為外掛程式) 用於整合容器磁碟區與外部儲存系統。Docker 磁碟區可由第三方驅動程式管理，也可由內建的 local 驅動程式管理。Docker 磁碟區的常見使用案例包括提供持續性資料磁碟區，或在同一容器執行個體上不同容器的不同位置共用磁碟區。如需詳細資訊，請參閱[搭配 Amazon ECS 使用 Docker 磁碟區](docker-volumes.md)。 | 
| 綁定掛載 | Fargate、Amazon EC2、Amazon ECS 受管執行個體 | Windows，Linux | 暫時 | 綁定掛載由主機上的檔案或目錄組成 AWS Fargate，例如掛載到容器的 Amazon EC2 執行個體或 。綁定掛載的常見使用案例包括：在同一任務中，將來源容器的磁碟區與其他容器公用；或在一個或多個容器中，掛載主機磁碟區或空磁碟區。如需詳細資訊，請參閱[搭配 Amazon ECS 使用綁定掛載](bind-mounts.md)。 | 

# 將 Amazon EBS 磁碟區與 Amazon ECS 搭配使用
<a name="ebs-volumes"></a>

Amazon Elastic Block Store (Amazon EBS) 磁碟區為資料密集型工作負載提供高可用性、具成本效益、持久且高效能的區塊儲存服務。Amazon EBS 磁碟區可與 Amazon ECS 任務搭配使用，適用於高輸送量及交易密集型的應用程式。如需有關 Amazon EBS 磁碟區的詳細資訊，請參閱 *Amazon EBS User Guide* 中的 [Amazon EBS volumes](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-volumes.html)。

連接至 Amazon ECS 任務的 Amazon EBS 磁碟區由 Amazon ECS 代表您管理。在獨立任務啟動期間，您可以提供相應組態，用於將一個 EBS 磁碟區連接至任務。在服務建立或更新期間，您可以提供相應組態，用於為 Amazon ECS 服務管理的每項任務分別連接一個 EBS 磁碟區。您可以設定新的空白磁碟區進行連接，也可以使用快照從現有磁碟區載入資料。

**注意**  
在使用快照設定磁碟區時，您可以指定 `volumeInitializationRate` (單位為 MiB/s)，從而以該速率從快照擷取資料，來建立在可預測的時間內完整初始化的磁碟區。如需有關磁碟區初始化的詳細資訊，請參閱 *Amazon EBS User Guide* 中的 [Initialize Amazon EBS volumes](https://docs.aws.amazon.com/ebs/latest/userguide/initalize-volume.html)。如需有關設定 Amazon EBS 磁碟區的詳細資訊，請參閱[在 Amazon ECS 任務定義中將磁碟區組態延至啟動時進行](specify-ebs-config.md)與[在部署 Amazon ECS 時指定 Amazon EBS 磁碟區組態](configure-ebs-volume.md)。

磁碟區組態會透過任務定義中的 `configuredAtLaunch` 參數，延至啟動時進行。透過在啟動時而非在任務定義中提供磁碟區組態，您可以建立不受特定資料磁碟區類型或特定 EBS 磁碟區設定限制的任務定義。然後，您可以在不同的執行時期環境中重複使用任務定義。例如，您可以在部署期間為生產環境工作負載提供比預生產環境更高的輸送量。

 連接至任務的 Amazon EBS 磁碟區可以使用 AWS Key Management Service (AWS KMS) 金鑰加密，以保護您的資料。如需詳細資訊，請參閱 [加密儲存於連接至 Amazon ECS 任務之 Amazon EBS 磁碟區中的資料](ebs-kms-encryption.md)。

若要監控磁碟區效能，您也可以使用 Amazon CloudWatch 指標。如需有關 Amazon EBS 磁碟區 Amazon ECS 指標的詳細資訊，請參閱 [Amazon ECS CloudWatch 指標](available-metrics.md)與 [Amazon ECS Container Insights metrics](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Container-Insights-metrics-ECS.html)。

所有支援 Amazon ECS 的商業與中國 [AWS 區域](https://docs.aws.amazon.com/glossary/latest/reference/glos-chap.html?icmpid=docs_homepage_addtlrcs#region)，皆支援將 Amazon EBS 磁碟區連接至任務。

## 支援的作業系統與容量
<a name="ebs-volumes-configuration"></a>

下表提供支援的作業系統與容量組態。


| Capacity | Linux  | Windows | 
| --- | --- | --- | 
| Fargate |  平台版本 1.4.0 或更新版本 (Linux) 支援 Amazon EBS 磁碟區。如需詳細資訊，請參閱[適用於 Amazon ECS 的 Fargate 平台版本](platform-fargate.md)。 | 不支援 | 
| EC2 | Amazon EBS 磁碟區支援用於託管在使用 Amazon ECS 最佳化 Amazon Machine Image (AMI) 的 Nitro 型執行個體上的任務。如需有關執行個體類型的詳細資訊，請參閱 Amazon EC2 User Guide 中的 [Instance types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html)。ECS 最佳化 AMI `20231219` 及更新版本支援 Amazon EBS 磁碟區。如需詳細資訊，請參閱[擷取 Amazon ECS 最佳化 AMI 中繼資料](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/retrieve-ecs-optimized_AMI.html)。 | 使用 Amazon ECS 最佳化 Amazon Machine Image (AMI) 的 Nitro 型執行個體上託管的任務。如需有關執行個體類型的詳細資訊，請參閱 Amazon EC2 User Guide 中的 [Instance types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html)。ECS 最佳化 AMI `20241017` 及更新版本支援 Amazon EBS 磁碟區。如需詳細資訊，請參閱[擷取 Amazon ECS 最佳化 Windows AMI 中繼資料](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/retrieve-ecs-optimized_windows_AMI.html)。 | 
| Amazon ECS 受管執行個體 | Amazon EBS 磁碟區支援用於託管在 Amazon ECS Linux 受管執行個體上的任務。 | 不支援 | 

## 考量事項
<a name="ebs-volume-considerations"></a>

 使用 Amazon EBS 磁碟區時，請考量下列事項：
+ 在 `use1-az3` 可用區域中，您無法設定要連接至 Fargate Amazon ECS 任務的 Amazon EBS 磁碟區。
+ 磁性 (`standard`) Amazon EBS 磁碟區類型不支援用於 Fargate 上託管的任務。如需有關 Amazon EBS 磁碟區類型的詳細資訊，請參閱 *Amazon EC2 User Guide* 中的 [Amazon EBS volumes](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-volume-types.html)。
+ 建立在部署時設定磁碟區的服務或獨立任務時，需用到 Amazon ECS 基礎結構 IAM 角色。您可以將 AWS 託管的 `AmazonECSInfrastructureRolePolicyForVolumes` IAM 政策連接至該角色，也可參照該托管政策建立並連接自己的政策，該政策需具有符合特定需求的許可。如需詳細資訊，請參閱[Amazon ECS 基礎結構 IAM 角色](infrastructure_IAM_role.md)。
+ 每項 Amazon ECS 任務最多僅能連接一個 Amazon EBS 磁碟區，且必須是全新磁碟區。現有 Amazon EBS 磁碟區無法連接至任務。但在部署時，可透過現有磁碟區的快照來設定新的 Amazon EBS 磁碟區。
+ 若要將 Amazon EBS 磁碟區與 Amazon ECS 服務搭配使用，部署控制器必須是 `ECS`。使用此部署控制器時，滾動部署與藍/綠部署策略均受支援。
+ 若要讓任務中的容器寫入掛載的 Amazon EBS 磁碟區，容器必須具有適當的檔案系統許可。當您在容器定義中指定非根使用者時，Amazon ECS 會自動使用群組型許可來設定磁碟區，以允許指定的使用者讀取和寫入磁碟區。如果未指定使用者，容器會以根身分執行，並具有磁碟區的完整存取權。
+ Amazon ECS 會自動將 `AmazonECSCreated` 與 `AmazonECSManaged` 保留標籤新增至連接的磁碟區。如果從磁碟區中移除這些標籤，Amazon ECS 將無法代表您管理磁碟區。如需有關標記 Amazon EBS 磁碟區的詳細資訊，請參閱[標記 Amazon EBS 磁碟區](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specify-ebs-config.html#ebs-volume-tagging)。如需有關標記 Amazon ECS 資源的詳細資訊，請參閱[標記 Amazon ECS 資源](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-using-tags.html)。
+ 不支援從包含分割區的 Amazon EBS 磁碟區快照佈建磁碟區。
+ 連接至由服務管理之任務的磁碟區不會保留下來，一律會在任務終止時被刪除。
+ 您無法設定要連接至在 AWS Outposts上執行之 Amazon ECS 任務的 Amazon EBS 磁碟區。

# 非根使用者行為
<a name="ebs-non-root-behavior"></a>

當您在容器定義中指定非根使用者時，Amazon ECS 會自動使用群組型許可來設定 Amazon EBS 磁碟區，以允許指定的使用者讀取和寫入磁碟區。磁碟區是以下列特性掛載：
+ 磁碟區由根使用者和根群組擁有。
+ 群組許可設定為允許讀取和寫入存取。
+ 非根使用者會新增至適當的群組以存取磁碟區。

搭配非根容器使用 Amazon EBS 磁碟區時，請遵循下列最佳實務：
+ 在容器映像中使用一致的使用者 IDs(UIDs) 和群組 IDs GIDs)，以確保一致的許可。
+ 在容器映像中預先建立掛載點目錄，並設定適當的擁有權和許可。
+ 在開發環境中使用 Amazon EBS 磁碟區測試您的容器，以確認檔案系統許可如預期般運作。
+ 如果相同任務中的多個容器共用磁碟區，請確保它們使用相容的 UIDs/GIDs或掛載具有一致存取期望的磁碟區。

# 在 Amazon ECS 任務定義中將磁碟區組態延至啟動時進行
<a name="specify-ebs-config"></a>

若要設定 Amazon EBS 磁碟區以連接至任務，您必須在任務定義中指定掛載點組態，並為該磁碟區命名。您也必須將 `configuredAtLaunch` 設定為 `true`，因為無法在任務定義中設定 Amazon EBS 磁碟區進行連接。但可在部署期間設定 Amazon EBS 磁碟區進行連接。

若要使用 AWS Command Line Interface (AWS CLI) 註冊任務定義，請將範本儲存為 JSON 檔案，然後將檔案傳遞為 `[register-task-definition](https://docs.aws.amazon.com/cli/latest/reference/ecs/register-task-definition.html)`命令的輸入。

若要使用 建立和註冊任務定義 AWS 管理主控台，請參閱 [使用主控台建立 Amazon ECS 任務定義](create-task-definition.md)。

以下任務定義展示了 `mountPoints` 與 `volumes` 物件在任務定義中的語法。如需有關任務定義參數的詳細資訊，請參閱 [Fargate 的 Amazon ECS 任務定義參數](task_definition_parameters.md)。若要使用此範例，請以您自己的資訊取代 `user input placeholders`。

## Linux
<a name="linux-example"></a>

```
{
    "family": "mytaskdef",
    "containerDefinitions": [
        {
            "name": "nginx",
            "image": "public.ecr.aws/nginx/nginx:latest",
            "networkMode": "awsvpc",
           "portMappings": [
                {
                    "name": "nginx-80-tcp",
                    "containerPort": 80,
                    "hostPort": 80,
                    "protocol": "tcp",
                    "appProtocol": "http"
                }
            ],
            "mountPoints": [
                {
                    "sourceVolume": "myEBSVolume",
                    "containerPath": "/mount/ebs",
                    "readOnly": true
                }
            ]
        }
    ],
    "volumes": [
        {
            "name": "myEBSVolume",
            "configuredAtLaunch": true
        }
    ],
    "requiresCompatibilities": [
        "FARGATE", "EC2"
    ],
    "cpu": "1024",
    "memory": "3072",
    "networkMode": "awsvpc"
}
```

## Windows
<a name="windows-example"></a>

```
{
    "family": "mytaskdef",
     "memory": "4096",
     "cpu": "2048",
    "family": "windows-simple-iis-2019-core",
    "executionRoleArn": "arn:aws:iam::012345678910:role/ecsTaskExecutionRole",
    "runtimePlatform": {"operatingSystemFamily": "WINDOWS_SERVER_2019_CORE"},
    "requiresCompatibilities": ["EC2"]
    "containerDefinitions": [
        {
             "command": ["New-Item -Path C:\\inetpub\\wwwroot\\index.html -Type file -Value '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p>'; C:\\ServiceMonitor.exe w3svc"],
            "entryPoint": [
                "powershell",
                "-Command"
            ],
            "essential": true,
            "cpu": 2048,
            "memory": 4096,
            "image": "mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019",
            "name": "sample_windows_app",
            "portMappings": [
                {
                    "hostPort": 443,
                    "containerPort": 80,
                    "protocol": "tcp"
                }
            ],
            "mountPoints": [
                {
                    "sourceVolume": "myEBSVolume",
                    "containerPath": "drive:\ebs",
                    "readOnly": true
                }
            ]
        }
    ],
    "volumes": [
        {
            "name": "myEBSVolume",
            "configuredAtLaunch": true
        }
    ],
    "requiresCompatibilities": [
        "FARGATE", "EC2"
    ],
    "cpu": "1024",
    "memory": "3072",
    "networkMode": "awsvpc"
}
```

`mountPoints`  
類型：物件陣列  
必要：否  
容器中資料磁碟區的掛載點。此參數會映射至 Docker API 中 create-container 的 `Volumes`，以及 docker run 的 `--volume` 選項。  
Windows 容器可在 `$env:ProgramData` 所在的相同磁碟上掛載整個目錄。Windows 容器無法在不同的磁碟機上掛載目錄，且掛載點不能跨磁碟機使用。您必須指定掛載點，將 Amazon EBS 磁碟區直接連接至 Amazon ECS 任務。    
`sourceVolume`  
類型：字串  
必要：是 (當使用 `mountPoints` 時)  
要掛載的磁碟區名稱。  
`containerPath`  
類型：字串  
必要：是 (當使用 `mountPoints` 時)  
掛載磁碟區之容器中的路徑。  
`readOnly`  
類型：布林值  
必要：否  
如果此數值為 `true`，容器擁有磁碟區的唯讀存取權。如果此值為 `false`，則容器可寫入磁碟區。預設值為 `false`。  
對於在執行 Windows 作業系統之 EC2 執行個體上執行的任務，將該值保留為預設值 `false`。

`name`  
類型：字串  
必要：否  
磁碟區名稱。最多可輸入 255 個字母 (大小寫)、數字、連字號 (`-`) 與底線 (`_`)。在容器定義 `mountPoints` 物件的 `sourceVolume` 參數中參考此名稱。

`configuredAtLaunch`  
類型：布林值  
必要：是，當您想要直接將 EBS 磁碟區連接至任務時。  
指定磁碟區可否在啟動時設定。若設定為 `true`，您可以在執行獨立任務或建立/更新服務時設定磁碟區。若設定為 `false`，您無法在任務定義中提供另一個磁碟區組態。必須提供此參數並將其設定為 `true`，以設定要連接至任務的 Amazon EBS 磁碟區。

# 加密儲存於連接至 Amazon ECS 任務之 Amazon EBS 磁碟區中的資料
<a name="ebs-kms-encryption"></a>

您可以使用 AWS Key Management Service (AWS KMS) 來建立和管理保護資料的密碼編譯金鑰。Amazon EBS 磁碟區是使用 進行靜態加密 AWS KMS keys。以下類型的資料會經過加密：
+ 儲存在磁碟區上的靜態資料
+ 磁碟 I/O 資料
+ 從磁碟區建立的快照
+ 從加密快照建立的新磁碟區

連接至任務的 Amazon EBS 磁碟區可透過以下兩種金鑰加密：一是別名為 `alias/aws/ebs` 的預設 AWS 受管金鑰 ，二是磁碟區組態中指定的對稱客戶自管金鑰。 AWS 帳戶 每個 的預設值 AWS 受管金鑰 都是唯一的 AWS 區域 ，且會自動建立。若要建立對稱客戶自管金鑰，請遵循 *AWS KMS Developer Guide* 中的 [Creating symmetric encryption KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk) 章節所述步驟進行。

您可以預設設定 Amazon EBS 加密，以便使用您為帳戶指定的 KMS 金鑰來 AWS 區域 加密在特定 中建立並連接至任務的所有新磁碟區。如需有關 Amazon EBS 加密與預設加密的詳細資訊，請參閱 * Developer Guide* 中的 [Amazon EBS encryption](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-encryption.html)。

## Amazon ECS 受管執行個體行為
<a name="managed-instances"></a>

您可以透過啟用加密功能來為 Amazon EBS 磁碟區加密，一種方式是啟用預設加密功能，另一種方式是在建立要加密的磁碟區時直接啟用加密功能。如需有關如何啟用預設加密功能 (帳戶層級) 的資訊，請參閱 *Amazon EBS User Guide* 中的 [Encryption by default](https://docs.aws.amazon.com/ebs/latest/userguide/encryption-by-default.html)。

您可以設定這些金鑰的任意組合。KMS 金鑰的優先順序如下：

1. 磁碟區組態中指定的 KMS 金鑰。在磁碟區組態中指定 KMS 金鑰時，其會覆寫 Amazon EBS 預設值以及在帳戶層級指定的任何 KMS 金鑰。

1. 在帳戶層級指定的 KMS 金鑰。在為 Amazon ECS 受管儲存體指定叢集層級的加密 KMS 金鑰時，其會覆寫 Amazon EBS 預設加密，但不會覆寫磁碟區組態中指定的任何 KMS 金鑰。

1. Amazon EBS 預設加密。如果您未指定帳戶層級 KMS 金鑰，也未在磁碟區組態中指定金鑰，則會套用預設加密。如果您啟用 Amazon EBS 預設加密，則預設使用的是您為預設加密指定的 KMS 金鑰。否則，預設使用別名為 `alias/aws/ebs` 的 AWS 受管金鑰 。
**注意**  
若在磁碟區組態中將 `encrypted` 設定為 `false`，不指定帳戶層級 KMS 金鑰，但啟用 Amazon EBS 預設加密，則該磁碟區仍會使用為 Amazon EBS 預設加密指定的金鑰進行加密。

## 非 Amazon ECS 受管執行個體行為
<a name="non-managed-instances"></a>

您也可以在建立或更新叢集時，設定 Amazon ECS 受管儲存體的 Amazon ECS 叢集層級加密。叢集層級加密會在任務層級生效，可用於透過指定的 KMS 金鑰，對連接至特定叢集中執行之每項任務的 Amazon EBS 磁碟區進行加密。如需有關為每項任務設定叢集層級加密的詳細資訊，請參閱 *Amazon ECS API reference* 中的 [ManagedStorageConfiguration](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ManagedStorageConfiguration.html)。

您可以設定這些金鑰的任意組合。KMS 金鑰的優先順序如下：

1. 磁碟區組態中指定的 KMS 金鑰。在磁碟區組態中指定 KMS 金鑰時，其會覆寫 Amazon EBS 預設值以及在叢集層級指定的任何 KMS 金鑰。

1. 在叢集層級指定的 KMS 金鑰。在為 Amazon ECS 受管儲存體指定叢集層級的加密 KMS 金鑰時，其會覆寫 Amazon EBS 預設加密，但不會覆寫磁碟區組態中指定的任何 KMS 金鑰。

1. Amazon EBS 預設加密。如果您未指定叢集層級 KMS 金鑰，也未在磁碟區組態中指定金鑰，則會套用預設加密。如果您啟用 Amazon EBS 預設加密，則預設使用的是您為預設加密指定的 KMS 金鑰。否則，預設值為 AWS 受管金鑰 具有別名 的 `alias/aws/ebs`。
**注意**  
若在磁碟區組態中將 `encrypted` 設定為 `false`，不指定叢集層級 KMS 金鑰，但啟用 Amazon EBS 預設加密，則該磁碟區仍會使用為 Amazon EBS 預設加密指定的金鑰進行加密。

## 客戶受管 KMS 金鑰政策
<a name="ebs-kms-encryption-policy"></a>

若要使用客戶自管金鑰加密連接至任務的 EBS 磁碟區，您必須設定 KMS 金鑰政策，確保用於磁碟區組態的 IAM 角色具有使用金鑰的必要許可。金鑰政策必須同時包含 `kms:CreateGrant` 與 `kms:GenerateDataKey*` 許可。加密使用快照建立的磁碟區時，需用到 `kms:ReEncryptTo` 與 `kms:ReEncryptFrom` 許可。如果只想為要連接的新空白磁碟區進行設定與加密，您可以排除 `kms:ReEncryptTo` 與 `kms:ReEncryptFrom` 許可。

下列 JSON 程式碼片段展示了可連接至 KMS 金鑰政策的金鑰政策陳述式。使用這些陳述式將提供 Amazon ECS 使用該金鑰加密 EBS 磁碟區的存取權。若要使用這些範例政策陳述式，請以自己的資訊取代 `user input placeholders`。與往常一樣，只設定需要的許可即可。

```
{
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::111122223333:role/ecsInfrastructureRole" },
      "Action": "kms:DescribeKey",
      "Resource":"*"
    },
    {
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::111122223333:role/ecsInfrastructureRole" },
      "Action": [
      "kms:GenerateDataKey*",
      "kms:ReEncryptTo",
      "kms:ReEncryptFrom"
      ],
      "Resource":"*",
      "Condition": {
        "StringEquals": {
          "kms:CallerAccount": "aws_account_id",
          "kms:ViaService": "ec2.region.amazonaws.com"
        },
        "ForAnyValue:StringEquals": {
          "kms:EncryptionContextKeys": "aws:ebs:id"
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::111122223333:role/ecsInfrastructureRole" },
      "Action": "kms:CreateGrant",
      "Resource":"*",
      "Condition": {
        "StringEquals": {
          "kms:CallerAccount": "aws_account_id",
          "kms:ViaService": "ec2.region.amazonaws.com"
        },
        "ForAnyValue:StringEquals": {
          "kms:EncryptionContextKeys": "aws:ebs:id"
        },
        "Bool": {
          "kms:GrantIsForAWSResource": true
        }
      }
    }
```

如需有關金鑰政策與許可的詳細資訊，請參閱 *AWS KMS Developer Guide* 中的 [Key policies in AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html) 與 [AWS KMS permissions](https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html)。如需對與金鑰許可相關的 EBS 磁碟區連接問題進行疑難排解，請參閱[對 Amazon ECS 任務的 Amazon EBS 磁碟區連接問題進行疑難排解](troubleshoot-ebs-volumes.md)。

# 在部署 Amazon ECS 時指定 Amazon EBS 磁碟區組態
<a name="configure-ebs-volume"></a>

在註冊任務定義 (`configuredAtLaunch` 參數設定為 `true`) 之後，即可在部署時 (執行獨立任務或建立/更新服務時) 設定 Amazon EBS 磁碟區。如需有關使用 `configuredAtLaunch` 參數將磁碟區組態延至啟動時進行的詳細資訊，請參閱[在 Amazon ECS 任務定義中將磁碟區組態延至啟動時進行](specify-ebs-config.md)。

若要設定磁碟區，您可以使用 Amazon ECS APIs，也可以傳遞 JSON 檔案做為下列 AWS CLI 命令的輸入：
+ `[run-task](https://docs.aws.amazon.com/cli/latest/reference/ecs/run-task.html)`：用於執行獨立的 ECS 任務。
+ `[start-task](https://docs.aws.amazon.com/cli/latest/reference/ecs/start-task.html)`：用在特定容器執行個體中執行獨立的 ECS 任務。此命令不適用於 Fargate 任務。
+ `[create-service](https://docs.aws.amazon.com/cli/latest/reference/ecs/create-service.html)`：用於建立新的 ECS 服務。
+ `[update-service](https://docs.aws.amazon.com/cli/latest/reference/ecs/update-service.html)`：用於更新現有服務。

**注意**  
若要讓任務中的容器寫入掛載的 Amazon EBS 磁碟區，容器必須具有適當的檔案系統許可。當您在容器定義中指定非根使用者時，Amazon ECS 會自動使用群組型許可來設定磁碟區，以允許指定的使用者讀取和寫入磁碟區。如果未指定使用者，容器會以根身分執行，並具有磁碟區的完整存取權。

 您也可以使用 AWS 管理主控台來設定 Amazon EBS 磁碟區。如需詳細資訊，請參閱[將應用程式作為 Amazon ECS 任務執行](standalone-task-create.md)、[建立 Amazon ECS 滾動更新部署](create-service-console-v2.md)及[更新 Amazon ECS 服務](update-service-console-v2.md)。

下列 JSON 程式碼片段展示了可在部署時設定的 Amazon EBS 磁碟區的所有參數。若要將這些參數用於磁碟區組態，請以自己的資訊取代 `user input placeholders`。如需有關這些參數的詳細資訊，請參閱[磁碟區組態](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service_definition_parameters.html#sd-volumeConfigurations)。

```
"volumeConfigurations": [
        {
            "name": "ebs-volume", 
            "managedEBSVolume": {
                "encrypted": true, 
                "kmsKeyId": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", 
                "volumeType": "gp3", 
                "sizeInGiB": 10, 
                "snapshotId": "snap-12345", 
                "volumeInitializationRate":100,
                "iops": 3000, 
                "throughput": 125, 
                "tagSpecifications": [
                    {
                        "resourceType": "volume", 
                        "tags": [
                            {
                                "key": "key1", 
                                "value": "value1"
                            }
                        ], 
                        "propagateTags": "NONE"
                    }
                ], 
                "roleArn": "arn:aws:iam::1111222333:role/ecsInfrastructureRole", 
                 "terminationPolicy": {
                    "deleteOnTermination": true//can't be configured for service-managed tasks, always true 
                },
                "filesystemType": "ext4"
            }
        }
    ]
```

**重要**  
請確保您在組態中指定的 `volumeName` 與在任務定義中指定的 `volumeName` 相同。

如需有關檢查磁碟區連接狀態的詳細資訊，請參閱[對 Amazon ECS 任務的 Amazon EBS 磁碟區連接問題進行疑難排解](troubleshoot-ebs-volumes.md)。如需 EBS 磁碟區連接所需的 Amazon ECS 基礎設施 AWS Identity and Access Management (IAM) 角色資訊，請參閱 [Amazon ECS 基礎結構 IAM 角色](infrastructure_IAM_role.md)。

以下 JSON 程式碼片段範例展示了 Amazon EBS 磁碟區組態。這些範例可以透過將程式碼片段儲存在 JSON 檔案中，並將檔案做為 AWS CLI 命令的參數 （使用 `--cli-input-json file://filename` 參數） 傳遞來使用。以您自己的資訊取代 `user input placeholders`。

## 為獨立任務設定磁碟區
<a name="ebs-run-task"></a>

下列程式碼片段展示了用於設定 Amazon EBS 磁碟區以連接至獨立任務的語法。下列 JSON 程式碼片段展示了用於設定 `volumeType`、`sizeInGiB`、`encrypted` 與 `kmsKeyId` 的語法。JSON 檔案中指定的組態將用於建立 EBS 磁碟區並將其連接至獨立任務。

```
{
   "cluster": "mycluster",
   "taskDefinition": "mytaskdef",
   "volumeConfigurations": [
        {
            "name": "datadir",
            "managedEBSVolume": {
                "volumeType": "gp3",
                "sizeInGiB": 100,
                "roleArn":"arn:aws:iam::1111222333:role/ecsInfrastructureRole",
                "encrypted": true,
                "kmsKeyId": "arn:aws:kms:region:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
            }
        }
   ]
}
```

## 在建立服務時設定磁碟區
<a name="ebs-create-service"></a>

下列程式碼片段展示了用於設定 Amazon EBS 磁碟區以連接至由服務管理之任務的語法。這些磁碟區來源於透過 `snapshotId` 參數指定的快照，傳輸速率為 200 MiB/s。JSON 檔案中指定的組態將用於建立 EBS 磁碟區並將其連接至由服務管理的每項任務。

```
{
   "cluster": "mycluster",
   "taskDefinition": "mytaskdef",
   "serviceName": "mysvc",
   "desiredCount": 2,
   "volumeConfigurations": [
        {
            "name": "myEbsVolume",
            "managedEBSVolume": {
              "roleArn":"arn:aws:iam::1111222333:role/ecsInfrastructureRole",
              "snapshotId": "snap-12345",
              "volumeInitializationRate": 200
            }
        }
   ]
}
```

## 在更新服務時設定磁碟區
<a name="ebs-update-service"></a>

下列 JSON 程式碼片段展示了用於更新先前未設定 Amazon EBS 磁碟區以連接至任務之服務的語法。您必須提供任務定義修訂版的 ARN，並將 `configuredAtLaunch` 設定為 `true`。下列 JSON 程式碼片段展示了用於設定 `volumeType`、`sizeInGiB`、`throughput` 與 `iops` 以及 `filesystemType` 的語法。此組態用於建立 EBS 磁碟區，並將其連接至由服務管理的每項任務。

```
{
   "cluster": "mycluster",
   "taskDefinition": "mytaskdef",
   "service": "mysvc",
   "desiredCount": 2,
   "volumeConfigurations": [
        {
            "name": "myEbsVolume",
            "managedEBSVolume": {
              "roleArn":"arn:aws:iam::1111222333:role/ecsInfrastructureRole",
               "volumeType": "gp3",
                "sizeInGiB": 100,
                 "iops": 3000, 
                "throughput": 125, 
                "filesystemType": "ext4"
            }
        }
   ]
}
```

### 將服務設定為不再使用 Amazon EBS 磁碟區
<a name="ebs-service-disable-ebs"></a>

下列 JSON 程式碼片段展示了用於更新服務以不再使用 Amazon EBS 磁碟區的語法。您必須提供一個將 `configuredAtLaunch` 設定為 `false` 的任務定義 ARN，或提供一個不包含 `configuredAtLaunch` 參數的任務定義。您還必須提供空 `volumeConfigurations` 物件。

```
{
   "cluster": "mycluster",
   "taskDefinition": "mytaskdef",
   "service": "mysvc",
   "desiredCount": 2,
   "volumeConfigurations": []
}
```

## Amazon EBS 磁碟區的終止政策
<a name="ebs-volume-termination-policy"></a>

當 Amazon ECS 任務終止時，Amazon ECS 會依據 `deleteOnTermination` 值，判斷是否應刪除與已終止任務相關聯的 Amazon EBS 磁碟區。依預設，在任務終止後，會刪除連接至任務的 EBS 磁碟區。對於獨立任務，您可以變更此設定，在任務終止時保留磁碟區。

**注意**  
連接至由服務管理之任務的磁碟區不會保留下來，一律會在任務終止時被刪除。

## 標記 Amazon EBS 磁碟區
<a name="ebs-volume-tagging"></a>

您可以使用 `tagSpecifications` 物件來標記 Amazon EBS 磁碟區。透過該物件，您可以提供自訂標籤，也可以根據磁碟區是連接至獨立任務還是服務中的任務，設定標籤是從任務定義還是從服務進行傳播。一個磁碟區最多可連接 50 個標籤。

**重要**  
Amazon ECS 會自動將 `AmazonECSCreated` 和 `AmazonECSManaged` 保留標籤附加至 Amazon EBS 磁碟區。這表示您最多可以控制為一個磁碟區連接 48 個額外標籤。這些額外標籤可為使用者自訂標籤、ECS 受管標籤或傳播標籤。

若想為磁碟區新增 Amazon ECS 受管標籤，必須在呼叫 `UpdateService`、`CreateService`、`RunTask` 或 `StartTask` 時，將 `enableECSManagedTags` 設定為 `true`。開啟 Amazon ECS 受管標籤功能後，Amazon ECS 會自動為磁碟區新增包含叢集與服務資訊的標籤 (即 `aws:ecs:clusterName` 與 `aws:ecs:serviceName`)。如需有關標記 Amazon ECS 資源的詳細資訊，請參閱[標記 Amazon ECS 資源](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-using-tags.html)。

下列 JSON 程式碼片段展示了用於為連接至服務中每項任務的每個 Amazon EBS 磁碟區新增使用者自訂標籤的語法。若要使用此範例建立服務，請以自己的資訊取代 `user input placeholders`。

```
{
   "cluster": "mycluster",
   "taskDefinition": "mytaskdef",
   "serviceName": "mysvc",
   "desiredCount": 2,
   "enableECSManagedTags": true,
   "volumeConfigurations": [
        {
            "name": "datadir",
            "managedEBSVolume": {
                "volumeType": "gp3",
                "sizeInGiB": 100,
                 "tagSpecifications": [
                    {
                        "resourceType": "volume", 
                        "tags": [
                            {
                                "key": "key1", 
                                "value": "value1"
                            }
                        ], 
                        "propagateTags": "NONE"
                    }
                ],
                "roleArn":"arn:aws:iam:1111222333:role/ecsInfrastructureRole",
                "encrypted": true,
                "kmsKeyId": "arn:aws:kms:region:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
            }
        }
   ]
}
```

**重要**  
您必須指定 `volume` 資源類型來標記 Amazon EBS 磁碟區。

# Fargate 隨需任務的 Amazon EBS 磁碟區效能
<a name="ebs-fargate-performance-limits"></a>

Fargate 隨需任務可用的基準 Amazon EBS 磁碟區 IOPS 與輸送量，取決於您為任務請求的 CPU 總單位數。如果您為 Fargate 任務請求 0.25、0.5 或 1 個虛擬 CPU 單位 (vCPU)，建議您設定一般用途 SSD 磁碟區 (`gp2` 或 `gp3`) 或硬碟磁碟機 (HDD) 磁碟區 (`st1` 或 `sc1`)。如果為 Fargate 任務請求超過 1 個 vCPU，則下列基準效能限制適用於連接至任務的 Amazon EBS 磁碟區。您取得的 EBS 效能可能會暫時高於下列限制，但建議您根據這些限制來規劃工作負載。


| 請求的 CPU 單位數 (vCPU) | 基準 Amazon EBS IOPS (16 KiB I/O) | 基準 Amazon EBS 輸送量 (MiBps、128 KiB I/O) | 基準頻寬 (Mbps) | 
| --- | --- | --- | --- | 
| 2 | 3,000 | 75 | 360 | 
| 4 | 5,000 | 120 | 1,150 | 
| 8 | 10,000 | 250 | 2,300 | 
| 16 | 15,000 | 500 | 4，500 | 

**注意**  
 在設定要連接至 Fargate 任務的 Amazon EBS 磁碟區時，Fargate 任務的 Amazon EBS 效能限制會在任務的暫時性儲存體與連接的磁碟區之間共用。

# EC2 任務的 Amazon EBS 磁碟區效能
<a name="ebs-fargate-performance-limits-ec2"></a>

Amazon EBS 提供有不同效能特性及價格的磁碟區類型，可讓您量身打造符合應用程式需求的儲存效能與成本。如需有關效能的資訊，包括每個磁碟區的 IOPS 與每個磁碟區的輸送量，請參閱 *Amazon Elastic Block Store User Guide* 中的 [Amazon EBS volume types](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-volume-types.html)。

# Amazon ECS 受管執行個體任務的 Amazon EBS 磁碟區效能
<a name="ebs-managed-instances-performance"></a>

Amazon EBS 提供有不同效能特性及價格的磁碟區類型，可讓您量身打造符合應用程式需求的儲存效能與成本。如需有關效能的資訊，包括每個磁碟區的 IOPS 與每個磁碟區的輸送量，請參閱 *Amazon Elastic Block Store User Guide* 中的 [Amazon EBS volume types](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-volume-types.html)。

# 對 Amazon ECS 任務的 Amazon EBS 磁碟區連接問題進行疑難排解
<a name="troubleshoot-ebs-volumes"></a>

您可能需要對 Amazon EBS 磁碟區連接至 Amazon ECS 任務的相關情況進行疑難排解或驗證。

## 檢查磁碟區連接狀態
<a name="troubleshoot-ebs-volumes-location"></a>

您可以使用 AWS 管理主控台 檢視 Amazon EBS 磁碟區連接至 Amazon ECS 任務的狀態。若任務啟動但連接失敗，您也會看到用於疑難排解的狀態原因。此時，建立的磁碟區將被刪除，任務也會停止。如需有關狀態原因的詳細資訊，請參閱[Amazon EBS 磁碟區連接至 Amazon ECS 任務的狀態原因](troubleshoot-ebs-volumes-scenarios.md)。

**使用主控台檢視磁碟區的連接狀態與狀態原因**

1. 開啟主控台，網址為 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)。

1. 在**叢集**頁面上，選擇任務執行所在的叢集。叢集詳細資訊頁面隨即出現。

1. 在叢集詳細資訊頁面中，選擇**任務**索引標籤。

1. 選擇要檢視磁碟區連接狀態的任務。若要檢查的任務已停止，可能需要使用**篩選預期狀態**並選擇**已停止**。

1. 在任務詳細資訊頁面上，選擇**磁碟區**索引標籤。您將能夠在**連接狀態**下方檢視 Amazon EBS 磁碟區的連接狀態。若磁碟區連接至任務失敗，可選擇**連接狀態**下方的狀態資訊，顯示失敗原因。

您也可透過 [DescribeTasks](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeTasks.html) API 檢視任務的磁碟區連接狀態及對應的狀態原因。

## 服務與任務失敗
<a name="service-task-failures"></a>

您可能會遇到非 Amazon EBS 磁碟區特有的服務或任務失敗問題，這類問題仍可能影響磁碟區的連接。如需詳細資訊，請參閱
+ [服務事件訊息](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-event-messages.html)
+ [已停止任務的錯誤代碼](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/stopped-task-error-codes.html)
+ [API 失敗原因](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/api_failures_messages.html)

# 容器無法寫入 Amazon EBS 磁碟區
<a name="troubleshoot-non-root-container"></a>

沒有適當許可的非根使用者  
當您在容器定義中指定非根使用者時，Amazon ECS 會自動設定具有群組型許可的磁碟區，以允許寫入存取。不過，如果您仍然遇到許可問題：  
+ 使用 格式 `uid:gid`（例如 )，確認您的容器定義中已正確指定 `user` 參數`1001:1001`。
+ 確保掛載磁碟區後，您的容器映像不會覆寫使用者許可。
+ 透過檢查容器日誌或使用 Amazon ECS Exec 檢查執行中的容器，檢查您的應用程式是否使用預期的使用者 ID 執行。

具有許可問題的根使用者  
如果您的容器定義中未指定使用者，則容器會以根身分執行，且應具有磁碟區的完整存取權。如果您遇到問題：  
+ 檢查容器內的掛載點，確認磁碟區已正確掛載。
+ 請確定掛載點組態中的磁碟區未設定為唯讀。

具有不同使用者的多容器任務  
在具有多個容器以不同使用者身分執行的任務中，Amazon ECS 會自動管理群組許可，以允許所有指定的使用者寫入磁碟區。如果容器無法寫入：  
+ 確認所有需要寫入存取權的容器都已正確設定 `user` 參數。
+ 檢查磁碟區是否掛載在需要存取磁碟區的所有容器中。

如需在容器定義中設定使用者的詳細資訊，請參閱 [ Fargate 的 Amazon ECS 任務定義參數](https://docs.aws.amazon.com/./task_definition_parameters.html)。

# Amazon EBS 磁碟區連接至 Amazon ECS 任務的狀態原因
<a name="troubleshoot-ebs-volumes-scenarios"></a>

使用下列參考來修正您在設定 Amazon EBS 磁碟區以連接至 Amazon ECS 任務 AWS 管理主控台 時，在 中以狀態原因形式可能遇到的問題。如需有關在主控台中尋找這些狀態原因的詳細資訊，請參閱[檢查磁碟區連接狀態](troubleshoot-ebs-volumes.md#troubleshoot-ebs-volumes-location)。

ECS was unable to assume the configured ECS Infrastructure Role 'arn:aws:iam::*111122223333*:role/*ecsInfrastructureRole*'. Please verify that the role being passed has the proper trust relationship with Amazon ECS  
此狀態原因會出現在下列案例中。  
+  您提供的 IAM 角色未連接必要的信任政策。若角色缺少必要的信任政策，Amazon ECS 將無法存取您提供的 Amazon ECS 基礎結構 IAM 角色。任務可能會卡在 `DEPROVISIONING` 狀態。如需有關必要信任政策的詳細資訊，請參閱 [Amazon ECS 基礎結構 IAM 角色](infrastructure_IAM_role.md)。
+ 您的 IAM 使用者沒有將 Amazon ECS 基礎結構角色傳遞給 Amazon ECS 的許可。任務可能會卡在 `DEPROVISIONING` 狀態。若要避免此問題，您可以將 `PassRole` 許可連接至使用者。如需詳細資訊，請參閱[Amazon ECS 基礎結構 IAM 角色](infrastructure_IAM_role.md)。
+ 您的 IAM 角色沒有 Amazon EBS 磁碟區連接所需的必要許可。任務可能會卡在 `DEPROVISIONING` 狀態。如需有關將 Amazon EBS 磁碟區連接至任務所需特定許可的詳細資訊，請參閱 [Amazon ECS 基礎結構 IAM 角色](infrastructure_IAM_role.md)。
您也可能因角色傳播延遲而看到此錯誤訊息。若等待幾分鐘後重新嘗試使用該角色仍無法修復問題，有可能是您對該角色的信任政策設定錯誤。

ECS failed to set up the EBS volume. Encountered IdempotentParameterMismatch"; "The client token you have provided is associated with a resource that is already deleted. Please use a different client token."  
下列 AWS KMS 關鍵案例可能會導致`IdempotentParameterMismatch`訊息出現：  
+ 您指定的 KMS 金鑰 ARN、ID 或別名無效。在此案例中，任務可能看起來已成功啟動，但任務最終會失敗，因為 會以非同步方式 AWS 驗證 KMS 金鑰。如需詳細資訊，請參閱 *Amazon EC2 User Guide* 中的 [Amazon EBS encryption](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-encryption.html)。
+ 您提供的客戶自管金鑰缺少必要許可，導致 Amazon ECS 基礎結構 IAM 角色無法使用該金鑰進行加密。若要避免金鑰政策許可問題，請參閱 [Amazon EBS 磁碟區資料加密](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ebs-volumes.html#ebs-kms-encryption)中的範例 AWS KMS 金鑰政策。
您可以設定 Amazon EventBridge，將 Amazon EBS 磁碟區事件與 Amazon ECS 任務狀態變更事件傳送至目標，例如 Amazon CloudWatch 群組。然後，您可透過這些事件識別影響磁碟區連接的特定客戶自管金鑰相關問題。如需詳細資訊，請參閱  
+  [如何建立 CloudWatch 日誌群組，做為 re：Post 上 EventBridge 規則的目標？](https://repost.aws/knowledge-center/cloudwatch-log-group-eventbridge)。 AWS 
+ [任務狀態變更事件](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_cwe_events.html#ecs_task_events)。
+ *Amazon EBS User Guide* 中的 [Amazon EventBridge events for Amazon EBS](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-cloud-watch-events.html)。

ECS timed out while configuring the EBS volume attachment to your Task.  
下列檔案系統格式案例會導致出現此訊息。  
+ 您在設定期間指定的檔案系統格式與[任務的作業系統](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RuntimePlatform.html)不相容。
+ 您設定要從快照建立的 Amazon EBS 磁碟區，但快照的檔案系統格式與任務的作業系統不相容。對於從快照建立的磁碟區，您必須指定與建立快照時磁碟區所使用的相同檔案系統類型。
您可利用 Amazon ECS 容器代理程式日誌，就此訊息對 EC2 任務進行疑難排解。如需詳細資訊，請參閱 [Amazon ECS 日誌檔案位置](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/logs.html)與 [Amazon ECS 日誌收集器](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-logs-collector.html)。

# 將 Amazon EFS 磁碟區與 Amazon ECS 搭配使用
<a name="efs-volumes"></a>

Amazon Elastic File System (Amazon EFS) 提供簡單且可擴展的檔案儲存體，可與 Amazon ECS 任務搭配使用。利用 Amazon EFS，儲存容量即可有彈性。儲存容量會隨著您新增和移除檔案時自動擴展和縮減。您的應用程式可在需要時具備所需的儲存容量。

您可以搭配使用 Amazon EFS 檔案系統與 Amazon ECS，來匯出整個容器執行個體之機群的檔案系統資料。如此一來，無論您的任務位於哪個執行個體，都可存取相同的持久性儲存體。您的任務定義也必須參考容器執行個體上所掛載的磁碟區，才可使用檔案系統。

如需教學，請參閱[使用主控台為 Amazon ECS 設定 Amazon EFS 檔案系統](tutorial-efs-volumes.md)。

## 考量事項
<a name="efs-volume-considerations"></a>

 使用 Amazon EFS 磁碟區時，請考量下列事項：
+ 對於在 EC2 上執行的任務，Amazon EFS 檔案系統支援作為公開預覽版，隨帶有容器代理程式版本 1.35.0 的 Amazon ECS 最佳化 AMI 版本 `20191212` 一同推出。不過，Amazon EFS 檔案系統支援廣泛使用 Amazon ECS 最佳化 AMI `20200319` 版與容器代理程式 1.38.0 版，這包含 Amazon EFS 存取點和 IAM 授權功能。建議您使用 Amazon ECS 最佳化 AMI 版本 `20200319` 或更新版本以使用這些功能。如需詳細資訊，請參閱[Amazon ECS 最佳化 Linux AMI](ecs-optimized_AMI.md)。
**注意**  
如果您建立自己的 AMI，則必須使用容器代理程式 1.38.0 或更新版本、`ecs-init` 1.38.0-1 版或更新版本，並在 Amazon EC2 執行個體上執行下列命令以啟用 Amazon ECS 磁碟區外掛程式。這些命令取決於您是否使用 Amazon Linux 2 或 Amazon Linux 作為基礎映像。  
Amazon Linux 2  

  ```
  yum install amazon-efs-utils
  systemctl enable --now amazon-ecs-volume-plugin
  ```
Amazon Linux  

  ```
  yum install amazon-efs-utils
  sudo shutdown -r now
  ```
+ 對於託管於 Fargate 的任務，平台版本 1.4.0 或更新版本 (Linux) 上支援 Amazon EFS 檔案系統。如需詳細資訊，請參閱[適用於 Amazon ECS 的 Fargate 平台版本](platform-fargate.md)。
+ 在 Fargate 上託管的任務使用 Amazon EFS 磁碟區時，Fargate 會建立負責管理 Amazon EFS 磁碟區的監督容器。監督容器使用少量的任務記憶體與 CPU。查詢任務中繼資料第 4 版端點時，可看見監督容器。此外，其在 CloudWatch Container Insights 中顯示為容器名稱 `aws-fargate-supervisor`。如需有關使用 EC2 的詳細資訊，請參閱 [Amazon ECS 任務中繼資料端點第 4 版](task-metadata-endpoint-v4.md)。如需有關使用 Fargate 的詳細資訊，請參閱 [Fargate 上任務的 Amazon ECS 任務中繼資料端點第 4 版](task-metadata-endpoint-v4-fargate.md)。
+ 外部執行個體不支援使用 Amazon EFS 磁碟區或指定 `EFSVolumeConfiguration`。
+ 執行於 Amazon ECS 受管執行個體上的任務，支援使用 Amazon EFS 磁碟區。
+ 建議您將代理程式組態檔案中的 `ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION` 參數，設定為小於預設值 (約 1 小時) 的值。此變更有助於防止 EFS 掛載憑證過期，並允許清除未在使用中的掛載。如需詳細資訊，請參閱 [Amazon ECS 容器代理程式組態](ecs-agent-config.md)。

## 使用 Amazon EFS 存取點
<a name="efs-volume-accesspoints"></a>

Amazon EFS 存取點是應用程式特定的 EFS 檔案系統進入點，以管理應用程式存取共用資料集。如需有關 Amazon EFS 存取點及如何控制對它們的存取的詳細資訊，請參閱《Amazon Elastic File System 使用者指南》中的[使用 Amazon EFS 存取點](https://docs.aws.amazon.com/efs/latest/ug/efs-access-points.html)。

存取點可以針對透過存取點發出的所有檔案系統請求，強制執行使用者身分 (包括使用者的 POSIX 群組)。存取點也可以針對檔案系統強制使用不同的根目錄。如此一來，用戶端只能存取指定目錄或其子目錄中的資料。

**注意**  
建立 EFS 存取點時，您可以在檔案系統上指定要做為根目錄的路徑。在 Amazon ECS 任務定義中使用存取點 ID 參考 EFS 檔案系統時，必須忽略根目錄或將其設定為 `/`，這會強制執行 EFS 存取點上設定的路徑。

您可以使用 Amazon ECS 任務 IAM 角色，以強制執行特定應用程式使用特定存取點。透過結合 IAM 政策與存取點，您可以為應用程式提供特定資料集的安全存取。如需如何使用任務 IAM 角色的詳細資訊，請參閱[Amazon ECS 任務 IAM 角色](task-iam-roles.md)。

# 搭配 Amazon ECS 使用 Amazon EFS 磁碟區的最佳實務
<a name="efs-best-practices"></a>

在搭配 Amazon ECS 使用 Amazon EFS 時，請注意下列最佳實務建議。

## Amazon EFS 磁碟區的安全與存取控制
<a name="storage-efs-security"></a>

Amazon EFS 提供存取控制功能，您可透過這些功能確保儲存在 Amazon EFS 檔案系統中的資料安全，且僅供有需求的應用程式存取。您可透過啟用靜態加密與傳輸中加密來保障資料安全。如需詳細資訊，請參閱 *Amazon Elastic File System 使用者指南*中的 [Amazon EFS 的資料加密](https://docs.aws.amazon.com/efs/latest/ug/encryption.html)。

除資料加密外，您也可透過 Amazon EFS 限制對檔案系統的存取。EFS 提供三種實作存取控制的方式。
+ **安全群組**：透過 Amazon EFS 掛載目標，您可以設定用於允許與拒絕網路流量的安全群組。您可對連接至 Amazon EFS 的安全群組進行設定，使其允許來自連接至 Amazon ECS 執行個體之安全群組的 NFS 流量 (連接埠 2049)；若使用 `awsvpc` 網路模式，則允許來自連接至 Amazon ECS 任務之安全群組的流量。
+ **IAM**：您可透過 IAM 限制對 Amazon EFS 檔案系統的存取。設定後，Amazon ECS 任務若需掛載 EFS 檔案系統，必須具備用於檔案系統存取的 IAM 角色。如需詳細資訊，請參閱 *Amazon Elastic File System User Guide* 中的 [Using IAM to control file system data access](https://docs.aws.amazon.com/efs/latest/ug/iam-access-control-nfs-efs.html)。

  IAM 政策也能強制執行預先定義的條件，例如要求用戶端在連線至 Amazon EFS 檔案系統時使用 TLS。如需詳細資訊，請參閱 *Amazon Elastic File System User Guide* 中的 [Amazon EFS condition keys for clients](https://docs.aws.amazon.com/efs/latest/ug/iam-access-control-nfs-efs.html#efs-condition-keys-for-nfs)。
+ **Amazon EFS 存取點**：Amazon EFS 存取點是應用程式專用於存取 Amazon EFS 檔案系統的進入點。您可以使用存取點為所有透過該存取點發出的檔案系統請求，強制執行使用者身分 (包括使用者的 POSIX 群組)。存取點也可以針對檔案系統強制使用不同的根目錄。如此一來，用戶端只能存取指定目錄或其子目錄中的資料。

### IAM 政策
<a name="storage-efs-security-iam"></a>

您可透過 IAM 政策控制對 Amazon EFS 檔案系統的存取。

您可以使用檔案系統政策，為存取檔案系統的用戶端指定下列動作。


| Action | Description | 
| --- | --- | 
|  `elasticfilesystem:ClientMount`  |  提供檔案系統的唯讀存取權。  | 
|  `elasticfilesystem:ClientWrite`  |  在檔案系統上提供具有寫入權限。  | 
|  `elasticfilesystem:ClientRootAccess`  |  存取檔案系統時，提供使用根使用者的功能。  | 

您需要在政策中指定每個動作。這些政策可透過下列方式定義：
+ 基於用戶端 – 將政策連接至任務角色

  在建立任務定義時設定 **IAM 授權**選項。
+ 基於資源 – 將政策連接至 Amazon EFS 檔案系統

  若不存在基於資源的政策，預設會在檔案系統建立時將存取權授予所有主體 (\$1)。

在您設定 **IAM 授權**選項時，我們會合併與任務角色相關聯的政策，以及基於 Amazon EFS 資源的政策。**IAM 授權**選項會將任務身分 (任務角色) 與政策一同傳遞給 Amazon EFS。這讓基於 Amazon EFS 資源的政策能夠識別政策中指定的 IAM 使用者或角色背景資訊。如果您未設定該選項，Amazon EFS 資源層級政策會將 IAM 使用者識別為「匿名」。

為實現最高級別的安全性，建議在 Amazon EFS 檔案系統上同時實作三種存取控制方式。例如，您可以設定連接至 Amazon EFS 掛載點的安全群組，僅允許來自與容器執行個體或 Amazon ECS 任務相關聯的安全群組的 NFS 輸入流量。此外，即使連線來自已允許的安全群組，您仍可以設定 Amazon EFS，要求必須透過 IAM 角色才能存取檔案系統。最後，您可使用 Amazon EFS 存取點強制執行 POSIX 使用者許可，並為應用程式指定根目錄。

下列任務定義程式碼片段展示了如何透過存取點掛載 Amazon EFS 檔案系統。

```
"volumes": [
    {
      "efsVolumeConfiguration": {
        "fileSystemId": "fs-1234",
        "authorizationConfig": {
          "accessPointId": "fsap-1234",
          "iam": "ENABLED"
        },
        "transitEncryption": "ENABLED",
        "rootDirectory": ""
      },
      "name": "my-filesystem"
    }
]
```

## Amazon EFS 磁碟區效能
<a name="storage-efs-performance"></a>

Amazon EFS 提供兩種效能模式：一般用途與最大 I/O。一般用途模式適用於對延遲敏感的應用程式，例如內容管理系統與 CI/CD 工具。相對地，最大 I/O 檔案系統則適用於資料分析、媒體處理與機器學習等工作負載。這類工作負載需要透過數百甚至數千個容器執行平行操作，並且需要盡可能高的彙總輸送量與 IOPS。如需詳細資訊，請參閱 *Amazon Elastic File System User Guide* 中的 [Amazon EFS performance modes](https://docs.aws.amazon.com/efs/latest/ug/performance.html#performancemodes)。

部分對延遲敏感的工作負載，既需要最大 I/O 效能模式提供的較高 I/O 等級，也需要一般用途效能模式提供的較低延遲。對於這類工作負載，我們建議建立多個一般用途效能模式的檔案系統。只要工作負載與應用程式本身支援，您就能透過這種方式，將應用程式工作負載分散至所有這些檔案系統中。

## Amazon EFS 磁碟區輸送量
<a name="storage-efs-performance-throughput"></a>

所有 Amazon EFS 檔案系統皆有對應的計量輸送量，其數值取決於採用的輸送量模式：若是使用*佈建輸送量*的檔案系統，則取決於佈建輸送量的數量；若是使用*爆量輸送量*的檔案系統，則取決於儲存在 EFS Standard 或 One Zone 儲存類別中的資料量。如需詳細資訊，請參閱 *Amazon Elastic File System User Guide* 中的 [Understanding metered throughput](https://docs.aws.amazon.com/efs/latest/ug/performance.html#read-write-throughput)。

Amazon EFS 檔案系統預設的輸送量模式為爆量模式。使用爆量模式時，隨著檔案系統的成長，檔案系統可用的輸送量會隨之橫向擴充或縮減。由於檔案型工作負載通常會遽增，即在特定時間段需要高輸送量，其餘時間則只需低輸送量，因此 Amazon EFS 設計了爆量機制，可在特定時間段提供高輸送量。此外，因許多工作負載以讀取為主，故讀取操作的計量比例不同於其他 NFS 操作 (如寫入操作)，兩者計量比例為 1:3。

所有 Amazon EFS 檔案系統，針對每 TB 的 Amazon EFS Standard 或 Amazon EFS One Zone 儲存空間，皆能提供 50 MB/s 的穩定基准效能。無論容量大小，所有檔案系統皆可爆量至 100 MB/s 的輸送量。而超過 1 TB EFS Standard 或 EFS One Zone 儲存空間的檔案系統，每 TB 儲存空間可爆量至 100 MB/s 輸送量。由於讀取操作採用 1:3 的計量比例，每 TiB 儲存空間可支援高達 300 MiB/s 的讀取輸送量。在將資料新增至檔案系統時，檔案系統可使用的最大輸送量會隨著 Amazon EFS Standard 儲存類別中的儲存容量，自動呈線性擴展。若需要的輸送量超過以所儲存資料量能提供的輸送量，您可將佈建輸送量設定為工作負載所需的特定量。

檔案系統輸送量會由連線至同一檔案系統的所有 Amazon EC2 執行個體共用。例如，一個可爆量至 100 MB/s 輸送量的 1 TB 檔案系統，既可以由單個 Amazon EC2 執行個體獨占 100 MB/s 輸送量，也可以由 10 個 Amazon EC2 執行個體分用 (即每個執行個體各占用 10 MB/s)。如需詳細資訊，請參閱 *Amazon Elastic File System User Guide* 中的 [Amazon EFS performance](https://docs.aws.amazon.com/efs/latest/ug/performance.html)。

## 最佳化 Amazon EFS 磁碟區的成本
<a name="storage-efs-costopt"></a>

Amazon EFS 可為您簡化儲存空間的擴展程序。在新增更多資料時，Amazon EFS 檔案系統會自動擴增。特別是在 Amazon EFS *爆量輸送量*模式下，Amazon EFS 的輸送量會隨著標準儲存類別中檔案系統的容量增長而擴展。若想在不額外支付 EFS 檔案系統佈建輸送量費用的前提下提升輸送量，可將一個 Amazon EFS 檔案系統與多個應用程式共用。透過 Amazon EFS 存取點，您能在共用的 Amazon EFS 檔案系統中實作儲存隔離。如此一來，即使多個應用程式仍然共用同一檔案系統，未經授權的應用程式也無法存取相關資料。

隨著資料量增加，Amazon EFS 會協助您自動將不常存取的檔案移至成本更低的儲存類別。Amazon EFS Standard-Infrequent Access (IA) 儲存類別能降低非每日存取檔案的儲存成本。此過程不會犧牲 Amazon EFS 提供的高可用性、高持久性、彈性，以及 POSIX 檔案系統存取權。如需詳細資訊，請參閱 *Amazon Elastic File System User Guide* 中的 [EFS storage classes](https://docs.aws.amazon.com/efs/latest/ug/features.html)。

建議使用 Amazon EFS 生命週期政策，透過自動將不常存取的檔案移至 Amazon EFS IA 儲存類別來節省成本。如需詳細資訊，請參閱《Amazon Elastic File System 使用者指南》中的 [Amazon EFS 生命週期管理](https://docs.aws.amazon.com/efs/latest/ug/lifecycle-management-efs.html)。

建立 Amazon EFS 檔案系統時，您可選擇讓 Amazon EFS 將資料跨多個可用區域複寫 (對應 Standard 儲存類別)，或在單一可用區域內以備援方式儲存資料。相較於 Amazon EFS Standard 儲存類別，Amazon EFS One Zone 儲存類別能大幅降低儲存成本。若工作負載不需要多可用區域的復原能力，建議使用 Amazon EFS One Zone 儲存類別。您可以將不常存取的檔案移至 Amazon EFS One Zone-Infrequent Access，進一步降低 Amazon EFS One Zone 儲存的成本。如需詳細資訊，請參閱 [Amazon EFS 不頻繁存取](https://aws.amazon.com/efs/features/infrequent-access/)。

## Amazon EFS 磁碟區資料保護
<a name="storage-efs-dataprotection"></a>

使用 Standard 儲存類別的 Amazon EFS 檔案系統，會以備援方式跨多個可用區域儲存資料。如果選取 Amazon EFS One Zone 儲存類別，則會以備援方式將資料儲存於單一可用區域內。此外，Amazon EFS 在設計上可提供每年 99.999999999% (11 個 9) 的資料持久性。

如同任何環境，建立備份並建置防誤刪防護措施是最佳實務。對於 Amazon EFS 資料，該最佳實務包含正常運作、定期測試的備份 AWS Backup。依預設，建立使用 Amazon EFS One Zone 儲存類別的檔案系統時，系統會將其設定為自動備份檔案，除非您選擇停用此功能。如需詳細資訊，請參閱 *Amazon Elastic File System User Guide* 中的 [Backing up EFS file systems](https://docs.aws.amazon.com/efs/latest/ug/awsbackup.html)。

# 在 Amazon ECS 任務定義中指定 Amazon EFS 檔案系統
<a name="specify-efs-config"></a>

若要為您的容器使用 Amazon EFS 檔案系統磁碟區，您必須在任務定義中指定磁碟區並掛載點組態。以下任務定義 JSON 片段說明容器 `volumes` 和 `mountPoints` 物件的語法。

```
{
    "containerDefinitions": [
        {
            "name": "container-using-efs",
            "image": "public.ecr.aws/amazonlinux/amazonlinux:latest",
            "entryPoint": [
                "sh",
                "-c"
            ],
            "command": [
                "ls -la /mount/efs"
            ],
            "mountPoints": [
                {
                    "sourceVolume": "myEfsVolume",
                    "containerPath": "/mount/efs",
                    "readOnly": true
                }
            ]
        }
    ],
    "volumes": [
        {
            "name": "myEfsVolume",
            "efsVolumeConfiguration": {
                "fileSystemId": "fs-1234",
                "rootDirectory": "/path/to/my/data",
                "transitEncryption": "ENABLED",
                "transitEncryptionPort": integer,
                "authorizationConfig": {
                    "accessPointId": "fsap-1234",
                    "iam": "ENABLED"
                }
            }
        }
    ]
}
```

`efsVolumeConfiguration`  
類型：物件  
必要：否  
只有使用 Amazon EFS 磁碟區時才會指定此參數。    
`fileSystemId`  
類型：字串  
必要：是  
要使用的 Amazon EFS 檔案系統識別碼。  
`rootDirectory`  
類型：字串  
必要：否  
在 Amazon EFS 檔案系統中的目錄，其將掛載作為主機內的根目錄。如果省略此參數，使用 Amazon EFS 磁碟區的根目錄。指定 `/` 的效果與忽略此參數的效果相同。  
如果在 `authorizationConfig` 中指定 EFS 存取點，則必須忽略根目錄參數或設定為 `/`，這將強制執行 EFS 存取點上設定的路徑。  
`transitEncryption`  
類型：字串  
有效值：`ENABLED` \$1 `DISABLED`  
必要：否  
指定是否要對在 Amazon ECS 主機和 Amazon EFS 伺服器之間傳輸中的 Amazon EFS 資料啟用加密功能。如果使用 Amazon EFS IAM 授權，則必須啟用傳輸加密。如果省略此參數，系統會使用 `DISABLED` 的預設值。如需詳細資訊，請參閱《Amazon Elastic File System 使用者指南》**中的[加密傳輸中的資料](https://docs.aws.amazon.com/efs/latest/ug/encryption-in-transit.html)。  
`transitEncryptionPort`  
類型：整數  
必要：否  
在 Amazon ECS 主機和 Amazon EFS 伺服器之間傳送加密資料時所使用的連接埠。如果您未指定傳輸加密連接埠，它會使用 Amazon EFS 掛載協助程式使用的連接埠選擇策略。如需詳細資訊，請參閱《Amazon Elastic File System 使用者指南》**中的 [EFS 掛載協助程式](https://docs.aws.amazon.com/efs/latest/ug/efs-mount-helper.html)。  
`authorizationConfig`  
類型：物件  
必要：否  
Amazon EFS 檔案系統的授權組態詳細資訊。    
`accessPointId`  
類型：字串  
必要：否  
要使用的存取點 ID。如果指定了存取點，則必須省略 `efsVolumeConfiguration` 中的根目錄值，或設定為 `/`，這將強制執行在 EFS 存取點上設定的路徑。如果使用存取點，則必須在 `EFSVolumeConfiguration` 中啟用傳輸加密。如需詳細資訊，請參閱《Amazon Elastic File System 使用者指南》**中的[使用 Amazon EFS 存取點](https://docs.aws.amazon.com/efs/latest/ug/efs-access-points.html)。  
`iam`  
類型：字串  
有效值：`ENABLED` \$1 `DISABLED`  
必要：否  
 掛載 Amazon ECS 檔案系統時，指定是否使用任務定義中定義的 Amazon EFS 任務 IAM 角色。如果已啟用，必須在 `EFSVolumeConfiguration` 中啟用傳輸加密。如果省略此參數，系統會使用 `DISABLED` 的預設值。如需詳細資訊，請參閱[任務的 IAM 角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html)。

# 使用主控台為 Amazon ECS 設定 Amazon EFS 檔案系統
<a name="tutorial-efs-volumes"></a>

了解如何搭配 Amazon ECS 使用 Amazon Elastic File System (Amazon EFS) 檔案系統。

## 步驟 1：建立 Amazon ECS 叢集
<a name="efs-create-cluster"></a>

使用下列步驟來建立 Amazon ECS 叢集。

**建立新叢集 (Amazon ECS 主控台)**

在開始之前，請指派適當的 IAM 許可。如需詳細資訊，請參閱[Amazon ECS 叢集範例](security_iam_id-based-policy-examples.md#IAM_cluster_policies)。

1. 開啟主控台，網址為 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)。

1. 從導覽列中選取要使用的「區域」。

1. 在導覽窗格中，選擇**叢集**。

1. 在 **Clusters** (叢集) 頁面上，選擇 **Create cluster** (建立叢集)。

1. 在**叢集組態**下的**叢集名稱**中，輸入叢集名稱的 `EFS-tutorial`。

1. (選用) 若要變更任務和服務啟動所在的 VPC 和子網路，請在 **Networking** (聯網) 下，執行下列任一操作：
   + 若要移除子網路，請在 **Subnets** (子網路) 下，對您要移除之每一個子網路選擇 **X**。
   + 若要變更為非 **default** (預設) VPC，請在 **VPC** 下，選擇現有的 **VPC**，然後在 **Subnets** (子網路) 下選擇各個子網路。

1.  若要將 Amazon EC2 執行個體新增至叢集，展開 **Infrastructure** (基礎設施)，然後選取 **Amazon EC2 執行個體**。接下來，設定作為容量提供者的 Auto Scaling 群組：

   1. 若要建立 Auto Scaling 群組，請從 **Auto Scaling group (ASG)** (Auto Scaling 群組 (ASG)) 中選取 **Create new group** (建立新群組)，然後提供有關該群組的下列詳細資訊：
     + 在**作業系統/架構**中，選擇 Amazon Linux 2。
     + 對於 **EC2 instance type (EC2 執行個體類型)**，選擇 `t2.micro`。

        對於 **SSH key pair** (SSH 金鑰對)，選擇在連線到執行個體時證明您身分的金鑰對。
     + 在**容量**中，輸入 `1`。

1. 選擇**建立**。

## 步驟 2：為 Amazon EC2 執行個體和 Amazon EFS 檔案系統建立安全群組
<a name="efs-security-group"></a>

在此步驟中，您將為 Amazon EC2 執行個體建立安全群組，以允許連接埠 80 上的入站網路流量，並為 Amazon EFS 檔案系統建立一個允許從容器執行個體進行入站存取的安全群組。

使用下列選項為 Amazon EC2 執行個體建立安全群組：
+ **安全群組名稱** - 為您的安全群組輸入唯一的名稱。
+ **VPC** - 選擇您先前為叢集所確認的 VPC。
+ **傳入規則**
  + **類型** - **HTTP**
  + **資源來源** - **0.0.0.0/0**。

使用下列選項為 Amazon EFS 檔案系統建立安全群組：
+ **安全群組名稱** - 為您的安全群組輸入唯一的名稱。例如 `EFS-access-for-sg-dc025fa2`。
+ **VPC** - 選擇您先前為叢集所確認的 VPC。
+ **傳入規則**
  + **類型** - **NFS**
  + **來源** - 使用您為執行個體建立的安全群組 ID 進行**自訂**。

如需有關如何建立安全群組的資訊，請參閱 *Amazon EC2 User Guide* 中的 [Create a security group for your Amazon EC2 instance](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/creating-security-group.html)。

## 步驟 3：建立 Amazon EFS 檔案系統
<a name="efs-create-filesystem"></a>

在此步驟中，您將建立一個 Amazon EFS 檔案系統。

**建立 Amazon ECS 任務的 Amazon EFS 檔案系統。**

1. 開啟 Amazon Elastic File System 主控台，網址為 [https://console.aws.amazon.com/efs/](https://console.aws.amazon.com/efs/)。

1. 選擇 **Create file system (建立檔案系統)**。

1. 輸入檔案系統的名稱，然後選擇容器執行個體所託管的 VPC。根據預設，指定之 VPC 中的每個子網路，都會收到一個使用該 VPC 之預設安全群組的掛載目標。然後，選擇**自訂**。
**注意**  
本教學課程假設您的 Amazon EFS 檔案系統、Amazon ECS 叢集、容器執行個體與任務皆位於同一 VPC 中。如需有關從不同 VPC 掛載檔案系統的詳細資訊，請參閱 *Amazon EFS User Guide* 中的 [Walkthrough: Mount a file system from a different VPC](https://docs.aws.amazon.com/efs/latest/ug/efs-different-vpc.html)。

1. 在**檔案系統設定**頁面上，設定選用設定，然後在**效能設定**下，為您的檔案系統選擇**高載**輸送量模式。設定完設定之後，請選取**下一步**。

   1. (選用) 為您的檔案系統新增標籤。例如，您可以在 **Name** (名稱) 鍵旁的 **Value** (值) 欄中輸入名稱，藉此為檔案系統指定不會重複的一名稱。

   1. (選用) 啟用生命週期管理，以避免在不常存取的儲存體上浪費成本。如需詳細資訊，請參閱《Amazon Elastic File System 使用者指南》**中的 [EFS 生命週期管理](https://docs.aws.amazon.com/efs/latest/ug/lifecycle-management-efs.html)。

   1. (選用) 啟用加密。選取此核取方塊以啟用靜態 Amazon EFS 檔案系統的加密。

1. 在**網路存取**頁面的**掛載目標**下，將每個可用區域的現有安全群組組態替換為您為 [步驟 2：為 Amazon EC2 執行個體和 Amazon EFS 檔案系統建立安全群組](#efs-security-group) 中的檔案系統建立的安全群組，然後選擇**下一步**。

1.  您不需要為本教學課程設定**檔案系統政策**，因此您可以選擇**下一步**略過此區段。

1. 檢閱您的檔案系統選項，然後選擇**建立**以完成程序。

1. 從**檔案系統**畫面中，記錄**檔案系統 ID**。在下一個步驟中，您將會在 Amazon ECS 任務定義中參考這個值。

## 步驟 4：將內容新增至 Amazon EFS 檔案系統
<a name="efs-add-content"></a>

在此步驟中，您會將 Amazon EFS 檔案系統掛載到 Amazon EC2 執行個體，並將內容新增到其中。這是為了在本教學課程中進行測試，以說明資料的持久性。使用此功能時，通常會將應用程式或其他方法的資料寫入 Amazon EFS 檔案系統。

**建立 Amazon EC2 執行個體並掛載 Amazon EFS 檔案系統**

1. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 選擇**啟動執行個體**。

1. 在**應用程式和作業系統映像 (Amazon Machine Image)** 下，選取 **Amazon Linux 2 AMI (HVM)**。

1. 在**執行個體類型**中，保留預設執行個體類型 `t2.micro`。

1.  在**金鑰對 (登入)** 下，選取用於 SSH 存取執行個體的金鑰對。

1. 在**網路設定**下，選取為 Amazon EFS 檔案系統和 Amazon ECS 叢集指定的 VPC。選取子網路和在 [步驟 2：為 Amazon EC2 執行個體和 Amazon EFS 檔案系統建立安全群組](#efs-security-group) 中建立的執行個體安全群組。設定執行個體的安全群組。確認已啟用**自動指派公有 IP**。

1. 在**設定儲存**下，選擇檔案系統的**編輯**按鈕，然後選擇 **EFS**。選取您在 [步驟 3：建立 Amazon EFS 檔案系統](#efs-create-filesystem) 中建立的檔案系統。您可以選擇性地變更掛載點，或保留預設值。
**重要**  
您必須先選擇子網路，然後才能將檔案系統新增至執行個體。

1. 清除**自動建立並連接安全群組**。保持選取另一個核取方塊。選擇 **Add shared file system (新增共用檔案系統)**。

1. 在 **Advanced Details** (進階詳細資訊) 下，確保透過 Amazon EFS 檔案系統掛載步驟自動填入使用者資料指令碼。

1.  在**摘要**下，確定**執行個體數量**為 **1**。選擇**啟動執行個體**。

1. 在**啟動執行個體**頁面上，選擇**檢視所有執行個體**以查看執行個體的狀態。初始時，您的**執行個體狀態**為 `PENDING`。當狀態變更為 `RUNNING` 且執行個體通過所有狀態檢查之後，執行個體即可供使用。

現在，您可以連線到 Amazon EC2 執行個體，並將內容新增至 Amazon EFS 檔案系統。

**連線到 Amazon EC2 執行個體，並將內容新增至 Amazon EFS 檔案系統。**

1. 您建立之 Amazon EC2 執行個體的 SSH。如需詳細資訊，請參閱 *Amazon EC2 User Guide* 中的 [Connect to your Linux instance using SSH](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-to-linux-instance.html)。

1. 從終端機視窗，執行 **df -T** 命令，確認 Amazon EFS 檔案系統已掛載。在下列輸出中，我們已反白顯示 Amazon EFS 檔案系統掛載。

   ```
   $ df -T
   Filesystem     Type            1K-blocks    Used        Available Use% Mounted on
   devtmpfs       devtmpfs           485468       0           485468   0% /dev
   tmpfs          tmpfs              503480       0           503480   0% /dev/shm
   tmpfs          tmpfs              503480     424           503056   1% /run
   tmpfs          tmpfs              503480       0           503480   0% /sys/fs/cgroup
   /dev/xvda1     xfs               8376300 1310952          7065348  16% /
   127.0.0.1:/    nfs4     9007199254739968       0 9007199254739968   0% /mnt/efs/fs1
   tmpfs          tmpfs              100700       0           100700   0% /run/user/1000
   ```

1. 導覽至掛載 Amazon EFS 檔案系統所在的目錄。在上述範例中，即為 `/mnt/efs/fs1`。

1. 建立名為 `index.html` 且具有下列內容的檔案：

   ```
   <html>
       <body>
           <h1>It Works!</h1>
           <p>You are using an Amazon EFS file system for persistent container storage.</p>
       </body>
   </html>
   ```

## 步驟 5：建立任務定義
<a name="efs-task-def"></a>

以下任務定義會建立名稱為 `efs-html` 的資料磁碟區。`nginx` 容器會將主機資料磁碟區掛載於 NGINX 根目錄 `/usr/share/nginx/html`。

**使用 Amazon ECS 主控台建立新的任務定義**

1. 開啟主控台，網址為 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)。

1. 在導覽窗格中，選擇 **Task Definitions** (任務定義)。

1. 選擇 **Create new task definitio** (建立新任務定義)、**Create new task definition with JSON** (使用 JSON 建立新的任務定義)。

1. 在 JSON 編輯器方塊中，複製並貼上以下 JSON 文字，以 Amazon EFS 檔案系統的 ID 取代 `fileSystemId`。

   ```
   {
       "containerDefinitions": [
           {
               "memory": 128,
               "portMappings": [
                   {
                       "hostPort": 80,
                       "containerPort": 80,
                       "protocol": "tcp"
                   }
               ],
               "essential": true,
               "mountPoints": [
                   {
                       "containerPath": "/usr/share/nginx/html",
                       "sourceVolume": "efs-html"
                   }
               ],
               "name": "nginx",
               "image": "public.ecr.aws/docker/library/nginx:latest"
           }
       ],
       "volumes": [
           {
               "name": "efs-html",
               "efsVolumeConfiguration": {
                   "fileSystemId": "fs-1324abcd",
                   "transitEncryption": "ENABLED"
               }
           }
       ],
       "family": "efs-tutorial",
       "executionRoleArn":"arn:aws:iam::111122223333:role/ecsTaskExecutionRole"
   }
   ```
**注意**  
Amazon ECS 任務執行 IAM 角色不需要任何特定的 Amazon EFS 相關許可，即可掛載 Amazon EFS 檔案系統。依預設，如果不存在基於 Amazon EFS 資源的政策，則會在建立檔案系統時授予所有主體 (\$1) 存取權。  
僅當在 Amazon ECS 任務定義中啟用「EFS IAM 授權」時，才需要 Amazon ECS 任務角色。啟用該功能後，必須在基於 Amazon EFS 資源的政策中允許該任務角色的身分存取 Amazon EFS 檔案系統，並應停用匿名存取。

1. 選擇**建立**。

## 步驟 6：執行任務並檢視結果
<a name="efs-run-task"></a>

現在，已建立您的 Amazon EFS 檔案系統，並且提供 NGINX 容器的 Web 內容，您可以使用建立的任務定義來執行任務。NGINX Web 伺服器會隨即提供您簡單的 HTML 頁面。如果您在 Amazon EFS 檔案系統中更新了內容，這些變更也會傳播至所有也掛載該檔案系統的容器。

任務會在您為叢集定義的子網路中執行。

**使用主控台執行任務並檢視結果**

1. 開啟主控台，網址為 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)。

1. 在 **Clusters** (叢集) 頁面上，選取要在哪個叢集中執行獨立任務。

   決定您要從中啟動服務的資源。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonECS/latest/developerguide/tutorial-efs-volumes.html)

1. (選用) 選擇已排程的任務在叢集基礎設施中的分佈方式。展開 **Compute configuration** (運算組態)，然後執行下列操作：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonECS/latest/developerguide/tutorial-efs-volumes.html)

1. 針對 **Application type** (應用程式類型)，選擇 **Task** (任務)。

1. 在**任務定義**中，選擇您先前建立的 `efs-tutorial` 任務定義。

1. 在**所需任務**中，輸入 `1`。

1. 選擇**建立**。

1. 在**叢集**頁面上，選擇**基礎設施**。

1. 在**容器執行個體**下，選擇要連線的容器執行個體。

1. 在**容器執行個體**頁面的**聯網**下，記錄執行個體的公有 IP 或**公有 DNS**。

1. 開啟瀏覽器並輸入公有 IP 地址。您應該看到下列訊息：

   ```
   It works!
   You are using an Amazon EFS file system for persistent container storage.
   ```
**注意**  
如果您未看到該訊息，請確認您容器執行個體的安全群組，允許連接埠 80 上的入站網路流量，且檔案系統的安全群組允許來自容器執行個體的入站存取。

# 搭配 Amazon ECS 使用 FSx for Windows File Server 磁碟區
<a name="wfsx-volumes"></a>

FSx for Windows File Server 提供全受管 Windows 檔案伺服器，這些伺服器由 Windows 檔案系統提供支援。搭配使用 FSx for Windows File Server 與 ECS 時，您可以使用持續、分散、共用、靜態的檔案儲存來佈建 Windows 任務。如需詳細資訊，請參閱[什麼是 FSx for Windows File Server？](https://docs.aws.amazon.com/fsx/latest/WindowsGuide/what-is.html)。

**注意**  
使用 Amazon ECS 最佳化 Windows Server 2016 Full AMI 的 EC2 執行個體不支援 FSx for Windows File Server ECS 任務磁碟區。  
您無法在 Fargate 組態上的 Windows 容器中使用 FSx for Windows File Server 磁碟區。但您可以[修改容器，使其在啟動時完成掛載](https://aws.amazon.com/blogs/containers/use-smb-storage-with-windows-containers-on-aws-fargate/)。

您可以使用 FSx for Windows File Server 來部署需要存取共用外部儲存體、高可用性區域儲存體或高輸送量儲存體的 Windows 工作負載。您可以將一個或多個 FSx for Windows File Server 檔案系統磁碟區掛載至 Amazon ECS Windows 執行個體上執行的 Amazon ECS 容器。您可於單一 Amazon ECS 任務內，在多個 Amazon ECS 容器之間共用 FSx for Windows File Server 檔案系統磁碟區。

若要讓 FSx for Windows File Server 與 ECS 搭配使用，在任務定義中包含 FSx for Windows File Server 檔案系統 ID 和相關資訊。如下列任務定義 JSON 片段範例。在建立並執行任務定義之前，您必須準備好以下事項。
+ 加入有效的網域的 ECS Windows EC2 執行個體。該網域可以透過 [AWS Directory Service for Microsoft Active Directory](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/directory_microsoft_ad.html)、內部部署 Active Directory 或 Amazon EC2 上自我託管的 Active Directory 進行託管。
+  AWS Secrets Manager 秘密或 Systems Manager 參數，其中包含用於加入 Active Directory 網域和連接 FSx for Windows File Server 檔案系統的登入資料。憑證值是您在建立 Active Directory 時輸入的名稱和密碼憑證。

如需相關教學，請參閱[了解如何為 Amazon ECS 設定 FSx for Windows File Server 檔案系統](tutorial-wfsx-volumes.md)。

## 考量事項
<a name="wfsx-volume-considerations"></a>

在使用 FSx for Windows File Server 磁碟區時，請考量下列事項：
+ Windows Amazon EC2 執行個體上的 Amazon ECS 原生支援 FSx for Windows File Server 磁碟區 — Amazon ECS 透過任務定義組態自動管理掛載。

  在 Linux Amazon EC2 執行個體上，Amazon ECS 無法透過任務定義自動掛載 FSx for Windows File Server 磁碟區。不過，您可以在主機層級的 Linux EC2 執行個體上手動掛載 FSx for Windows File Server 檔案共享，然後將該路徑繫結掛載到 Amazon ECS 容器中。如需詳細資訊，請參閱[從 Linux 掛載 Amazon FSx 檔案共用](https://docs.aws.amazon.com/fsx/latest/WindowsGuide/map-shares-linux.html)。
**重要**  
這是自我管理的組態。如需在 Linux 上掛載和維護 FSx for Windows File Server 檔案共享的指引，請參閱 [FSx for Windows File Server 文件](https://docs.aws.amazon.com/fsx/latest/WindowsGuide/)。
**重要**  
在 Linux EC2 執行個體上使用手動掛載的 FSx for Windows File Server 共用時，Amazon ECS 和 FSx for Windows File Server 會獨立運作 — Amazon ECS 不會監控 Amazon FSx 掛載，而 FSx for Windows File Server 不會追蹤 Amazon ECS 任務置放或生命週期事件。您有責任確保 Amazon ECS 容器執行個體與 Amazon FSx 檔案系統之間的網路連線能力、實作掛載運作狀態檢查，以及處理重新連線邏輯，以容忍容錯移轉事件。
+ FSx for Windows File Server 與 Amazon ECS 不支援 AWS Fargate。
+ 在 Amazon ECS 受管執行個體上，不支援將 FSx for Windows File Server 與 Amazon ECS 搭配使用。
+ 具有 `awsvpc` 網路模式的 FSx for Windows File Server 與 Amazon ECS 需要容器代理程式的版本 `1.54.0` 或更新版本。
+ Amazon ECS 任務使用的磁碟機代號的上限為 23。具有 FSx for Windows File Server 磁碟區的每個任務都會取得指派給它的磁碟機代號。
+ 根據預設，任務資源清除時間為任務結束後的 3 小時。即使沒有任務正在使用它，任務建立的檔案映射會持續 3 小時。使用 Amazon ECS 環境變數 `ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION` 可設定預設清理時間。如需詳細資訊，請參閱[Amazon ECS 容器代理程式組態](ecs-agent-config.md)。
+ 任務通常只會在與 FSx for Windows File Server 檔案系統相同的 VPC 中執行。但是，如果 Amazon ECS 叢集 VPC 與 FSx for Windows File Server 檔案系統之間透過 VPC 對等互連建立了網路連線，則可以跨 VPC 支援。
+ 透過設定 VPC 安全群組，可在網路層級控制對 FSx for Windows File Server 檔案系統的存取。只有在加入 Active Directory 網域且已正確設定 Active Directory 安全群組的 EC2 執行個體上託管的任務，才能存取 FSx for Windows File Server 檔案共用。如果安全群組設定錯誤，Amazon ECS 會使任務啟動失敗，並顯示下列錯誤訊息：`unable to mount file system fs-id`。
+ FSx for Windows File Server 已與 AWS Identity and Access Management (IAM) 整合，以控制 IAM 使用者和群組可對特定 FSx for Windows File Server 資源採取的動作。透過用戶端授權，客戶可以定義允許或拒絕存取特定 FSx for Windows File Server 檔案系統的 IAM 角色，選擇性地要求唯讀存取，以及選擇性地允許或禁止從用戶端對檔案系統進行根存取。如需詳細資訊，請參閱《Amazon FSx Windows 使用者指南》中的[安全性](https://docs.aws.amazon.com/fsx/latest/WindowsGuide/security.html)。

# 搭配 Amazon ECS 使用 FSx for Windows File Server 的最佳實務
<a name="wfsx-best-practices"></a>

在搭配 Amazon ECS 使用 FSx for Windows File Server 時，請注意下列最佳實務建議。

## FSx for Windows File Server 的安全與存取控制
<a name="wfsx-security-access-controls"></a>

FSx for Windows File Server 提供下列存取控制功能，您可透過這些功能確保儲存在 FSx for Windows File Server 檔案系統中的資料安全，且僅供有需求的應用程式存取。

### FSx for Windows File Server 磁碟區的資料加密
<a name="storage-fsx-security-encryption"></a>

FSx for Windows File Server 支援兩種形式的檔案系統加密：「傳輸中資料加密」與「靜態資料加密」。當檔案共用映射至支援 SMB 通訊協定 3.0 或更新版本的容器執行個體時，即會啟用傳輸中資料加密。靜態資料加密則會在建立 Amazon FSx 檔案系統時自動啟用。當您存取檔案系統時，Amazon FSx 會透過 SMB 加密技術自動對傳輸中的資料進行加密，無需修改應用程式即可實現。如需詳細資訊，請參閱 *Amazon FSx for Windows File Server User Guide* 中的 [Data encryption in Amazon FSx](https://docs.aws.amazon.com/fsx/latest/WindowsGuide/encryption.html)。

### 使用 Windows ACL 進行資料夾層級存取控制
<a name="storage-fsx-security-access"></a>

Windows Amazon EC2 執行個體會透過 Active Directory 憑證存取 Amazon FSx 檔案共用。此類執行個體也會使用標準 Windows 存取控制清單 (ACL)，實現精細的檔案層級與資料夾層級存取控制。您可以建立多個憑證，每個憑證分別對應共用區內的特定資料夾，並映射至特定任務。

在下列範例中，任務可以使用儲存在 Secrets Manager 中的憑證存取 `App01` 資料夾。Amazon Resource Name (ARN) 為 `1234`。

```
"rootDirectory": "\\path\\to\\my\\data\App01",
"credentialsParameter": "arn-1234",
"domain": "corp.fullyqualified.com",
```

在另一個範例中，任務可以使用儲存在 Secrets Manager 中的憑證存取 `App02` 資料夾。其 ARN 是 `6789`。

```
"rootDirectory": "\\path\\to\\my\\data\App02",
"credentialsParameter": "arn-6789",
"domain": "corp.fullyqualified.com",
```

# 在 Amazon ECS 任務定義中指定 FSx for Windows File Server 檔案系統
<a name="specify-wfsx-config"></a>

若要將 FSx for Windows File Server 檔案系統磁碟區用於您的容器，請在任務定義中指定磁碟區並掛載點組態。以下任務定義 JSON 片段說明容器 `volumes` 和 `mountPoints` 物件的語法。

```
{
    "containerDefinitions": [
        {
            "entryPoint": [
                "powershell",
                "-Command"
            ],
            "portMappings": [],
            "command": ["New-Item -Path C:\\fsx-windows-dir\\index.html -ItemType file -Value '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>It Works!</h2> <p>You are using Amazon FSx for Windows File Server file system for persistent container storage.</p>' -Force"],
            "cpu": 512,
            "memory": 256,
            "image": "mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019",
            "essential": false,
            "name": "container1",
            "mountPoints": [
                {
                    "sourceVolume": "fsx-windows-dir",
                    "containerPath": "C:\\fsx-windows-dir",
                    "readOnly": false
                }
            ]
        },
        {
            "entryPoint": [
                "powershell",
                "-Command"
            ],
            "portMappings": [
                {
                    "hostPort": 443,
                    "protocol": "tcp",
                    "containerPort": 80
                }
            ],
            "command": ["Remove-Item -Recurse C:\\inetpub\\wwwroot\\* -Force; Start-Sleep -Seconds 120; Move-Item -Path C:\\fsx-windows-dir\\index.html -Destination C:\\inetpub\\wwwroot\\index.html -Force; C:\\ServiceMonitor.exe w3svc"],
            "mountPoints": [
                {
                    "sourceVolume": "fsx-windows-dir",
                    "containerPath": "C:\\fsx-windows-dir",
                    "readOnly": false
                }
            ],
            "cpu": 512,
            "memory": 256,
            "image": "mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019",
            "essential": true,
            "name": "container2"
        }
    ],
    "family": "fsx-windows",
    "executionRoleArn": "arn:aws:iam::111122223333:role/ecsTaskExecutionRole",
    "volumes": [
        {
            "name": "fsx-windows-dir",
            "fsxWindowsFileServerVolumeConfiguration": {
                "fileSystemId": "fs-0eeb5730b2EXAMPLE",
                "authorizationConfig": {
                    "domain": "example.com",
                    "credentialsParameter": "arn:arn-1234"
                },
                "rootDirectory": "share"
            }
        }
    ]
}
```

`FSxWindowsFileServerVolumeConfiguration`  
類型：物件  
必要：否  
當您為任務儲存使用 [FSx for Windows File Server](https://docs.aws.amazon.com/fsx/latest/WindowsGuide/what-is.html) 檔案系統時，指定此參數。    
`fileSystemId`  
類型：字串  
必要：是  
要使用的 FSx for Windows File Server 檔案系統 ID。  
`rootDirectory`  
類型：字串  
必要：是  
FSx for Windows File Server 檔案系統中的目錄，其將掛載做為主機內的根目錄。  
`authorizationConfig`    
`credentialsParameter`  
類型：字串  
必要：是  
授權憑證選項：  
+ [Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) 秘密的 Amazon Resource Name (ARN)。
+ [Systems Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/integration-ps-secretsmanager.html) 參數的 Amazon Resource Name (ARN)。  
`domain`  
類型：字串  
必要：是  
由 [AWS Directory Service for Microsoft Active Directory](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/directory_microsoft_ad.html) (AWS Managed Microsoft AD) 目錄或自我託管 EC2 Active Directory 託管的完整網域名稱。

## 儲存 FSx for Windows File Server 磁碟區憑證的方法
<a name="creds"></a>

有兩種不同的方法可存放憑證，以便與憑證參數搭配使用。
+ **AWS Secrets Manager 秘密**

  您可以使用*其他類型的秘密*類別，在 AWS Secrets Manager 主控台中建立此登入資料。您可以為每個鍵/值對、使用者名稱/管理員以及密碼/*密碼*新增一列。
+ **Systems Manager 參數**

  您可以在 Systems Manager 參數主控台中建立此憑證，方法是在下列範例程式碼片段的表單中輸入文字。

  ```
  {
    "username": "admin",
    "password": "password"
  }
  ```

任務定義 `FSxWindowsFileServerVolumeConfiguration` 參數中的 `credentialsParameter` 保留秘密 ARN 或 Systems Manager 參數 ARN。如需詳細資訊，請參閱 *《Secrets Manager 使用者指南》*中的[什麼是 AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) 和 *Systems Manager 使用者指南*中的[Systems Manager 參數存放區](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html)。

# 了解如何為 Amazon ECS 設定 FSx for Windows File Server 檔案系統
<a name="tutorial-wfsx-volumes"></a>

了解如何啟動 Amazon ECS 最佳化 Windows 執行個體，該執行個體同時託管 FSx for Windows File Server 檔案系統，以及可存取該檔案系統的容器。若要這樣做，請先建立 Directory Service AWS Managed Microsoft Active Directory。接著，您可以建立 Amazon FSx for Windows File Server 檔案系統，以及具有 Amazon EC2 執行個體與任務定義的 Amazon ECS 叢集。您可以設定容器的任務定義，以使用 FSx for Windows File Server 檔案系統。最後，您將測試檔案系統。

每次啟動或刪除 Active Directory 或 FSx for Windows File Server 檔案系統時，需要 20 至 45 分鐘。請準備保留至少 90 分鐘以完成教學課程，或在幾個工作階段中完成教學課程。

## 教學課程的先決條件
<a name="wfsx-prerequisites"></a>
+ 管理使用者。請參閱 [設定以使用 Amazon ECS。](get-set-up-for-amazon-ecs.md)。
+ (選用) 用於透過 RDP 存取連線至 EC2 Windows 執行個體的 `PEM` 金鑰對。如需有關如何建立金鑰對的資訊，請參閱 *Amazon EC2 User Guide* 中的 [Amazon EC2 key pairs and Amazon EC2 instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)。
+ 具有至少一個公有、一個私有子網路和一個安全群組的 VPC。您可以使用預設 VPC。您不需要 NAT 閘道或裝置。 Directory Service 不支援與 Active Directory 搭配的網路位址轉譯 (NAT)。為了可以運作，Active Directory、FSx for Windows File Server 檔案系統、ECS 叢集和 EC2 執行個體必須位於 VPC 內。如需 VPCs和作用中目錄的詳細資訊，請參閱[建立 VPC](https://docs.aws.amazon.com/vpc/latest/userguide/create-vpc.html) 和[建立 AWS Managed Microsoft AD 的先決條件](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_getting_started.html#ms_ad_getting_started_prereqs)。
+ IAM ecsInstanceRole 和 ecsTaskExecutionRole 許可與您的帳戶建立關聯。這些服務連結的角色可讓服務代表您進行 API 呼叫，並存取容器、機密、目錄和檔案伺服器。

## 步驟 1：建立 IAM 存取角色
<a name="iam-roles"></a>

**使用 AWS 管理主控台建立叢集。**

1. 請參閱 [Amazon ECS 容器執行個體 IAM 角色](instance_IAM_role.md) 來檢查您是否擁有 ecsInstanceRole，並查看如何在沒有的情況下建立一個。

1. 建議您針對實際生產環境中的最低許可自訂角色政策。為了完成本教學課程，請確認下列 AWS 受管政策已連接至您的 ecsInstanceRole。連接政策 (如果尚未連接)。
   + AmazonEC2ContainerServiceforEC2Role
   + AmazonSSMManagedInstanceCore
   + AmazonSSMDirectoryServiceAccess

   連接 AWS 受管政策。

   1. 開啟 [ IAM 主控台](https://console.aws.amazon.com//iam/)。

   1. 在導覽窗格中，選擇 **Roles** (角色)。

   1. 選擇 **AWS 受管角色**。

   1. 選擇 **Permissions, Attach policies.** (許可、連接政策。)。

   1. 若要縮小可連接的政策，請使用 **Filter** (篩選)。

   1. 選取適用的政策，然後選擇 **Attach Policy** (連接政策)。

1. 請參閱 [Amazon ECS 任務執行 IAM 角色](task_execution_IAM_role.md) 來檢查您是否擁有 ecsTaskExecutionRole，並查看如何在沒有的情況下建立一個。

   建議您針對實際生產環境中的最低許可自訂角色政策。為了完成本教學課程，請確認下列 AWS 受管政策已連接至您的 ecsTaskExecutionRole。連接政策 (如果尚未連接)。使用上一節中提供的程序來連接 AWS 受管政策。
   + SecretsManagerReadWrite
   + AmazonFSxReadOnlyAccess
   + AmazonSSMReadOnlyAccess
   + AmazonECSTaskExecutionRolePolicy

## 步驟 2：建立 Windows Active Directory (AD)
<a name="wfsx-create-ads"></a>

1. 請遵循 *Directory Service 管理指南*中[建立 AWS Managed Microsoft AD](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_getting_started.html#ms_ad_getting_started_create_directory) AWS 中所述的步驟。使用您在本教學課程中指定的 VPC。在*建立 AWS Managed Microsoft AD* 的步驟 3 中，儲存使用者名稱和管理員密碼以用於下列步驟。另外，請記下完整目錄 DNS 名稱，以供後續步驟中使用。您可以在建立 Active Directory 期間完成以下步驟。

1. 建立要在下列步驟中使用的 AWS Secrets Manager 秘密。如需詳細資訊，請參閱[《Secrets Manager 使用者指南》中的 Secrets Manager 入門](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html#get-started)。 AWS **

   1. 開啟 [Secrets Manager 主控台](https://console.aws.amazon.com//secretsmanager/)。

   1. 按一下 **Store a new secret** (存放新機密)。

   1. 選取 **Other type of secrets** (其他機密類型)。

   1. 對於 **Secret key/value** (機密鍵/值)，在第一個資料列中建立具有值 **admin** 的索引鍵 **username**。按一下 **\$1 Add row** (\$1 新增列)。

   1. 在新資料列中，建立索引鍵 **password**。對於值，輸入您在*建立 AWS 受管 AD 目錄*的步驟 3 中輸入的密碼。

   1. 按一下 **Next** (下一步) 按鈕。

   1. 提供機密名稱和描述。按一下 **Next (下一步)**。

   1. 按一下 **Next (下一步)**。按一下 **Store** (存放)。

   1. 從 **Secrets** (機密) 頁面清單上，按一下您剛才建立的機密。

   1. 儲存新機密的 ARN，以便在後續步驟中使用。

   1. 您可以繼續進行下一個步驟，同時建立 Active Directory。

## 步驟 3：驗證並更新安全群組
<a name="wfsx-sg"></a>

在此步驟中，您會驗證並更新您正在使用的安全群組的規則。為此，您可以使用為 VPC 建立的預設安全群組。

**驗證並更新安全群組。**

您需要建立或編輯安全群組，以便連接埠可以接收和傳送資料，請參閱 *FSx for Windows File Server 使用者指南*中的 [Amazon VPC 安全群組](https://docs.aws.amazon.com/fsx/latest/WindowsGuide/limit-access-security-groups.html#fsx-vpc-security-groups)。您可以藉由建立安全群組傳入規則完成此操作，規則顯示在以下傳入規則資料表的第一列。此規則允許來自網路界面 (及其關聯執行個體) 的傳入流量，而這些網路界面會指派給安全群組。您建立的所有雲端資源都位於同一 VPC 內，並連接至相同的安全群組。因此，此規則允許所需的流量往來於 FSx for Windows File Server 檔案系統、Active Directory 和 ECS 執行個體。其他傳入規則允許流量提供網站和 RDP 存取服務，以便連線至您的 ECS 執行個體。

下表顯示本教學課程所需的安全群組傳入規則。


| Type | 通訊協定 | 連接埠範圍 | 來源 | 
| --- | --- | --- | --- | 
|  所有流量  |  全部  |  全部  |  *sg-securitygroup*  | 
|  HTTPS  |  TCP  |  443  |  0.0.0.0/0  | 
|  RDP  |  TCP  |  3389  |  您的筆記型電腦 IP 地址  | 

下表顯示本教學課程所需的安全群組傳出規則。


| Type | 通訊協定 | 連接埠範圍 | 目標 | 
| --- | --- | --- | --- | 
|  所有流量  |  全部  |  全部  |  0.0.0.0/0  | 

1. 開啟 [EC2 主控台](https://console.aws.amazon.com//ec2/)並從左側選單選取 **Security Groups** (安全群組)。

1. 從現在顯示的安全群組清單中，選取您要用於本教學課程的安全群組左側的核取方塊。

   隨即顯示您的安全群組詳細資訊。

1. 編輯傳入和傳出規則，方法是選取 **Inbound rules** (傳入規則) 或 **Outbound rules** (傳出規則) 索引標籤，然後選擇 **Edit inbound rules** (編輯傳入規則) 或 **Edit outbound rules** (編輯傳出規則) 按鈕。編輯規則以與上表中顯示的規則相符。稍後在本教學課程中建立 EC2 執行個體後，請使用 EC2 執行個體的公有 IP 位址編輯傳入規則 RDP 來源，詳情請參閱 *Amazon EC2 User Guide* 中的 [Connect to your Windows instance using RDP](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connecting_to_windows_instance.html)。

## 步驟 4：建立 FSx for Windows File Server 檔案系統
<a name="wfsx-create-fsx"></a>

在您的安全群組經過驗證和更新，且您的 Active Directory 已建立並處於作用中狀態之後，請在與您的 Active Directory 相同的 VPC 中建立 FSx for Windows File Server 檔案系統。請依照下列步驟，建立 FSx for Windows File Server 檔案系統，以供您的 Windows 任務使用。

**建立第一個檔案系統。**

1. 開啟 [Amazon FSx 主控台](https://console.aws.amazon.com//fsx/)。

1. 在儀表板上，選擇 **Create file system** (建立檔案系統) 以啟動檔案系統建立精靈。

1. 在 **Select file system type** (選取檔案系統類型) 頁面中，選擇 **FSx for Windows File Server**，然後選擇 **Next** (下一步)。**Create file system** (建立檔案系統) 頁面隨即顯示。

1. 在 **File system details** (檔案系統詳細資訊) 區段中，輸入檔案系統的名稱。命名檔案系統可讓您更輕鬆地尋找和管理檔案系統。您最多可使用 256 個 Unicode 字元。允許的字元如下：英文字母、數字、空格和特殊字元加號 (\$1)、減號 (-)、等號 (=)、句點 (.)、下劃線 (\$1)、冒號 (:) 和斜線 (/)。

1. 對於 **Deployment type** (部署類型)，請選擇 **Single-AZ** (單一可用區)，部署在單一可用區域中部署的檔案系統。*單一可用區 2* 是最新一代的單一可用區域檔案系統，支援 SSD 和 HDD 儲存。

1. 對於 **Storage type** (儲存類型)，請選擇 **EBS**。

1. 對於 **Storage capacity** (儲存容量)，請輸入最小儲存容量。

1. 保留 **Throughput capacity** (輸送容量) 的預設設定。

1. 在**網路與安全**區段中，選擇您為 Directory Service 目錄選擇的相同 Amazon VPC。

1. 對於 **VPC Security Groups** (VPC 安全群組) 下，選擇您在*步驟 3：驗證並更新您的安全群組*中驗證的安全群組。

1. 對於 **Windows authentication** (Windows 身分驗證)，選擇 **AWS 受管 Microsoft Active Directory**，然後從清單中選擇您的 Directory Service 目錄。

1. 對於 **Encryption** (加密)，請保留 **aws/fsx (default)** (aws/fsx (預設)) 的預設 **Encryption key** (加密金鑰) 設定。

1. 請保留 **Maintenance preferences** (維護偏好設定) 的預設設定。

1. 按一下 **Next** (下一步) 按鈕。

1. 檢閱顯示在 **Create file system** (建立檔案系統) 頁面上的檔案系統組態。請注意建立檔案系統後，您可以修改哪些檔案系統設定，以供參考。選擇 **Create file system (建立檔案系統)**。

1. 請注意檔案系統 ID。您會在稍後的步驟中需要使用。

   您可以在建立 FSx for Windows File Server 檔案系統時，繼續建立叢集和 EC2 執行個體的後續步驟。

## 步驟 5：建立 Amazon ECS 叢集
<a name="wfsx-create-cluster"></a>

**使用 Amazon ECS 主控台建立叢集**

1. 開啟主控台，網址為 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)。

1. 從導覽列中選取要使用的「區域」。

1. 在導覽窗格中，選擇**叢集**。

1. 在 **Clusters** (叢集) 頁面上，選擇 **Create cluster** (建立叢集)。

1. 在**叢集組態**下的**叢集名稱**中，輸入 **windows-fsx-cluster**。

1. 展開**基礎設施**，清除 AWS Fargate （無伺服器），然後選取 **Amazon EC2 執行個體**。

   1. 若要建立 Auto Scaling 群組，請從 **Auto Scaling group (ASG)** (Auto Scaling 群組 (ASG)) 中選取 **Create new group** (建立新群組)，然後提供有關該群組的下列詳細資訊：
     + 在**作業系統/架構**中，選擇 **Windows Server 2019 Core**。
     + 對於 **EC2 執行個體類型**，選擇 t2.medium 或 t2.micro。

1. 選擇**建立**。

## 步驟 6：建立 Amazon ECS 最佳化的 Amazon EC2 執行個體
<a name="wfsx-create-instance"></a>

建立 Amazon ECS Windows 容器執行個體。

**建立 Amazon ECS 執行個體**

1. 使用 `aws ssm get-parameters` 命令擷取託管 VPC 的區域 AMI 名稱。如需詳細資訊，請參閱[擷取 Amazon ECS 最佳化 AMI 中繼資料](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/retrieve-ecs-optimized_windows_AMI.html)。

1. 使用 Amazon EC2 主控台來啟動執行個體。

   1. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

   1. 從導覽列中選取要使用的「區域」。

   1. 在 **EC2 儀表板**中，選擇 **Launch instance** (啟動執行個體)。

   1. 在 **Name (名稱)** 輸入唯一的名稱。

   1. 針對**應用程式和作業系統映像 (Amazon Machine Image)**，在**搜尋**欄位中，輸入您擷取到的 AMI 名稱。

   1. 對於**執行個體類型**，選擇 t2.medium 或 t2.micro。

   1. 在 **Key pair (login)** (金鑰對 (登入)) 欄位中，選擇一個金鑰對。如果您未指定金鑰對，則 

   1. 在**網路設定**下，針對 **VPC** 和**子網路**，選擇您的 VPC 和公有子網路。

   1. 在 **Network settings** (網路設定) 下的 **Security group** (安全群組) 欄位中，選擇一個現有的安全群組，或建立一個新的安全群組。確定您選擇的安全群組具有在 [教學課程的先決條件](#wfsx-prerequisites) 中定義的輸入和輸出規則

   1. 在 **Network settings** (網路設定) 下的 **Auto-assign Public IP** (自動指派公有 IP) 欄位中，選取 **Enable** (啟用)。

   1. 展開**進階詳細資訊**，然後針對**網域加入目錄**，選取您建立的 Active Directory 的 ID。啟動 EC2 執行個體時，此選項網域會加入您的 AD。

   1. 在 **Advanced details** (進階詳細資料) 下的 **IAM instance profile** (IAM 執行個體設定檔) 欄位中，選擇 **ecsInstanceRole**。

   1. 利用下列使用者資料設定您的 Amazon ECS 容器執行個體。在 **Advanced details** (進階詳細資料) 下的 **User data** (使用者資料) 欄位中，貼入下列指令碼，以您的叢集名稱取代 *cluster\$1name*。

      ```
      <powershell>
      Initialize-ECSAgent -Cluster windows-fsx-cluster -EnableTaskIAMRole
      </powershell>
      ```

   1. 準備就緒後，請選取 acknowledgment (確認) 欄位，再選擇 **Launch Instances** (啟動執行個體)。

   1. 會有確認頁面讓您知道您的執行個體正在啟動。選擇 **View Instances** (檢視執行個體) 關閉確認頁面並返回主控台。

1. 開啟主控台，網址為 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)。

1. 在導覽窗格中選擇**叢集**，然後選擇 **windows-fsx-cluster**。

1. 選擇**基礎設施**索引標籤，並確認您的執行個體已在 **windows-fsx-cluster** 叢集註冊。

## 步驟 7：註冊 Windows 任務定義
<a name="register_windows_task_def"></a>

您必須先註冊任務定義，才能在您的 Amazon ECS 叢集中執行 Windows 容器。以下任務定義範例會顯示簡單的網頁。任務會啟動兩個可存取 FSx 檔案系統的容器。第一個容器會將 HTML 檔案寫入檔案系統。第二個容器從檔案系統下載 HTML 檔案並為網頁提供服務。

1. 開啟主控台，網址為 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)。

1. 在導覽窗格中，選擇 **Task Definitions** (任務定義)。

1. 選擇 **Create new task definitio** (建立新任務定義)、**Create new task definition with JSON** (使用 JSON 建立新的任務定義)。

1. 在 JSON 編輯器方塊中，取代任務執行角色的值和有關 FSx 檔案系統的詳細資訊，然後選擇**儲存**。

   ```
   {
       "containerDefinitions": [
           {
               "entryPoint": [
                   "powershell",
                   "-Command"
               ],
               "portMappings": [],
               "command": ["New-Item -Path C:\\fsx-windows-dir\\index.html -ItemType file -Value '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>It Works!</h2> <p>You are using Amazon FSx for Windows File Server file system for persistent container storage.</p>' -Force"],
               "cpu": 512,
               "memory": 256,
               "image": "mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019",
               "essential": false,
               "name": "container1",
               "mountPoints": [
                   {
                       "sourceVolume": "fsx-windows-dir",
                       "containerPath": "C:\\fsx-windows-dir",
                       "readOnly": false
                   }
               ]
           },
           {
               "entryPoint": [
                   "powershell",
                   "-Command"
               ],
               "portMappings": [
                   {
                       "hostPort": 443,
                       "protocol": "tcp",
                       "containerPort": 80
                   }
               ],
               "command": ["Remove-Item -Recurse C:\\inetpub\\wwwroot\\* -Force; Start-Sleep -Seconds 120; Move-Item -Path C:\\fsx-windows-dir\\index.html -Destination C:\\inetpub\\wwwroot\\index.html -Force; C:\\ServiceMonitor.exe w3svc"],
               "mountPoints": [
                   {
                       "sourceVolume": "fsx-windows-dir",
                       "containerPath": "C:\\fsx-windows-dir",
                       "readOnly": false
                   }
               ],
               "cpu": 512,
               "memory": 256,
               "image": "mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019",
               "essential": true,
               "name": "container2"
           }
       ],
       "family": "fsx-windows",
       "executionRoleArn": "arn:aws:iam::111122223333:role/ecsTaskExecutionRole",
       "volumes": [
           {
               "name": "fsx-windows-dir",
               "fsxWindowsFileServerVolumeConfiguration": {
                   "fileSystemId": "fs-0eeb5730b2EXAMPLE",
                   "authorizationConfig": {
                       "domain": "example.com",
                       "credentialsParameter": "arn:arn-1234"
                   },
                   "rootDirectory": "share"
               }
           }
       ]
   }
   ```

## 步驟 8：執行任務並檢視結果
<a name="wfsx-run-task"></a>

在執行任務之前，請確認 FSx for Windows File Server 檔案系統的狀態為 **Available** (可用)。可用之後，您可以使用您建立的任務定義來執行任務。透過使用檔案系統建立相互之間隨機顯示 HTML 檔案的容器，以啟動任務。隨機顯示後，Web 伺服器提供簡單的 HTML 頁面。

**注意**  
您可能無法從 VPN 內連線至網站。

**使用 Amazon ECS 主控台執行任務並檢視結果。**

1. 開啟主控台，網址為 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)。

1. 在導覽窗格中選擇**叢集**，然後選擇 **windows-fsx-cluster**。

1. 選擇**任務**索引標籤，然後選擇**執行新任務**。

1. 針對 **Launch Type** (啟動類型)，選擇 **EC2**。

1. 在部署組態下，針對**任務定義**選擇 **fsx-windows**，然後選擇**建立**。

1. 當您的任務狀態為**執行中**時，請選擇任務 ID。

1. 在**容器**下，當容器 1 狀態為**已停止**時，選取容器 2 以檢視容器的詳細資訊。

1.  在 **container2 的容器詳細資訊**下，選取**網路繫結**，然後按一下與容器關聯的外部 IP 地址。您的瀏覽器將會開啟並顯示以下訊息。

   ```
   Amazon ECS Sample App
   It Works! 
   You are using Amazon FSx for Windows File Server file system for persistent container storage.
   ```
**注意**  
可能需要幾分鐘的時間才會顯示訊息。如果幾分鐘後您未看到此訊息，請檢查您是否未在 VPN 中執行，並確認容器執行個體的安全群組，允許連接埠 443 上的傳入網路 HTTP 流量。

## 步驟 9：清除
<a name="wfsx-cleanup"></a>

**注意**  
刪除 FSx for Windows File Server 檔案系統或 AD 需要 20 到 45 分鐘的時間。您必須等到 FSx for Windows File Server 檔案系統刪除操作完成後，才能開始 AD 刪除操作。

**刪除 FSx for Windows File Server 檔案系統。**

1. 開啟 [Amazon FSx 主控台](https://console.aws.amazon.com//fsx/)

1. 選取您剛建立之 FSx for Windows File Server 檔案系統左側的選項按鈕。

1. 選擇**動作**。

1. 選取 **Delete file system** (刪除檔案系統)。

**刪除 AD。**

1. 開啟 [Directory Service 主控台](https://console.aws.amazon.com//directoryservicev2/)。

1. 選擇您剛建立之 AD 左側的選項按鈕。

1. 選擇**動作**。

1. 選擇 **Delete directory** (刪除目錄)。

**刪除叢集。**

1. 開啟主控台，網址為 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)。

1. 在導覽窗格中選擇**叢集**，然後選擇 **windows-fsx-cluster**。

1. 選擇 **Delete cluster (刪除叢集)**。

1. 輸入短語，然後選擇**刪除**。

**終止 EC2 執行個體。**

1. 開啟 [Amazon EC2 主控台](https://console.aws.amazon.com//ec2/)。

1. 從左側選單中，選取 **Instances** (執行個體)。

1. 勾選您建立之 EC2 執行個體左側的核取方塊。

1. 按一下**執行個體狀態**和**終止執行個體**。

**刪除密碼。**

1. 開啟 [Secrets Manager 主控台](https://console.aws.amazon.com//secretsmanager/)。

1. 選取您為此逐步解說所建立的機密。

1. 按一下 **Actions** (動作)。

1. 選擇 **Delete secret** (刪除機密)。

# 搭配 Amazon ECS 使用 Docker 磁碟區
<a name="docker-volumes"></a>

使用 Docker 磁碟區時，可以使用內建的 `local` 驅動程式或第三方磁碟區驅動程式。Docker 磁碟區是由 Docker 管理，並且會在容器執行個體上的 `/var/lib/docker/volumes` 中建立一個目錄，其中包含磁碟區資料。

若要使用 Docker 磁碟區，請在您的任務定義中指定 `dockerVolumeConfiguration`。如需詳細資訊，請參閱 Docker 文件中的 [Volumes](https://docs.docker.com/engine/storage/volumes/)。

Docker 磁碟區的一些常用案例如下：
+ 提供搭配容器使用的持久性資料磁碟區
+ 在相同的容器執行個體上不同容器的不同位置共用定義的資料磁碟區
+ 定義空的非持久性資料磁碟區，並將其掛載到相同任務內的多個容器上
+ 將資料磁碟區提供給由第三方驅動程式管理的任務

## 使用 Docker 磁碟區時的考量
<a name="docker-volume-considerations"></a>

使用 Docker 磁碟區時，請考量下列事項：
+ 只有在使用 EC2 啟動類型或外部執行個體時才支援 Docker 磁碟區。
+ Windows 容器只支援使用 `local` 驅動程式。
+ 如果使用第三方驅動程式，確保先在容器執行個體上安裝及使用它，容器代理程式才會啟動。如果在啟動代理程式之前沒有啟動第三方驅動程式，您可以使用下列命令之一重新啟動容器代理程式：
  + 對於 Amazon ECS 最佳化 Amazon Linux 2 AMI：

    ```
    sudo systemctl restart ecs
    ```
  + 對於 Amazon ECS 最佳化 Amazon Linux AMI：

    ```
    sudo stop ecs && sudo start ecs
    ```

如需有關如何在任務定義中指定 Docker 磁碟區的資訊，請參閱[在 Amazon ECS 任務定義中指定 Docker 磁碟區](specify-volume-config.md)。

# 在 Amazon ECS 任務定義中指定 Docker 磁碟區
<a name="specify-volume-config"></a>

您必須先在任務定義中指定磁碟區和掛載點組態，您的容器才可以使用資料磁碟區。本節說明容器的磁碟區組態。對於使用 Docker 磁碟區的任務，指定 `dockerVolumeConfiguration`。對於使用綁定掛載主機磁碟區的任務，指定 `host` 和選用的 `sourcePath`。

以下任務定義 JSON 說明容器 `volumes` 和 `mountPoints` 物件的語法。

```
{
    "containerDefinitions": [
        {
            "mountPoints": [
                {
                    "sourceVolume": "string",
                    "containerPath": "/path/to/mount_volume",
                    "readOnly": boolean
                }
            ]
        }
    ],
    "volumes": [
        {
            "name": "string",
            "dockerVolumeConfiguration": {
                "scope": "string",
                "autoprovision": boolean,
                "driver": "string",
                "driverOpts": {
                    "key": "value"
                },
                "labels": {
                    "key": "value"
                }
            }
        }
    ]
}
```

`name`  
類型：字串  
必要：否  
磁碟區名稱。最多可輸入 255 個字母 (大小寫)、數字、連字號 (`-`) 與底線 (`_`)。在容器定義 `mountPoints` 物件的 `sourceVolume` 參數中參考此名稱。

`dockerVolumeConfiguration`  
類型：[DockerVolumeConfiguration](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DockerVolumeConfiguration.html) 物件  
必要：否  
此參數只有使用 Docker 磁碟區時才會指定。只有在 EC2 執行個體上執行任務時，才支援 Docker 磁碟區。Windows 容器只支援使用 `local` 驅動程式。若要使用綁定掛載，請指定 `host`。    
`scope`  
類型：字串  
有效值: `task` \$1 `shared`  
必要：否  
決定生命週期的 Docker 磁碟區範圍。範圍受限於 `task` 的 Docker 磁碟區，會在任務啟動時自動佈建，以及在任務停止時銷毀。範圍為 `shared` 的 Docker 磁碟區會在任務停止之後保留。  
`autoprovision`  
類型：布林值  
預設值：`false`  
必要：否  
若此數值為 `true`，Docker 磁碟區便得以建立 (若它尚不存在)。此欄位只有在 `scope` 的值為 `shared` 才會使用。如果 `scope` 的值為 `task`，則此參數必須省略。  
`driver`  
類型：字串  
必要：否  
要使用的 Docker 磁碟區驅動程式。驅動程式值必須符合 Docker 提供的驅動程式名稱，因為此名稱會用於任務置放。如果使用 Docker 外掛程式 CLI 安裝驅動程式，則使用 `docker plugin ls` 從容器執行個體擷取驅動程式名稱。如果使用其他方法安裝驅動程式，則使用 Docker 外掛程式探索來擷取驅動程式名稱。  
`driverOpts`  
類型：字串  
必要：否  
一組需傳遞的、專用於 Docker 驅動程式的選項映射。此參數會映射至 Docker 中「Create a volume」區段的 `DriverOpts`。  
`labels`  
類型：字串  
必要：否  
自訂中繼資料，新增到您的 Docker 磁碟區。

`mountPoints`  
類型：物件陣列  
必要：否  
容器中資料磁碟區的掛載點。此參數會映射至 Docker API 中 create-container 的 `Volumes`，以及 docker run 的 `--volume` 選項。  
Windows 容器可在 `$env:ProgramData` 所在的相同磁碟上掛載整個目錄。Windows 容器無法在不同的磁碟機上掛載目錄，且掛載點不能跨磁碟機使用。您必須指定掛載點，將 Amazon EBS 磁碟區直接連接至 Amazon ECS 任務。    
`sourceVolume`  
類型：字串  
必要：是 (當使用 `mountPoints` 時)  
要掛載的磁碟區名稱。  
`containerPath`  
類型：字串  
必要：是 (當使用 `mountPoints` 時)  
掛載磁碟區之容器中的路徑。  
`readOnly`  
類型：布林值  
必要：否  
如果此數值為 `true`，容器擁有磁碟區的唯讀存取權。如果此值為 `false`，則容器可寫入磁碟區。預設值為 `false`。  
對於在執行 Windows 作業系統之 EC2 執行個體上執行的任務，將該值保留為預設值 `false`。

# Amazon ECS 的 Docker 磁碟區範例
<a name="docker-volume-examples"></a>

下列範例示範如何為容器提供暫時性儲存，以及如何為多個容器提供共用磁碟區，以及如何為容器提供 NFS 持久性儲存。

**使用 Docker 磁碟區為單個容器提供暫時性儲存**

在此範例中，容器使用任務完成後清除的空白資料磁碟區。舉一個使用案例範例，您的容器在任務期間需要存取一些暫存檔案儲存位置。使用 Docker 磁碟區可達成此任務。

1. 在任務定義 `volumes` 區段，以 `name` 和 `DockerVolumeConfiguration` 值定義資料磁碟區。在本範例中，我們指定範圍為 `task`，所以會在任務停止後刪除磁碟區，並使用內建的 `local` 驅動程式。

   ```
   "volumes": [
       {
           "name": "scratch",
           "dockerVolumeConfiguration" : {
               "scope": "task",
               "driver": "local",
               "labels": {
                   "scratch": "space"
               }
           }
       }
   ]
   ```

1. 在 `containerDefinitions` 區段中定義容器，並使用 `mountPoints` 值來參考已定義的磁碟區名稱，使用 `containerPath` 值將磁碟區掛載於容器。

   ```
   "containerDefinitions": [
       {
           "name": "container-1",
           "mountPoints": [
               {
                 "sourceVolume": "scratch",
                 "containerPath": "/var/scratch"
               }
           ]
       }
   ]
   ```

**使用 Docker 磁碟區為多個容器提供持續性儲存**

在此範例中，您要多個容器使用一個共用磁碟區，並且要在使用它的任何單一任務停止之後加以保留。正在使用內建的 `local` 驅動程式。如此一來，磁碟區仍受限於容器執行個體的生命週期。

1. 在任務定義 `volumes` 區段，以 `name` 和 `DockerVolumeConfiguration` 值定義資料磁碟區。在此範例中，指定 `shared` 範圍，以便持續保留磁碟區，請將 autoprovision 設定為 `true`。如此一來，已建立該磁碟區以供使用。然後，還可以使用內建 `local` 驅動程式。

   ```
   "volumes": [
       {
           "name": "database",
           "dockerVolumeConfiguration" : {
               "scope": "shared",
               "autoprovision": true,
               "driver": "local",
               "labels": {
                   "database": "database_name"
               }
           }
       }
   ]
   ```

1. 在 `containerDefinitions` 區段中定義容器，並使用 `mountPoints` 值來參考已定義的磁碟區名稱，使用 `containerPath` 值將磁碟區掛載於容器。

   ```
   "containerDefinitions": [
       {
           "name": "container-1",
           "mountPoints": [
           {
             "sourceVolume": "database",
             "containerPath": "/var/database"
           }
         ]
       },
       {
         "name": "container-2",
         "mountPoints": [
           {
             "sourceVolume": "database",
             "containerPath": "/var/database"
           }
         ]
       }
     ]
   ```

**使用 Docker 磁碟區提供容器的 NFS 持久性儲存**

 在此範例中，容器使用 NFS 資料磁碟區，該資料磁碟區在任務啟動時自動掛載並在任務停止時自動卸載。這可使用 Docker 內建 `local` 驅動程式加以實現。一個範例使用案例是，您可能有本機 NFS 儲存體，並且需要從 ECS Anywhere 任務進行存取。這可以使用具有 NFS 驅動程式選項的 Docker 磁碟區來達成。

1. 在任務定義 `volumes` 區段，以 `name` 和 `DockerVolumeConfiguration` 值定義資料磁碟區。在此範例中，指定 `task` 範圍，以便在任務停止後卸載磁碟區。使用 `local` 驅動程式並相應地使用 `type`、`device` 和 `o` 選項設定 `driverOpts`。使用 NFS 伺服器端點取代 `NFS_SERVER`。

   ```
   "volumes": [
          {
              "name": "NFS",
              "dockerVolumeConfiguration" : {
                  "scope": "task",
                  "driver": "local",
                  "driverOpts": {
                      "type": "nfs",
                      "device": "$NFS_SERVER:/mnt/nfs",
                      "o": "addr=$NFS_SERVER"
                  }
              }
          }
      ]
   ```

1. 在 `containerDefinitions` 區段中定義容器，並使用 `mountPoints` 值來參考已定義的磁碟區名稱，使用 `containerPath` 值將磁碟區掛載在容器上。

   ```
   "containerDefinitions": [
          {
              "name": "container-1",
              "mountPoints": [
                  {
                    "sourceVolume": "NFS",
                    "containerPath": "/var/nfsmount"
                  }
              ]
          }
      ]
   ```

# 搭配 Amazon ECS 使用綁定掛載
<a name="bind-mounts"></a>

透過綁定掛載，主機上的檔案或目錄 (例如 Amazon EC2 執行個體) 會掛載至容器中。在 Fargate 和 Amazon EC2 執行個體上託管的任務支援綁定掛載。綁定掛載與使用它們的容器的生命週期相關聯。使用綁定掛載的所有容器停止之後，例如當任務停止時，資料就會被移除。對於 Amazon EC2 執行個體上託管的任務，可以將資料連接至主機 Amazon EC2 執行個體的生命週期，方法是在任務定義中指定 `host` 與選用的 `sourcePath` 值。如需詳細資訊，請參閱 Docker 文件中的 [Bind mounts](https://docs.docker.com/engine/storage/bind-mounts/)。

以下是綁定掛載的常用案例。
+ 若要提供空白的資料磁碟區以便在一個或多個容器中掛載。
+ 若要在一個或多個容器中掛載主機資料磁碟區。
+ 若要與相同任務中的其他容器共用來源容器的資料磁碟區。
+ 若要將 Dockerfile 中的路徑及其內容公開給一個或多個容器。

## 使用綁定掛載時的考量
<a name="bind-mount-considerations"></a>

使用綁定掛載時，請考量下列事項。
+ 在預設情況下， AWS Fargate 使用平台版本 `1.4.0`或更新版本 (Linux) `1.0.0`或更新版本 (Windows) 在 上託管的任務，會接收至少 20 GiB 的暫時性儲存，以進行綁定掛載。您可以透過在任務定義中指定 `ephemeralStorage` 參數來增加暫時性儲存的總量，最多可達 200 GiB。
+ 若要在執行任務時將 Dockerfile 中的檔案公開至資料磁碟區，Amazon ECS 資料平面會尋找 `VOLUME` 指令。如果在 `VOLUME` 指令中指定的絕對路徑與在任務定義中指定的 `containerPath` 相同，則 `VOLUME` 指令路徑中的資料會複製到資料磁碟區。在下列 Dockerfile 範例中，`/var/log/exported` 目錄中名為 `examplefile` 的檔案會寫入主機，然後掛載在容器內。

  ```
  FROM public.ecr.aws/amazonlinux/amazonlinux:latest
  RUN mkdir -p /var/log/exported
  RUN touch /var/log/exported/examplefile
  VOLUME ["/var/log/exported"]
  ```

  根據預設，磁碟區許可設定為 `0755` 和擁有者設定為 `root`。您可以在 Dockerfile 中自訂這些許可。在下列範例中，將目錄的擁有者設定為 `node`。

  ```
  FROM public.ecr.aws/amazonlinux/amazonlinux:latest
  RUN yum install -y shadow-utils && yum clean all
  RUN useradd node
  RUN mkdir -p /var/log/exported && chown node:node /var/log/exported
  RUN touch /var/log/exported/examplefile
  USER node
  VOLUME ["/var/log/exported"]
  ```
+ 對於在 Amazon EC2 執行個體上託管的任務，當 `host` 和 `sourcePath` 值未指定時，Docker 常駐程式會為您管理綁定掛載。當沒有任何容器參考此綁定掛載時，Amazon ECS 容器代理程式任務清除服務最終會予以刪除。根據預設，這會在容器退出的 3 小時後發生。不過，您可以使用 `ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION` 代理程式變數設定此持續時間。如需詳細資訊，請參閱[Amazon ECS 容器代理程式組態](ecs-agent-config.md)。如果您需要此資料的保留時間超過容器的生命週期，請為綁定掛載指定 `sourcePath` 值。
+ 對於託管在 Amazon ECS 受管執行個體上的任務，根檔案系統的部分是唯讀的。讀取/寫入繫結掛載必須使用可寫入目錄，例如`/var`持久性資料或`/tmp`暫存資料。嘗試建立其他目錄的讀取/寫入繫結掛載會導致任務無法啟動，並出現類似以下的錯誤：

  ```
  error creating empty volume: error while creating volume path '/path': mkdir /path: read-only file system
  ```

  唯讀繫結掛載 （在 `mountPoints` 參數`"readOnly": true`中以 設定） 可以指向主機上任何可存取的目錄。

  若要檢視可寫入路徑的完整清單，您可以在 Amazon ECS 受管執行個體上執行任務，並使用 檢查執行個體的掛載資料表。使用下列設定建立任務定義，以存取主機檔案系統：

  ```
  {
      "pidMode": "host",
      "containerDefinitions": [{
          "privileged": true,
          ...
      }]
  }
  ```

  然後從容器內執行下列命令：

  ```
  # List writable mounts
  cat /proc/1/root/proc/1/mounts | awk '$4 ~ /^rw,/ || $4 == "rw" {print $2}' | sort
  
  # List read-only mounts
  cat /proc/1/root/proc/1/mounts | awk '$4 ~ /^ro,/ || $4 == "ro" {print $2}' | sort
  ```
**重要**  
`privileged` 設定會授予主機上的容器延伸功能，相當於根存取。在此範例中，它用於檢查主機的掛載資料表以進行診斷。如需詳細資訊，請參閱[避免以特權方式執行容器 (Amazon EC2)](security-tasks-containers.md#security-tasks-containers-recommendations-avoid-privileged-containers)。

  如需在容器中以互動方式執行命令的詳細資訊，請參閱 [使用 ECS Exec 監控 Amazon ECS 容器](ecs-exec.md)。

# 在 Amazon ECS 任務定義中指定綁定掛載
<a name="specify-bind-mount-config"></a>

對於託管在 Fargate 或 Amazon EC2 執行個體上的 Amazon ECS 任務，下列任務定義 JSON 程式碼片段展示了任務定義的 `volumes`、`mountPoints` 以及 `ephemeralStorage` 物件的語法。

```
{
   "family": "",
   ...
   "containerDefinitions" : [
      {
         "mountPoints" : [
            {
               "containerPath" : "/path/to/mount_volume",
               "sourceVolume" : "string"
            }
          ],
          "name" : "string"
       }
    ],
    ...
    "volumes" : [
       {
          "name" : "string"
       }
    ],
    "ephemeralStorage": {
	   "sizeInGiB": integer
    }
}
```

對於託管於 Amazon EC2 執行個體上的 Amazon ECS 任務，您可以在指定任務磁碟區詳細資訊時使用選用的 `host` 參數和 `sourcePath`。指定時，它會將綁定掛載任務的生命週期，而不是容器。

```
"volumes" : [
    {
        "host" : {
            "sourcePath" : "string"
        },
        "name" : "string"
    }
]
```

下面會更詳細地描述每個任務定義參數。

`name`  
類型：字串  
必要：否  
磁碟區名稱。最多可輸入 255 個字母 (大小寫)、數字、連字號 (`-`) 與底線 (`_`)。在容器定義 `mountPoints` 物件的 `sourceVolume` 參數中參考此名稱。

`host`  
必要：否  
`host` 參數用於將綁定掛載的生命週期綁定到主機 Amazon EC2 執行個體，而非任務，以及它的儲存位置。如果 `host` 參數是空的，則 Docker 常駐程式會為您的資料磁碟區指派主機路徑，但其相關聯的容器停止執行後，不保證會保留資料。  
Windows 容器可在 `$env:ProgramData` 所在的相同磁碟上掛載整個目錄。  
只有在使用託管在 Amazon EC2 執行個體或 Amazon ECS 受管執行個體上的任務時，才支援 `sourcePath` 參數。  
`sourcePath`  
類型：字串  
必要：否  
使用 `host` 參數時，指定 `sourcePath` 以宣告在主機 Amazon EC2 執行個體上提供給容器的路徑。如果此參數是空的，則 Docker 常駐程式會為您指派主機路徑。如果 `host` 參數包含 `sourcePath` 檔案位置，資料磁碟區將保留在主機 Amazon EC2 執行個體上的指定位置，直到您手動將其刪除為止。如果 `sourcePath` 值不存在於主機 Amazon EC2 執行個體，Docker 常駐程式將建立該值。如果位置存在，將匯出來源路徑資料夾的內容。

`mountPoints`  
類型：物件陣列  
必要：否  
容器中資料磁碟區的掛載點。此參數會映射至 Docker API 中 create-container 的 `Volumes`，以及 docker run 的 `--volume` 選項。  
Windows 容器可在 `$env:ProgramData` 所在的相同磁碟上掛載整個目錄。Windows 容器無法在不同的磁碟機上掛載目錄，且掛載點不能跨磁碟機使用。您必須指定掛載點，將 Amazon EBS 磁碟區直接連接至 Amazon ECS 任務。    
`sourceVolume`  
類型：字串  
必要：是 (當使用 `mountPoints` 時)  
要掛載的磁碟區名稱。  
`containerPath`  
類型：字串  
必要：是 (當使用 `mountPoints` 時)  
掛載磁碟區之容器中的路徑。  
`readOnly`  
類型：布林值  
必要：否  
如果此數值為 `true`，容器擁有磁碟區的唯讀存取權。如果此值為 `false`，則容器可寫入磁碟區。預設值為 `false`。  
對於在執行 Windows 作業系統之 EC2 執行個體上執行的任務，將該值保留為預設值 `false`。

`ephemeralStorage`  
類型：物件  
必要：否  
為任務配置的暫時性儲存量。對於 AWS Fargate 使用平台版本 `1.4.0`或更新版本 (Linux) 或更新版本 (`1.0.0`Windows) 在 上託管的任務，此參數用於擴展可用的暫時性儲存總量，超過預設數量。  
您可以使用 Copilot CLI、CloudFormation、 AWS SDK 或 CLI 來指定繫結掛載的暫時性儲存。

# Amazon ECS 的綁定掛載範例
<a name="bind-mount-examples"></a>

下列範例涵蓋對容器使用綁定掛載的常見使用案例。

**若要為 Fargate 任務分配更多的暫時性儲存量**

對於託管於使用平台版本 `1.4.0` 或更新版本 (Linux) 或者 `1.0.0` (Windows) 的 Fargate 上的 Amazon ECS 任務，您可以為任務中的容器分配比預設暫時性儲存量更多的空間以供使用。此範例可以整合到其他範例中，為您的 Fargate 任務分配更多的暫時性儲存。
+ 在任務定義中，定義 `ephemeralStorage` 物件。`sizeInGiB` 必須是 `21` 和 `200` 之間的整數並以 GiB 為單位來表示。

  ```
  "ephemeralStorage": {
      "sizeInGiB": integer
  }
  ```

**若要為一個或多個容器提供空白的資料磁碟區**

在某些情況下，您希望在任務中為容器提供一些暫存空間。例如，您可能有兩個資料庫容器，在任務期間需要存取相同的暫存檔案儲存位置。這可以使用綁定掛載來達成。

1. 在任務定義 `volumes` 區段中，以名稱 `database_scratch` 定義綁定掛載。

   ```
     "volumes": [
       {
         "name": "database_scratch"
       }
     ]
   ```

1. 在 `containerDefinitions` 區段中，建立資料庫容器定義。如此一來，它們就可以掛載磁碟區。

   ```
   "containerDefinitions": [
       {
         "name": "database1",
         "image": "my-repo/database",
         "cpu": 100,
         "memory": 100,
         "essential": true,
         "mountPoints": [
           {
             "sourceVolume": "database_scratch",
             "containerPath": "/var/scratch"
           }
         ]
       },
       {
         "name": "database2",
         "image": "my-repo/database",
         "cpu": 100,
         "memory": 100,
         "essential": true,
         "mountPoints": [
           {
             "sourceVolume": "database_scratch",
             "containerPath": "/var/scratch"
           }
         ]
       }
     ]
   ```

**若要將 Docker 文件中的路徑及其內容公開給容器**

在此範例中，您有一個 Dockerfile，它會寫入您想要掛載在容器內的資料。此範例適用於 Fargate 或 Amazon EC2 執行個體上託管的任務。

1. 建立 Dockerfile。下列範例使用公有 Amazon Linux 2 容器映像，並在我們想要在容器內部掛載的 `/var/log/exported` 目錄中建立名為 `examplefile` 的檔案。`VOLUME` 指令應該指定一個絕對路徑。

   ```
   FROM public.ecr.aws/amazonlinux/amazonlinux:latest
   RUN mkdir -p /var/log/exported
   RUN touch /var/log/exported/examplefile
   VOLUME ["/var/log/exported"]
   ```

   根據預設，磁碟區許可設定為 `0755` 和擁有者設定為 `root`。可以在 Docker 檔案中變更這些許可。在下列範例中，`/var/log/exported` 目錄的擁有者設定為 `node`。

   ```
   FROM public.ecr.aws/amazonlinux/amazonlinux:latest
   RUN yum install -y shadow-utils && yum clean all
   RUN useradd node
   RUN mkdir -p /var/log/exported && chown node:node /var/log/exported					    
   USER node
   RUN touch /var/log/exported/examplefile
   VOLUME ["/var/log/exported"]
   ```

1. 在任務定義 `volumes` 區段中，以名稱 `application_logs` 定義一個磁碟區。

   ```
     "volumes": [
       {
         "name": "application_logs"
       }
     ]
   ```

1. 在 `containerDefinitions` 區段中，建立應用程式容器定義。如此一來，它們就可以掛載儲存。`containerPath` 值必須符合 Dockerfile `VOLUME` 指令中指定的絕對路徑。

   ```
     "containerDefinitions": [
       {
         "name": "application1",
         "image": "my-repo/application",
         "cpu": 100,
         "memory": 100,
         "essential": true,
         "mountPoints": [
           {
             "sourceVolume": "application_logs",
             "containerPath": "/var/log/exported"
           }
         ]
       },
       {
         "name": "application2",
         "image": "my-repo/application",
         "cpu": 100,
         "memory": 100,
         "essential": true,
         "mountPoints": [
           {
             "sourceVolume": "application_logs",
             "containerPath": "/var/log/exported"
           }
         ]
       }
     ]
   ```

**若要為與主機 Amazon EC2 執行個體生命週期相關聯的容器提供空資料磁碟區**

對於在 Amazon EC2 執行個體上託管的任務，您可以使用綁定掛載，並將資料與主機 Amazon EC2 執行個體的生命週期相關聯。您可以使用 `host` 參數並指定 `sourcePath` 值來達成此操作。位在 `sourcePath` 的任何檔案都會出現在值為 `containerPath` 的容器中。寫入 `containerPath` 值的任何檔案都會寫入主機 Amazon EC2 執行個體上的 `sourcePath` 值。
**重要**  
Amazon ECS 不會在 Amazon EC2 執行個體之間同步您的儲存。使用持久性儲存的任務可以放置在您有可用容量之叢集中的任何 Amazon EC2 執行個體。如果您的任務在停止和重新啟動後需要持久性儲存，請務必在任務啟動時間使用 AWS CLI [start-task](https://docs.aws.amazon.com/cli/latest/reference/ecs/start-task.html) 命令指定相同的 Amazon EC2 執行個體。也可使用 Amazon EFS 磁碟區以供持久性儲存。如需詳細資訊，請參閱[將 Amazon EFS 磁碟區與 Amazon ECS 搭配使用](efs-volumes.md)。

1. 在任務定義 `volumes` 區段，以 `name` 和 `sourcePath` 值定義綁定掛載。在下列範例中，主機 Amazon EC2 執行個體包含要掛載在容器內的 `/ecs/webdata` 的資料。

   ```
     "volumes": [
       {
         "name": "webdata",
         "host": {
           "sourcePath": "/ecs/webdata"
         }
       }
     ]
   ```

1. 在 `containerDefinitions` 區段中定義容器，並使用 `mountPoints` 值來參考綁定掛載名稱，使用 `containerPath` 值在容器上掛載綁定掛載。

   ```
     "containerDefinitions": [
       {
         "name": "web",
         "image": "public.ecr.aws/docker/library/nginx:latest",
         "cpu": 99,
         "memory": 100,
         "portMappings": [
           {
             "containerPort": 80,
             "hostPort": 80
           }
         ],
         "essential": true,
         "mountPoints": [
           {
             "sourceVolume": "webdata",
             "containerPath": "/usr/share/nginx/html"
           }
         ]
       }
     ]
   ```

**在不同位置的多個容器中掛載已定義的磁碟區**

您可以在任務定義中定義資料磁碟區，並將該磁碟區掛載到不同容器的不同位置。例如，您的主機容器有一個位於 `/data/webroot` 的網站資料夾。建議您以唯讀方式將該資料磁碟區掛載到有不同文件根目錄的兩個不同 Web 伺服器上。

1. 在任務定義 `volumes` 區段中，以名稱 `webroot` 和來源路徑 `/data/webroot` 定義資料磁碟區。

   ```
     "volumes": [
       {
         "name": "webroot",
         "host": {
           "sourcePath": "/data/webroot"
         }
       }
     ]
   ```

1. 在 `containerDefinitions` 區段中，使用 `mountPoints` 值為每個 Web 伺服器定義容器，這些值會建立 `webroot` 磁碟區與指向該容器文件根目錄之 `containerPath` 值的關聯性。

   ```
     "containerDefinitions": [
       {
         "name": "web-server-1",
         "image": "my-repo/ubuntu-apache",
         "cpu": 100,
         "memory": 100,
         "portMappings": [
           {
             "containerPort": 80,
             "hostPort": 80
           }
         ],
         "essential": true,
         "mountPoints": [
           {
             "sourceVolume": "webroot",
             "containerPath": "/var/www/html",
             "readOnly": true
           }
         ]
       },
       {
         "name": "web-server-2",
         "image": "my-repo/sles11-apache",
         "cpu": 100,
         "memory": 100,
         "portMappings": [
           {
             "containerPort": 8080,
             "hostPort": 8080
           }
         ],
         "essential": true,
         "mountPoints": [
           {
             "sourceVolume": "webroot",
             "containerPath": "/srv/www/htdocs",
             "readOnly": true
           }
         ]
       }
     ]
   ```

**使用 `volumesFrom` 掛載來自其他容器的磁碟區**

針對在 Amazon EC2 執行個體上託管的任務，您可以在容器上定義一或多個磁碟區，然後在相同的任務中的不同的容器定義中使用 `volumesFrom` 參數，將所有來自 `sourceContainer` 的磁碟區掛載在其原始定義的掛載點。`volumesFrom` 參數適用於在任務定義中定義的磁碟區，以及使用 Dockerfile 內建在映像中的磁碟區。

1. (選用) 若要共用內建在映像的磁碟區，請使用 Dockerfile 中的 `VOLUME` 指令。以下範例 Dockerfile 使用 `httpd` 映像，然後新增磁碟區，再將之掛載到 Apache 文件根中的 `dockerfile_volume`。該資料夾由 `httpd` Web 伺服器使用。

   ```
   FROM httpd
   VOLUME ["/usr/local/apache2/htdocs/dockerfile_volume"]
   ```

   您可以使用此 Dockerfile 建立映像，並將之推送到儲存庫，例如 Docker Hub，然後在您的任務定義中使用。在以下步驟中使用的範例 `my-repo/httpd_dockerfile_volume` 映像是使用前述的 Dockerfile 所建立。

1. 建立任務定義，定義您容器的其他磁碟區及掛載點。在這個範例 `volumes` 區段中，您要建立一個名為 `empty` 的空磁碟區，它是由 Docker 常駐程式管理。您還要定義一個稱為 `host_etc` 的主機磁碟區。它會匯出主機容器執行個體的 `/etc` 資料夾。

   ```
   {
     "family": "test-volumes-from",
     "volumes": [
       {
         "name": "empty",
         "host": {}
       },
       {
         "name": "host_etc",
         "host": {
           "sourcePath": "/etc"
         }
       }
     ],
   ```

   在容器定義區段中，建立一個容器，掛載之前定義的磁碟區。在此範例中，`web` 容器掛載 `empty` 和 `host_etc` 磁碟區。這是使用由 Dockerfile 中的磁碟區建立的映像的容器。

   ```
   "containerDefinitions": [
       {
         "name": "web",
         "image": "my-repo/httpd_dockerfile_volume",
         "cpu": 100,
         "memory": 500,
         "portMappings": [
           {
             "containerPort": 80,
             "hostPort": 80
           }
         ],
         "mountPoints": [
           {
             "sourceVolume": "empty",
             "containerPath": "/usr/local/apache2/htdocs/empty_volume"
           },
           {
             "sourceVolume": "host_etc",
             "containerPath": "/usr/local/apache2/htdocs/host_etc"
           }
         ],
         "essential": true
       },
   ```

   建立另一個容器，使用 `volumesFrom` 掛載與 `web` 容器相關聯的所有磁碟區。`web` 容器上的所有磁碟區同樣掛載在 `busybox` 容器上。這包括在 Dockerfile 中指定的磁碟區，該磁碟區用於建置 `my-repo/httpd_dockerfile_volume` 映像。

   ```
       {
         "name": "busybox",
         "image": "busybox",
         "volumesFrom": [
           {
             "sourceContainer": "web"
           }
         ],
         "cpu": 100,
         "memory": 500,
         "entryPoint": [
           "sh",
           "-c"
         ],
         "command": [
           "echo $(date) > /usr/local/apache2/htdocs/empty_volume/date && echo $(date) > /usr/local/apache2/htdocs/host_etc/date && echo $(date) > /usr/local/apache2/htdocs/dockerfile_volume/date"
         ],
         "essential": false
       }
     ]
   }
   ```

   執行此任務時，兩個容器會掛載磁碟區，而 `busybox` 容器中的 `command` 會將日期和時間寫入檔案。這個檔案在每個磁碟區資料夾中稱為 `date`。然後，在 `web` 容器所顯示的網站上，就能看到這些資料夾。
**注意**  
由於 `busybox` 容器執行快速命令，然後結束，所以在容器定義中必須設為 `"essential": false`。否則，它結束時會停止整個任務。