通过 Parameter Store 参数引用 Amazon Secrets Manager 密钥 - Amazon Systems Manager
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

通过 Parameter Store 参数引用 Amazon Secrets Manager 密钥

Amazon Secrets Manager 可以帮助您组织和管理重要的配置数据(例如凭证、密码和许可证密钥)。Parameter Store(Amazon Systems Manager 的一项功能)与 Secrets Manager 集成,以便您在使用其他已支持引用 Parameter Store 参数的 Amazon Web Services时,可以检索 Secrets Manager 密钥。这些服务包括 Amazon Elastic Compute Cloud (Amazon EC2)、Amazon Elastic Container Service (Amazon ECS)、Amazon Lambda、Amazon CloudFormation、Amazon CodeBuild、Amazon CodeDeploy 和其他 Systems Manager 功能。通过使用 Parameter Store 引用 Secrets Manager 密钥,可创建一致且安全的过程来调用和使用代码,以及配置脚本中的密钥和引用数据。

有关 Secrets Manager 的更多信息,请参阅 Amazon Secrets Manager 用户指南中的什么是 Amazon Secrets Manager?

Restrictions

使用 Parameter Store 引用 Secrets Manager 秘密时,请注意以下限制:

  • 只能通过使用 GetParameterGetParameters API 操作来检索 Secrets Manager 秘密。Secrets Manager 不支持修改操作和高级查询 API 操作(例如 DescribeParametersGetParametersByPath)。

  • 可以使用 Amazon Command Line Interface (Amazon CLI)、Amazon Tools for Windows PowerShell 和开发工具包通过 Parameter Store 检索秘密。

  • 当通过 Parameter Store 检索 Secrets Manager 秘密时,名称必须以以下预留路径开头:/aws/reference/secretsmanager/secret_ID_in_Secrets_Manager

    下面是一个示例:/aws/reference/secretsmanager/CFCreds1

  • Parameter Store 将遵循附加到 Secrets Manager 秘密的 Amazon Identity and Access Management (IAM) 策略。例如,如果用户 1 没有密钥 A 的访问权限,则用户 1 无法使用 Parameter Store 检索密钥 A。

  • 引用 Secrets Manager 秘密的参数无法使用 Parameter Store 版本控制或历史记录功能。

  • Parameter Store 将遵循 Secrets Manager 版本阶段。如果您引用某一版本阶段,它将使用字母、数字、句点 (.)、连字符 (-) 或下划线 (_)。在版本阶段中指定的所有其他符号都会导致引用失败。

如何使用 Parameter Store 引用 Secrets Manager 秘密

以下过程介绍如何使用 Parameter Store API 引用 Secrets Manager 秘密。该过程可以引用 Amazon Secrets Manager 用户指南中的其他过程。

注意

在开始之前,请验证并确保您拥有在 Parameter Store 参数中引用 Secrets Manager 秘密的权限。如果您在 Secrets Manager 和 Systems Manager 中拥有管理员权限,则可以使用 Parameter Store API 引用或检索秘密。如果您在某一 Parameter Store 参数中引用 Secrets Manager 秘密,但您没有访问该秘密的权限,则该引用将失败。有关更多信息,请参阅 Amazon Secrets Manager 用户指南中的 Amazon Secrets Manager 的身份验证和访问控制

重要

Parameter Store 将充当对 Secrets Manager 秘密的引用的直通服务。Parameter Store 不会保留有关秘密的数据或元数据。引用是无状态的。

使用 Parameter Store 引用 Secrets Manager 秘密

  1. 可以在 Secrets Manager 中创建秘密。有关更多信息,请参阅使用 Amazon Secrets Manager 创建和管理密钥

  2. 使用 Amazon CLI、Amazon Tools for Windows PowerShell 或开发工具包引用密钥。当您引用 Secrets Manager 秘密时,名称必须以以下预留路径开头:/aws/reference/secretsmanager/。指定此路径后,Systems Manager 知道从 Secrets Manager 而不是 Parameter Store 检索秘密。以下是一些使用 Parameter Store 正确引用 Secrets Manager 秘密 CFCreds1DBPass 的示例名称。

    • /aws/reference/secretsmanager/CFCreds1

    • /aws/reference/secretsmanager/DBPass

    以下是引用存储在 Secrets Manager 中的访问密钥和秘密密钥的 Java 代码示例。此代码示例设置 Amazon DynamoDB 客户端。代码通过 Parameter Store 检索配置数据和凭证。配置数据以字符串参数的形式存储在 Parameter Store 中,凭证存储在 Secrets Manager 中。即使配置数据和凭证存储在不同的服务中,但这两组数据均可通过 Parameter Store 使用 GetParameter API 访问。

    /** * Initialize System Manager Client with default credentials */ AWSSimpleSystemsManagement ssm = AWSSimpleSystemsManagementClientBuilder.defaultClient(); ... /** * Example method to launch DynamoDB client with credentials different from default * @return DynamoDB client */ AmazonDynamoDB getDynamoDbClient() { //Getting Amazon credentials from Secrets Manager using GetParameter BasicAWSCredentials differentAWSCreds = new BasicAWSCredentials( getParameter("/aws/reference/secretsmanager/access-key"), getParameter("/aws/reference/secretsmanager/secret-key")); //Initialize the DDB Client with different credentials final AmazonDynamoDB client = AmazonDynamoDBClient.builder() .withCredentials(new AWSStaticCredentialsProvider(differentAWSCreds)) .withRegion(getParameter("region")) //Getting config from Parameter Store .build(); return client; } /** * Helper method to retrieve SSM Parameter's value * @param parameterName identifier of the SSM Parameter * @return decrypted parameter value */ public GetParameterResult getParameter(String parameterName) { GetParameterRequest request = new GetParameterRequest(); request.setName(parameterName); request.setWithDecryption(true); return ssm.newGetParameterCall().call(request).getParameter().getValue(); }

    下面是一些 Amazon CLI 示例。使用 aws secretsmanager list-secrets 命令查找秘密的名称。

    Amazon CLI 示例 1:使用密钥名称引用

    Linux & macOS
    aws ssm get-parameter \ --name /aws/reference/secretsmanager/s1-secret \ --with-decryption
    Windows
    aws ssm get-parameter ^ --name /aws/reference/secretsmanager/s1-secret ^ --with-decryption

    此命令会返回如下信息。

    {
        "Parameter": {
            "Name": "/aws/reference/secretsmanager/s1-secret",
            "Type": "SecureString",
            "Value": "Fl*MEishm!al875",
            "Version": 0,
            "SourceResult": 
                  "{
                       \"CreatedDate\": 1526334434.743,
                       \"Name\": \"s1-secret\",
                       \"VersionId\": \"aaabbbccc-1111-222-333-123456789\",
                       \"SecretString\": \"Fl*MEishm!al875\",
                       \"VersionStages\": [\"AWSCURRENT\"],
                       \"ARN\": \"arn:aws:secretsmanager:us-east-2:123456789012:secret:s1-secret-E18LRP\"
                   }"
            "LastModifiedDate": 2018-05-14T21:47:14.743Z,
            "ARN": "arn:aws:secretsmanager:us-east-2:123456789012:secret:s1-secret-
                   E18LRP",
          }
    }

    Amazon CLI 示例 2:包括版本 ID 的引用

    Linux & macOS
    aws ssm get-parameter \ --name /aws/reference/secretsmanager/s1-secret:11111-aaa-bbb-ccc-123456789 \ --with-decryption
    Windows
    aws ssm get-parameter ^ --name /aws/reference/secretsmanager/s1-secret:11111-aaa-bbb-ccc-123456789 ^ --with-decryption

    此命令会返回如下信息。

    {
        "Parameter": {
            "Name": "/aws/reference/secretsmanager/s1-secret",
            "Type": "SecureString",
            "Value": "Fl*MEishm!al875",
            "Version": 0,
            "SourceResult": 
                  "{
                       \"CreatedDate\": 1526334434.743,
                       \"Name\": \"s1-secret\",
                       \"VersionId\": \"11111-aaa-bbb-ccc-123456789\",
                       \"SecretString\": \"Fl*MEishm!al875\",
                       \"VersionStages\": [\"AWSCURRENT\"],
                       \"ARN\": \"arn:aws:secretsmanager:us-east-2:123456789012:secret:s1-secret-E18LRP\"
                   }"
            "Selector": ":11111-aaa-bbb-ccc-123456789"
          }
            "LastModifiedDate": 2018-05-14T21:47:14.743Z,
            "ARN": "arn:aws:secretsmanager:us-east-2:123456789012:secret:s1-secret-
                   E18LRP",
    }
    

    Amazon CLI 示例 3:包括版本阶段的引用

    Linux & macOS
    aws ssm get-parameter \ --name /aws/reference/secretsmanager/s1-secret:AWSCURRENT \ --with-decryption
    Windows
    aws ssm get-parameter ^ --name /aws/reference/secretsmanager/s1-secret:AWSCURRENT ^ --with-decryption

    此命令会返回如下信息。

    {
        "Parameter": {
            "Name": "/aws/reference/secretsmanager/s1-secret",
            "Type": "SecureString",
            "Value": "Fl*MEishm!al875",
            "Version": 0,
            "SourceResult": 
                  "{
                       \"CreatedDate\": 1526334434.743,
                       \"Name\": \"s1-secret\",
                       \"VersionId\": \"11111-aaa-bbb-ccc-123456789\",
                       \"SecretString\": \"Fl*MEishm!al875\",
                       \"VersionStages\": [\"AWSCURRENT\"],
                       \"ARN\": \"arn:aws:secretsmanager:us-east-2:123456789012:secret:s1-secret-E18LRP\"
                   }"
            "Selector": ":AWSCURRENT"
          }
          "LastModifiedDate": 2018-05-14T21:47:14.743Z,
          "ARN": "arn:aws:secretsmanager:us-east-2:123456789012:secret:s1-secret-
                    E18LRP",
    }