Amazon Elastic Kubernetes Service에서 Parameter Store 파라미터 사용 - AWS Systems Manager

Amazon Elastic Kubernetes Service에서 Parameter Store 파라미터 사용

Secrets Manager의 보안 암호와 Parameter Store의 파라미터를 Amazon EKS 포드에 탑재된 파일로 표시하려면 Kubernetes 보안 암호 스토어 CSI 드라이버에 대해 AWS 보안 암호 및 구성 공급자(ASCP)를 사용할 수 있습니다.(Parameter Store는 AWS Systems Manager의 기능입니다.) ASCP는 Amazon Elastic Kubernetes Service(Amazon EKS) 1.17+에서 작동합니다. AWS Fargate 노드 그룹은 지원되지 않습니다.

ASCP를 사용하여 Parameter Store에서 저장 및 관리되는 파라미터를 검색할 수 있습니다. 그런 다음 Amazon EKS에서 실행되는 워크로드에서 파라미터를 사용할 수 있습니다. 파라미터에 JSON 형식의 여러 키 값 쌍이 포함되어 있는 경우 Amazon EKS에서 탑재할 키 값 쌍을 선택할 수 있습니다. ASCP는 JMESPath 구문을 사용하여 파라미터의 키 값 쌍을 쿼리할 수 있습니다.

AWS Identity and Access Management(IAM) 역할 및 정책을 사용하여 파라미터에 대한 액세스를 클러스터의 특정 Amazon EKS 포드로 제한할 수 있습니다. ASCP는 포드 자격 증명을 검색하고 IAM 역할에 대한 자격 증명을 교환합니다. ASCP는 포드의 IAM 역할을 맡습니다. 그런 다음 Parameter Store에서 해당 역할에 대해 권한이 부여된 파라미터를 검색할 수 있습니다.

Secrets Manager와 Amazon EKS를 통합하는 방법에 대한 자세한 내용은 Amazon Elastic Kubernetes Service에서 Secrets Manager 사용을 참조하세요.

ASCP 설치

ASCP는 secrets-store-csi-driver-provider-aws 리포지토리의 GitHub에서 제공됩니다. 리포지토리에는 보안 암호를 생성하고 탑재하기 위한 예제 YAML 파일도 포함되어 있습니다. 먼저 Kubernetes 보안 암호 스토어 CSI 드라이버를 설치한 후 ASCP를 설치합니다.

Kubernetes 보안 암호 스토어 CSI 드라이버 및 ASCP를 설치하려면
  1. Kubernetes 보안 암호 스토어 CSI 드라이버를 설치하려면 다음 명령을 실행합니다. 전체 설치 지침은 Kubernetes 보안 암호 스토어 CSI 드라이버 북의 설치를 참조하세요. Helm 설치에 대한 자세한 내용은 Amazon EKS에서 Helm 사용을 참조하세요.

    helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts helm install -n kube-system csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver
  2. ASCP를 설치하려면 GitHub 리포지토리 배포 디렉터리에서 YAML 파일을 사용합니다. kubectl 설치에 대한 자세한 내용은 kubectl 설치를 참조하세요.

    kubectl apply -f https://raw.githubusercontent.com/aws/secrets-store-csi-driver-provider-aws/main/deployment/aws-provider-installer.yaml

1단계: 액세스 제어 설정

Parameter Store에서 Amazon EKS 포드에 파라미터에 대한 액세스 권한을 부여하려면, 먼저 포드가 액세스해야 하는 파라미터에 대한 액세스를 제한하는 정책을 생성합니다. 그런 다음 서비스 계정용 IAM 역할을 생성하고 정책을 연결합니다. IAM 정책을 사용하여 Systems Manager 파라미터에 대한 액세스를 제한하는 것에 대한 자세한 내용은 IAM 정책을 사용하여 Parameter Store 파라미터에 대한 액세스 제한 섹션을 참조하세요.

참고

Parameter Store 파라미터를 사용할 때 ssm:GetParameters 권한이 정책에 필요합니다.

ASCP는 포드 자격 증명을 검색하고 IAM 역할에 대한 자격 증명을 교환합니다. ASCP는 포드의 IAM 역할을 가정하여 사용자가 권한을 부여한 파라미터에 대한 액세스 권한을 부여합니다. 다른 컨테이너는 IAM 역할과 연결하지 않는 한 파라미터에 액세스할 수 없습니다.

2단계: Amazon EKS에 파라미터 탑재

Amazon EKS에서 파일 시스템의 파일인 것처럼 파라미터를 표시하려면 파라미터에 대한 정보 및 Amazon EKS 포드에 탑재하는 방법이 포함된 SecretProviderClass YAML 파일을 생성합니다.

SecretProviderClass는 참조하는 Amazon EKS 포드와 동일한 네임스페이스에 있어야 합니다.

SecretProviderClass

SecretProviderClass YAML의 형식은 다음과 같습니다.

apiVersion: secrets-store.csi.x-k8s.io/v1alpha1 kind: SecretProviderClass metadata: name: <NAME> spec: provider: aws parameters:
파라미터

탑재 요청의 세부 정보를 포함합니다.

객체

탑재할 파라미터의 YAML 선언을 포함하는 문자열입니다. YAML 다중 행 문자열 또는 파이프(|) 문자를 사용하는 것이 좋습니다.

objectName

파라미터의 표시 이름입니다. 이 이름은 사용자가 objectAlias를 지정하지 않는 한 Amazon EKS 포드에서 파라미터의 파일 이름이 됩니다. Parameter Store의 경우 파라미터의 Name이어야 하며, 전체 Amazon 리소스 이름(ARN)일 수 없습니다.

jmesPath

(선택 사항) Amazon EKS에 탑재할 파일에 대한 JSON 인코딩 파라미터의 키 맵입니다. 다음 예제에서는 JSON 인코딩 파라미터의 형태를 보여줍니다.

{ "username" : "myusername", "password" : "mypassword" }

키는 usernamepassword입니다. username에 연결된 값은 myusername이며, password에 연결된 값은 mypassword입니다.

경로

파라미터의 키입니다.

objectAlias

Amazon EKS 포드에 탑재할 파일 이름입니다.

objectType

Parameter Store의 경우 이 필드는 필수 사항입니다. ssmparameter를 사용합니다.

objectAlias

(선택 사항) Amazon EKS 포드에 있는 파라미터의 파일 이름입니다. 이 필드를 지정하지 않은 경우 objectName이 파일 이름으로 표시됩니다.

objectVersion

(선택 사항) 파라미터의 버전 번호입니다. 파라미터를 업데이트할 때마다 업데이트해야 하므로 이 필드를 사용하지 않는 것이 좋습니다. 기본적으로 가장 최신 버전이 사용됩니다. Parameter Store 파라미터의 경우, objectVersion 또는 objectVersionLabel 중 하나를 사용할 수 있지만 둘 다 사용할 수는 없습니다.

objectVersionLabel

(선택 사항) 버전에 대한 파라미터 레이블입니다. 기본값은 가장 최근 버전입니다. Parameter Store 파라미터의 경우, objectVersion 또는 objectVersionLabel 중 하나를 사용할 수 있지만 둘 다 사용할 수는 없습니다.

region

(선택 사항) 파라미터의 AWS 리전입니다. 이 필드를 사용하지 않는 경우 ASCP는 노드의 주석에서 지역을 조회합니다. 이 조회는 탑재 요청에 오버헤드를 추가하므로 많은 수의 포드를 사용하는 클러스터에 리전을 제공하는 것이 좋습니다.

pathTranslation

(선택 사항) 파일 이름(objectName또는objectAlias)에 Linux의 슬래시(/)와 같은 경로 구분 문자가 포함된 경우 사용할 단일 대체 문자입니다. 파라미터 이름에 경로 구분 기호가 포함된 경우 ASCP는 해당 이름으로 탑재된 파일을 생성할 수 없습니다. 대신 이 필드에 경로 구분 문자를 입력하여 다른 문자로 바꿀 수 있습니다. 이 필드를 사용하지 않는 경우 기본값은 밑줄(_)이므로 예를 들어 My/Path/ParameterMy_Path_Parameter으로 탑재됩니다.

문자 대체를 방지하려면 False 문자열을 입력합니다.

다음 예제 구성은 Parameter Store 파라미터 리소스가 포함된 SecretProviderClass를 보여줍니다.

apiVersion: secrets-store.csi.x-k8s.io/v1alpha1 kind: SecretProviderClass metadata: name: aws-secrets spec: provider: aws parameters: objects: | - objectName: "MyParameter" objectType: "ssmparameter"

3단계: 배포 YAML 업데이트

배포 YAML을 업데이트하여 secrets-store.csi.k8s.io 드라이버를 사용하고 이전 단계에서 생성된 SecretProviderClass 리소스를 참조합니다. 이렇게 하면 클러스터에서 보안 암호 스토어 CSI 드라이버를 사용합니다.

아래는 이름이 aws-secretsSecretProviderClass를 사용하는 샘플 배포 YAML입니다.

volumes: - name: secrets-store-inline csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: "aws-secrets"

자습서: Amazon EKS 포드에서 파라미터 생성 및 장착

이 자습서에서는 Parameter Store에서 예제 파라미터를 만든 후 Amazon EKS 포드에 파라미터를 탑재하고 배포합니다.

시작하기 전에 ASCP를 설치합니다. 자세한 내용은 ASCP 설치 단원을 참조하십시오.

보안 암호 생성 및 탑재
  1. AWS 리전 및 클러스터 이름을 쉘 변수로 설정하므로 bash 명령에서 사용할 수 있습니다. region에서 Amazon EKS 클러스터가 실행되는 AWS 리전을 입력합니다. clustername에 클러스터의 이름을 입력합니다.

    REGION=region CLUSTERNAME=clustername
  2. 테스트 파라미터를 생성합니다.

    aws ssm put-parameter --name "MyParameter" --value "EKS parameter" --type String --region "$REGION"
  3. 이전 단계에서 생성한 파라미터에 대한 액세스를 제한하는 포드에 대한 리소스 정책을 생성합니다. parameter-arn의 경우 파라미터의 ARN을 사용합니다. 셸 변수에 정책 ARN을 저장합니다. 파라미터 ARN을 검색하려면 get-parameter를 사용합니다.

    POLICY_ARN=$(aws --region "$REGION" --query Policy.Arn --output text iam create-policy --policy-name nginx-parameter-deployment-policy --policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["ssm:GetParameter", "ssm:GetParameters"], "Resource": ["parameter-arn"] } ] }')
  4. 아직 없는 경우 클러스터에 대한 IAM OpenID Connect(OIDC) 공급자를 생성합니다. 자세한 내용은 클러스터에 사용할 IAM OIDC 공급자 생성을 참조하세요.

    eksctl utils associate-iam-oidc-provider --region="$REGION" --cluster="$CLUSTERNAME" --approve # Only run this once
  5. 포드에서 사용하는 서비스 계정을 만들고 3단계에서 생성한 리소스 정책을 해당 서비스 계정에 연결합니다. 이 자습서에서는 서비스 계정 이름에 nginx-deployment-sa를 사용합니다. 자세한 내용은 서비스 계정에 대한 IAM 역할 생성을 참조하세요.

    eksctl create iamserviceaccount --name nginx-deployment-sa --region="$REGION" --cluster "$CLUSTERNAME" --attach-policy-arn "$POLICY_ARN" --approve --override-existing-serviceaccounts
  6. SecretProviderClass를 생성하여 포드에 탑재할 파라미터를 지정합니다. 다음 명령은 이름이 ExampleSecretProviderClass.yamlSecretProviderClass 파일의 파일 위치를 사용합니다. 자체 SecretProviderClass 생성에 대한 자세한 내용은 SecretProviderClass 섹션을 참조하세요.

    kubectl apply -f ./ExampleSecretProviderClass.yaml
  7. 포드를 배포합니다. 다음 명령은 이름이 ExampleDeployment.yaml인 배포 파일을 사용합니다. 자체 SecretProviderClass 생성에 대한 자세한 내용은 3단계: 배포 YAML 업데이트 섹션을 참조하세요.

    kubectl apply -f ./ExampleDeployment.yaml
  8. 파라미터가 제대로 탑재되었는지 확인하려면 다음 명령을 사용하여 파라미터 값이 나타나는지 확인합니다.

    kubectl exec -it $(kubectl get pods | awk '/nginx-deployment/{print $1}' | head -1) cat /mnt/secrets-store/MyParameter; echo

    파라미터 값이 나타납니다.

    "EKS parameter"

문제 해결

포드 배포를 설명하여 대부분의 오류를 볼 수 있습니다.

컨테이너에 대한 오류 메시지 확인
  1. 다음 명령을 사용하여 포드 이름 목록을 가져옵니다. 기본 네임스페이스를 사용하지 않는 경우에는 -n <NAMESPACE>를 사용합니다.

    kubectl get pods
  2. 포드를 설명하기 위해 다음 명령에서 pod-id에 대해 이전 단계에서 찾은 포드의 포드 ID를 사용합니다. 기본 네임스페이스를 사용하지 않는 경우에는 -n <NAMESPACE>를 사용합니다.

    kubectl describe pod/pod-id
ASCP에 대한 오류를 확인하려면
  • 공급자 로그에서 자세한 정보를 찾으려면 다음 명령에서 pod-id에 대해 csi-secrets-store-provider-aws 포드의 ID를 사용합니다.

    kubectl -n kube-system get pods kubectl -n kube-system logs pod/pod-id