이번 포스팅에서는 AWS Practitioner 시험에서 기초 개념만 다뤘던 정책(Policy)과 EC2 인스턴스 유형에 대해,
Solutions Architect - Associate(SAA) 수준으로 좀 더 깊이 있게 파헤쳐보려 한다.
AWS 정책
AWS의 사용자가 특정 서비스나 리소스에 어떠한 행동을 할 수 있는지 JSON형식으로 정의한 문서다.
보통 IAM 서비스를 활용해 사용자나 그룹, 역할에 정책을 부여하고, 이를 통해 접근 권한을 제어할 수 있음
정책의 JSON문서를 보면 기본적인 구성요소들이 있는데, 아래와 같다.
- Version
- 정책의 문서 버전을 나타냄
- 무조건 2012-10-17으로 명시(AWS에서 사용 중인 최신 정책 문법 버전)
- Statement
- 정책의 실질적인 내용을 담고 있음
- [ { .... }, { .... } ]보통 이런 배열 구조로 표현
- Effect
- Allow혹은 Deny값으로 해당 작업을 허용할지 거부할지 명시
- 항상 Deny가 Allow보다 우선 적용
- Action
- 사용자가 하려고 하는 작업을 나타냄
- 예시: s3:GetObject, ec2:StartInstances 등
- Resource
- Action이 적용될 AWS의 리소스 ARN (Amazon Resource Name)을 지정
- 예를들면
- "Resource": "arn:aws:ec2:ap-northeast-2:123456789012:instance/i-0abc1234def567890"은 서울 리전에 있는 특정 EC2 인스턴스 하나에만 권한이 적용
- "Resource": "arn:aws:s3:::my-bucket-name" 은 my-bucket-name이라는 S3 버킷 자체에 대한 권한이 적용
- Condition
- 정책이 적용될 조건을 설정
- 예시: 특정 IP에서만 접근 허용, 특정 시간대에만 허용 등
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "ec2:*",
"Effect": "Allow",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "elasticloadbalancing:*",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "cloudwatch:*",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "autoscaling:*",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "iam:CreateServiceLinkedRole",
"Resource": "*",
"Condition": {
"StringEquals": {
"iam:AWSServiceName": [
"autoscaling.amazonaws.com",
"ec2scheduled.amazonaws.com",
"elasticloadbalancing.amazonaws.com",
"spot.amazonaws.com",
"spotfleet.amazonaws.com",
"transitgateway.amazonaws.com"
]
}
}
}
]
}
이는 실제 AWS의 AmazonEC2FullAccess 정책을 가져온 것이다. 이를 Statement단위로 분석해보자
{ "Action": "ec2:*", "Effect": "Allow", "Resource": "*" }
- Action: EC2 서비스에 대한 모든 작업
- Effect: 허용
- Resource: 모든 리소스( *로 표시)
{ "Effect": "Allow", "Action": "elasticloadbalancing:*", "Resource": "*" }
- Action: ELB에 대한 모든 작업
- Effect: 허용
- Resource: 모든 리소스
{ "Effect": "Allow", "Action": "cloudwatch:*", "Resource": "*" }
- Action: CloudWatch에 대한 모든 작업
- Effect: 허용
- Resource: 모든 리소스
{ "Effect": "Allow", "Action": "autoscaling:*", "Resource": "*" }
- Action: AutoScaling에 대한 모든 작업
- Effect: 허용
- Resource: 모든 리소스
{ "Effect": "Allow", "Action": "iam:CreateServiceLinkedRole", "Resource": "*", "Condition": { "StringEquals": { "iam:AWSServiceName": [ "autoscaling.amazonaws.com", "ec2scheduled.amazonaws.com", "elasticloadbalancing.amazonaws.com", "spot.amazonaws.com", "spotfleet.amazonaws.com", "transitgateway.amazonaws.com" ] } } } }
- Action: 필요시 역할을 자동으로 생성하는 작업
- Effect: 허용
- Resource: 모든 리소스
- Condition: StringEquals조건에서만 위의 작업들을 허용
- StringEquals: 정확히 일치하는 값, 위의 예시에는 AWS서비스 이름이 [...] 괄호안의 이름과 일치하는 경우에만 허용
👉 이처럼 AmazonEC2FullAccess정책은 EC2에 대한 모든 접근을 허용하는 정책인 만큼, EC2와 연동되는 다른 AWS 서비스들에 대한 접근도 함께 허용하고 있음을 알 수 있다.

EC2 인스턴스를 생성할 때 위와 같이 인스턴스 유형을 선택하는 과정이 있다. 이 단계는 쉽게 말해, 내가 생성할 가상 컴퓨터의 하드웨어 사양을 고르는 것이라 볼 수 있다.
이전 포스팅에서는 인스턴스 유형을 단순히 "가상 컴퓨터의 스펙 고르기" 관점에서 설명했지만, 이번에는 이 인스턴스 유형의 이름이 어떻게 구성되어 있는지,
즉 네이밍 규칙에 대해 조금 더 자세히 살펴보겠다.

위 사진과 같이 인스턴스 유형엔 매우 다양한 종류가 있는데, 이것들은 일정한 구조와 규칙에 따라 이름이 정해진다.
인스턴스 유형 이름은 기본적으로 아래와 같이 구성된다.
<패밀리><세대>.<크기>
예를 들어, t3.micro, m5.large, c6g.xlarge 등이 있다.
각 구성 요소가 어떤 의미를 가지는지 하나씩 살펴보자.
어떤 용도/성능 특화 인스턴스인지 나타낸다.
주요 패밀리를 표로 정리하면 아래와 같다.
| 패밀리 | 용도 설명 | 대표 예시 |
|---|---|---|
| t | 가볍고 저렴한 범용 인스턴스. CPU 크레딧 기반, 테스트/개발 서버용 | t3.micro |
| m | 안정적인 일반 범용 인스턴스. CPU/메모리 균형형 | m5.large |
| c (Compute Optimized) | 고성능 CPU 중심의 컴퓨팅 최적화 워크로드용 | c6g.large |
| r (RAM Optimized) | 메모리 사용량이 많은 인메모리 DB, 캐시 워크로드용 | r5.xlarge |
| g (GPU) | 머신러닝, 그래픽 처리, 딥러닝 추론 등 GPU 활용 워크로드 | g4dn.xlarge |
세대는 t2, t3, m4, m5 등 패밀리 뒤에 들어가는 숫자를 가리키고, 보통 세대가 올라갈 수록 다음과 같은 변화를 보인다.
- 성능 향상
- 비용 효율성 개선
- 하드웨어 변화(예시: Intel -> AMD)
즉, 숫자가 높을 수록 성능이 개선된 최신 세대임을 의미한다.
이름 그대로 인스턴스 유형에서 해당 인스턴스의 크기를 나타낸다.
-> 즉 CPU 개수, 메모리(RAM) 크기, 네트워크 성능 등 리소스 규모를 의미하는 요소
표로 정리하면 아래와 같다.
| 크기 명칭 | 설명 |
|---|---|
| micro | 매우 작고 저렴함. 테스트/개발에 적합 |
| medium | 소규모 서비스나 간단한 애플리케이션용 |
| large | 표준 기본 크기. 대부분의 일반 워크로드에 적합 |
| xlarge | large보다 높은 사양. 성능이 더 필요한 작업에 적합 |
| 2xlarge~16xlarge | 숫자만큼 리소스가 배수로 증가함 |
| metal | 가상화 없이 물리 서버를 그대로 제공 |