EC2 인스턴스 안의 프로그램이 S3나 다른 AWS 서비스를 호출해야 할 때, 액세스 키를 인스턴스에 저장하지 않고 IAM 역할을 연결하는 방법이 있습니다. 이 글에서는 IAM 콘솔에서 역할을 만들고, EC2 시작 화면에서 그 역할을 연결하고, 결과를 읽은 뒤 모두 삭제합니다.
준비물
| 항목 | 내용 |
|---|---|
| AWS 계정 | 실습용 IAM 사용자. IAM 역할 생성과 삭제, EC2 시작과 종료 권한 필요 |
| 리전 | 아시아 태평양(서울) ap-northeast-2. IAM은 리전과 무관한 글로벌 서비스 |
| 인스턴스 | t3.micro 한 대 |
| 예상 소요 시간 | 약 20분 |
이 글은 인스턴스에 접속하지 않습니다. 키 페어는 만들지 않았고, 보안 그룹의 인바운드는 모두 닫았습니다. 화면의 계정 ID와 사용자 이름, ARN은 가렸습니다.
입력할 값
| 화면 | 항목 | 입력값 |
|---|---|---|
| 역할 생성 1단계 | 신뢰할 수 있는 엔터티 유형 | AWS 서비스 |
| 역할 생성 1단계 | 서비스 또는 사용 사례 | EC2 |
| 역할 생성 2단계 | 권한 정책 | AmazonS3ReadOnlyAccess |
| 역할 생성 3단계 | 역할 이름 | cr-demo-ec2-s3-read-role |
| EC2 시작 | 이름 | cr-demo-role-ec2 |
| EC2 시작 | 키 페어 | 목록을 열어 키 페어 없이 계속 진행을 직접 선택 |
| EC2 시작 | 네트워크와 서브넷 | 이 글은 이 계정의 비공개 서브넷을 썼습니다. 퍼블릭 IP 자동 할당은 비활성이었습니다 |
| EC2 시작 | 방화벽(보안 그룹) | 보안 그룹 생성, SSH 트래픽 허용 해제 |
| EC2 시작 | 고급 세부 정보의 IAM 인스턴스 프로파일 | cr-demo-ec2-s3-read-role |
1. 신뢰할 수 있는 엔터티 선택
IAM 콘솔 왼쪽 메뉴의 역할에서 역할 생성을 누릅니다. 1단계에서 엔터티 유형은 AWS 서비스가 기본으로 선택돼 있습니다. 아래 서비스 또는 사용 사례 칸을 열고 EC2를 입력해 고릅니다.

EC2를 고르면 사용 사례 목록이 나오고, EC2(EC2 인스턴스가 사용자를 대신해 AWS 서비스를 호출하도록 허용)가 기본으로 선택됩니다. 다음을 누릅니다.
2. 권한 정책 붙이기
2단계 권한 추가에서는 기존 정책 사용이 기본입니다. 검색 칸에 AmazonS3ReadOnlyAccess를 입력하고 Enter를 누르면 한 건이 나옵니다. 체크박스를 선택하고 왼쪽의 +를 누르면 정책 JSON이 펼쳐집니다.

이 관리형 정책의 설명은 콘솔에서 모든 버킷을 읽기 전용으로 접근하도록 허용한다는 내용입니다. 허용 동작은 s3:Get*, s3:List*, s3:Describe*와 s3-object-lambda의 Get*, List*입니다. 쓰기 동작(s3:Put*, s3:Delete*)은 포함돼 있지 않습니다. 화면에는 JSON의 앞부분만 보이고, 대상(Resource)이 모든 리소스(*)라는 점과 허용 동작 목록은 AWS 문서의 정책 설명(AmazonS3ReadOnlyAccess 관리형 정책 참조 페이지)을 근거로 적었습니다. 설명 문구는 콘솔이라고 되어 있지만 권한은 API 호출에도 적용됩니다. 대상이 계정의 모든 버킷이므로, 운영 환경에서는 특정 버킷으로 좁힌 정책을 따로 만드는 편이 안전합니다. 다음을 누릅니다.
3. 이름 지정과 신뢰 정책 읽기
3단계에서 역할 이름에 cr-demo-ec2-s3-read-role을 입력합니다. 설명 칸에는 Allows EC2 instances to call AWS services on your behalf.가 미리 들어 있었고 그대로 두었습니다.

아래로 내려가면 신뢰 정책이 있습니다. 이 정책은 누가 역할을 맡을 수 있는지를 정합니다.
| 필드 | 값 | 의미 |
|---|---|---|
Effect |
Allow |
허용 |
Action |
sts:AssumeRole |
역할을 맡는 동작 |
Principal.Service |
ec2.amazonaws.com |
EC2 서비스가 이 역할을 맡을 수 있음 |
신뢰 정책은 누가 역할을 맡을지, 권한 정책은 맡은 뒤 무엇을 할 수 있는지를 정합니다. 신뢰 정책만 있으면 역할을 맡을 수는 있어도 할 수 있는 일이 없습니다. 화면 맨 아래에서 역할 생성을 누릅니다.

생성 직후 역할 요약에는 ARN과 함께 인스턴스 프로파일 ARN이 있습니다. 콘솔에서 EC2용 역할을 만들면 같은 이름의 인스턴스 프로파일이 함께 만들어졌습니다. 인스턴스에는 역할이 아니라 이 인스턴스 프로파일이 연결됩니다. 권한 정책 열에는 AmazonS3ReadOnlyAccess 한 줄이 있습니다.
4. 인스턴스에 역할 연결
EC2 콘솔의 인스턴스 시작을 엽니다. 이름에 cr-demo-role-ec2를 입력하고, AMI와 인스턴스 유형은 기본값(Amazon Linux, t3.micro)으로 둡니다. 키 페어는 목록에서 키 페어 없이 계속 진행을 직접 고릅니다. 보안 그룹은 새로 만들고 SSH 허용 체크를 해제했습니다. 이 단계의 자세한 입력은 EC2 글과 같습니다.
화면 아래의 고급 세부 정보를 펼치면 IAM 인스턴스 프로파일 칸이 있습니다. 목록을 열면 방금 만든 cr-demo-ec2-s3-read-role 하나가 나옵니다.

선택하고 인스턴스 시작을 누릅니다.
5. 연결 결과 읽기
인스턴스 요약 화면에서 IAM 역할 항목을 찾습니다.

IAM 역할에 만든 역할 이름이 표시됐고 IMDSv2는 Required였습니다. IMDSv2 값은 AMI 기본값에 따라 다를 수 있습니다. 보안 탭에서도 같은 역할을 볼 수 있습니다.

이 글은 인스턴스에 접속하지 않아 역할로 실제 S3를 읽는 것까지는 확인하지 않았습니다. AWS 문서 기준으로 인스턴스 안의 프로그램은 인스턴스 메타데이터 서비스에서 이 역할의 임시 자격 증명을 받아 쓰며, 액세스 키를 파일에 저장하지 않아도 됩니다.
6. 정리: 인스턴스, 역할, 보안 그룹 삭제
이 글에서는 인스턴스 종료, 역할 삭제, 보안 그룹 삭제 순서로 진행했습니다. 보안 그룹은 인스턴스를 종료한 뒤에 삭제했고, 역할 삭제에는 순서 제약을 겪지 않았습니다.
인스턴스 종료
인스턴스 상태 메뉴에서 인스턴스 종료(삭제)를 엽니다.

대상이 이 글에서 만든 인스턴스 하나인지 확인하고 종료(삭제)를 누릅니다. 약 1분 뒤 인스턴스 목록에서 상태가 종료됨으로 바뀐 것을 확인했습니다.
역할 삭제
IAM 콘솔에서 역할 이름을 열고 오른쪽 위의 삭제를 누릅니다.

대화상자는 역할을 삭제하면 인라인 정책과 연결된 인스턴스 프로파일도 삭제된다고 안내합니다. 확인 칸에 역할 이름을 입력해야 삭제 단추가 켜집니다.

보안 그룹 삭제
EC2 시작 화면이 만든 launch-wizard-1 보안 그룹은 인스턴스를 종료해도 남습니다. 보안 그룹 화면에서 삭제 대화상자의 대상이 이 그룹 하나인지 확인하고 삭제합니다. 이 글에서는 삭제 뒤 목록에 default만 남았습니다.
자주 막히는 곳
| 증상 | 확인할 것 |
|---|---|
| IAM 인스턴스 프로파일 목록에 역할이 없음 | 목록 옆 새로고침을 누릅니다. 이 글에서는 역할을 만든 뒤 시작 화면을 열었을 때 목록에 있었습니다 |
| 역할 삭제 대화상자의 삭제가 비활성임 | 확인 칸에 역할 이름을 정확히 입력해야 켜집니다 |
| 사용 사례에 EC2가 여러 개 보임 | EC2 한 줄과 EC2 Role for AWS Systems Manager 등이 따로 있습니다. 이 글은 첫 번째 EC2를 골랐습니다 |
| 보안 그룹이 남아 있음 | 시작 화면이 만든 launch-wizard-1은 인스턴스 종료로 지워지지 않았습니다. 따로 삭제합니다 |
이어서 해 볼 것
- 정책을 계정의 모든 버킷이 아니라 특정 버킷 하나만 읽도록 직접 JSON으로 만들어 보기
- 실행 중인 인스턴스에서 역할을 바꾸거나 떼어 보기(요금과 권한 변경이 있으니 실습 계정에서만)
- AWS IAM 정책 시뮬레이터 글로 이 역할의 권한이 허용하는 동작 확인하기
확인 범위
- 확인한 것: 서울 리전 콘솔(한국어 화면)에서 위 설정으로 EC2용 역할을 만들고, 인스턴스에 연결하고, 요약과 보안 탭에서 역할을 읽고, 인스턴스, 역할, 보안 그룹을 삭제하는 과정을 실제로 수행했습니다. 역할을 만든 뒤 목록은 41개였고(화면 캡처는 첨부하지 않았습니다) 삭제 뒤 40개로 돌아왔으며 보안 그룹 목록에는 default만 남았습니다.
- 확인하지 못한 것: 인스턴스에 접속하지 않아 역할의 임시 자격 증명으로 S3를 읽는 동작은 확인하지 않았습니다. 인스턴스 프로파일이 삭제된 것은 대화상자 안내와 역할 삭제 뒤 동작으로만 확인했고, IAM의 인스턴스 프로파일 목록은 따로 열지 않았습니다.
- 화면 구성과 기본값은 콘솔 업데이트와 계정 설정에 따라 달라질 수 있습니다.
이 글의 다음 단계
- AWS CloudTrail 이벤트 기록에서 누가 언제 무엇을 했는지 읽기CloudTrail 이벤트 기록 화면에서 최근 변경 이벤트를 보고, 리소스 이름으로 걸러 한 보안 그룹의 생성부터 삭제까지를 추적합니다. 이벤트 상세와 JSON 레코드에서 사용자, 시각, 호출 내용, MFA 여부를 읽는 방법을 정리합니다.
- AWS 콘솔에서 보안 그룹을 만들고 인바운드 규칙을 복사해 입력하기EC2 콘솔에서 보안 그룹 cr-demo-sg를 만들고 HTTPS와 SSH 인바운드 규칙을 입력합니다. 소스를 어디로 정하느냐에 따라 달라지는 경고를 확인하고, 만든 규칙과 기본 아웃바운드 규칙을 읽은 뒤 보안 그룹을 삭제해 정리합니다.