# AWS 콘솔에서 EC2에 IAM 역할을 연결해 액세스 키 없이 S3 읽기 권한 주기

> IAM 콘솔에서 EC2용 역할 cr-demo-ec2-s3-read-role을 만들고 AmazonS3ReadOnlyAccess를 붙인 뒤, EC2 시작 화면의 고급 세부 정보에서 인스턴스에 연결합니다. 신뢰 정책과 권한 정책의 역할을 읽고, 인스턴스와 역할을 삭제해 정리합니다.

- 주소: https://copyandrun.com/blog/aws-iam-role-for-ec2-console/
- 분야: 클라우드
- 발행일: 2026-10-19
- 태그: AWS, IAM, IAM 역할, EC2, 인스턴스 프로파일

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`를 입력해 고릅니다.

![신뢰할 수 있는 엔터티 유형이 AWS 서비스이고 서비스 또는 사용 사례가 EC2로 선택돼 있으며 사용 사례 목록에 EC2가 선택된 것을 확인합니다.](https://copyandrun.com/img/aws-iam-role-for-ec2-console/01-trusted-entity-ec2.png)

EC2를 고르면 사용 사례 목록이 나오고, `EC2`(EC2 인스턴스가 사용자를 대신해 AWS 서비스를 호출하도록 허용)가 기본으로 선택됩니다. `다음`을 누릅니다.

## 2. 권한 정책 붙이기

2단계 `권한 추가`에서는 `기존 정책 사용`이 기본입니다. 검색 칸에 `AmazonS3ReadOnlyAccess`를 입력하고 Enter를 누르면 한 건이 나옵니다. 체크박스를 선택하고 왼쪽의 `+`를 누르면 정책 JSON이 펼쳐집니다.

![검색 결과의 AmazonS3ReadOnlyAccess가 체크됐고 펼쳐진 JSON에 Effect가 Allow, Action에 s3:Get*, s3:List*, s3:Describe*, s3-object-lambda:Get*, s3-object-lambda:List*가 보이는 것을 확인합니다.](https://copyandrun.com/img/aws-iam-role-for-ec2-console/02-attach-s3-readonly.png)

이 관리형 정책의 설명은 콘솔에서 모든 버킷을 읽기 전용으로 접근하도록 허용한다는 내용입니다. 허용 동작은 `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.`가 미리 들어 있었고 그대로 두었습니다.

![역할 이름 칸에 cr-demo-ec2-s3-read-role이 입력돼 있고 설명 칸에 기본 문구가 있으며 아래 신뢰 정책 JSON의 Effect가 Allow, Action이 sts:AssumeRole인 것을 확인합니다.](https://copyandrun.com/img/aws-iam-role-for-ec2-console/03-name-and-trust-policy.png)

아래로 내려가면 `신뢰 정책`이 있습니다. 이 정책은 누가 역할을 맡을 수 있는지를 정합니다.

| 필드 | 값 | 의미 |
| --- | --- | --- |
| `Effect` | `Allow` | 허용 |
| `Action` | `sts:AssumeRole` | 역할을 맡는 동작 |
| `Principal.Service` | `ec2.amazonaws.com` | EC2 서비스가 이 역할을 맡을 수 있음 |

신뢰 정책은 누가 역할을 맡을지, 권한 정책은 맡은 뒤 무엇을 할 수 있는지를 정합니다. 신뢰 정책만 있으면 역할을 맡을 수는 있어도 할 수 있는 일이 없습니다. 화면 맨 아래에서 `역할 생성`을 누릅니다.

![역할 이름 아래 요약에 생성 날짜, ARN, 인스턴스 프로파일 ARN이 표시되며 권한 정책에 AmazonS3ReadOnlyAccess가 하나 연결돼 있는 것을 확인합니다.](https://copyandrun.com/img/aws-iam-role-for-ec2-console/04-role-detail.png)

생성 직후 역할 요약에는 ARN과 함께 `인스턴스 프로파일 ARN`이 있습니다. 콘솔에서 EC2용 역할을 만들면 같은 이름의 인스턴스 프로파일이 함께 만들어졌습니다. 인스턴스에는 역할이 아니라 이 인스턴스 프로파일이 연결됩니다. 권한 정책 열에는 `AmazonS3ReadOnlyAccess` 한 줄이 있습니다.

## 4. 인스턴스에 역할 연결

EC2 콘솔의 `인스턴스 시작`을 엽니다. 이름에 `cr-demo-role-ec2`를 입력하고, AMI와 인스턴스 유형은 기본값(Amazon Linux, t3.micro)으로 둡니다. 키 페어는 목록에서 `키 페어 없이 계속 진행`을 직접 고릅니다. 보안 그룹은 새로 만들고 SSH 허용 체크를 해제했습니다. 이 단계의 자세한 입력은 [EC2 글](/blog/aws-ec2-launch-in-vpc-console/)과 같습니다.

화면 아래의 `고급 세부 정보`를 펼치면 `IAM 인스턴스 프로파일` 칸이 있습니다. 목록을 열면 방금 만든 `cr-demo-ec2-s3-read-role` 하나가 나옵니다.

![고급 세부 정보의 IAM 인스턴스 프로파일 칸에 cr-demo-ec2-s3-read-role이 선택돼 있고 오른쪽에 새 IAM 프로파일 생성 링크가 있는 것을 확인합니다.](https://copyandrun.com/img/aws-iam-role-for-ec2-console/05-instance-profile-picked.png)

선택하고 `인스턴스 시작`을 누릅니다.

## 5. 연결 결과 읽기

인스턴스 요약 화면에서 `IAM 역할` 항목을 찾습니다.

![인스턴스 요약에 IAM 역할이 cr-demo-ec2-s3-read-role로 표시되고 IMDSv2가 Required, 인스턴스 상태가 실행 중인 것을 확인합니다.](https://copyandrun.com/img/aws-iam-role-for-ec2-console/06-instance-iam-role.png)

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

![보안 탭의 보안 세부 정보에 IAM 역할 cr-demo-ec2-s3-read-role과 보안 그룹 launch-wizard-1이 있고 인바운드 규칙은 표시할 규칙이 없으며 아웃바운드는 모든 트래픽인 것을 확인합니다.](https://copyandrun.com/img/aws-iam-role-for-ec2-console/07-security-tab.png)

이 글은 인스턴스에 접속하지 않아 역할로 실제 S3를 읽는 것까지는 확인하지 않았습니다. AWS 문서 기준으로 인스턴스 안의 프로그램은 인스턴스 메타데이터 서비스에서 이 역할의 임시 자격 증명을 받아 쓰며, 액세스 키를 파일에 저장하지 않아도 됩니다.

## 6. 정리: 인스턴스, 역할, 보안 그룹 삭제

이 글에서는 인스턴스 종료, 역할 삭제, 보안 그룹 삭제 순서로 진행했습니다. 보안 그룹은 인스턴스를 종료한 뒤에 삭제했고, 역할 삭제에는 순서 제약을 겪지 않았습니다.

**인스턴스 종료**

인스턴스 상태 메뉴에서 `인스턴스 종료(삭제)`를 엽니다.

![종료 대화상자에 대상이 cr-demo-role-ec2 하나이고 종료 방지가 비활성이며 루트 EBS 볼륨이 삭제된다는 경고가 있는 것을 확인합니다.](https://copyandrun.com/img/aws-iam-role-for-ec2-console/08-terminate-dialog.png)

대상이 이 글에서 만든 인스턴스 하나인지 확인하고 `종료(삭제)`를 누릅니다. 약 1분 뒤 인스턴스 목록에서 상태가 `종료됨`으로 바뀐 것을 확인했습니다.

**역할 삭제**

IAM 콘솔에서 역할 이름을 열고 오른쪽 위의 `삭제`를 누릅니다.

![역할 삭제 대화상자에 대상이 cr-demo-ec2-s3-read-role 하나이고 인라인 정책과 연결된 인스턴스 프로파일도 모두 삭제된다는 안내와 역할 이름을 입력하는 확인 칸이 있는 것을 확인합니다.](https://copyandrun.com/img/aws-iam-role-for-ec2-console/09-role-delete-dialog.png)

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

![역할 삭제 완료 배너가 있고 역할 목록의 역할 수가 40으로 표시된 것을 확인합니다.](https://copyandrun.com/img/aws-iam-role-for-ec2-console/10-role-deleted.png)

**보안 그룹 삭제**

EC2 시작 화면이 만든 `launch-wizard-1` 보안 그룹은 인스턴스를 종료해도 남습니다. 보안 그룹 화면에서 삭제 대화상자의 대상이 이 그룹 하나인지 확인하고 삭제합니다. 이 글에서는 삭제 뒤 목록에 `default`만 남았습니다.

## 자주 막히는 곳

| 증상 | 확인할 것 |
| --- | --- |
| IAM 인스턴스 프로파일 목록에 역할이 없음 | 목록 옆 새로고침을 누릅니다. 이 글에서는 역할을 만든 뒤 시작 화면을 열었을 때 목록에 있었습니다 |
| 역할 삭제 대화상자의 삭제가 비활성임 | 확인 칸에 역할 이름을 정확히 입력해야 켜집니다 |
| 사용 사례에 EC2가 여러 개 보임 | `EC2` 한 줄과 `EC2 Role for AWS Systems Manager` 등이 따로 있습니다. 이 글은 첫 번째 `EC2`를 골랐습니다 |
| 보안 그룹이 남아 있음 | 시작 화면이 만든 `launch-wizard-1`은 인스턴스 종료로 지워지지 않았습니다. 따로 삭제합니다 |

## 이어서 해 볼 것

- 정책을 계정의 모든 버킷이 아니라 특정 버킷 하나만 읽도록 직접 JSON으로 만들어 보기
- 실행 중인 인스턴스에서 역할을 바꾸거나 떼어 보기(요금과 권한 변경이 있으니 실습 계정에서만)
- [AWS IAM 정책 시뮬레이터 글](/blog/aws-iam-policy-simulator-read/)로 이 역할의 권한이 허용하는 동작 확인하기

## 확인 범위

- 확인한 것: 서울 리전 콘솔(한국어 화면)에서 위 설정으로 EC2용 역할을 만들고, 인스턴스에 연결하고, 요약과 보안 탭에서 역할을 읽고, 인스턴스, 역할, 보안 그룹을 삭제하는 과정을 실제로 수행했습니다. 역할을 만든 뒤 목록은 41개였고(화면 캡처는 첨부하지 않았습니다) 삭제 뒤 40개로 돌아왔으며 보안 그룹 목록에는 default만 남았습니다.
- 확인하지 못한 것: 인스턴스에 접속하지 않아 역할의 임시 자격 증명으로 S3를 읽는 동작은 확인하지 않았습니다. 인스턴스 프로파일이 삭제된 것은 대화상자 안내와 역할 삭제 뒤 동작으로만 확인했고, IAM의 인스턴스 프로파일 목록은 따로 열지 않았습니다.
- 화면 구성과 기본값은 콘솔 업데이트와 계정 설정에 따라 달라질 수 있습니다.
