

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 서비스 계정에 대한 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) 클러스터 운영자가 AWS IAM 역할을 Kubernetes 서비스 계정에 매핑할 수 있는 서비스 계정에 대한 역할(IRSA)]을 지원합니다.

이를 통해 EKS에서 실행되고 다른 AWS 서비스를 사용하는 앱에 대한 세분화된 권한 관리를 제공합니다. 여기에는 S3, 기타 데이터 서비스(RDS, MQ, STS, DynamoDB) 또는 AWS Load Balancer 컨트롤러 또는 ExternalDNS와 같은 Kubernetes 구성 요소를 사용하는 앱이 포함될 수 있습니다.

를 사용하여 IAM 역할 및 서비스 계정 페어를 쉽게 생성할 수 있습니다`eksctl`.

**참고**  
[인스턴스 역할을](iam-policies.md) 사용하고 대신 IRSA를 사용하려는 경우 두 역할을 혼합해서는 안 됩니다.

## 작동 방식
<a name="iam-how-works"></a>

EKS가 노출하는 IAM OpenID Connect Provider(OIDC)를 통해 작동하며, IAM 역할은 IAM OIDC Provider(특정 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` 이름에는 IAM 역할 및 서비스 계정 페어를 나타내는 *iamserviceaccount*가 있습니다.

## CLI에서 사용
<a name="_usage_from_cli"></a>

**참고**  
서비스 계정에 대한 IAM 역할에는 Kubernetes 버전 1.13 이상이 필요합니다.

IAM OIDC Provider는 기본적으로 활성화되어 있지 않습니다. 다음 명령을 사용하여 활성화하거나 구성 파일을 사용할 수 있습니다(아래 참조).

```
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`을 방지합니다. 그러면 다른 도구가 역할 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`하므로 노드 그룹과 동일한 방식으로 *iamserviceaccount를* 관리할 수 있습니다. ** `eksctl create iamserviceaccount` 명령은 `--include` 및 `--exclude` 플래그를 지원합니다(이러한 작동 방식에 대한 자세한 내용은 [이 섹션](general-nodegroups.md#node-include) 참조). 또한 `eksctl delete iamserviceaccount` 명령은 `--only-missing` 도 지원하므로 노드 그룹과 동일한 방식으로 삭제를 수행할 수 있습니다.

**참고**  
IAM 서비스 계정은 네임스페이스 내에서 범위가 지정됩니다. 즉, 이름이 같은 두 개의 서비스 계정이 서로 다른 네임스페이스에 존재할 수 있습니다. 따라서 서비스 계정을 , `--include` `--exclude` 플래그의 일부로 고유하게 정의하려면 이름 문자열을 `namespace/name` 형식으로 전달해야 합니다. 예:

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

활성화 옵션은 `cluster-autoscaler` 및와 같은 잘 알려진 사용 사례와 함께 IRSA를 정책 목록에 대한 간단한 설명`cert-manager`으로 사용하기 위해 `wellKnownPolicies` 포함되어 있습니다.

지원되는 잘 알려진 정책 및의 기타 속성`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) 