

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# サービスアカウントの IAM ロール
<a name="iamserviceaccounts"></a>

**ヒント**  
 `eksctl` は、EKS [Pod Identity Associations を介してアプリケーションを実行する EKS ](pod-identity-associations.md)へのきめ細かなアクセス許可の設定をサポートします。

Amazon EKS は[、ここで](https://docs.aws.amazon.com/eks/latest/userguide/access-policies.html#access-policy-permissions)サービスアカウントのロール (IRSA)] をサポートしています。これにより、クラスターオペレーターは AWS IAM ロールを Kubernetes サービスアカウントにマッピングできます。

これにより、EKS で実行され、他の AWS のサービスを使用するアプリケーションのアクセス許可をきめ細かく管理できます。これらは、S3、その他のデータサービス (RDS、MQ、STS、DynamoDB)、または AWS Load Balancer コントローラーや ExternalDNS などの Kubernetes コンポーネントを使用するアプリケーションです。

を使用して IAM ロールとサービスアカウントのペアを簡単に作成できます`eksctl`。

**注記**  
[インスタンスロール](iam-policies.md)を使用していて、代わりに IRSA の使用を検討している場合は、この 2 つを混在させないでください。

## 仕組み
<a name="iam-how-works"></a>

EKS が公開する IAM OpenID Connect プロバイダー (OIDC) を介して動作し、IAM ロールは IAM OIDC プロバイダー (特定の EKS クラスターに固有) を参照し、バインドされる Kubernetes サービスアカウントを参照して構築する必要があります。IAM ロールが作成されると、サービスアカウントはそのロールの ARN を注釈 () として含める必要があります`eks.amazonaws.com/role-arn`。デフォルトでは、サービスアカウントはロール注釈を含めるように作成または更新されます。これは、 フラグ を使用して無効にできます`--role-only`。

EKS 内には、ポッドが使用するサービスアカウントの注釈に基づいて、AWS セッション認証情報をそれぞれロールのポッドに挿入する[アドミッションコントローラー](https://github.com/aws/amazon-eks-pod-identity-webhook/)があります。認証情報は `AWS_ROLE_ARN` & `AWS_WEB_IDENTITY_TOKEN_FILE`環境変数によって公開されます。最新バージョンの AWS SDK が使用されている場合 (正確なバージョンの詳細については、[こちら](https://docs.aws.amazon.com/eks/latest/userguide/access-policies.html#access-policy-permissions)を参照）、アプリケーションはこれらの認証情報を使用します。

リソース`eksctl`の名前は *iamserviceaccount* で、IAM ロールとサービスアカウントのペアを表します。

## CLI の使用
<a name="_usage_from_cli"></a>

**注記**  
サービスアカウントの IAM ロールには、Kubernetes バージョン 1.13 以降が必要です。

IAM OIDC プロバイダーはデフォルトでは有効になっていません。次のコマンドを使用して有効にすることも、設定ファイル (以下を参照) を使用することもできます。

```
eksctl utils associate-iam-oidc-provider --cluster=<clusterName>
```

クラスターに IAM OIDC プロバイダーを関連付けたら、サービスアカウントにバインドされた IAM ロールを作成するには、以下を実行します。

```
eksctl create iamserviceaccount --cluster=<clusterName> --name=<serviceAccountName> --namespace=<serviceAccountNamespace> --attach-policy-arn=<policyARN>
```

**注記**  
複数のポリシーを使用するには、`--attach-policy-arn`複数回指定できます。

具体的には、以下を実行して、S3 への読み取り専用アクセス権を持つサービスアカウントを作成できます。

```
eksctl create iamserviceaccount --cluster=<clusterName> --name=s3-read-only --attach-policy-arn=arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
```

デフォルトでは、`default`名前空間に作成されますが、次のような他の名前空間を指定できます。

```
eksctl create iamserviceaccount --cluster=<clusterName> --name=s3-read-only --namespace=s3-app --attach-policy-arn=arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
```

**注記**  
名前空間がまだ存在しない場合は、作成されます。

サービスアカウントが既にクラスターに作成されている場合 (IAM ロールなし）、 `--override-existing-serviceaccounts`フラグを使用する必要があります。

カスタムタグ付けは、 を指定して IAM ロールに適用することもできます`--tags`。

```
eksctl create iamserviceaccount --cluster=<clusterName> --name=<serviceAccountName> --tags "Owner=John Doe,Team=Some Team"
```

CloudFormation は、ランダムな文字列を含むロール名を生成します。事前定義されたロール名が必要な場合は、 を指定できます`--role-name`。

```
eksctl create iamserviceaccount --cluster=<clusterName> --name=<serviceAccountName> --role-name "custom-role-name"
```

サービスアカウントが helm などの他のツールによって作成および管理されている場合は、 を使用して競合を防止`--role-only`します。もう 1 つのツールは、ロール ARN 注釈の維持を担当します。`--override-existing-serviceaccounts` は `roleOnly`/`--role-only` サービスアカウントには影響せず、ロールは常に作成されます。

```
eksctl create iamserviceaccount --cluster=<clusterName> --name=<serviceAccountName> --role-only --role-name=<customRoleName>
```

サービスアカウントで使用する既存のロールがある場合は、ポリシーを指定する代わりに `--attach-role-arn`フラグを指定できます。ロールが指定されたサービスアカウントでのみ引き受けられるようにするには、[ここで](https://docs.aws.amazon.com/eks/latest/userguide/access-policies.html#access-policy-permissions)関係ポリシードキュメントを設定する必要があります〕。

```
eksctl create iamserviceaccount --cluster=<clusterName> --name=<serviceAccountName> --attach-role-arn=<customRoleARN>
```

サービスアカウントロールのアクセス許可を更新するには、 を実行します`eksctl update iamserviceaccount`。

**注記**  
 `eksctl delete iamserviceaccount` は、 によって作成されていない場合`ServiceAccounts`でも Kubernetes を削除します`eksctl`。

## 設定ファイルでの使用
<a name="_usage_with_config_files"></a>

設定ファイル`iamserviceaccounts`を使用して を管理するには、 で必要なアカウントを設定`iam.withOIDC: true`して一覧表示します`iam.serviceAccount`。

すべてのコマンドは をサポートしており`--config-file`、*ノードグループ*と同じ方法で *iamservice アカウント*を管理できます。`eksctl create iamserviceaccount` コマンドは `--include`と `--exclude`フラグをサポートします (これらの仕組みの詳細については[、このセクション](general-nodegroups.md#node-include)を参照してください）。また、 `eksctl delete iamserviceaccount` コマンドは `--only-missing`もサポートしているため、ノードグループと同じ方法で削除を実行できます。

**注記**  
IAM サービスアカウントは名前空間内でスコープされます。つまり、同じ名前の 2 つのサービスアカウントが別の名前空間に存在する可能性があります。したがって、 `--include``--exclude`フラグの一部としてサービスアカウントを一意に定義するには、 `namespace/name`形式で名前文字列を渡す必要があります。例:

```
eksctl create iamserviceaccount --config-file=<path> --include backend-apps/s3-reader
```

を有効にするオプション`wellKnownPolicies`は、ポリシーのリストの短縮として`cert-manager`、 `cluster-autoscaler`や などのよく知られたユースケースで IRSA を使用する場合に付属しています。

サポートされている既知のポリシーやその他のプロパティ`serviceAccounts`は[、設定スキーマ](https://geoffcline.github.io/eksctl-schema-demo/#iam-serviceAccounts)に記載されています。

では、次の設定例を使用します`eksctl create cluster`。

```
# An example of ClusterConfig with IAMServiceAccounts:
---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: cluster-13
  region: us-west-2

iam:
  withOIDC: true
  serviceAccounts:
  - metadata:
      name: s3-reader
      # if no namespace is set, "default" will be used;
      # the namespace will be created if it doesn't exist already
      namespace: backend-apps
      labels: {aws-usage: "application"}
    attachPolicyARNs:
    - "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess"
    tags:
      Owner: "John Doe"
      Team: "Some Team"
  - metadata:
      name: cache-access
      namespace: backend-apps
      labels: {aws-usage: "application"}
    attachPolicyARNs:
    - "arn:aws:iam::aws:policy/AmazonDynamoDBReadOnlyAccess"
    - "arn:aws:iam::aws:policy/AmazonElastiCacheFullAccess"
  - metadata:
      name: cluster-autoscaler
      namespace: kube-system
      labels: {aws-usage: "cluster-ops"}
    wellKnownPolicies:
      autoScaler: true
    roleName: eksctl-cluster-autoscaler-role
    roleOnly: true
  - metadata:
      name: some-app
      namespace: default
    attachRoleARN: arn:aws:iam::123:role/already-created-role-for-app
nodeGroups:
  - name: "ng-1"
    tags:
      # EC2 tags required for cluster-autoscaler auto-discovery
      k8s.io/cluster-autoscaler/enabled: "true"
      k8s.io/cluster-autoscaler/cluster-13: "owned"
    desiredCapacity: 1
```

これらのフィールドを設定せずにクラスターを作成する場合は、次のコマンドを使用して必要なものをすべて有効にできます。

```
eksctl utils associate-iam-oidc-provider --config-file=<path>
eksctl create iamserviceaccount --config-file=<path>
```

## 詳細情報
<a name="_further_information"></a>
+  [サービスアカウントのきめ細かな IAM ロールの紹介](https://aws.amazon.com/blogs/opensource/introducing-fine-grained-iam-roles-service-accounts/) 
+  [EKS ユーザーガイド - サービスアカウントの IAM ロール](https://docs.aws.amazon.com/eks/latest/userguide/access-policies.html#access-policy-permissions) 
+  [IAM ユーザーとロールを Kubernetes RBAC ロールにマッピングする](iam-identity-mappings.md) 