

 **このページの改善にご協力ください** 

このユーザーガイドに貢献するには、すべてのページの右側のペインにある「**GitHub でこのページを編集する**」リンクを選択してください。

# EKS Auto Mode のロードバランサーコントローラーに特定のシークレットへのアクセスを許可する
<a name="auto-managed-rbac-example"></a>

このチュートリアルでは、Amazon EKS Auto Mode のロードバランサーコントローラーに、特定の Kubernetes `Secret` への読み取りアクセス権を付与します。これにより、ALB `Ingress` での OIDC 認証が可能になります。`eks:managed` グループを対象にした、名前空間スコープの `Role` と `RoleBinding` を使用します。

このチュートリアルの完了には約 15 分かかります。作成する Kubernetes RBAC オブジェクトには AWS 料金は発生しません。

Amazon EKS Auto Mode のロードバランサーコントローラーは、ALB `Ingress` オブジェクトでの OIDC 認証をサポートしています。この認証を有効にするには、`alb.ingress.kubernetes.io/auth-type: oidc` アノテーションを使用します。OIDC 設定を解決するために、コントローラーは `alb.ingress.kubernetes.io/auth-idp-oidc` 注釈で指定された Kubernetes `Secret` を読み取ります。現在、そのマネージドアクセスポリシーは `Secret` オブジェクトに対する `get` を付与していないため、リコンサイラーは失敗し、次のようなメッセージを受け取ります。

```
Failed build model due to ingress: <ns>/<name>:
  secrets "<secret>" is forbidden:
  User "arn:aws:sts::<acct>:assumed-role/AWSServiceRoleForAmazonEKS/<session>"
  cannot get resource "secrets" in API group "" in the namespace "<ns>"
```

[EKS Auto Mode のマネージドコントローラーに追加の Kubernetes RBAC を付与する](auto-managed-rbac.md) で説明されているメカニズムを使用すると、マネージドコントローラーに、必要な OIDC `Secret` に対する `get` のみを付与できます。

## 前提条件
<a name="_prerequisites"></a>

開始する前に、以下の準備が整っていることを確認します。
+ 自動的に作成された `AWSServiceRoleForAmazonEKS` アクセスエントリを持つ Amazon EKS Auto Mode クラスター。
+  クラスターアクセスが設定された `kubectl`。
+ `aws sts get-caller-identity` と `aws eks describe-access-entry` のアクセス許可でインストールおよび設定された AWS CLI。
+ `alb.ingress.kubernetes.io/auth-type: oidc` 注釈を使用する ALB `Ingress`、およびそれが参照する Kubernetes `Secret`。

## ステップ 1: 許可リストに追加するシークレットを特定する
<a name="_step_1_identify_the_secret_to_add_to_the_allow_list"></a>

ALB `Ingress` 上の OIDC 設定は次のようになります。`Secret` の名前と `Ingress` 名前空間を記録します – RBAC オブジェクトは `Secret` と同じ名前空間に存在する必要があります。

```
annotations:
  alb.ingress.kubernetes.io/auth-type: oidc
  alb.ingress.kubernetes.io/auth-idp-oidc: >
    {
      "issuer": "...",
      "authorizationEndpoint": "...",
      "tokenEndpoint": "...",
      "userInfoEndpoint": "...",
      "secretName": "oidc"
    }
```

この例の残りの部分では、名前空間 `monitoring` と `Secret` 名 `oidc` を使用します。

## ステップ 2: 名前空間スコープのロールとロールバインディングを適用する
<a name="_step_2_apply_a_namespace_scoped_role_and_rolebinding"></a>

この形式では、1 つの名前空間内の指定された `Secret` に対して `get` のみを付与します。次を `eks-managed-oidc-secret-reader.yaml` として保存します。

```
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: eks-managed-oidc-secret-reader
  namespace: monitoring
rules:
- apiGroups: [""]
  resources: ["secrets"]
  resourceNames: ["oidc"]
  verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: eks-managed-oidc-secret-reader
  namespace: monitoring
subjects:
- kind: Group
  name: eks:managed
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: eks-managed-oidc-secret-reader
  apiGroup: rbac.authorization.k8s.io
```

適用:

```
kubectl apply -f eks-managed-oidc-secret-reader.yaml
```

後で許可リストにさらに `Secret` オブジェクトを追加するには、`Role’s `resourceNames` リストに名前を追加して再適用します。

## ステップ 3: Ingress が復旧したことを確認する
<a name="_step_3_confirm_the_ingress_recovers"></a>

ロードバランサーコントローラーは、次のパス (通常は数分以内) で `Ingress` を再調整します。付与が機能すると、以前の `secrets "oidc" is forbidden` エラーが `Ingress` に表示されなくなり、ロードバランサーの処理が進みます。エラーが解消されない場合は、`Role’s `namespace`、`resourceNames`、および `RoleBinding` サブジェクトを再確認します。

## 付与を削除する
<a name="_removing_the_grant"></a>

**重要**  
ALB `Ingress` が `alb.ingress.kubernetes.io/auth-type: oidc` を使用している限り、`Role` と `RoleBinding` をそのまま保持します。これらを削除すると、`Ingress` での OIDC 解決が再び機能しなくなります。

`Ingress` で OIDC の使用を停止する場合は、付与を削除します:

```
kubectl delete rolebinding eks-managed-oidc-secret-reader -n monitoring
kubectl delete role        eks-managed-oidc-secret-reader -n monitoring
```

## 関連リソース
<a name="_related_resources"></a>
+  [EKS Auto Mode のマネージドコントローラーに追加の Kubernetes RBAC を付与する](auto-managed-rbac.md) – `eks:managed` グループの概念的な概要と、付与のスコープ設定方法。
+  [EKS アクセスエントリを使用して Kubernetes へのアクセスを IAM ユーザーに許可する](access-entries.md) – Amazon EKS アクセスエントリ。
+  Kubernetes ドキュメントの「[RBAC 認可を使用する](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)」。