AWS

[IAM] default profile과 EC2Role 함께 사용하기

비번변경 2022. 9. 4. 23:46

개요

AWS EC2의 특정 사용자에게 default profile을 등록해두었다. 그런데 같은 사용자로 EC2 Role을 이용해 AWS를 조작해야 하는 상황이 생겼다.

다만 AWS에서 자격 증명을 확인하는 순서는 아래와 같다.

  1. CLI 실행 시의 옵션 : 파라미터로 지정한 --region, --output, --profile 옵션
  2. 환경 변수 : 시스템의 환경 변수
  3. ~/.aws/credential (Linux 기준)
  4. ~/.aws/config (Linux 기준)
  5. 컨테이너 자격 증명 : ECS에 연결된 IAM Role
  6. EC2 인스턴스 프로파일 보안 인증 : EC2에 연결된 IAM Role

즉, EC2에 연결된 Role의 적용 우선순위가 가장 낮기 때문에 default profile을 설정하면 Role에 접근할 수 없게 된다.

 

이 글에서는 AWS CLI 사용 시 EC2 Role을 지정할 수 있도록 profile을 등록하는 방법을 정리해둔다.

 

 

테스트 환경

1. EC2의 ubuntu 계정에 default profile을 등록한다. default profile엔 AmazonEC2FullAccess 정책만 허용한다.

2. EC2에 Role을 연결한다. 연결한 Role에는 AmazonS3FullAccess 정책을 허용한다.

 

AWS CLI로 ec2, s3 명령 실행 시 아래와 같이 동작하면 된다.

# 명령어 예시
aws ec2 describe-instances --query Reservations[*].Instances[*].PublicDnsName --output text
aws s3 ls

권한 확인

 

 

방법 1. EC2 메타데이터 profile 생성

공식 문서 중 Amazon EC2 인스턴스 메타데이터의 자격 증명 사용에 의하면 credentials 또는 config 파일에 role_arn 값을 지정하여 profile을 생성하면 된다고 한다.

 

profile 예시는 아래와 같다.

[profile profilename]
role_arn = <arn:aws:iam::123456789012:role/rolename>
credential_source = Ec2InstanceMetadata
region = <region>

# 예시
[profile ec2Role]
role_arn = arn:aws:iam::123456789012:role/role-test
credential_source = Ec2InstanceMetadata
region = ap-northeast-2

값을 추가 후 ec2Role profile을 사용해 s3 ls가 동작하는지 확인해봤지만, 아래와 같은 메시지와 함께 실행되지 않았다.

$ aws s3 ls --profile ec2Role

An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:sts::123456789012:assumed-role/role-test/i-0a45cd50e80000000 is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::123456789012:role/role-test

정확히는 알 수 없지만 sts role-test/ec2_instance 사용자가 role에 대해 sts:AssumeRole이라는 동작을 실행할 권한이 없는 것 같다.

코멘트로 알게된 내용을 추가한다.

ec2InstanceMetadata를 이용한 role_arn 지정 시에는 EC2 인스턴스에 연결된 Role이 아닌 AssumeRole을 통한 역할 전환으로 인식된다.

EC2에 role을 연결하면 role에 대한 AssumeRole 권한은 부여되지만, Role은 EC2에 대한 신뢰 관계가 없어서 발생하는 현상인 것으로 보인다. 이런 경우에는 role에 신뢰 정책을 추가하면 된다.

ec2에서 사용하는 것을 전제로 하여 role을 생성했을 경우, 기본 신뢰 정책은 아래와 같다.

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Principal": {
				"Service": "ec2.amazonaws.com"
            },
			"Action": "sts:AssumeRole"
		}
	]
}

이 정책의 Statement.Principal에 sts 사용자를 추가한다.

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Principal": {
				"Service": "ec2.amazonaws.com",
				"AWS": "arn:aws:sts::123456789012:assumed-role/role-test/i-0a45cd50e80000000"
			},
			"Action": "sts:AssumeRole"
		}
	]
}

신뢰 정책 적용 후 s3 ls를 재실행하면 이상 없이 동작한다.

EC2 메타데이터 profile

 

 

방법 2. 빈 profile 생성

~/.aws/credential 또는 ~/.aws/config에 빈 profile을 생성한다. profile 이름만 지정하면 된다.

[default]
aws_access_key_id = KEY
aws_secret_access_key = KEY

[ec2Role]

ec2Role profile을 사용하여 s3 ls 명령이 동작하는지 확인한다.

aws s3 ls --profile <PROFILE_NAME>

# 예시
aws s3 ls --profile ec2Role

빈 profile 생성

이상 없이 동작하는 모습을 확인할 수 있다.

 

 

2가지 방법 중 보다 적절한 방법을 선택하면 될 것 같다.

 

 

참고 문서

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-configure-metadata.html

https://medium.com/@ngocson2vn/how-to-fix-the-error-an-error-occurred-accessdenied-when-calling-the-assumerole-operation-e85f0152daca

https://aws.amazon.com/ko/premiumsupport/knowledge-center/iam-assume-role-error/