

 **이 페이지 개선에 도움 주기** 

이 사용자 가이드에 기여하려면 모든 페이지의 오른쪽 창에 있는 **GitHub에서 이 페이지 편집** 링크를 선택합니다.

# Amazon EFS와 함께 탄력적 파일 시스템 스토리지 사용
<a name="efs-csi"></a>

 [Amazon Elastic File System](https://docs.aws.amazon.com/efs/latest/ug/whatisefs.html)(Amazon EFS)은 완전히 탄력적인 서버리스 파일 스토리지를 제공하므로 스토리지 용량과 성능을 프로비저닝하거나 관리하지 않고도 파일 데이터를 공유할 수 있습니다. [Amazon EFS 컨테이너 스토리지 인터페이스(CSI) 드라이버](https://github.com/kubernetes-sigs/aws-efs-csi-driver)를 사용하면 AWS에서 실행되는 Kubernetes 클러스터가 Amazon EFS 파일 시스템을 영구 볼륨으로 탑재할 수 있습니다. 이 주제에서는 Amazon EFS CSI 드라이버를 Amazon EKS 클러스터에 배포하는 방법을 설명합니다.

## 고려 사항
<a name="efs-csi-considerations"></a>
+ Amazon EFS CSI 드라이버는 Windows 기반 컨테이너 이미지와 호환되지 않습니다.
+ Fargate 노드에는 영구 볼륨에 대해 [동적 프로비저닝](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/examples/kubernetes/efs/dynamic_provisioning/README.md)을 사용할 수 없지만 [정적 프로비저닝](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/examples/kubernetes/efs/static_provisioning/README.md)은 사용할 수 있습니다.
+  [동적 프로비저닝](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/examples/kubernetes/efs/dynamic_provisioning/README.md)은 [1.2](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/CHANGELOG-1.x.md#v12) 이상의 드라이버가 필요합니다. 모든 지원되는 Amazon EKS 클러스터 버전에서 드라이버 버전 `1.1`을 사용하여 영구 볼륨에 대해 [정적 프로비저닝](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/examples/kubernetes/efs/static_provisioning/README.md)을 사용할 수 있습니다. ([Amazon EKS 지원 버전](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html) 참조)
+ 이 드라이버의 버전 [1.3.2](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/CHANGELOG-1.x.md#v132) 이상은 Amazon EC2 Graviton 기반 인스턴스를 포함하여 Arm64 아키텍처를 지원합니다.
+ 이 드라이버의 버전 [1.4.2](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/CHANGELOG-1.x.md#v142) 이상은 파일 시스템 탑재에 FIPS 사용을 지원합니다.
+ Amazon EFS의 리소스 할당량을 기록해 둡니다. 자세한 내용은 [Amazon EFS 할당량](https://docs.aws.amazon.com/efs/latest/ug/limits.html)을 참조하세요.
+ 버전 [2.0.0](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/CHANGELOG-2.x.md#v200)부터 이 드라이버는 TLS 연결에 `stunnel`를 사용하던 것을 `efs-proxy`로 전환했습니다. `efs-proxy`를 사용하면 실행 중인 노드의 코어 수에 1을 더한 것과 같은 수의 스레드가 열립니다.
+ Amazon EFS CSI 드라이버는 Amazon EKS Hybrid Nodes와 호환되지 않습니다.

## 사전 조건
<a name="efs-csi-prereqs"></a>
+ Amazon EFS CSI 드라이버에는 AWS Identity and Access Management(IAM) 권한이 필요합니다.
  +  AWS는 EKS Pod Identity 사용을 제안합니다. 자세한 내용은 [EKS Pod Identity 설정 개요](pod-identities.md#pod-id-setup-overview) 섹션을 참조하세요.
  + 서비스 계정의 IAM 역할 및 클러스터의 IAM OpenID Connect(OIDC) 공급자 설정에 대한 자세한 내용은 [클러스터에 대한 IAM OIDC 공급자 생성](enable-iam-roles-for-service-accounts.md) 섹션을 참조하세요.
+ 장치에 설치 및 구성된 AWS 명령줄 인터페이스(AWS CLI)의 버전 `2.12.3` 이상 또는 버전 `1.27.160` 이상 또는 AWS CloudShell. 현재 버전을 확인하려면 `aws --version | cut -d / -f2 | cut -d ' ' -f1`을 사용합니다. `yum`, `apt-get` 또는 macOS용 Homebrew 같은 패키지 관리자는 최신 버전의 AWS CLI 이전에 나온 버전이 몇 가지 있을 때도 있습니다. 최신 버전을 설치하려면 * AWS 명령줄 인터페이스 사용 설명서*에서 [설치](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) 및 [aws config를 사용하여 빠른 구성](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)을 참조하세요. AWS CloudShell에 설치된 AWS CLI 버전도 최신 버전보다 여러 버전 이전일 수도 있습니다. 업데이트하려면 * AWS CloudShell 사용 설명서*의 [홈 디렉터리에 AWS CLI 설치하기](https://docs.aws.amazon.com/cloudshell/latest/userguide/vm-specs.html#install-cli-software)를 참조하세요.
+ `kubectl` 명령줄 도구는 장치 또는 AWS CloudShell에 설치됩니다. 버전은 클러스터의 Kubernetes 버전과 동일하거나 최대 하나 이전 또는 이후의 마이너 버전일 수 있습니다. 예를 들어, 클러스터 버전이 `1.29`인 경우 `kubectl` 버전 `1.28`, `1.29` 또는 `1.30`를 함께 사용할 수 있습니다. `kubectl`을 설치하거나 업그레이드하려면 [`kubectl` 및 `eksctl` 설정](install-kubectl.md) 부분을 참조하세요.

**참고**  
Fargate에서 실행되는 포드는 수동 드라이버 설치 단계 없이 Amazon EFS 파일 시스템을 자동으로 탑재합니다.

## 1단계-IAM 역할 생성
<a name="efs-create-iam-resources"></a>

Amazon EFS CSI 드라이버가 파일 시스템과 상호 작용하려면 IAM 권한이 필요합니다. IAM 역할을 생성하고 여기에 ` arn:aws:iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy` 관리형 정책을 연결합니다.

**참고**  
Amazon EFS와 Amazon S3 파일 시스템 스토리지를 둘 다 사용하려면 `AmazonEFSCSIDriverPolicy` 및 `AmazonS3FilesCSIDriverPolicy` 관리형 정책을 둘 다 컨트롤러 역할에 연결해야 합니다. Amazon S3 파일 시스템 스토리지에 대한 자세한 내용은 [Amazon EFS CSI 드라이버와 함께 Amazon S3 파일 시스템 스토리지 사용 EFS](s3files-csi.md) 섹션을 참조하세요.

이 절차를 구현하려면 다음 도구 중 하나를 사용할 수 있습니다.
+  [`eksctl`](#eksctl_efs_store_app_data) 
+  [AWS Management Console](#console_efs_store_app_data) 
+  [AWS CLI](#awscli_efs_store_app_data) 

**참고**  
이 절차의 특정 단계는 드라이버를 Amazon EKS 추가 기능으로 사용하기 위해 작성되었습니다. 자체 관리형 설치에 대한 자세한 내용은 GitHub의 [Set up driver permission](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/docs/install.md#set-up-driver-permission)을 참조하세요.

### `eksctl`
<a name="eksctl_efs_store_app_data"></a>

#### Pod Identity를 사용하는 경우
<a name="efs-eksctl-pod-identities"></a>

다음 명령을 실행하여 `eksctl`로 IAM 역할과 Pod Identity 연결을 생성할 수 있습니다. `my-cluster`을 클러스터 이름으로 교체합니다. 또한 `AmazonEKS_EFS_CSI_DriverRole`을 다른 이름으로 바꿀 수 있습니다.

```
export cluster_name=my-cluster
export role_name=AmazonEKS_EFS_CSI_DriverRole
eksctl create podidentityassociation \
    --service-account-name efs-csi-controller-sa \
    --namespace kube-system \
    --cluster $cluster_name \
    --role-name $role_name \
    --permission-policy-arns arn:aws:iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy
```

#### 서비스 계정에 IAM 역할을 사용하는 경우
<a name="efs-eksctl-irsa"></a>

다음 명령을 실행하여 `eksctl`로 IAM 역할을 만들 수 있습니다. `my-cluster`을 클러스터 이름으로 교체합니다. 또한 `AmazonEKS_EFS_CSI_DriverRole`을 다른 이름으로 바꿀 수 있습니다.

```
export cluster_name=my-cluster
export role_name=AmazonEKS_EFS_CSI_DriverRole
eksctl create iamserviceaccount \
    --name efs-csi-controller-sa \
    --namespace kube-system \
    --cluster $cluster_name \
    --role-name $role_name \
    --role-only \
    --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy \
    --approve
TRUST_POLICY=$(aws iam get-role --output json --role-name $role_name --query 'Role.AssumeRolePolicyDocument' | \
    sed -e 's/efs-csi-controller-sa/efs-csi-*/' -e 's/StringEquals/StringLike/')
aws iam update-assume-role-policy --role-name $role_name --policy-document "$TRUST_POLICY"
```

### AWS Management Console
<a name="console_efs_store_app_data"></a>

다음을 실행하여 AWS Management Console를 사용하여 IAM 역할을 만듭니다.

1. IAM 콘솔(https://console.aws.amazon.com/iam/)을 엽니다.

1. 왼쪽 탐색 창에서 **역할**을 선택합니다.

1. **역할** 페이지에서 **역할 생성**을 선택합니다.

1. **신뢰할 수 있는 엔터티 선택** 페이지에서 다음을 수행합니다.

   1. EKS Pod Identity를 사용하는 경우

      1. **신뢰할 수 있는 엔터티 유형** 섹션에서 **AWS 서비스**를 선택합니다.

      1. **서비스 또는 사용 사례** 드롭다운에서 **EKS**를 선택합니다.

      1. **사용 사례** 섹션에서 **EKS - Pod Identity**를 선택합니다.

      1. **다음**을 선택합니다.

   1. 서비스 계정에 IAM 역할을 사용하는 경우

      1. **신뢰할 수 있는 엔터티 유형** 섹션에서 **웹 자격 증명**을 선택합니다.

      1. **아이덴티티 제공업체(Identity provider)**의 경우 클러스터에 대해 **OpenID Connect 공급자 URL(OpenID Connect provider URL)**을 선택합니다(Amazon EKS의 **개요**에 표시된 대로).

      1. **대상**에서 `sts.amazonaws.com`을 입력합니다.

      1. **다음**을 선택합니다.

1. **권한 추가** 페이지에서 다음을 수행합니다.

   1. **필터 정책** 상자에 `AmazonEFSCSIDriverPolicy`를 입력합니다.

   1. 검색에서 반환된 `AmazonEFSCSIDriverPolicy` 왼쪽에 있는 확인란을 선택합니다.

   1. **다음**을 선택합니다.

1. **이름, 검토 및 생성** 페이지에서 다음을 수행합니다.

   1. **역할 이름**에 역할의 고유한 이름(예: `AmazonEKS_EFS_CSI_DriverRole`)을 입력합니다.

   1. **태그 추가(선택사항)**에서 태그를 키-값 페어로 연결하여 메타데이터를 역할에 추가합니다. IAM에서 태그 사용에 대한 자세한 내용을 알아보려면 [IAM 사용 설명서](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html)의 *IAM 리소스에 태깅*을 참조하세요.

   1. **역할 생성**을 선택합니다.

1. 역할이 생성된 후

   1. EKS Pod Identity를 사용하는 경우

      1. [Amazon EKS 콘솔](https://console.aws.amazon.com/eks/home#/clusters)을 엽니다.

      1. 왼쪽 탐색 창에서 **클러스터**를 선택한 다음 EKS Pod Identity 연결을 구성할 클러스터의 이름을 선택합니다.

      1. **액세스** 탭을 선택합니다.

      1. **Pod Identity 연결**에서 **생성**을 선택합니다.

      1. **IAM 역할** 드롭다운을 선택하고 새로 생성된 역할을 선택합니다.

      1. **Kubernetes 네임스페이스** 필드를 선택하고 `kube-system`을 입력합니다.

      1. **Kubernetes 서비스 계정** 필드를 선택하고 `efs-csi-controller-sa`를 입력합니다.

      1. **생성(Create)**을 선택합니다.

      1. Pod Identity 연결 생성에 대한 자세한 내용은 [pod identity 연결 생성(AWS 콘솔)](pod-id-association.md#pod-id-association-create) 섹션을 참조하세요.

   1. 서비스 계정에 IAM 역할을 사용하는 경우

      1. 역할을 선택하여 편집을 위해 엽니다.

      1. **신뢰 관계** 탭을 선택한 후 **신뢰 정책 편집**을 선택합니다.

      1. 다음과 비슷한 줄을 찾습니다.

         ```
         "oidc.eks.region-code.amazonaws.com/id/<EXAMPLED539D4633E53DE1B71EXAMPLE>:aud": "sts.amazonaws.com"
         ```

         이전 줄 위에 다음 줄을 추가합니다. `<region-code>`를 클러스터가 있는 AWS 리전으로 바꿉니다. `<EXAMPLED539D4633E53DE1B71EXAMPLE>`을 클러스터의 OIDC 공급자 ID로 바꿉니다.

         ```
         "oidc.eks.<region-code>.amazonaws.com/id/<EXAMPLED539D4633E53DE1B71EXAMPLE>:sub": "system:serviceaccount:kube-system:efs-csi-*",
         ```

      1. `Condition` 운영자를 `"StringEquals"`에서 `"StringLike"`(으)로 수정합니다.

      1. **신뢰 정책 업데이트**를 선택하여 종료합니다.

### AWS CLI
<a name="awscli_efs_store_app_data"></a>

다음 명령을 실행하여 AWS CLI로 IAM 역할을 만들 수 있습니다.

#### Pod Identity를 사용하는 경우
<a name="efs-cli-pod-identities"></a>

1. `pods.eks.amazonaws.com` 서비스에 `AssumeRole` 및 `TagSession` 작업을 부여하는 IAM 역할을 생성합니다.

   1. 다음 콘텐츠를 `aws-efs-csi-driver-trust-policy-pod-identity.json`라는 파일에 복사합니다.

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

   1. 역할을 생성합니다. `my-cluster`을 클러스터 이름으로 교체합니다. 또한 `AmazonEKS_EFS_CSI_DriverRole`을 다른 이름으로 바꿀 수 있습니다.

      ```
      export cluster_name=my-cluster
      export role_name=AmazonEKS_EFS_CSI_DriverRole
      aws iam create-role \
        --role-name $role_name \
        --assume-role-policy-document file://"aws-efs-csi-driver-trust-policy-pod-identity.json"
      ```

1. 다음 명령어로 필요한 AWS 관리형 정책을 역할에 연결합니다.

   ```
   aws iam attach-role-policy \
     --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy \
     --role-name $role_name
   ```

1. 다음 명령을 실행하여 Pod Identity 연결을 생성합니다. `<111122223333>`을 계정 ID로 바꿉니다.

   ```
   aws eks create-pod-identity-association --cluster-name $cluster_name --role-arn {arn-aws}iam::<111122223333>:role/$role_name --namespace kube-system --service-account efs-csi-controller-sa
   ```

1. Pod Identity 연결 생성에 대한 자세한 내용은 [pod identity 연결 생성(AWS 콘솔)](pod-id-association.md#pod-id-association-create) 섹션을 참조하세요.

#### 서비스 계정에 IAM 역할을 사용하는 경우
<a name="efs-cli-irsa"></a>

1. 클러스터의 OIDC 공급자 URL을 확인합니다. `my-cluster`을 클러스터 이름으로 교체합니다. 또한 `AmazonEKS_EFS_CSI_DriverRole`을 다른 이름으로 바꿀 수 있습니다.

   ```
   export cluster_name=my-cluster
   export role_name=AmazonEKS_EFS_CSI_DriverRole
   aws eks describe-cluster --name $cluster_name --query "cluster.identity.oidc.issuer" --output text
   ```

   예제 출력은 다음과 같습니다.

   ```
   https://oidc.eks.<region-code>.amazonaws.com/id/<EXAMPLED539D4633E53DE1B71EXAMPLE>
   ```

   명령의 출력이 `None`인 경우 **사전 요구 사항**을 검토합니다.

1. `AssumeRoleWithWebIdentity` 작업을 부여하는 IAM 역할을 생성합니다.

   1. 다음 콘텐츠를 `aws-efs-csi-driver-trust-policy.json`라는 파일에 복사합니다. `<111122223333>`을 계정 ID로 바꿉니다. `<EXAMPLED539D4633E53DE1B71EXAMPLE>` 및 `<region-code>`를 이전 단계에서 반환된 값으로 바꿉니다.

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
              "Federated": "arn:aws:iam::123456789012:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
              "StringLike": {
                "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:efs-csi-*",
                "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com"
              }
            }
          }
        ]
      }
      ```

   1. 역할을 생성합니다.

      ```
      aws iam create-role \
        --role-name $role_name \
        --assume-role-policy-document file://"aws-efs-csi-driver-trust-policy.json"
      ```

1. 다음 명령어로 필요한 AWS 관리형 정책을 역할에 연결합니다.

   ```
   aws iam attach-role-policy \
     --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy \
     --role-name $role_name
   ```

## 2단계: Amazon EFS CSI 드라이버 받기
<a name="efs-install-driver"></a>

Amazon EKS 추가 기능을 통해 Amazon EFS CSI 드라이버를 설치하는 것이 좋습니다. Amazon EKS 추가 기능을 클러스터에 추가하려면 [Amazon EKS 추가 기능 생성](creating-an-add-on.md) 섹션을 참조하세요. Amazon EKS 추가 기능에 대한 자세한 내용은 [Amazon EKS 추가 기능](eks-add-ons.md) 섹션을 참조하세요. Amazon EKS 추가 기능을 사용할 수 없는 경우, 사용할 수 없는 이유에 대한 문제를 [컨테이너 로드맵 GitHub 리포지토리에](https://github.com/aws/containers-roadmap/issues) 제출하는 것이 좋습니다.

**중요**  
Amazon EFS 드라이버를 Amazon EKS 추가 기능으로 추가하기 전에 클러스터에 자체 관리형 버전의 드라이버가 설치되어 있지 않은지 확인하세요. 그러한 경우 GitHub에서 [Amazon EFS CSI 드라이버 제거](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/docs/install.md#uninstalling-the-amazon-efs-csi-driver)를 참조하세요.

대신 Amazon EFS CSI 드라이버의 자체 관리형 설치를 원하는 경우 GitHub의 [Installation](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/docs/install.md)을 참조하세요.

## 3단계: Amazon EFS 파일 시스템 생성
<a name="efs-create-filesystem"></a>

Amazon EFS 파일 시스템을 생성하려면 GitHub의 [Create an Amazon EFS file system for Amazon EKS](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/docs/efs-create-filesystem.md)를 참조하세요.

## 4단계: 샘플 애플리케이션 배포
<a name="efs-sample-app"></a>

다양한 샘플 앱을 배포하고 필요에 따라 수정할 수 있습니다. 자세한 내용은 GitHub의 [Examples](https://github.com/kubernetes-sigs/aws-efs-csi-driver/tree/master/examples/kubernetes)를 참조하세요.