

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

# 자습서: Amazon Elastic Kubernetes Service에서 호스팅되는 컨테이너화된 애플리케이션에서 연결
<a name="EKS-tutorial"></a>

이 자습서에서는 SigV4 인증을 사용하여 Amazon Keyspaces에 연결하는 컨테이너화된 애플리케이션을 호스팅하도록 Amazon Elastic Kubernetes Service(Amazon EKS) 클러스터를 설정하는 데 필요한 단계를 안내합니다.

Amazon EKS는 에 자체 Kubernetes 컨트롤 플레인을 설치, 운영 및 유지 관리할 필요가 없는 관리형 서비스입니다. [Kubernetes](https://kubernetes.io/docs/concepts/overview/)는 컨테이너화된 애플리케이션의 관리, 규모 조정 및 배포포를 자동화하는 오픈 소스 시스템입니다.

이 자습서에서는 컨테이너화된 Java 애플리케이션을 구성, 빌드 및 Amazon EKS에 배포하기 위한 단계별 지침을 제공합니다. 마지막 단계에서는 애플리케이션을 실행하여 Amazon Keyspaces 테이블에 데이터를 작성합니다.

**Topics**
+ [Amazon EKS에서 Amazon Keyspaces로 연결하기 위한 사전 조건](EKS-tutorial-prerequisites.md)
+ [1단계: Amazon EKS 클러스터 구성 및 IAM 권한 설정](EKS-tutorial-step1.md)
+ [2단계: 애플리케이션 구성](EKS-tutorial-step2.md)
+ [3단계: 애플리케이션 이미지를 생성하고 Amazon ECR 리포지토리에 Docker 파일을 업로드합니다.](EKS-tutorial-step3.md)
+ [4단계: 애플리케이션을 Amazon EKS에 배포하고 테이블에 데이터 쓰기](EKS-tutorial-step4.md)
+ [5단계: (선택 사항) 정리](EKS-tutorial-step5.md)

# Amazon EKS에서 Amazon Keyspaces로 연결하기 위한 사전 조건
<a name="EKS-tutorial-prerequisites"></a>

**자습서를 시작하기 전에 다음 AWS 리소스를 생성합니다.**

1. 이 자습서를 시작하기 전에의 AWS 설정 지침을 따르세요[Amazon Keyspaces(Apache Cassandra용) 액세스](accessing.md). 이러한 단계에는 Amazon Keyspaces에 대한 액세스 권한이 있는 AWS Identity and Access Management (IAM) 보안 주체 생성 AWS 및 가입이 포함됩니다.

1. 이 자습서의 뒷부분에서 Amazon EKS에서 실행 중인 컨테이너화된 애플리케이션에서 쓸 수 있는 `aws`이라는 이름의 Amazon Keyspaces 키스페이스와 `user`라는 이름의 테이블을 생성합니다. AWS CLI 또는를 사용하여이 작업을 수행할 수 있습니다`cqlsh`.

------
#### [ AWS CLI ]

   ```
   aws keyspaces create-keyspace --keyspace-name 'aws'
   ```

   키스페이스가 생성되었는지 확인하려면 다음 명령을 사용할 수 있습니다.

   ```
   aws keyspaces list-keyspaces
   ```

   테이블을 생성하려면 다음 명령을 사용할 수 있습니다.

   ```
   aws keyspaces create-table --keyspace-name 'aws' --table-name 'user' --schema-definition 'allColumns=[
               {name=username,type=text}, {name=fname,type=text},{name=last_update_date,type=timestamp},{name=lname,type=text}],
               partitionKeys=[{name=username}]'
   ```

   테이블이 생성되었는지 확인하려면 다음 명령을 사용할 수 있습니다.

   ```
   aws keyspaces list-tables --keyspace-name 'aws'
   ```

   자세한 내용은 **AWS CLI 명령 참조에서 [키스페이스 만들기](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/keyspaces/create-keyspace.html) 및 [테이블 만들기](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/keyspaces/create-table.html)를 참조하세요.

------
#### [ cqlsh ]

   ```
   CREATE KEYSPACE aws WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '3'}  AND durable_writes = true;
   CREATE TABLE aws.user (
       username text PRIMARY KEY,
       fname text,
       last_update_date timestamp,
       lname text
   );
   ```

   테이블이 생성되었는지 확인하려면 다음 문을 사용할 수 있습니다.

   ```
   SELECT * FROM system_schema.tables WHERE keyspace_name = "aws";
   ```

   테이블은 이 문의 출력에 나열되어야 합니다. 테이블이 생성될 때까지 지연이 발생할 수 있습니다. 자세한 내용은 [CREATE TABLE](cql.ddl.table.md#cql.ddl.table.create) 단원을 참조하십시오.

------

1. **Fargate - Linux** 노드 유형을 사용하여 Amazon EKS 클러스터를 생성합니다. Fargate는 Amazon EC2 인스턴스를 관리하지 않고도 Kubernetes 포드를 배포할 수 있는 서버리스 컴퓨팅 엔진입니다. 모든 예제 명령에서 클러스터 이름을 업데이트하지 않고 이 자습서를 따르려면 **Amazon EKS 사용 설명서의 [Amazon EKS 시작하기 - `eksctl`](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-eksctl.html)의 지침에 따라 이름이 `my-eks-cluster`인 클러스터를 만듭니다. 클러스터가 생성되면 노드와 두 기본 포드가 실행 중이고 정상인지 확인합니다. 이러한 권한 부여는 다음 명령을 사용하여 가능합니다.

   ```
   kubectl get pods -A -o wide
   ```

   이 출력과 유사한 결과가 나타날 것입니다.

   ```
   NAMESPACE     NAME                       READY   STATUS    RESTARTS   AGE   IP          NODE                                                NOMINATED NODE   READINESS GATES
   kube-system   coredns-1234567890-abcde   1/1     Running   0          18m   192.0.2.0   fargate-ip-192-0-2-0.region-code.compute.internal   <none>           <none>
   kube-system   coredns-1234567890-12345   1/1     Running   0          18m   192.0.2.1   fargate-ip-192-0-2-1.region-code.compute.internal   <none>           <none>
   ```

1. 도커를 설치합니다. Amazon EC2 인스턴스에 Docker를 설치하는 방법에 대한 지침은 Amazon Elastic Container Registry 사용 설명서의 [Docker 설치](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html#getting-started-cli-prereqs)를 참조하세요.

   Docker는 최신 Linux 배포 버전(Ubuntu 등)을 비롯하여 macOS 및 Windows 등 다양한 운영 체제에서 사용할 수 있습니다. 특정 운영 체제에 Docker를 설치하는 방법에 대한 자세한 내용은 [Docker 설치 안내서](https://docs.docker.com/engine/install/#installation)를 참조하세요.

1. Amazon ECR 리포지토리를 생성합니다. Amazon ECR은 원하는 CLI와 함께 사용하여 Docker 이미지를 푸시, 풀 및 관리할 수 있는 AWS 관리형 컨테이너 이미지 레지스트리 서비스입니다. Amazon ECR 리포지토리에 대한 자세한 내용은 [Amazon Elastic Container Registry 사용 설명서](https://docs.aws.amazon.com/AmazonECR/latest/userguide/)를 참조하세요. 다음 명령을 사용하여 이름이 `my-ecr-repository`인 리포지토리를 생성할 수 있습니다.

   ```
   aws ecr create-repository --repository-name my-ecr-repository
   ```

필수 단계를 완료한 후 [1단계: Amazon EKS 클러스터 구성 및 IAM 권한 설정](EKS-tutorial-step1.md)로 진행합니다.

# 1단계: Amazon EKS 클러스터 구성 및 IAM 권한 설정
<a name="EKS-tutorial-step1"></a>

**Amazon EKS 클러스터를 구성하고 Amazon EKS 서비스 계정이 Amazon Keyspaces 테이블에 연결되도록 허용하는 데 필요한 IAM 리소스를 생성합니다.**

1. Amazon EKS 클러스터에 대한 Open ID Connect(OIDC) 공급자를 생성합니다. 이는 서비스 계정에 IAM 역할을 사용하는 데 필요합니다. OIDC 공급자 및 이를 생성하는 방법에 대한 자세한 내용은 **Amazon EKS 사용 설명서의 [클러스터에 대한 IAM OIDC 공급자 생성](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html)을 참조하세요.

   1. 다음 명령을 사용하여 클러스터의 IAM OIDC ID 공급자를 생성합니다. 이 예제에서는 클러스터 이름을 `my-eks-cluster`라고 가정합니다. 이름이 다른 클러스터가 있는 경우 향후 모든 명령에서 이름을 업데이트해야 합니다.

      ```
      eksctl utils associate-iam-oidc-provider --cluster my-eks-cluster --approve 
      ```

   1. OIDC ID 공급자가 다음 명령을 사용하여 IAM에 등록되었는지 확인합니다.

      ```
      aws iam list-open-id-connect-providers --region us-east-1
      ```

      결과는 다음과 비슷해야 합니다. OIDC의 Amazon 리소스 이름(ARN)을 기록해 둡니다. 서비스 계정에 대한 신뢰 정책을 생성할 때 다음 단계에서 필요합니다.

      ```
      {
          "OpenIDConnectProviderList": [
              ..
              {
                  "Arn": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
              }
          ]
      }
      ```

1. Amazon EKS 클러스터의 서비스 계정을 생성합니다. 서비스 계정은 *포드*에서 실행되는 프로세스의 ID를 제공합니다. 포드는 컨테이너화된 애플리케이션을 배포하는 데 사용할 수 있는 가장 작고 간단한 Kubernetes 객체입니다. 그런 다음 서비스 계정이 리소스에 대한 권한을 얻기 위해 수임할 수 있는 IAM 역할을 생성합니다. 해당 AWS 서비스에 대한 액세스 권한이 있는 IAM 역할을 수임할 수 있는 서비스 계정을 사용하도록 구성된 포드에서 모든 서비스에 액세스할 수 있습니다.

   1. 서비스 계정의 새 네임스페이스를 생성합니다. 네임스페이스는 이 자습서를 위해 생성된 클러스터 리소스를 격리하는 데 도움이 됩니다. 다음 명령을 사용하여 새 네임스페이스를 생성할 수 있습니다.

      ```
      kubectl create namespace my-eks-namespace
      ```

   1. 사용자 지정 네임스페이스를 사용하려면 이를 Fargate 프로필과 연결해야 합니다. 다음 코드는 이에 대한 예입니다.

      ```
      eksctl create fargateprofile \
          --cluster my-eks-cluster \
          --name my-fargate-profile \
          --namespace my-eks-namespace \
          --labels *=*
      ```

   1. 다음 명령을 사용하여 Amazon EKS 클러스터의 네임스페이스 `my-eks-namespace`에 이름이 `my-eks-serviceaccount`인 서비스 계정을 생성합니다.

      ```
      cat >my-serviceaccount.yaml <<EOF
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: my-eks-serviceaccount
        namespace: my-eks-namespace
      EOF
      kubectl apply -f my-serviceaccount.yaml
      ```

   1. 다음 명령을 실행하여 IAM 역할에 서비스 계정을 신뢰하도록 지시하는 신뢰 정책 파일을 생성합니다. 위탁자가 역할을 수임하려면 먼저 이 신뢰 관계가 필요합니다. 파일을 다음과 같이 편집해야 합니다.
      + `Principal`에 IAM이 `list-open-id-connect-providers` 명령으로 반환한 ARN을 입력합니다. ARN에는 계정 번호와 리전이 포함됩니다.
      + `condition` 문에서 AWS 리전 및 OIDC ID를 바꿉니다.
      + 서비스 계정 이름과 네임스페이스가 올바른지 확인합니다.

      IAM 역할을 생성할 때 다음 단계에서 신뢰 정책 파일을 연결해야 합니다.

      ```
      cat >trust-relationship.json <<EOF
      {
          "Version": "2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
                  },
                  "Action": "sts:AssumeRoleWithWebIdentity",
                  "Condition": {
                      "StringEquals": {
                          "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:my-eks-namespace:my-eks-serviceaccount",
                          "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com"
                      }
                  }
              }
          ]
      }
      EOF
      ```

      선택 사항: 여러 서비스 계정 또는 네임스페이스가 역할을 수임할 수 있도록 `StringEquals` 또는 `StringLike` 조건에 여러 항목을 추가할 수도 있습니다. 서비스 계정이 다른 AWS 계정에서 IAM 역할을 수임하도록 허용하려면 **Amazon EKS 사용 설명서의 [교차 계정 IAM 권한](https://docs.aws.amazon.com/eks/latest/userguide/cross-account-access.html)을 참조하세요.

1. 수임할 Amazon EKS 서비스 계정의 이름 `my-iam-role`로 IAM 역할을 생성합니다. 마지막 단계에서 생성된 신뢰 정책 파일을 역할에 연결합니다. 신뢰 정책은 IAM 역할이 신뢰할 수 있는 서비스 계정 및 OIDC 공급자를 지정합니다.

   ```
   aws iam create-role --role-name my-iam-role --assume-role-policy-document file://trust-relationship.json --description "EKS service account role"
   ```

1. 액세스 정책을 연결하여 Amazon Keyspaces에 IAM 역할 권한을 할당합니다.

   1. 액세스 정책을 연결하여 특정 Amazon Keyspaces 리소스에서 IAM 역할이 수행할 수 있는 작업을 정의합니다. 이 자습서에서는 애플리케이션이 Amazon Keyspaces 테이블에 데이터를 쓰기 `AmazonKeyspacesFullAccess`때문에 AWS 관리형 정책를 사용합니다. 하지만 가장 좋은 방법은 최소 권한 원칙을 구현하는 사용자 지정 액세스 정책을 생성하는 것입니다. 자세한 내용은 [Amazon Keyspaces에서 IAM을 사용하는 방법](security_iam_service-with-iam.md) 단원을 참조하십시오.

      ```
      aws iam attach-role-policy --role-name my-iam-role --policy-arn=arn:aws:iam::aws:policy/AmazonKeyspacesFullAccess
      ```

      다음 문을 사용하여 정책이 IAM 역할에 성공적으로 연결되었는지 확인합니다.

      ```
      aws iam list-attached-role-policies --role-name my-iam-role
      ```

      결과는 다음과 같아야 합니다.

      ```
      {
          "AttachedPolicies": [
              {
                  "PolicyName": "AmazonKeyspacesFullAccess",
                  "PolicyArn": "arn:aws:iam::aws:policy/AmazonKeyspacesFullAccess"
              }
          ]
      }
      ```

   1. 서비스 계정에 해당 계정이 수임할 수 있는 IAM 역할의 Amazon 리소스 이름(ARN)을 주석으로 추가합니다. 계정 ID로 역할 ARN을 업데이트해야 합니다.

      ```
      kubectl annotate serviceaccount -n my-eks-namespace my-eks-serviceaccount eks.amazonaws.com/role-arn=arn:aws:iam::111122223333:role/my-iam-role
      ```

1. IAM 역할과 서비스 계정이 올바르게 구성되었는지 확인합니다.

   1. 다음 문을 사용하여 IAM 역할의 신뢰 정책이 올바르게 구성되었는지 확인합니다.

      ```
      aws iam get-role --role-name my-iam-role --query Role.AssumeRolePolicyDocument
      ```

      결과는 다음과 비슷해야 합니다.

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

   1. Amazon EKS 서비스 계정에 IAM 역할이 주석으로 달렸는지 확인합니다.

      ```
      kubectl describe serviceaccount my-eks-serviceaccount -n my-eks-namespace
      ```

      결과는 다음과 비슷해야 합니다.

      ```
      Name: my-eks-serviceaccount 
      Namespace:my-eks-namespace
      Labels: <none>
      Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/my-iam-role 
      Image pull secrets: <none> 
      Mountable secrets: <none> 
      Tokens: <none> 
      [...]
      ```

Amazon EKS 서비스 계정, IAM 역할을 생성하고 필요한 관계 및 권한을 구성한 후 [2단계: 애플리케이션 구성](EKS-tutorial-step2.md)로 진행합니다.

# 2단계: 애플리케이션 구성
<a name="EKS-tutorial-step2"></a>

이 단계에서는 SigV4 플러그인을 사용하여 Amazon Keyspaces에 연결하는 애플리케이션을 빌드합니다. [Github](https://github.com/aws-samples/amazon-keyspaces-examples/tree/main/java/datastax-v4/eks)의 Amazon Keyspaces 예제 코드 리포지토리에서 예제 Java 애플리케이션을 보고 다운로드할 수 있습니다. 또는 자체 애플리케이션을 사용하여 모든 구성 단계를 완료해야 합니다.

**애플리케이션을 구성하고 필요한 종속성을 추가합니다.**

1. 다음 명령을 사용하여 Github 리포지토리를 복제하여 예제 Java 애플리케이션을 다운로드할 수 있습니다.

   ```
   git clone https://github.com/aws-samples/amazon-keyspaces-examples.git
   ```

1. Github 리포지토리를 다운로드한 후 다운로드한 파일의 압축을 풀고 `resources` 디렉터리에서 `application.conf` 파일로 이동합니다.

   1. **애플리케이션 구성**

      이 단계에서는 SigV4 인증 플러그인을 구성합니다. 애플리케이션에서 다음 예제를 사용할 수 있습니다. 아직 생성하지 않은 경우 IAM 액세스 키(액세스 키 ID 및 보안 액세스 키)를 생성하여 AWS 구성 파일 또는 환경 변수로 저장해야 합니다. 자세한 지침은 [Cassandra 클라이언트 드라이버용 AWS CLI, AWS SDK 또는 Amazon Keyspaces SigV4 플러그인에 필요한 자격 증명](SigV4_credentials.md) 섹션을 참조하세요. 필요에 따라 Amazon Keyspaces의 AWS 리전 및 서비스 엔드포인트를 업데이트합니다. 서비스 엔드포인트에 대한 자세한 정보는 [Amazon Keyspaces의 서비스 엔드포인트](programmatic.endpoints.md) 섹션을 참조하세요. truststore 위치, truststore 이름 및 truststore 암호를 자신의 암호로 바꿉니다.

      ```
      datastax-java-driver {
        basic.contact-points = ["cassandra.us-east-1.amazonaws.com:9142"]
        basic.load-balancing-policy.local-datacenter = "us-east-1"
        advanced.auth-provider {
          class = software.aws.mcs.auth.SigV4AuthProvider
          aws-region = "us-east-1"
        }
        advanced.ssl-engine-factory {
          class = DefaultSslEngineFactory
          truststore-path = "truststore_locationtruststore_name.jks"
          truststore-password = "truststore_password;"
        }
      }
      ```

   1. **STS 모듈 종속성을 추가합니다.**

      이렇게 하면 서비스 계정이 IAM 역할을 수임할 수 있도록 애플리케이션이 제공해야 하는 AWS 자격 증명을 반환`WebIdentityTokenCredentialsProvider`하는를 사용할 수 있는 기능이 추가됩니다. 다음 예제를 기반으로 이 작업을 수행할 수 있습니다.

      ```
              <dependency>
                  <groupId>com.amazonaws</groupId>
                  <artifactId>aws-java-sdk-sts</artifactId>
                  <version>1.11.717</version> 
              </dependency>
      ```

   1. **SigV4 종속성을 추가합니다.**

       이 패키지는 Amazon Keyspaces에 인증하는 데 필요한 SigV4 인증 플러그인을 구현합니다.

      ```
              <dependency>
                  <groupId>software.aws.mcs</groupId>
                  <artifactId>aws-sigv4-auth-cassandra-java-driver-plugin</artifactId>
                  <version>4.0.3</version> 
              </dependency>
      ```

1. **로깅 종속성을 추가합니다.**

    로그가 없으면 연결 문제를 해결할 수 없습니다. 이 자습서에서는 `slf4j`를 로깅 프레임워크로 사용하고 `logback.xml`을 사용하여 로그 출력을 저장합니다. 로깅 수준을 `debug`로 설정하여 연결을 설정합니다. 다음 예제를 사용하여 종속성을 추가할 수 있습니다.

   ```
           <dependency>
               <groupId>org.slf4j</groupId>
               <artifactId>slf4j-api</artifactId>
               <version>2.0.5</version> 
           </dependency>
   ```

   다음 코드 조각을 사용하여 로깅을 구성할 수 있습니다.

   ```
   <configuration>
       <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
           
           <encoder>
               <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
           </encoder>
       </appender>
   
       <root level="debug">
           <appender-ref ref="STDOUT" />
       </rootv
   </configuration>
   ```
**참고**  
연결 실패를 조사하려면 `debug` 수준이 필요합니다. 애플리케이션에서 Amazon Keyspaces에 성공적으로 연결한 후 필요에 따라 로깅 수준을 `info` 또는 `warning`으로 변경할 수 있습니다.

# 3단계: 애플리케이션 이미지를 생성하고 Amazon ECR 리포지토리에 Docker 파일을 업로드합니다.
<a name="EKS-tutorial-step3"></a>

이 단계에서는 예제 애플리케이션을 컴파일하고, Docker 이미지를 빌드하고, 이미지를 Amazon ECR 리포지토리로 푸시합니다.

**애플리케이션을 빌드하고, Docker 이미지를 빌드하고, Amazon Elastic Container Registry에 제출합니다.**

1.  AWS 리전을 정의하는 빌드의 환경 변수를 설정합니다. 이 예제의 리전을 사용자 고유의 정보로 바꿉니다.

   ```
   export CASSANDRA_HOST=cassandra.us-east-1.amazonaws.com:9142
   export CASSANDRA_DC=us-east-1
   ```

1. 다음 명령을 사용하여 Apache Maven 버전 3.6.3 이상으로 애플리케이션을 컴파일합니다.

   ```
   mvn clean install
   ```

   그러면 `target` 디렉터리에 모든 종속성이 포함된 다음 `JAR` 파일이 생성됩니다.

1. 다음 명령을 사용하여 다음 단계에 필요한 ECR 리포지토리 URI를 검색합니다. 리전을 사용 중인 리전으로 업데이트해야 합니다.

   ```
   aws ecr describe-repositories --region us-east-1
   ```

   출력 결과는 다음 예제와 같아야 합니다.

   ```
   "repositories": [
    {
    "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/my-ecr-repository",
    "registryId": "111122223333",
    "repositoryName": "my-ecr-repository",
    "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/my-ecr-repository",
    "createdAt": "2023-11-02T03:46:34+00:00",
    "imageTagMutability": "MUTABLE",
    "imageScanningConfiguration": {
    "scanOnPush": false
    },
    "encryptionConfiguration": {
    "encryptionType": "AES256"
    }
    },
   ```

1. 애플리케이션의 루트 디렉터리에서 마지막 단계의 리포지토리 URI를 사용하여 Docker 이미지를 빌드합니다. 필요에 따라 Docker 파일을 수정합니다. 빌드 명령에서 계정 ID를 바꾸고를 Amazon ECR 리포지토리`my-ecr-repository`가 위치한 리전 AWS 리전 으로 설정해야 합니다.

   ```
   docker build -t 111122223333.dkr.ecr.us-east-1.amazonaws.com/my-ecr-repository:latest .
   ```

1. 인증 토큰을 검색하여 Docker 이미지를 Amazon ECR로 푸시합니다. 이러한 권한 부여는 다음 명령을 사용하여 가능합니다.

   ```
   aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com
   ```

1. 먼저 Amazon ECR 리포지토리의 기존 이미지를 확인합니다. 다음 명령을 사용할 수 있습니다.

   ```
   aws ecr describe-images --repository-name my-ecr-repository --region us-east-1
   ```

   그런 다음 Docker 이미지를 리포지토리로 푸시합니다. 다음 명령을 사용할 수 있습니다.

   ```
   docker push 111122223333.dkr.ecr.us-east-1.amazonaws.com/my-ecr-repository:latest
   ```

# 4단계: 애플리케이션을 Amazon EKS에 배포하고 테이블에 데이터 쓰기
<a name="EKS-tutorial-step4"></a>

자습서의 이 단계에서는 애플리케이션에 대한 Amazon EKS 배포를 구성하고 애플리케이션이 실행 중이며 Amazon Keyspaces에 연결할 수 있는지 확인합니다.

Amazon EKS에 애플리케이션을 배포하려면 `deployment.yaml`이라는 파일에서 모든 관련 설정을 구성해야 합니다. 그런 다음 이 파일은 Amazon EKS에서 애플리케이션을 배포하는 데 사용됩니다. 파일의 메타데이터에는 다음 정보가 포함되어야 합니다.
+ **애플리케이션 이름** – 애플리케이션의 이름입니다. 본 자습서에서는 `my-keyspaces-app`을 사용합니다.
+ **Kubernetes 네임스페이스** - Amazon EKS 클러스터의 네임스페이스입니다. 본 자습서에서는 `my-eks-namespace`를 사용합니다.
+ **Amazon EKS 서비스 계정 이름** - Amazon EKS 서비스 계정의 이름입니다. 본 자습서에서는 `my-eks-serviceaccount`을 사용합니다.
+ **이미지 이름** - 애플리케이션 이미지의 이름입니다. 본 자습서에서는 `my-keyspaces-app`을 사용합니다.
+ **Amazon ECR** - Amazon EKS의 Docker 이미지 URI입니다.
+  **AWS 계정 ID**  AWS 계정 ID입니다.
+ **IAM 역할 ARN** - 서비스 계정이 수임할 수 있도록 생성된 IAM 역할의 ARN입니다. 본 자습서에서는 `my-iam-role`을 사용합니다.
+ **AWS 리전 Amazon EKS 클러스터를 생성한 Amazon EKS 클러스터의** . AWS 리전 

이 단계에서는 Amazon Keyspaces에 연결하고 테이블에 데이터를 쓰는 애플리케이션을 배포하고 실행합니다.

1. `deployment.yaml` 파일을 구성합니다. 다음 값을 교체해야 합니다.
   + `name`
   + `namespace`
   + `serviceAccountName`
   + `image`
   + `AWS_ROLE_ARN value`
   +  AWS 리전 의 `CASSANDRA_HOST`
   + `AWS_REGION`

   다음 파일을 예제로 사용할 수 있습니다.

   ```
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: my-keyspaces-app
     namespace: my-eks-namespace
   spec:
     replicas: 1
     selector:
       matchLabels:
         app: my-keyspaces-app
     template:
       metadata:
         labels:
           app: my-keyspaces-app
       spec:
         serviceAccountName: my-eks-serviceaccount
         containers:
         - name: my-keyspaces-app
           image: 111122223333.dkr.ecr.us-east-1.amazonaws.com/my-ecr-repository:latest
           ports:
           - containerPort: 8080
           env:
           - name: CASSANDRA_HOST
             value: "cassandra.us-east-1.amazonaws.com:9142"
           - name: CASSANDRA_DC
             value: "us-east-1"
           - name: AWS_WEB_IDENTITY_TOKEN_FILE
             value: /var/run/secrets/eks.amazonaws.com/serviceaccount/token
           - name: AWS_ROLE_ARN
             value: "arn:aws:iam::111122223333:role/my-iam-role"
           - name: AWS_REGION
             value: "us-east-1"
   ```

1. `deployment.yaml`를 배포합니다.

   ```
   kubectl apply -f deployment.yaml
   ```

   결과는 다음과 같아야 합니다.

   ```
   deployment.apps/my-keyspaces-app created
   ```

1. Amazon EKS 클러스터의 네임스페이스에서 포드의 상태를 확인합니다.

   ```
   kubectl get pods -n my-eks-namespace
   ```

   결과가 다음 예제와 비슷해야 합니다.

   ```
   NAME                    READY STATUS RESTARTS AGE
   my-keyspaces-app-123abcde4f-g5hij 1/1 Running 0 75s
   ```

   자세한 내용은 다음 명령을 사용하여 확인할 수 있습니다.

   ```
   kubectl describe pod my-keyspaces-app-123abcde4f-g5hij -n my-eks-namespace
   ```

   ```
   Name:                 my-keyspaces-app-123abcde4f-g5hij
   Namespace:            my-eks-namespace
   Priority:             2000001000
   Priority Class Name:  system-node-critical
   Service Account:      my-eks-serviceaccount
   Node:                 fargate-ip-192-168-102-209.ec2.internal/192.168.102.209
   Start Time:           Thu, 23 Nov 2023 12:15:43 +0000
   Labels:               app=my-keyspaces-app
                         eks.amazonaws.com/fargate-profile=my-fargate-profile
                         pod-template-hash=6c56fccc56
   Annotations:          CapacityProvisioned: 0.25vCPU 0.5GB
                         Logging: LoggingDisabled: LOGGING_CONFIGMAP_NOT_FOUND
   Status:               Running
   IP:                   192.168.102.209
   IPs:
     IP:           192.168.102.209
   Controlled By:  ReplicaSet/my-keyspaces-app-6c56fccc56
   Containers:
     my-keyspaces-app:
       Container ID:   containerd://41ff7811d33ae4bc398755800abcdc132335d51d74f218ba81da0700a6f8c67b
       Image:          111122223333.dkr.ecr.us-east-1.amazonaws.com/my_eks_repository:latest
       Image ID:       111122223333.dkr.ecr.us-east-1.amazonaws.com/my_eks_repository@sha256:fd3c6430fc5251661efce99741c72c1b4b03061474940200d0524b84a951439c
       Port:           8080/TCP
       Host Port:      0/TCP
       State:          Running
         Started:      Thu, 23 Nov 2023 12:15:19 +0000
         Finished:     Thu, 23 Nov 2023 12:16:17 +0000
       Ready:          True
       Restart Count:  1
       Environment:
         CASSANDRA_HOST:               cassandra.us-east-1.amazonaws.com:9142
         CASSANDRA_DC:                 us-east-1
         AWS_WEB_IDENTITY_TOKEN_FILE:  /var/run/secrets/eks.amazonaws.com/serviceaccount/token
         AWS_ROLE_ARN:                 arn:aws:iam::111122223333:role/my-iam-role
         AWS_REGION:                   us-east-1
         AWS_STS_REGIONAL_ENDPOINTS:   regional
       Mounts:
         /var/run/secrets/eks.amazonaws.com/serviceaccount from aws-iam-token (ro)
         /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-fssbf (ro)
   Conditions:
     Type              Status
     Initialized       True 
     Ready             True 
     ContainersReady   True 
     PodScheduled      True 
   Volumes:
     aws-iam-token:
       Type:                    Projected (a volume that contains injected data from multiple sources)
       TokenExpirationSeconds:  86400
     kube-api-access-fssbf:
       Type:                    Projected (a volume that contains injected data from multiple sources)
       TokenExpirationSeconds:  3607
       ConfigMapName:           kube-root-ca.crt
       ConfigMapOptional:       <nil>
       DownwardAPI:             true
   QoS Class:                   BestEffort
   Node-Selectors:              <none>
   Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                                node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
   Events:
     Type     Reason           Age                From               Message
     ----     ------           ----               ----               -------
     Warning  LoggingDisabled  2m13s              fargate-scheduler  Disabled logging because aws-logging configmap was not found. configmap "aws-logging" not found
     Normal   Scheduled        89s                fargate-scheduler  Successfully assigned my-eks-namespace/my-keyspaces-app-6c56fccc56-mgs2m to fargate-ip-192-168-102-209.ec2.internal
     Normal   Pulled           75s                kubelet            Successfully pulled image "111122223333.dkr.ecr.us-east-1.amazonaws.com/my_eks_repository:latest" in 13.027s (13.027s including waiting)
     Normal   Pulling          54s (x2 over 88s)  kubelet            Pulling image "111122223333.dkr.ecr.us-east-1.amazonaws.com/my_eks_repository:latest"
     Normal   Created          54s (x2 over 75s)  kubelet            Created container my-keyspaces-app
     Normal   Pulled           54s                kubelet            Successfully pulled image "111122223333.dkr.ecr.us-east-1.amazonaws.com/my_eks_repository:latest" in 222ms (222ms including waiting)
     Normal   Started          53s (x2 over 75s)  kubelet            Started container my-keyspaces-app
   ```

1. 포드의 로그를 확인하여 애플리케이션이 실행 중이고 Amazon Keyspaces 테이블에 연결할 수 있는지 확인합니다. 이러한 권한 부여는 다음 명령을 사용하여 가능합니다. 배포 이름으로 바꿉니다.

   ```
   kubectl logs -f my-keyspaces-app-123abcde4f-g5hij -n my-eks-namespace
   ```

   아래 예제와 같이 Amazon Keyspaces에 대한 연결을 확인하는 애플리케이션 로그 항목을 볼 수 있어야 합니다.

   ```
   2:47:20.553 [s0-admin-0] DEBUG c.d.o.d.i.c.metadata.MetadataManager - [s0] Adding initial contact points [Node(endPoint=cassandra.us-east-1.amazonaws.com/1.222.333.44:9142, hostId=null, hashCode=e750d92)]
   22:47:20.562 [s0-admin-1] DEBUG c.d.o.d.i.c.c.ControlConnection - [s0] Initializing with event types [SCHEMA_CHANGE, STATUS_CHANGE, TOPOLOGY_CHANGE]
   22:47:20.564 [s0-admin-1] DEBUG c.d.o.d.i.core.context.EventBus - [s0] Registering com.datastax.oss.driver.internal.core.metadata.LoadBalancingPolicyWrapper$$Lambda$812/0x0000000801105e88@769afb95 for class com.datastax.oss.driver.internal.core.metadata.NodeStateEvent
   22:47:20.566 [s0-admin-1] DEBUG c.d.o.d.i.c.c.ControlConnection - [s0] Trying to establish a connection to Node(endPoint=cassandra.us-east-1.amazonaws.com/1.222.333.44:9142, hostId=null, hashCode=e750d92)
   ```

1. Amazon Keyspaces 테이블에서 다음 CQL 쿼리를 실행하여 한 줄의 데이터가 테이블에 기록되었는지 확인합니다.

   ```
   SELECT * from aws.user;
   ```

   다음 결과가 표시됩니다.

   ```
   fname    | lname | username | last_update_date 
   ----------+-------+----------+-----------------------------
   random    | k     | test     | 2023-12-07 13:58:31.57+0000
   ```

# 5단계: (선택 사항) 정리
<a name="EKS-tutorial-step5"></a>

이 단계를 따르면 이 자습서에서 생성한 모든 리소스를 제거할 수 있습니다.

**이 자습서에서 만든 리소스 제거**

1. 배포를 삭제합니다. 다음 CLI 명령을 사용하여 수행할 수 있습니다.

   ```
   kubectl delete deployment my-keyspaces-app -n my-eks-namespace
   ```

1. Amazon EKS 클러스터와 클러스터에 포함된 모든 포드를 삭제합니다. 또한 서비스 계정 및 OIDC ID 공급자와 같은 관련 리소스도 삭제됩니다. 다음 CLI 명령을 사용하여 수행할 수 있습니다.

   ```
   eksctl delete cluster --name my-eks-cluster --region us-east-1
   ```

1. Amazon Keyspaces에 대한 액세스 권한이 있는 Amazon EKS 서비스 계정에 사용되는 IAM 역할을 삭제합니다. 먼저 역할에 연결된 관리형 정책을 제거해야 합니다.

   ```
   aws iam detach-role-policy --role-name my-iam-role --policy-arn arn:aws:iam::aws:policy/AmazonKeyspacesFullAccess
   ```

   그런 다음 아래 명령을 사용하여 역할을 삭제할 수 있습니다.

   ```
   aws iam delete-role --role-name my-iam-role
   ```

   자세한 내용은 **IAM 사용 설명서의 [IAM 역할(AWS CLI) 삭제](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_manage_delete.html#roles-managingrole-deleting-cli)를 참조하세요.

1. 저장된 모든 이미지를 포함하여 Amazon ECR 리포지토리를 삭제합니다. 다음 명령을 사용하여 수행할 수 있습니다.

   ```
   aws ecr delete-repository \
         --repository-name my-ecr-repository \
         --force \
         --region us-east-1
   ```

   `force` 플래그는 이미지가 포함된 리포지토리를 삭제하는 데 필요합니다. 이미지를 먼저 삭제하려면 다음 명령을 사용하여 삭제할 수 있습니다.

   ```
   aws ecr batch-delete-image \
         --repository-name my-ecr-repository \
         --image-ids imageTag=latest \
         --region us-east-1
   ```

   자세한 내용은 Amazon Elastic Container Registry 사용 설명서의 [이미지 삭제](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html#cli-delete-image)를 참조하세요.

1. Amazon Keyspaces 키스페이스 및 테이블을 삭제합니다. 키스페이스를 삭제하면 해당 키스페이스의 모든 테이블이 자동으로 삭제됩니다. 다음 옵션 중 하나를 사용하여 삭제할 수 있습니다.

------
#### [ AWS CLI ]

   ```
   aws keyspaces delete-keyspace --keyspace-name 'aws'
   ```

   키스페이스가 삭제되었는지 확인하려면 다음 명령을 사용할 수 있습니다.

   ```
   aws keyspaces list-keyspaces
   ```

   테이블을 먼저 삭제하려면 다음 명령을 사용할 수 있습니다.

   ```
   aws keyspaces delete-table --keyspace-name 'aws' --table-name 'user'
   ```

   테이블이 삭제되었는지 확인하려면 다음 명령을 사용할 수 있습니다.

   ```
   aws keyspaces list-tables --keyspace-name 'aws'
   ```

   자세한 내용은 **AWS CLI 명령 참조의 [키스페이스 삭제](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/keyspaces/delete-keyspace.html) 및 [테이블 삭제](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/keyspaces/delete-table.html)를 참조하세요.

------
#### [ cqlsh ]

   ```
   DROP KEYSPACE IF EXISTS "aws";
   ```

   키스페이스가 삭제되었는지 확인하려면 다음 문을 사용할 수 있습니다.

   ```
   SELECT * FROM system_schema.keyspaces ;
   ```

   키스페이스는 이 문의 출력에 나열되어서는 안 됩니다. 키스페이스가 삭제될 때까지 지연이 발생할 수 있습니다. 자세한 내용은 [DROP KEYSPACE](cql.ddl.keyspace.md#cql.ddl.keyspace.drop) 단원을 참조하십시오.

   테이블을 먼저 삭제하려면 다음 명령을 사용할 수 있습니다.

   ```
   DROP TABLE "aws.user"
   ```

   테이블이 삭제되었는지 확인하려면 다음 명령을 사용할 수 있습니다.

   ```
   SELECT * FROM system_schema.tables WHERE keyspace_name = "aws";
   ```

   이 문의 출력에 테이블이 나열되어서는 안 됩니다. 테이블이 삭제될 때까지 지연이 발생할 수 있습니다. 자세한 내용은 [DROP TABLE](cql.ddl.table.md#cql.ddl.table.drop) 단원을 참조하십시오.

------