

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

# AWS 秘密和組態提供者程式碼範例
<a name="ascp-examples"></a>

## ASCP 身分驗證與存取控制範例
<a name="ascp-auth-access-examples"></a>

### 範例：允許 Amazon EKS Pod 身分識別服務 (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 Pod 身分識別，請使用下列任何值：`"true"`、`"True"`、`"TRUE"`、`"t"` 或 `"T"`。
+ 若要明確使用 IRSA，請設定下列任何值：`"false"`、`"False"`、`"f"`、`"FALSE"` 或 `"F"`。

**preferredAddressType**  
(選用) 指定 Pod 身分識別代理程式端點通訊的偏好 IP 位址類型。此欄位僅在使用 EKS Pod 身分識別功能時適用，並在使用服務帳戶的 IAM 角色時忽略。值不區分大小寫。有效的值如下：  
+ `"ipv4"`、`"IPv4"` 或 `"IPV4"` – 強制使用 Pod 身分識別代理程式 IPv4 端點
+ `"ipv6"`、`"IPv6"` 或 `"IPV6"` – 強制使用 Pod 身分識別代理程式 IPv6 端點
+ 未指定 – 使用自動端點選擇、先嘗試 IPv4 端點，並在 IPv4 失敗時退回到 IPv6 端點

**objects**  
包含待掛載秘密的 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 參數存放區，這是 參數[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**  
如果未針對 `objectName` 使用 Secrets Manager ARN，其則為必要欄位。可以是 `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`。    
**路徑**  
來自秘密值 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 Pod 中掛載秘密。
<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>

如需有關如何搭配 Amazon EKS 使用 ASCP 的詳細資訊，請參閱下列資源：
+ [搭配 Amazon EKS 使用 Pod 身分識別](https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html)
+ [使用 AWS 秘密和組態提供者](https://docs.aws.amazon.com/secretsmanager/latest/userguide/integrating_ascp_csi.html)
+ [GitHub 上的AWS Secrets Store CSI 驅動程式](https://github.com/aws/secrets-store-csi-driver-provider-aws)