GitLab 차트를 사용할 때 AWS의 IAM 역할
차트에서 외부 객체 저장에 대한 기본 구성은 액세스 및 비밀 키를 사용합니다.
또한 kube2iam
, kiam
, 또는 IRSA와 결합하여 IAM 역할을 사용할 수도 있습니다.
IAM 역할
IAM 역할은 S3 버킷에 대한 읽기, 쓰기 및 목록 권한이 필요합니다.
버킷당 역할을 할당하거나 이들을 결합할 수 있습니다.
차트 구성
IAM 역할은 아래 지정된 주석을 추가하고 시크릿을 변경하여 지정할 수 있습니다.
레지스트리
IAM 역할은 다음과 같이 주석 키를 통해 지정할 수 있습니다.
--set registry.annotations."iam\.amazonaws\.com/role"=<role name>
registry-storage.yaml
시크릿을 생성할 때, 액세스 및 비밀 키를 생략하세요.
s3:
bucket: gitlab-registry
v4auth: true
region: us-east-1
참고: 키 쌍을 제공하는 경우 IAM 역할은 무시됩니다. 자세한 내용은 AWS 문서를 참조하세요.
LFS, Artifacts, Uploads, Packages
LFS, artifacts, uploads 및 packages에 대해 IAM 역할은 webservice
및 sidekiq
구성의 주석 키를 통해 지정할 수 있습니다.
--set gitlab.sidekiq.annotations."iam\.amazonaws\.com/role"=<role name>
--set gitlab.webservice.annotations."iam\.amazonaws\.com/role"=<role name>
object-storage.yaml
시크릿을 생성할 때, 액세스 및 비밀 키를 생략하세요. GitLab Rails 코드베이스가 S3 저장소에 대해 Fog를 사용하기 때문에 Fog가 역할을 사용하도록 하려면 use_iam_profile
키를 추가해야 합니다.
provider: AWS
use_iam_profile: true
region: us-east-1
참고: 이 구성에 endpoint
를 포함하지 마세요.
IRSA는 특수화된 엔드포인트를 사용하는 STS 토큰을 사용합니다.
endpoint
가 제공되면 AWS 클라이언트는 이 엔드포인트로 ‘AssumeRoleWithWebIdentity’ 메시지를 전송하려고 시도하고 실패합니다.
백업
Toolbox 구성을 사용하여 주석을 설정하여 S3로 백업을 업로드할 수 있습니다.
--set gitlab.toolbox.annotations."iam\.amazonaws\.com/role"=<role name>
s3cmd.config
시크릿을 생성할 때, 액세스 및 비밀 키를 생략하세요.
[default]
bucket_location = us-east-1
서비스 계정에 IAM 역할 사용
AWS EKS 클러스터(버전 1.14 이상)에서 GitLab을 실행하는 경우, 액세스 토큰을 생성하거나 저장하지 않고 S3 객체 저장소에 인증하기 위해 AWS IAM 역할을 사용할 수 있습니다. EKS 클러스터에서 IAM 역할을 사용하는 자세한 내용은 AWS의 Introducing fine-grained IAM roles for service accounts 문서에서 확인할 수 있습니다.
이 Helm 차트에서 Role에 대한 적절한 IRSA 주석을 적용하려면 두 가지 방법 중 한 가지를 사용할 수 있습니다:
- 상기 AWS 문서에서 설명한 대로 미리 생성된 ServiceAccounts. 이를 통해 올바른 주석이 ServiceAccount와 연결된 OIDC 제공자에 설정됩니다.
- 정의된 주석을 가진 Chart에서 생성된 ServiceAccounts. 우리는 ServiceAccounts에 대한 전역 및 차트별 주석 설정을 허용합니다.
EKS 클러스터의 ServiceAccount에 IAM 역할을 사용하려면 특정 주석을 eks.amazonaws.com/role-arn: arn:aws:iam::<ACCOUNT_ID>:role/<IAM_ROLE_NAME>
으로 지정해야 합니다.
AWS EKS 클러스터에서 GitLab을 실행하는 서비스 계정에 IAM 역할을 사용하려면 IAM roles for service accounts의 지침에 따르세요.
미리 생성된 서비스 계정 사용
GitLab 차트를 배포할 때 다음 옵션을 설정하세요.
ServiceAccount가 활성화되지만 생성되지는 않는다는 점이 중요합니다.
global:
serviceAccount:
enabled: true
create: false
name: <SERVICE ACCT NAME>
세밀한 ServiceAccount 제어도 가능합니다:
registry:
serviceAccount:
create: false
name: gitlab-registry
gitlab:
migrations:
serviceAccount:
create: false
name: gitlab-migrations
webservice:
serviceAccount:
create: false
name: gitlab-webservice
sidekiq:
serviceAccount:
create: false
name: gitlab-sidekiq
toolbox:
serviceAccount:
create: false
name: gitlab-toolbox
IAM 역할의 신뢰 정책이 이러한 Kubernetes 서비스 계정을 신뢰하도록 구성되어 있는지 확인하세요.
차트 소유의 서비스 계정 사용
eks.amazonaws.com/role-arn
주석은 GitLab 소유의 차트에서 생성된 모든 ServiceAccount에 적용할 수 있습니다. 이를 위해 global.serviceAccount.annotations
를 구성하세요.
global:
serviceAccount:
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::xxxxxxxxxxxx:role/name
주석은 각 ServiceAccount마다 추가할 수도 있으며, 각 차트에 해당하는 일치하는 정의를 추가하세요. 이들은 동일한 역할이거나 개별 역할일 수 있습니다.
registry:
serviceAccount:
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::xxxxxxxxxxxx:role/gitlab-registry
gitlab:
migrations:
serviceAccount:
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::xxxxxxxxxxxx:role/gitlab
webservice:
serviceAccount:
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::xxxxxxxxxxxx:role/gitlab
sidekiq:
serviceAccount:
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::xxxxxxxxxxxx:role/gitlab
toolbox:
serviceAccount:
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::xxxxxxxxxxxx:role/gitlab-toolbox
문제 해결
IAM 역할이 올바르게 설정되었는지, GitLab이 IAM 역할을 사용하여 S3에 액세스하는지 테스트할 수 있습니다. 이를 위해 toolbox
팟에 로그인하여 awscli
를 사용해야 합니다(<namespace>
을 GitLab이 설치된 네임스페이스로 대체):
kubectl exec -ti $(kubectl get pod -n <namespace> -lapp=toolbox -o jsonpath='{.items[0].metadata.name}') -n <namespace> -- bash
awscli
패키지가 설치된 상태에서 AWS API와 통신할 수 있는지 확인합니다:
aws sts get-caller-identity
AWS API 연결에 성공했다면, 임시 사용자 ID, 계정 번호 및 IAM ARN(이는 S3에 액세스하기 위해 사용되는 IAM ARN이 아닙니다)을 표시하는 정상적인 응답이 반환됩니다. 연결에 실패한 경우, toolbox
팟이 AWS API와 통신할 수 없는 이유를 찾기 위해 더 많은 문제 해결이 필요합니다.
AWS API에 연결하는 것이 성공적이라면, 다음 명령어가 생성된 IAM 역할을 가정하고 S3에 액세스할 수 있는지 확인합니다. AWS_ROLE_ARN
및 AWS_WEB_IDENTITY_TOKEN_FILE
변수는 팟에 IAM 역할 주석이 추가되었을 때 환경에 정의되며, 별도로 정의할 필요가 없습니다.
aws sts assume-role-with-web-identity --role-arn $AWS_ROLE_ARN --role-session-name gitlab --web-identity-token file://$AWS_WEB_IDENTITY_TOKEN_FILE
IAM 역할을 가정할 수 없는 경우, 다음과 유사한 오류 메시지가 표시됩니다:
An error occurred (AccessDenied) when calling the AssumeRoleWithWebIdentity operation: Not authorized to perform sts:AssumeRoleWithWebIdentity
그렇지 않으면, STS 자격 증명 및 IAM 역할 정보가 표시됩니다.
WebIdentityErr: failed to retrieve credentials
로그에서 이 오류가 표시된다면, 이는 object-storage.yaml
시크릿에 endpoint
가 구성되었음을 나타냅니다. 이 설정을 제거하고 webservice
및 sidekiq
팟을 다시 시작해야 합니다.