서론
얼마전 실무에서 CloudFront 에 Lambda@Edge, S3를 연동하여 S3 -> CloudFront 응답을 트리거로 설정한 람다가 실행되어 이미지 리사이징을 처리한 경험이 있었다.
당시 가장 어려웠던 점이 서비스 연동을 위한 권한 설정이었기에, 정리해보고자 한다.
IAM
IAM(Identity and Access Management): AWS 리소스에 대한 액세스를 제어할 수 있는 서비스
주요 개념
- 유저: 개별 ID
- 그룹: 유저 모음
- 정책: 권한 설명서
- 역할: 임시가면
정책 (Policy)
- 무엇을 할 수 있는가가 적힌 JSON 문서 (예: S3 읽기 가능)
- 종류: Managed vs Inline
- AWS Managed Policy: AWS가 미리 만들어둔 정책 (예: AdministratorAccess). 여러 명에게 재사용 가능.
- Inline Policy: 특정 사용자/역할에 붙여둔 정책. 삭제하면 같이 사라짐.
- 정책을 붙일 수 있는곳 = 자격증명
- IAM 유저, IAM 그룹, IAM 역할
- IAM 유저에게 정책을 부여하는법
- 유저에게 정책을 직접 붙인다 (=인라인)
- 역할에 정책을 붙인 다음 유저가 정책을 assume(추측하다 보다는 책임을 맡다, 특정한 모습을 취하다의 뉘앙스)하도록 함: 권장!
역할 (Role)
- 그런데 역할이라는 개념이 굳이 왜 필요할까?
- AWS 서비스(EC2, Lambda 등)에도 정책을 붙이고 싶은데, 이들은 자격증명에 해당하지 않으므로 정책을 직접 붙일 수 없음
- 계정 간 이동: 다리 역할 (Cross-Account)
- 재사용성: 여러 정책을 묶어서 하나의 단위처럼 관리 가능
- 구성 요소
- Trust Policy(신뢰 정책)
- 생성 시 설정
- 이 역할을 사용하는 것을 허용하는 주체(=principal)
- IAM 유저, IAM 역할(역할 Chaining 가능), AWS 서비스
- Permission Policy(권한 정책)
- 역할(Role) 생성 후 붙임
- 이 역할을 통해 할 수 있는 작업
- 예: s3 객체 get/put 등
- Trust Policy(신뢰 정책)
// 신뢰정책 예
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"lambda.amazonaws.com",
"edgelambda.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
// 권한 정책 예
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}
예시
서비스 A가 B에 접근하기 위해 할 일
1. IAM 역할 생성 - 신뢰정책에 A 포함, 권한 정책에 B 포함
2. A 에 IAM 역할 연결
3. (선택- 보안 강화) B 의 리소스기반 정책에 생성한 역할의 ARN을 추가함
참고
- 최소권한정책
- 서비스는 기본적으로 다른 서비스에 대해 아무 권한도 가지고 있지 않으며, 명시적으로 권한을 부여해야 함
기본적으로 모든 요청을 거부합니다. (일반적으로, AWS 계정 루트 사용자 증명을 사용하여 해당 계정의 리소스를 요청하는 경우는 항상 허용됩니다.)권한 정책(자격 증명 기반 또는 리소스 기반)에 포함된 명시적 허용은 이 기본 작동을 재정의합니다.
- ARN(Amazon Resource Name)
- AWS 리소스를 식별
Amazon 리소스 이름(ARN)은 AWS 리소스를 고유하게 식별합니다. IAM 정책, Amazon Relational Database Service(RDS) 태그 및 API 호출과 같은 모든 AWS에서 리소스를 명료하게 지정해야 하는 경우 ARN이 필요합니다. [링크]
출처
'배운 것들 > AWS' 카테고리의 다른 글
| AWS SAA-C03 준비 기록 (2) | 2025.12.04 |
|---|---|
| Firecracker 살펴보기 (0) | 2025.05.06 |
| Lambda@Edge 를 이용한 대용량 이미지 리사이즈 (0) | 2025.03.18 |
| Online DDL을 사용하지 않고 테이블 락 없이 스키마 변경하기 (3) | 2025.03.18 |
| 운영중인 서비스의 서버 Node.js 버전 업그레이드하기 (5) | 2025.03.18 |