9.3. 자체 Pod에서 AWS IAM 역할을 가정
이 섹션의 절차에 따라 서비스 계정이 사용자 정의 프로젝트에 배포된 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
)가 설치되어 있습니다.
절차
다음 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
로 교체해야 합니다.
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
출력 예
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
>입니다.서비스 계정이 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
- 선택 사항: 사용자 지정 특성 또는 권한 경계를 역할에 추가합니다. 자세한 내용은 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
)가 설치되어 있습니다.
절차
AWS 클러스터의 Red Hat OpenShift Service에서 프로젝트를 생성합니다.
$ oc new-project <project_name> 1
- 1
- &
lt;project_name
>을 프로젝트 이름으로 바꿉니다. 이름은 AWS IAM 역할 구성에 지정한 프로젝트 이름과 일치해야 합니다.
참고프로젝트가 생성되면 자동으로 프로젝트로 전환됩니다.
다음 서비스 계정 구성을 사용하여
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
>입니다.
프로젝트에서 서비스 계정을 생성합니다.
$ oc create -f test-service-account.yaml
출력 예
serviceaccount/<service_account_name> created
서비스 계정의 세부 정보를 검토합니다.
$ 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>
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 사용자 계정이 있습니다.
절차
Containerfile
이라는 파일에 다음 구성을 추가합니다.FROM ubi9/ubi 1 RUN dnf makecache && dnf install -y python3-pip && dnf clean all && pip3 install boto3>=1.15.0 2
파일이 포함된 디렉터리에서
awsboto3sdk
라는 컨테이너 이미지를 빌드합니다.$ podman build -t awsboto3sdk .
Quay.io에 로그인합니다.
$ podman login quay.io
Quay.io에 업로드할 준비를 위해 이미지에 태그를 지정합니다.
$ podman tag localhost/awsboto3sdk quay.io/<quay_username>/awsboto3sdk:latest 1
- 1
- <
;quay_username>
;을 Quay.io 사용자 이름으로 교체합니다.
태그된 컨테이너 이미지를 Quay.io로 푸시합니다.
$ podman push quay.io/<quay_username>/awsboto3sdk:latest 1
- 1
- <
;quay_username>
;을 Quay.io 사용자 이름으로 교체합니다.
이미지가 public으로 포함된 Quay.io 리포지토리를 만듭니다. 이렇게 하면 AWS 클러스터의 Red Hat OpenShift Service에 Pod를 배포하는 데 사용할 수 있도록 이미지가 게시됩니다.
- https://quay.io/ 에서 이미지가 포함된 리포지토리의 리포지토리 설정 페이지로 이동합니다.
- 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 및 툴 참조 가이드를 참조하십시오.
절차
다음 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
컨테이너 이미지의 위치를 지정합니다. <quay_username>
;을 Quay.io 사용자 이름으로 교체합니다.- 5
- 이 예제 Pod 구성에서는 이 줄에서 100000초 동안 Pod를 실행하여 Pod에서 직접 검증 테스트를 수행할 수 있습니다. 자세한 확인 단계는 Pod에서 가정된 IAM 역할 확인을 참조하십시오.
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 및 툴 참조 가이드를 참조하십시오.
절차
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 토큰이 포함되어 있습니다.
awsboto3sdk
Pod에서 대화형 터미널을 시작합니다.$ oc exec -ti awsboto3sdk -- /bin/sh
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을 지정해야 합니다.
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의 전체 경로를 지정해야 합니다.
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)
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를 인증하는 데 사용됩니다.
Pod에서 AWS Boto3 SDK 작업이 성공적으로 실행되는지 확인합니다.
Pod의 대화형 터미널에서 Python 3 쉘을 시작합니다.
$ python3
Python 3 쉘에서
boto3
모듈을 가져옵니다.>>> import boto3
Boto3
s3
서비스 리소스를 포함하는 변수를 생성합니다.>>> s3 = boto3.resource('s3')
AWS 계정에 있는 모든 S3 버킷의 이름을 출력합니다.
>>> for bucket in s3.buckets.all(): ... print(bucket.name) ...
출력 예
<bucket_name> <bucket_name> <bucket_name> ...
서비스 계정이 AWS IAM 역할로 가정하면 출력에 AWS 계정에서 사용할 수 있는 모든 S3 버킷이 나열됩니다.