透過 Amazon ECS環境變數擷取 Secrets Manager 秘密 - Amazon Elastic Container Service

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

透過 Amazon ECS環境變數擷取 Secrets Manager 秘密

當您將秘密插入為環境變數時,您可以指定秘密的完整內容、秘密中的特定JSON金鑰,或要注入的秘密特定版本。這可協助您控制向容器公開的敏感資料。如需有關秘密版本控制的詳細資訊,請參閱《AWS Secrets Manager 使用者指南》中的 AWS Secrets Manager重要術語和概念

使用環境變數將 Secrets Manager 秘密注入容器時,應考慮下列事項。

  • 敏感資料會在初次啟動容器時,嵌入您的容器。如果後續更新或輪換秘密,則容器不會自動收到更新的值。您必須啟動新的任務,或如果任務是服務的一部分,您可以更新服務,並使用 Force new deployment (強制新的部署) 選項強制服務來啟動新的任務。

  • 對於 上的 Amazon ECS任務 AWS Fargate,請考慮下列事項:

    • 若要將秘密的完整內容作為環境變數或在日誌組態中插入,您必須使用平台版本 1.3.0 或更新版本。如需相關資訊,請參閱 適用於 Amazon 的 Fargate 平台版本 ECS

    • 若要將特定JSON金鑰或秘密版本插入環境變數或日誌組態中,您必須使用平台版本 1.4.0或更新版本 (Linux) 或 1.0.0(Windows)。如需相關資訊,請參閱 適用於 Amazon 的 Fargate 平台版本 ECS

  • 對於 上的 Amazon ECS任務EC2,應考慮下列事項:

    • 若要使用特定JSON金鑰或秘密版本來注入秘密,您的容器執行個體必須具有容器代理程式的版本1.37.0或更新版本。不過,我們建議您使用最新版的容器代理程式。如需檢查代理程式版本及更新至最新版本的資訊,請參閱「更新 Amazon ECS容器代理程式」。

      若要插入秘密的完整內容做為環境變數,或在日誌組態中插入秘密,則容器執行個體必須有 1.22.0 版或更新版本的容器代理程式。

  • 使用介面VPC端點增強安全控制,並透過私有子網路連線至 Secrets Manager。您必須為 Secrets Manager 建立介面VPC端點。如需VPC端點的相關資訊,請參閱 AWS Secrets Manager 使用者指南 中的建立VPC端點。如需使用 Secrets Manager 和 Amazon 的詳細資訊VPC,請參閱如何在 Amazon 中連線至 Secrets Manager 服務VPC

  • 對於設定為使用 awslogs 日誌記錄驅動程式的 Windows 任務,您也必須在容器執行個體上設定 ECS_ENABLE_AWSLOGS_EXECUTIONROLE_OVERRIDE 環境變數。使用下列語法:

    <powershell> [Environment]::SetEnvironmentVariable("ECS_ENABLE_AWSLOGS_EXECUTIONROLE_OVERRIDE", $TRUE, "Machine") Initialize-ECSAgent -Cluster <cluster name> -EnableTaskIAMRole -LoggingDrivers '["json-file","awslogs"]' </powershell>
  • 您的任務定義必須使用任務執行角色搭配 Secrets Manager 的其他許可。如需詳細資訊,請參閱Amazon ECS任務執行IAM角色

建立 AWS Secrets Manager 秘密

您可以使用 Secrets Manager 主控台為您的敏感資料建立秘密。如需詳細資訊,請參閱 AWS Secrets Manager 使用者指南 中的建立 AWS Secrets Manager 秘密

將環境變數新增至容器定義

您可以在容器定義中指定下列項目:

  • 包含要在容器中設定之環境變數名稱的 secrets 物件。

  • Secrets Manager 秘密的 Amazon Resource Name (ARN)

  • 包含要提供給容器之敏感資料的其他參數

下列範例示範了必須為 Secrets Manager 秘密指定的完整語法。

arn:aws:secretsmanager:region:aws_account_id:secret:secret-name:json-key:version-stage:version-id

以下部分說明其他參數。這些參數雖然是選用,但如果您不使用,則必須包含冒號 : 來使用預設值。以下提供範例深入說明。

json-key

使用您要設為環境變數值的值,來指定金鑰/值對中的金鑰名稱。僅支援 JSON 格式的值。如果您未指定JSON金鑰,則會使用秘密的完整內容。

version-stage

指定您要使用之秘密版本的預備標籤。如果指定了版本預備標籤,就無法指定版本 ID。如果未指定版本階段,則預設會擷取具有 AWSCURRENT 階段標籤的秘密。

預備標籤會用來在不同版本的秘密更新或輪換時加以追蹤。每個版本的秘密都有一或多個預備標籤和 ID。如需詳細資訊,請參閱 《AWS Secrets Manager 使用者指南》中的 AWS Secrets Manager的重要術語和概念

version-id

針對您要使用的秘密版本,指定其唯一識別符。如果指定了版本 ID,就無法指定版本預備標籤。如果未指定版本 ID,則預設會擷取具有 AWSCURRENT 階段標籤的秘密。

版本IDs用於追蹤更新或輪換的秘密的不同版本。每個版本的秘密都有 ID。如需詳細資訊,請參閱 《AWS Secrets Manager 使用者指南》中的 AWS Secrets Manager的重要術語和概念

容器定義範例

下列範例示範您可以在容器定義中參考 Secrets Manager 秘密的方法。

範例 參考完整秘密

以下是任務定義的程式碼片段,顯示參考 Secrets Manager 秘密全文時的格式。

{ "containerDefinitions": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:secret_name-AbCdEf" }] }] }

若要從容器內存取此秘密的值,您需要呼叫 $environment_variable_name

範例 參考秘密中的特定金鑰

以下顯示來自get-secret-value命令的範例輸出,其中顯示秘密的內容,以及與其相關聯的版本暫存標籤和版本 ID。

{ "ARN": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf", "Name": "appauthexample", "VersionId": "871d9eca-18aa-46a9-8785-981ddEXAMPLE", "SecretString": "{\"username1\":\"password1\",\"username2\":\"password2\",\"username3\":\"password3\"}", "VersionStages": [ "AWSCURRENT" ], "CreatedDate": 1581968848.921 }

透過在 結尾指定金鑰名稱,參考容器定義中先前輸出的特定金鑰ARN。

{ "containerDefinitions": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf:username1::" }] }] }
範例 參考特定秘密版本

以下示範 describe-secret 命令的範例輸出,會顯示秘密的未加密內容,以及所有版本秘密的中繼資料。

{ "ARN": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf", "Name": "appauthexample", "Description": "Example of a secret containing application authorization data.", "RotationEnabled": false, "LastChangedDate": 1581968848.926, "LastAccessedDate": 1581897600.0, "Tags": [], "VersionIdsToStages": { "871d9eca-18aa-46a9-8785-981ddEXAMPLE": [ "AWSCURRENT" ], "9d4cb84b-ad69-40c0-a0ab-cead3EXAMPLE": [ "AWSPREVIOUS" ] } }

透過在 結尾指定金鑰名稱,參考容器定義中先前輸出的特定版本預備標籤ARN。

{ "containerDefinitions": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf::AWSPREVIOUS:" }] }] }

透過在 結尾指定金鑰名稱,參考容器定義中先前輸出的特定版本 IDARN。

{ "containerDefinitions": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf:::9d4cb84b-ad69-40c0-a0ab-cead3EXAMPLE" }] }] }
範例 參考秘密的特定金鑰和版本預備標籤

以下說明如何參考秘密中的特定金鑰和特定版本預備標籤。

{ "containerDefinitions": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf:username1:AWSPREVIOUS:" }] }] }

若要指定特定的金鑰和版本 ID,請使用下列語法。

{ "containerDefinitions": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf:username1::9d4cb84b-ad69-40c0-a0ab-cead3EXAMPLE" }] }] }

如需有關如何使用環境變數中指定的秘密建立任務定義的資訊,請參閱 使用主控台建立 Amazon ECS任務定義