검색

9.3. 자체 Pod에서 AWS IAM 역할을 가정

download PDF

이 섹션의 절차에 따라 서비스 계정이 사용자 정의 프로젝트에 배포된 Pod에서 AWS IAM(Identity and Access Management) 역할을 가정할 수 있습니다.

AWS IAM 역할, 서비스 계정, AWS SDK가 포함된 컨테이너 이미지 및 이미지를 사용하여 배포한 Pod를 포함하여 필요한 리소스를 생성할 수 있습니다. 이 예제에서는 AWS Boto3 SDK for Python이 사용됩니다. Pod ID Webhook에서 AWS 환경 변수, 볼륨 마운트 및 토큰 볼륨을 Pod에 변경하는지 확인할 수도 있습니다. 또한 서비스 계정이 Pod에서 AWS IAM 역할을 가정하고 AWS SDK 작업을 성공적으로 실행할 수 있는지 확인할 수 있습니다.

9.3.1. 서비스 계정에 AWS IAM 역할 설정

AWS 클러스터의 Red Hat OpenShift Service의 서비스 계정으로 간주할 AWS Identity and Access Management(IAM) 역할을 생성합니다. 서비스 계정에 필요한 권한을 연결하여 Pod에서 AWS SDK 작업을 실행합니다.

사전 요구 사항

  • AWS 계정에 IAM 역할을 설치하고 구성하는 데 필요한 권한이 있습니다.
  • AWS STS(Security Token Service)를 사용하는 AWS 클러스터의 Red Hat OpenShift Service에 액세스할 수 있습니다. 관리자 수준 사용자 권한이 필요하지 않습니다.
  • STS 클러스터를 사용하여 AWS의 Red Hat OpenShift Service에서 서비스 계정 발행자로 구성된 OpenID Connect(OIDC) 공급자에 대한 Amazon 리소스 이름(ARN)이 있습니다.

    참고

    STS 클러스터를 사용하는 AWS의 Red Hat OpenShift Service에서 OIDC 공급자는 설치 중에 생성되며 기본적으로 서비스 계정 발행자로 설정됩니다. OIDC 공급자 ARN을 모르는 경우 클러스터 관리자에게 문의하십시오.

  • AWS CLI(aws)가 설치되어 있습니다.

절차

  1. 다음 JSON 구성을 사용하여 trust-policy.json 이라는 파일을 생성합니다.

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Federated": "<oidc_provider_arn>" 1
                },
                "Action": "sts:AssumeRoleWithWebIdentity",
                "Condition": {
                    "StringEquals": {
                        "<oidc_provider_name>:sub": "system:serviceaccount:<project_name>:<service_account_name>" 2
                    }
                }
            }
        ]
    }
    1
    < oidc_provider_arn >을 OIDC 공급자의 ARN으로 바꿉니다(예 : arn:aws::<aws_account_id>:oidc-provider/rh-oidc.s3.us-east-1.amazonaws.com/1v3r0n44npxu4g46aeohduomfres ).
    2
    지정된 프로젝트 및 서비스 계정에 역할을 제한합니다. < oidc_provider_name >을 OIDC 공급자의 이름으로 교체합니다(예: rh-oidc.s3.us-east-1.amazonaws.com/1v3r0n44n44u4g58so46aeohduomfres ). < project_name>:<service_account_name >을 프로젝트 이름 및 서비스 계정 이름으로 교체합니다(예: my-project:test-service-account ).
    참고

    또는 "< oidc_provider_name>:sub": "system:serviceaccount:<project_name>:*"을 사용하여 지정된 프로젝트 내의 모든 서비스 계정으로 역할을 제한할 수 있습니다. * 와일드카드를 제공하는 경우 StringEquals 를 이전 줄에서 StringLike 로 교체해야 합니다.

  2. trust-policy.json 파일에 정의된 신뢰 정책을 사용하는 AWS IAM 역할을 생성합니다.

    $ aws iam create-role \
        --role-name <aws_iam_role_name> \ 1
        --assume-role-policy-document file://trust-policy.json 2
    1
    & lt;aws_iam_role_name >을 IAM 역할의 이름으로 교체합니다(예: pod-identity-test-role ).
    2
    이전 단계에서 생성한 trust-policy.json 파일을 참조합니다.

    출력 예

    ROLE    arn:aws:iam::<aws_account_id>:role/<aws_iam_role_name>        2022-09-28T12:03:17+00:00       /       AQWMS3TB4Z2N3SH7675JK   <aws_iam_role_name>
    ASSUMEROLEPOLICYDOCUMENT        2012-10-17
    STATEMENT       sts:AssumeRoleWithWebIdentity   Allow
    STRINGEQUALS    system:serviceaccount:<project_name>:<service_account_name>
    PRINCIPAL       <oidc_provider_arn>

    출력에서 역할의 ARN을 유지합니다. 역할 ARN 형식은 arn:aws:iam::<aws_account_id>:role/<aws_iam_role_name >입니다.

  3. 서비스 계정이 Pod에서 AWS SDK 작업을 실행할 때 필요한 관리형 AWS 권한을 연결합니다.

    $ aws iam attach-role-policy \
        --policy-arn arn:aws:iam::aws:policy/ReadOnlyAccess \ 1
        --role-name <aws_iam_role_name> 2
    1
    이 예제의 정책은 IAM 역할에 읽기 전용 액세스 권한을 추가합니다.
    2
    & lt;aws_iam_role_name >을 이전 단계에서 생성한 IAM 역할의 이름으로 교체합니다.
  4. 선택 사항: 사용자 지정 특성 또는 권한 경계를 역할에 추가합니다. 자세한 내용은 AWS 문서의 AWS 서비스에 권한을 위임하는 역할 생성을 참조하십시오.

9.3.2. 프로젝트에서 서비스 계정 생성

사용자 정의 프로젝트에 서비스 계정을 추가합니다. 서비스 계정에서 가정할 AWS ID 및 액세스 관리(IAM) 역할의 ARM(Amazon Resource Name)을 참조하는 서비스 계정 구성에 eks.amazonaws.com/role-arn 주석을 포함합니다.

사전 요구 사항

  • 서비스 계정에 대한 AWS IAM 역할을 생성했습니다. 자세한 내용은 서비스 계정에 대한 AWS IAM 역할 설정을 참조하십시오.
  • AWS STS(Security Token Service) 클러스터를 사용하여 AWS의 Red Hat OpenShift Service에 액세스할 수 있습니다. 관리자 수준 사용자 권한이 필요하지 않습니다.
  • OpenShift CLI(oc)가 설치되어 있습니다.

절차

  1. AWS 클러스터의 Red Hat OpenShift Service에서 프로젝트를 생성합니다.

    $ oc new-project <project_name> 1
    1
    & lt;project_name >을 프로젝트 이름으로 바꿉니다. 이름은 AWS IAM 역할 구성에 지정한 프로젝트 이름과 일치해야 합니다.
    참고

    프로젝트가 생성되면 자동으로 프로젝트로 전환됩니다.

  2. 다음 서비스 계정 구성을 사용하여 test-service-account.yaml 이라는 파일을 생성합니다.

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: <service_account_name> 1
      namespace: <project_name> 2
      annotations:
        eks.amazonaws.com/role-arn: "<aws_iam_role_arn>" 3
    1
    & lt;service_account_name >을 서비스 계정 이름으로 바꿉니다. 이름은 AWS IAM 역할 구성에 지정한 서비스 계정 이름과 일치해야 합니다.
    2
    & lt;project_name >을 프로젝트 이름으로 바꿉니다. 이름은 AWS IAM 역할 구성에 지정한 프로젝트 이름과 일치해야 합니다.
    3
    서비스 계정이 Pod 내에서 사용하기 위해 가정하는 AWS IAM 역할의 ARN을 지정합니다. & lt;aws_iam_role_arn >을 서비스 계정에 대해 생성한 AWS IAM 역할의 ARN으로 바꿉니다. 역할 ARN 형식은 arn:aws:iam::<aws_account_id>:role/<aws_iam_role_name >입니다.
  3. 프로젝트에서 서비스 계정을 생성합니다.

    $ oc create -f test-service-account.yaml

    출력 예

    serviceaccount/<service_account_name> created

  4. 서비스 계정의 세부 정보를 검토합니다.

    $ oc describe serviceaccount <service_account_name> 1
    1
    & lt;service_account_name >을 서비스 계정 이름으로 바꿉니다.

    출력 예

    Name:                <service_account_name> 1
    Namespace:           <project_name> 2
    Labels:              <none>
    Annotations:         eks.amazonaws.com/role-arn: <aws_iam_role_arn> 3
    Image pull secrets:  <service_account_name>-dockercfg-rnjkq
    Mountable secrets:   <service_account_name>-dockercfg-rnjkq
    Tokens:              <service_account_name>-token-4gbjp
    Events:              <none>

    1
    서비스 계정의 이름을 지정합니다.
    2
    서비스 계정이 포함된 프로젝트를 지정합니다.
    3
    서비스 계정이 가정하는 AWS IAM 역할의 ARN에 대한 주석을 나열합니다.

9.3.3. AWS SDK 컨테이너 이미지 예제 생성

이 절차의 단계에서는 AWS SDK를 포함하는 컨테이너 이미지를 생성하는 예제 방법을 제공합니다.

예제 단계에서는 Podman을 사용하여 이미지를 호스팅할 컨테이너 이미지와 Quay.io를 생성합니다. Quay.io에 대한 자세한 내용은 Quay.io 시작하기를 참조하십시오. 컨테이너 이미지는 AWS SDK 작업을 실행할 수 있는 Pod를 배포하는 데 사용할 수 있습니다.

참고

이 예제 절차에서는 AWS Boto3 SDK for Python이 컨테이너 이미지에 설치됩니다. AWS Boto3 SDK 설치 및 사용에 대한 자세한 내용은 AWS Boto3 설명서를 참조하십시오. 다른 AWS SDK에 대한 자세한 내용은 AWS 문서의 AWS SDK 및 툴 참조 가이드를 참조하십시오.

사전 요구 사항

  • 설치 호스트에 Podman을 설치했습니다.
  • Quay.io 사용자 계정이 있습니다.

절차

  1. Containerfile 이라는 파일에 다음 구성을 추가합니다.

    FROM ubi9/ubi 1
    RUN dnf makecache && dnf install -y python3-pip && dnf clean all && pip3 install boto3>=1.15.0 2
    1
    Red Hat Universal Base Image 버전 9를 지정합니다.
    2
    pip 패키지 관리 시스템을 사용하여 AWS Boto3 SDK를 설치합니다. 이 예에서는 AWS Boto3 SDK 버전 1.15.0 이상이 설치되어 있습니다.
  2. 파일이 포함된 디렉터리에서 awsboto3sdk 라는 컨테이너 이미지를 빌드합니다.

    $ podman build -t awsboto3sdk .
  3. Quay.io에 로그인합니다.

    $ podman login quay.io
  4. Quay.io에 업로드할 준비를 위해 이미지에 태그를 지정합니다.

    $ podman tag localhost/awsboto3sdk quay.io/<quay_username>/awsboto3sdk:latest 1
    1
    &lt ;quay_username&gt;을 Quay.io 사용자 이름으로 교체합니다.
  5. 태그된 컨테이너 이미지를 Quay.io로 푸시합니다.

    $ podman push quay.io/<quay_username>/awsboto3sdk:latest 1
    1
    &lt ;quay_username&gt;을 Quay.io 사용자 이름으로 교체합니다.
  6. 이미지가 public으로 포함된 Quay.io 리포지토리를 만듭니다. 이렇게 하면 AWS 클러스터의 Red Hat OpenShift Service에 Pod를 배포하는 데 사용할 수 있도록 이미지가 게시됩니다.

    1. https://quay.io/ 에서 이미지가 포함된 리포지토리의 리포지토리 설정 페이지로 이동합니다.
    2. Make Public 을 클릭하여 리포지토리를 공개하도록 합니다.

9.3.4. AWS SDK를 포함하는 Pod 배포

AWS SDK가 포함된 컨테이너 이미지에서 사용자 정의 프로젝트에 Pod를 배포합니다. Pod 구성에서 eks.amazonaws.com/role-arn 주석이 포함된 서비스 계정을 지정합니다.

Pod에 대한 서비스 계정 참조를 사용하면 Pod ID Webhook에서 AWS 환경 변수, 볼륨 마운트 및 토큰 볼륨을 Pod에 삽입합니다. Pod 변경을 사용하면 서비스 계정에서 Pod에서 AWS IAM 역할을 자동으로 가정할 수 있습니다.

사전 요구 사항

  • 서비스 계정에 대한 AWS IAM(Identity and Access Management) 역할이 생성되어 있습니다. 자세한 내용은 서비스 계정에 대한 AWS IAM 역할 설정을 참조하십시오.
  • AWS STS(Security Token Service)를 사용하는 AWS 클러스터의 Red Hat OpenShift Service에 액세스할 수 있습니다. 관리자 수준 사용자 권한이 필요하지 않습니다.
  • OpenShift CLI(oc)가 설치되어 있습니다.
  • 서비스 계정에서 가정할 IAM 역할에 대한 Amazon Resource Name(ARN)을 참조하는 eks.amazonaws.com/role-arn 주석이 포함된 프로젝트에 서비스 계정을 생성했습니다.
  • AWS SDK가 포함된 컨테이너 이미지가 있고 해당 이미지를 클러스터에서 사용할 수 있습니다. 자세한 단계는 AWS SDK 컨테이너 이미지 예제를 참조하십시오.

    참고

    이 예제 절차에서는 AWS Boto3 SDK for Python을 사용합니다. AWS Boto3 SDK 설치 및 사용에 대한 자세한 내용은 AWS Boto3 설명서를 참조하십시오. 다른 AWS SDK에 대한 자세한 내용은 AWS 문서의 AWS SDK 및 툴 참조 가이드를 참조하십시오.

절차

  1. 다음 Pod 구성을 사용하여 awsboto3sdk-pod.yaml 이라는 파일을 생성합니다.

    apiVersion: v1
    kind: Pod
    metadata:
      namespace: <project_name> 1
      name: awsboto3sdk 2
    spec:
      securityContext:
        runAsNonRoot: true
        seccompProfile:
          type: RuntimeDefault
      serviceAccountName: <service_account_name> 3
      containers:
      - name: awsboto3sdk
        image: quay.io/<quay_username>/awsboto3sdk:latest 4
        command:
        - /bin/bash
        - "-c"
        - "sleep 100000" 5
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop: [ALL]
      terminationGracePeriodSeconds: 0
      restartPolicy: Never
    1
    & lt;project_name >을 프로젝트 이름으로 바꿉니다. 이름은 AWS IAM 역할 구성에 지정한 프로젝트 이름과 일치해야 합니다.
    2
    pod 이름을 지정합니다.
    3
    & lt;service_account_name >을 AWS IAM 역할을 가정하도록 구성된 서비스 계정 이름으로 교체합니다. 이름은 AWS IAM 역할 구성에 지정한 서비스 계정 이름과 일치해야 합니다.
    4
    awsboto3sdk 컨테이너 이미지의 위치를 지정합니다. &lt ;quay_username&gt;을 Quay.io 사용자 이름으로 교체합니다.
    5
    이 예제 Pod 구성에서는 이 줄에서 100000초 동안 Pod를 실행하여 Pod에서 직접 검증 테스트를 수행할 수 있습니다. 자세한 확인 단계는 Pod에서 가정된 IAM 역할 확인을 참조하십시오.
  2. awsboto3sdk Pod를 배포합니다.

    $ oc create -f awsboto3sdk-pod.yaml

    출력 예

    pod/awsboto3sdk created

9.3.5. Pod에서 가정된 IAM 역할 확인

프로젝트에 awsboto3sdk Pod를 배포한 후 Pod ID Webhook에서 Pod를 변경했는지 확인합니다. 필요한 AWS 환경 변수, 볼륨 마운트 및 OIDC 토큰 볼륨이 Pod 내에 있는지 확인합니다.

Pod에서 AWS SDK 작업을 실행할 때 서비스 계정이 AWS 계정에 대해 IAM(Identity and Access Management) 역할을 가정하는지 확인할 수도 있습니다.

사전 요구 사항

  • 서비스 계정에 대한 AWS IAM 역할을 생성했습니다. 자세한 내용은 서비스 계정에 대한 AWS IAM 역할 설정을 참조하십시오.
  • AWS STS(Security Token Service)를 사용하는 AWS 클러스터의 Red Hat OpenShift Service에 액세스할 수 있습니다. 관리자 수준 사용자 권한이 필요하지 않습니다.
  • OpenShift CLI(oc)가 설치되어 있습니다.
  • 서비스 계정에서 가정할 IAM 역할에 대한 Amazon Resource Name(ARN)을 참조하는 eks.amazonaws.com/role-arn 주석이 포함된 프로젝트에 서비스 계정을 생성했습니다.
  • AWS SDK가 포함된 사용자 정의 프로젝트에 Pod를 배포했습니다. Pod는 Pod ID Webhook를 사용하여 AWS SDK 작업을 실행하는 데 필요한 AWS IAM 역할을 가정하는 서비스 계정을 참조합니다. 자세한 단계는 AWS SDK가 포함된 Pod 배포를 참조하십시오.

    참고

    이 예제 절차에서는 AWS Boto3 SDK for Python을 포함하는 Pod를 사용합니다. AWS Boto3 SDK 설치 및 사용에 대한 자세한 내용은 AWS Boto3 설명서를 참조하십시오. 다른 AWS SDK에 대한 자세한 내용은 AWS 문서의 AWS SDK 및 툴 참조 가이드를 참조하십시오.

절차

  1. AWS 환경 변수, 볼륨 마운트 및 OIDC 토큰 볼륨이 배포된 awsboto3sdk Pod 설명에 나열되어 있는지 확인합니다.

    $ oc describe pod awsboto3sdk

    출력 예

    Name:         awsboto3sdk
    Namespace:    <project_name>
    ...
    Containers:
      awsboto3sdk:
        ...
        Environment:
          AWS_ROLE_ARN:                 <aws_iam_role_arn> 1
          AWS_WEB_IDENTITY_TOKEN_FILE:  /var/run/secrets/eks.amazonaws.com/serviceaccount/token 2
        Mounts:
          /var/run/secrets/eks.amazonaws.com/serviceaccount from aws-iam-token (ro) 3
    ...
    Volumes:
      aws-iam-token: 4
        Type:                    Projected (a volume that contains injected data from multiple sources)
        TokenExpirationSeconds:  86400
    ...

    1
    Pod ID Webhook에서 Pod에 삽입한 AWS_ROLE_ARN 환경 변수를 나열합니다. 변수에는 서비스 계정에서 가정하는 AWS IAM 역할의 ARN이 포함되어 있습니다.
    2
    Pod ID Webhook에서 Pod에 삽입한 AWS__IDENTITY_TOKEN_FILE 환경 변수를 나열합니다. 변수에는 서비스 계정 ID를 확인하는 데 사용되는 OIDC 토큰의 전체 경로가 포함됩니다.
    3
    Pod ID 웹 후크를 통해 Pod에 삽입된 볼륨 마운트를 나열합니다.
    4
    /var/run/secrets/eks.amazonaws.com/serviceaccount 마운트 지점에 마운트된 aws-iam-token 볼륨을 나열합니다. 볼륨에는 AWS IAM 역할을 가정하기 위해 서비스 계정을 인증하는 데 사용되는 OIDC 토큰이 포함되어 있습니다.
  2. awsboto3sdk Pod에서 대화형 터미널을 시작합니다.

    $ oc exec -ti awsboto3sdk -- /bin/sh
  3. Pod의 대화형 터미널에서 Pod ID 웹 후크에 의해 $AWS_ROLE_ARN 환경 변수가 Pod로 변경되었는지 확인합니다.

    $ echo $AWS_ROLE_ARN

    출력 예

    arn:aws:iam::<aws_account_id>:role/<aws_iam_role_name> 1

    1
    출력은 AWS SDK 작업을 실행하는 데 필요한 권한이 있는 AWS IAM 역할의 ARN을 지정해야 합니다.
  4. Pod의 대화형 터미널에서 $AWS_ please_IDENTITY_TOKEN_FILE 환경 변수가 Pod ID 웹 후크에 의해 Pod로 변경되었는지 확인합니다.

    $ echo $AWS_WEB_IDENTITY_TOKEN_FILE

    출력 예

    /var/run/secrets/eks.amazonaws.com/serviceaccount/token 1

    1
    출력은 서비스 계정의 OIDC 토큰까지 Pod의 전체 경로를 지정해야 합니다.
  5. Pod의 대화형 터미널에서 OIDC 토큰 파일을 포함하는 aws-iam-token 볼륨 마운트가 Pod ID 웹 후크에 의해 마운트되었는지 확인합니다.

    $ mount | grep -is 'eks.amazonaws.com'

    출력 예

    tmpfs on /run/secrets/eks.amazonaws.com/serviceaccount type tmpfs (ro,relatime,seclabel,size=13376888k)

  6. Pod의 대화형 터미널에서 token 이라는 OIDC 토큰 파일이 /var/run/secrets/eks.amazonaws.com/serviceaccount/ 마운트 지점에 있는지 확인합니다.

    $ ls /var/run/secrets/eks.amazonaws.com/serviceaccount/token

    출력 예

    /var/run/secrets/eks.amazonaws.com/serviceaccount/token 1

    1
    Pod ID 웹 후크에 의해 Pod에 마운트된 aws-iam-token 볼륨의 OIDC 토큰 파일입니다. 토큰은 AWS에서 서비스 계정의 ID를 인증하는 데 사용됩니다.
  7. Pod에서 AWS Boto3 SDK 작업이 성공적으로 실행되는지 확인합니다.

    1. Pod의 대화형 터미널에서 Python 3 쉘을 시작합니다.

      $ python3
    2. Python 3 쉘에서 boto3 모듈을 가져옵니다.

      >>> import boto3
    3. Boto3 s3 서비스 리소스를 포함하는 변수를 생성합니다.

      >>> s3 = boto3.resource('s3')
    4. AWS 계정에 있는 모든 S3 버킷의 이름을 출력합니다.

      >>> for bucket in s3.buckets.all():
      ...     print(bucket.name)
      ...

      출력 예

      <bucket_name>
      <bucket_name>
      <bucket_name>
      ...

      서비스 계정이 AWS IAM 역할로 가정하면 출력에 AWS 계정에서 사용할 수 있는 모든 S3 버킷이 나열됩니다.

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.