

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# AWS 机密和配置提供程序代码示例
<a name="ascp-examples"></a>

## ASCP 身份验证和访问控制示例
<a name="ascp-auth-access-examples"></a>

### 示例：允许 Amazon EKS 容器组身份服务（pods.eks.amazonaws.com）担任角色并标记会话的 IAM 策略：
<a name="w2aac19c17c18b5b3"></a>

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "pods.eks.amazonaws.com"
      },
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession"
      ]
    }
  ]
}
```

------

## SecretProviderClass
<a name="ascp-examples-secretproviderclass"></a>

您可以使用 YAML 描述要使用 ASCP 在 Amazon EKS 中挂载哪些密钥。有关示例，请参阅 [SecretProviderClass 用法](#ascp-scenarios-secretproviderclass)。

### SecretProviderClass YAML 结构
<a name="w2aac19c17c18c25b5"></a>

```
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
   name: name
spec:
  provider: aws
  parameters:
    region:
    failoverRegion:
    pathTranslation:
    usePodIdentity:
    preferredAddressType:
    objects:
```

参数字段包含挂载请求的详细信息：

**region**  
（可选）机密 AWS 区域 中的一个。如果不使用此字段，ASCP 将从节点上的注释中查找 “区域”。查找会增加挂载请求的开销，因此我们建议为使用大量容器组（pod）的集群提供区域。  
如果您还指定 `failoverRegion`，ASCP 会尝试从两个区域检索密钥。如果任一区域返回 4xx 错误（例如身份验证问题），ASCP 都不会挂载任何一个密钥。如果成功从 `region` 中检索到密钥，则 ASCP 会挂载该密钥值。如果未成功从 `region` 中检索到密钥，但已成功从 `failoverRegion` 中检索到密钥，则 ASCP 会挂载该密钥值。

**failoverRegion**  
（可选）如果您包含此字段，ASCP 会尝试从 `region` 中定义的区域和此字段检索密钥。如果任一区域返回 4xx 错误（例如身份验证问题），ASCP 都不会挂载任何一个密钥。如果成功从 `region` 中检索到密钥，则 ASCP 会挂载该密钥值。如果未成功从 `region` 中检索到密钥，但已成功从 `failoverRegion` 中检索到密钥，则 ASCP 会挂载该密钥值。有关如何使用此字段的示例，请参阅 [多区域密钥失效转移](#multi-region-failover)。

**pathTranslation**  
（可选）如果 Amazon EKS 中的文件名包含路径分隔符则要使用的单个替换字符，例如 Linux 上的斜杠 (/)。ASCP 无法创建包含路径分隔符的挂载文件。相反，ASCP 使用不同的字符替换路径分隔符。如果不使用此字段，替换字符为下划线 (\$1)，因此，例如 `My/Path/Secret` 挂载为 `My_Path_Secret`。  
要防止字符替换，请输入字符串 `False`。

**usePodIdentity**  
（可选）确定身份验证方法。如果未指定，则默认为服务账户（IRSA）的 IAM 角色。  
+ 要使用 EKS 容器组身份，请使用以下任意值：`"true"`、`"True"`、`"TRUE"`、`"t"` 或 `"T"`。
+ 要明确使用 IRSA，请设置为以下任意值：`"false"`、`"False"`、`"FALSE"`、`"f"` 或 `"F"`。

**preferredAddressType**  
（可选）指定容器组身份代理端点通信的首选 IP 地址类型。该字段仅在使用 EKS 容器组身份功能时适用，使用服务账户的 IAM 角色时将忽略。值不区分大小写。有效值为：  
+ `"ipv4"`、`"IPv4"` “或 `"IPV4"` — 强制使用 Pod Identity Agent IPv4 端点
+ `"ipv6"``"IPv6"`、或 `"IPV6"` — 强制使用 Pod Identity Agent IPv6 端点
+ 未指定 — 使用 auto 端点选择，先尝试 IPv4 端点，如果 IPv4 失败则回退到 IPv6 端点

**对象**  
包含要挂载密钥的 YAML 声明字符串。我们建议使用 YAML 多行字符串或竖线 (\$1) 字符。    
**objectName**  
必需。指定要获取的密钥或参数的名称。对于 Secrets Manager，这是 [https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html#API_GetSecretValue_RequestParameters](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html#API_GetSecretValue_RequestParameters) 参数，可以是密钥的友好名称，也可以是完整 ARN。对于 SSM Parameter Store，这是参数的 [https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html#API_GetParameter_RequestParameters](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html#API_GetParameter_RequestParameters)，可以是参数名称，也可以是完整 ARN。  
**objectType**  
如果不将 Secrets Manager ARN 用于 `objectName`，需要这个操作 可以是 `secretsmanager` 或 `ssmparameter`。  
**objectAlias**  
（可选）Amazon EKS 容器组（pod）中密钥的文件名。如果不指定此字段，则 `objectName` 作为文件名显示。  
**filePermission**  
（可选）4 位八进制字符串，指定用于挂载密钥的文件权限。如果您没有指定此字段，它将默认为 `"0644"`。  
**ObjectVersion**  
（可选）密钥的版本 ID。不推荐，因为每次更新密钥时都必须更新版本 ID。默认情况下，使用最新版本。如果包括 `failoverRegion`，则此字段表示主 `objectVersion`。  
**objectVersionLabel**  
（可选）版本的别名。默认为最新版本 AWSCURRENT。有关更多信息，请参阅 [密钥版本](whats-in-a-secret.md#term_version)。如果包括 `failoverRegion`，则此字段表示主 `objectVersionLabel`。  
**JMESPath**  
（可选）密钥中的键映射到要在 Amazon EKS 中挂载的文件。要使用此字段，密钥值必须采用 JSON 格式。如果使用此字段，必须包含子字段 `path` 和 `objectAlias`。    
**path**  
来自密钥值 JSON 中的键-值对的键。如果该字段包含连字符，请使用单引号对其进行转义，例如：`path: '"hyphenated-path"'`  
**objectAlias**  
要挂载到 Amazon EKS 容器组（pod）中的文件名。如果该字段包含连字符，请使用单引号对其进行转义，例如：`objectAlias: '"hyphenated-alias"'`  
**filePermission**  
（可选）4 位八进制字符串，指定用于挂载密钥的文件权限。如果未指定此字段，则其默认为父对象的文件权限。  
**failoverObject**  
（可选）如果您指定此字段，ASCP 会尝试检索主 `objectName` 中指定的密钥和 `failoverObject` `objectName` 子字段中指定的密钥。如果任何一个返回 4xx 错误（例如身份验证问题），ASCP 都不会挂载任何一个密钥。如果成功从主 `objectName` 中检索到密钥，则 ASCP 会挂载该密钥值。如果未成功从主 `objectName` 中检索到密钥，但已成功从失效转移 `objectName` 中检索到密钥，则 ASCP 会挂载该密钥值。如果包含此字段，责必须包含字段 `objectAlias`。有关如何使用此字段的示例，请参阅 [失效转移到其他密钥](#failover-secret)。  
当失效转移密钥不是副本时，通常使用此字段。有关如何指定副本的示例，请参阅 [多区域密钥失效转移](#multi-region-failover)。    
**objectName**  
失效转移密钥的名称或完整 ARN。如果使用 ARN，则 ARN 中的区域必须与字段 `failoverRegion` 匹配。  
**ObjectVersion**  
（可选）密钥的版本 ID。必须与主 `objectVersion` 匹配。不推荐，因为每次更新密钥时都必须更新版本 ID。默认情况下，使用最新版本。  
**objectVersionLabel**  
（可选）版本的别名。默认为最新版本 AWSCURRENT。有关更多信息，请参阅 [密钥版本](whats-in-a-secret.md#term_version)。

### 创建基本 SecretProviderClass 配置以在您的 Amazon EKS 容器中挂载密钥。
<a name="w2aac19c17c18c25c11"></a>

------
#### [ Pod Identity ]

SecretProviderClass 要在同一 Amazon EKS 集群中使用密钥，请执行以下操作：

```
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: aws-secrets-manager
spec:
  provider: aws
  parameters:
    objects: |
      - objectName: "mySecret"
        objectType: "secretsmanager"
    usePodIdentity: "true"
```

------
#### [ IRSA ]

```
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: deployment-aws-secrets
spec:
  provider: aws
  parameters:
    objects: |
        - objectName: "MySecret"
          objectType: "secretsmanager"
```

------

### SecretProviderClass 用法
<a name="ascp-scenarios-secretproviderclass"></a>

使用这些示例为不同的场景创建 SecretProviderClass 配置。

#### 示例：按名称或 ARN 挂载密钥
<a name="mount-by-name-arn"></a>

此示例说明了如何挂载三种不同类型的密钥：
+ 由完整 ARN 指定的密钥
+ 由名称指定的密钥
+ 密钥的特定版本

```
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: aws-secrets
spec:
  provider: aws
  parameters:
    objects: |
      - objectName: "arn:aws:secretsmanager:us-east-2:777788889999:secret:MySecret2-d4e5f6"
      - objectName: "MySecret3"
        objectType: "secretsmanager"
      - objectName: "MySecret4"
        objectType: "secretsmanager"
        objectVersionLabel: "AWSCURRENT"
```

#### 示例：从密钥挂载键-值对
<a name="mount-key-value-pairs"></a>

此示例说明了如何从 JSON 格式的密钥挂载特定的键-值对：

```
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: aws-secrets
spec:
  provider: aws
  parameters:
    objects: |
      - objectName: "arn:aws:secretsmanager:us-east-2:777788889999:secret:MySecret-a1b2c3"
        jmesPath: 
            - path: username
              objectAlias: dbusername
            - path: password
              objectAlias: dbpassword
```

#### 示例：按文件权限挂载密钥
<a name="mount-by-permission"></a>

此示例说明了如何使用特定文件权限挂载密钥

```
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: aws-secrets
spec:
  provider: aws
  parameters:
    objects: |
      - objectName: "mySecret"
        objectType: "secretsmanager"
        filePermission: "0600"
        jmesPath: 
            - path: username
              objectAlias: dbusername
              filePermission: "0400"
```

#### 示例：失效转移配置示例
<a name="failover-examples"></a>

此示例说明了如何为密钥配置失效转移。

##### 多区域密钥失效转移
<a name="multi-region-failover"></a>

此示例说明了如何为跨多个区域复制的密钥配置自动失效转移：

```
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: aws-secrets
spec:
  provider: aws
  parameters:
    region: us-east-1
    failoverRegion: us-east-2
    objects: |
      - objectName: "MySecret"
```

##### 失效转移到其他密钥
<a name="failover-secret"></a>

此示例说明了如何将失效转移配置为其他密钥（并非副本）：

```
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: aws-secrets
spec:
  provider: aws
  parameters:
    region: us-east-1
    failoverRegion: us-east-2
    objects: |
      - objectName: "arn:aws:secretsmanager:us-east-1:777788889999:secret:MySecret-a1b2c3"
        objectAlias: "MyMountedSecret"
        failoverObject: 
          - objectName: "arn:aws:secretsmanager:us-east-2:777788889999:secret:MyFailoverSecret-d4e5f6"
```

## 其他资源
<a name="additional-resources"></a>

有关将 ASCP 与 Amazon EKS 结合使用的更多信息，请参阅以下资源：
+ [将容器组身份与 Amazon EKS 结合使用](https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html)
+ [使用 AWS 密钥和配置提供程序](https://docs.aws.amazon.com/secretsmanager/latest/userguide/integrating_ascp_csi.html)
+ [AWS 秘密商店 CSI 驱动程序开启 GitHub](https://github.com/aws/secrets-store-csi-driver-provider-aws)