참고자료
기타 업데이트
- 2024-03-05. AWS에서 다른 클라우드나 온프레미스 환경으로 데이터를 이전하는 경우, 무료 데이터 전송 지원
기본 제공되는 매 월 100GB 데이터를 초과하는 경우, 지원을 요청하면 크레딧을 부여. 블로그
Amazon API Gateway
개요
- RESTful API : 상태 비저장 HTTP 엔드포인트를 개방하고, 클라이언트의 HTTP 요청을 적절한 백엔드에 라우팅
- WebSocket API : (상태 저장) WebSocket 엔드포인트를 개방하고, 클라이언트의 업스트림 메시지를 적절한 백엔드에 라우팅
용어
- API 배포
API의 특정 시점 스냅샷. 클라이언트가 API를 사용하기 위해서는 배포가 하나 이상의 API 스테이지와 연결돼야 한다
- API 스테이지
API 수명 주기에 대한 논리적 참조(예. prod, dev, v2)
- 콜백 URL
새 클라이언트와 WebSocket 연결을 수립했을 때, 콜백 URL을 이용해 백엔드에서 클라이언트로 메시지를 보낼 수 있다
- 통합 요청
API Gateway 내부 인터페이스로, 클라이언트 요청을 백엔드에서 요구하는 형태로 매핑한다
- 통합 응답
API Gateway 내부 인터페이스로, 백엔드 응답을 클라이언트에 맞는 형태로 매핑한다
- 매핑 템플릿
VTL(Velocity Template Language) 스크립트로 통합 요청/응답의 매핑을 기술한 것
- 메서드 요청
REST API 공개 인터페이스로, 클라이언트 요청 형태를 정의한다
- 메서드 응답
REST API 공개 인터페이스로, 클라이언트가 기대하는 응답 형태를 정의한다
- 모의 통합
통합 요청을 처리할 백엔드 없이, API Gateway에서 직접 응답을 생성한다
- 프록시 통합
- HTTP 프록시 통합 : 클라이언트와 전체 요청을 백엔드에 전달. 백엔드 전체 응답을 클라이언트에 전달한다
- Lambda 프록시 통합 : 클라이언트 전체 요청을 Lambda 입력으로 전달. Lambda 출력을 HTTP 응답으로 변환한다
- 라우팅 요청
WebSocket API 공개 인터페이스로, 클라이언트의 업스트림 메시지를 정의
- 라우팅 응답
WebSocket API 공개 인터페이스로, 클라이언트가 기대하는 응답 형태를 정의
REST API vs HTTP API
둘 다 RESTful API 제품으로, REST API는 HTTP API보다 많은 기능을 지원하지만 대신 비용도 더 많이 든다
아래는 일부 발췌이며, 최신 사항 전체는 http-api-vs-rest 참고
공개 엔드포인트 유형
엔드포인트 유형 | REST API | HTTP API |
---|---|---|
엣지 최적화 | ✓ | |
리전 | ✓ | ✓ |
프라이빗 | ✓ |
보안
보안 기능 | REST API | HTTP API |
---|---|---|
상호 TLS 인증 | ✓ | ✓ |
클라이언트 인증서 발급 | ✓ | |
AWS WAF | ✓ |
제한사항
링크. 아래는 일부 발췌
WebSocket 엔드포인트가 퍼블릭인 경우, 공격자가 새 연결 제한량의 상당량을 점유할 수 있는 문제가 있다
API | 리소스 또는 작업 | 기본 할당량 | 높일 수 있음 |
---|---|---|---|
HTTP | 최대 통합 제한 시간 | 30초 | 아니요 |
WebSocket | 리전별 계정당 초당 새 연결 수 | 500 | 예 |
WebSocket | 프레임 크기 | 32KB | 아니요 |
자습서
REST API - Lambda 프록시 통합
Lambda 프록시 통합
- 요청 이벤트 예
↓ JavaScript
- 반환 형식 제한
↓ JavaScript
교차 계정 Lambda 프록시 통합
다른 계정의 Lambda 함수로 요청 라우팅 가능 -- 단, 적절한 권한 설정 필요. AWS 콘솔에서 작업하는 경우 아래와 같이 권한 부여를 위한 AWS CLI 명령이 안내된다
↓ shell
Lambda 비 프록시 통합
- 요청 이벤트
요청의 모든 데이터를 전달하는 Lambda 프록시 통합과 다르게, API Gateway에 정의한 통합 요청만 Lambda 함수에 전달된다
- 반환 형식
문자열 형식의 JSON 객체만 반환할 수 있는 Lambda 프록시 통합과 다르게, 임의 문자열, 숫자, 부울, 이진 BLOB까지도 반환 가능
Amazon AppFlow
두 SaaS 종단에 대하여 안전한 데이터 전송을 수행하도록 도와준다
예. Amazon S3에서 Google BigQuery로 데이터 적재
Amazon Athena
개요
- 표준 SQL을 이용해 Amazon S3 파일을 분석할 수 있는 대화형 쿼리 서비스
S3 외에도 다양한 데이터 소스를 지원한다 : DynamoDB, CloudWatch Logs, Apache Kafka, MySQL, PostgreSQL, Google BigQuery, Redis, ...
- AWS 관리 콘솔 외에도 JDBC 또는 ODBC 연결, Athena CLI, AWS SDK를 통해서도 Athena를 이용할 수 있다
Athena SQL
용어
- Dataset : Athena가 최종적으로 읽어들이는 데이터 집합. CSV, JSON 등
- Metadata : dataset을 테이블로 구조화하는 정보(스키마)
- Data catalog 또는 Metastore : Athena 내부에서, metadata를 관리하는 시스템
기본적으로 AWS Glue Data Catalog를 지원하며, 이는 S3, Redshift, DynamoDB 등에 대한 연결 및 테이블 생성을 가능하게 해준다
- Data source : database 그룹
각 data source는 특정한 data catalog를 이용한다
- Database : 테이블 그룹
- Table : 행 또는 열 그룹으로 구성된 데이터
시작하기
- Settings > 쿼리 결과를 저장할 S3 위치 지정
- 데이터베이스 생성
↓ sql
- 테이블 생성
↓ sql
- 조회
↓ sql
Data source 연결
AWS Glue 이용
- 다른 계정의 AWS Glue를 이용할 수도 있다
- 컬럼 이름은 변경 가능하지만, 테이블과 데이터베이스의 이름은 변경할 수 없다
새로운 이름으로 다시 만들어야 한다
- AWS Glue crawler 사용 시, 제외 패턴은 Athena에 적용되지 않는다
S3 버킷의 .json 파일을 제외하도록 설정해도, Athena에서 쿼리를 실행하면 모두 읽어들인다
- AWS Glue crawler 사용 시, 구조가 유사한 디렉터리를 발견하면 동일 테이블의 서로 다른 파티션으로 취급할 수 있다
서로 다른 테이블로 만들어야 하는 경우, 스캔하는 데이터 소스를 보다 명확하게 좁혀야 한다
- CSV에 헤더 라인이 존재하는 경우
↓ sql
- CSV 값이 따옴표로 감싸인 경우
↓ sql
Athena Federated Query 이용
참고자료 : connectors-available
- Lambda에서 실행되는 data source connector가 federated query를 실행한다
- CloudWatch Logs, DynamoDB, JDBC 호환 RDB 등을 위한 data source connector가 기본 지원된다
- Athena Query Federation SDK를 이용하여 사용자 정의 connector를 만들 수도 있다
Databbase, table 생성
- '_'로 시작하는 식별자는 백틱으로 감싸야 한다
- 숫자로 시작하는 식별자는 ""로 감싸야 한다
- Athena 키워드를 식별자로 이용할 때, DDL에서는 백틱으로, SELECT 문에서는 ""로 감싸야 한다
AND, AS, BY, CASE, ..., WITH 등
- LOCATION 속성을 이용해 S3 테이블 데이터 폴더를 지정할 때, 끝에 '/'를 붙여야 한다
- 서브쿼리에서는 WHERE 절에 파티션 키에 대한 값을 명시해도, 현재로써는 테이블의 모든 데이터를 읽는다(230825 문서 확인)
- 파티션 프로젝션을 설정하지 않으면(전통적인 파티션만 설정한 경우), 쿼리 실행 시 대상 파티션을 추리기 위해 GetPartitions 명령이 먼저 호출된다
- 이때 파티션이 너무 많다면 성능에 악영향이 발생할 수 있다. 파티션 프로젝션을 설정하면 GetPartitions 명령 없이 대상 파티션을 추려낼 수 있다
- 반대로 쿼리 대상 파티션 중 상당수가 실제로는 존재하지 않을 경우, 파티션 프로젝션을 이용한 쿼리는 읽기를 수행한 뒤에야 파티션이 존재하지 않음을 알 수 있기 떄문에 전통적인 파티션이 더 나을 수 있다
- 기존 테이블에 파티션 프로젝션을 설정하려면, 파티션 컬럼이 이미 테이블에 존재해야 한다. 자동으로 추가해주지 않음에 유의
- partition-projection-supported-types
- UUID와 같은 예측 불가능한 값으로도 파티셔닝할 수 있다
↓ sql
쿼리 결과로부터 테이블 생성
- 문법에 대해서는 create-table-as 설명서 참고
- 특성상 CREATE TABLE(DDL) 이전에 SELECT(DML)를 수행하며, 서비스 제한량과 관련하여 DML 사용으로 집계된다
- 테이블 생성 도중에 실패할 수 있는데, 해당 시점까지 만들던 테이블에 대하여는 조회가 가능하다
Athena에서 쿼리 결과를 삭제하는 일은 없기 때문
- ORDER BY 절은 무시된다
- 파티셔닝된 결과 테이블을 만들 수 있다
쿼리 실행하기
- AWS 콘솔에서 쿼리 계획을 확인할 수 있다
- 최근 쿼리 결과를 재사용하도록 설정할 수 있다
- 실행된 쿼리에 대한 상세 정보를 확인할 수 있다
- 뷰를 만들고, 테이블과 마찬가지로 권한 설정을 할 수 있다
- 쿼리를 저장하여 재사용할 수 있다
- ?를 이용하여 파라미터화된 쿼리를 실행할 수 있다
- 지리 정보에 관한 데이터 타입을 처리할 수 있다
point, line, polygon, multiline, multipolygon
배열 다루기
배열의 모든 원소들은 하나의 공통 타입으로 표현할 수 있어야 한다
↓ 생성
↓ 접합
↓ 길이
↓ 원소 참조
↓ 원소 포함 여부
↓ 평탄화, 테이블화
↓ 배열 필터링
↓ 배열 정렬
↓ 여러 행을 배열로 집계
↓ 배열 원소에 대한 집계
JSON 다루기
↓ JSON 변환
↓ JSON 속성 조회
DDL
참고자료 : ddl-sql-reference
Amazon Aurora + RDS
주의/권장 사항
- 클라이언트가 DNS 조회 결과를 캐시하는 경우, TTL을 짧게 설정한다. 장애 조치로 인해 프라이머리 IP 주소가 변경될 수 있다
↓ Java 예시
- 수동으로 장애 조치를 테스트하여, 소요되는 시간을 파악한다. 또, DB에 액세스하는 애플리케이션이 자동으로 새 프라이머리 DB 인스턴스에 연결되는지 확인한다
- 작업 집합이 메모리에 상주하도록 RAM을 충분히 할당하는 것이 좋다 -> ReadIOPS 지표는 안정적으로 작은 값이어야 한다
RDS의 경우, 인스턴스 클래스를 높였을 때 ReadIOPS가 급격히 떨어진다면 확장이 효과적이었음을 의미한다 -> ReadIOPS가 급격히 떨어지지 않는 수준까지 확장한다
- CHAP_BestPractices에서 RDS 엔진별 모범 사례 참고
- RDS 인스턴스 변경 시 재부팅이 필요한 경우가 있다 : Overview
- 다중 AZ 배포를 이용하더라도, 인스턴스에 대한 데이터베이스 엔진 업그레이드는 클러스터 내 모든 인스턴스에 동시에 적용되므로 가동 중지를 피할 수 없다
RDS for MySQL, RDS for MariaDB의 경우 블루/그린 배포를 이용해 가동 중지를 최소화할 수 있다 -- 보통 1분 미만
<단일 인스턴스에 필수 마이너 버전 업데이트 적용한 예>[원본 보기]
RDS 개요
- 관계형 데이터베이스를 쉽게 설치, 운영, 확장할 수 있는 서비스
- DB 인스턴스 : RDS의 기본 구성 요소
- DB 인스턴스 클래스 : DB 인스턴스의 컴퓨팅 및 메모리 용량 결정
- DB 인스턴스 클래스에 따라 지원되는 DB 엔진 및 버전이 다를 수 있음에 유의
- EBS를 이용하는 경우, 인스턴스 최대 IOPS를 넘게 구성할 수 없음에 유의. ebs-optimized
예를 들어, 최대 IOPS가 40,000인 DB 인스턴스에 64,000 IOPS EBS 볼륨 4개를 연결한 경우, 최대 IOPS는 256,000이 아니라 40,000
- DB 인스턴스 스토리지
- 범용 gp2 : 1GiB당 3IOPS 제공. 최소 100IOPS, 최대 16,000IOPS
- 범용 gp3 : 스토리지 용량과 관계없이 성능 지정 가능. 기본 3,000IOPS & 125MiB/s
볼륨 크기가 특정 임계값에 도달하면 기본 스토리지 성능이 12,000IOPS & 500MiB/s로 확장된다(RDS for SQL Server 제외). 이는 4개의 볼륨을 이용하는 볼륨 스트라이핑 덕분
- 프로비저닝된 io1 : 사용자가 지정한 수준의 일관적인 성능 제공. 지연에 민감한 워크로드용
엔진별 RDS 기능
블루/그린 배포
MariaDB | MySQL | Oracle | PostgreSQL | SQL Server |
---|---|---|---|---|
O | O | X | X | X |
프로덕션 데이터베이스 환경을 별도의 스테이징 환경에 복사하고, 지속적으로 동기화 수행. 프로덕션 환경에 영향을 주지 않으면서 스테이징 환경에서 데이터베이스를 변경한 다음, 최소 중단 시간으로 스테이징 환경을 프로덕션으로 승격 가능
교차 리전 자동 백업
MariaDB | MySQL | Oracle | PostgreSQL | SQL Server |
---|---|---|---|---|
O | O | O | O | O |
자동 백업으로 생성되는 스냅샷을 다른 리전에 복제하여 보관하도록 구성할 수 있다. 기존 인스턴스에 대해 설정하려면 RDS > Automated backups > 인스턴스 선택 > Actions > 교차 리전 복제 관리
리전 간 읽기 전용 복제본
MariaDB | MySQL | Oracle | PostgreSQL | SQL Server |
---|---|---|---|---|
O | O | △ | O | △ |
소스 DB 인스턴스와 다른 리전에 읽기 전용 복제본을 생성할 수 있다
데이터베이스 활동 스트림
MariaDB | MySQL | Oracle | PostgreSQL | SQL Server |
---|---|---|---|---|
X | X | O | X | O |
DB 인스턴스 감사 활동에 대한 경보를 설정하고 모니터링할 수 있다
듀얼 스택 모드
MariaDB | MySQL | Oracle | PostgreSQL | SQL Server |
---|---|---|---|---|
O | O | O | O | O |
IPv6도 이용할 수 있다
S3로 스냅샷 내보내기
MariaDB | MySQL | Oracle | PostgreSQL | SQL Server |
---|---|---|---|---|
O | O | X | O | X |
S3로 내보낸 스냅샷은 Amazon Athena 또는 Amazon Redshift Spectrum을 이용해 직접 분석할 수도 있다
IAM 데이터베이스 인증
MariaDB | MySQL | Oracle | PostgreSQL | SQL Server |
---|---|---|---|---|
O | O | X | O | X |
암호 대신 IAM 인증 토큰을 발급 받아 인증한다. 토큰 생성에 오버헤드가 발생하므로 초당 200개 이상의 새 인증이 필요한 경우엔 부적합할 수 있다
Kerberos 인증
MariaDB | MySQL | Oracle | PostgreSQL | SQL Server |
---|---|---|---|---|
X | O | O | O | O |
Kerberos 및 Microsoft Active Directory를 이용한 외부 인증 정보로 데이터베이스에 접속 가능
다중 AZ DB 클러스터
MariaDB | MySQL | Oracle | PostgreSQL | SQL Server |
---|---|---|---|---|
X | O | X | O | X |
- 3개의 가용 영역을 이용(대기 인스턴스 2대)하여 다중 AZ DB 인스턴스 배포(대기 인스턴스 1대)에 비해 높은 고가용성, 읽기 처리 용량, 낮은 쓰기 대기 시간 지원
- 다중 AZ DB 인스턴스 배포의 경우, 대기 인스턴스에 트랙잭션이 동기식으로 전파(때문에 처리 지연 발생)되며, 대기 인스턴스는 읽기 트래픽을 처리할 수 없다
일반적인 장애 조치 시간 : 60 ~ 120초
- 다중 AZ DB 클러스터 배포의 경우, 변경 사항 커밋에 하나 이상의 대기 인스턴스의 승인을 받는 반동기식 복제를 사용하고, 대기 인스턴스는 읽기 트래픽을 처리할 수 있다
일반적인 장애 조치 시간 : ~ 35초
성능 개선 도우미
MariaDB | MySQL | Oracle | PostgreSQL | SQL Server |
---|---|---|---|---|
O | O | O | O | O |
데이터베이스 성능을 분석하는 데 도움이 되는 자료를 수집하여 시각화한다
RDS Custom
MariaDB | MySQL | Oracle | PostgreSQL | SQL Server |
---|---|---|---|---|
X | X | O | X | O |
데이터베이스 환경 및 운영 체제에 액세스하여 커스터마이징 가능
RDS 프록시
MariaDB | MySQL | Oracle | PostgreSQL | SQL Server |
---|---|---|---|---|
O | O | O | O | O |
원본 데이터베이스에 대한 연결 풀을 제공한다. 애플리케이션 안에서 연결을 관리하지 않는 경우, 인스턴스에서 지원하는 것보다 많은 연결을 동시에 열어두려는 경우에 적합
Secrets Manager 통합
MariaDB | MySQL | Oracle | PostgreSQL | SQL Server |
---|---|---|---|---|
O | O | O | O | O |
RDS 마스터 암호를 Secrets Manager에 저장하고, 정기적으로 교체할 수 있다
RDS for PostgreSQL
논리적 복제
- 파라미터 그룹 설정 필요 -- 기본 파라미터 그룹으로는 불가능 CHAP_Source
- 소스 데이터베이스가 삭제된 경우가 아니라면, 구독을 삭제하기 전에 alter subscription을 이용해 먼저 연결을 해제해야 한다 logical-replication-subscription.html#LOGICAL-REPLICATION-SUBSCRIPTION-SLOT
- 기본적으로 복제로 인해 트리거가 촉발되지 않지만, 트리거가 실행되도록 변경할 수도 있다
Aurora
파라미터 그룹 작업
- 파라미터 그룹은 DB 엔진 구성 값의 컨테이너 역할을 한다
- 파라미터 값은 상수, 수식, 함수를 이용해 지정할 수 있다
DB 인스턴스 파라미터
- DB 인스턴스에 적용되는 파라미터
- 정적 파라미터 변경 : DB 인스턴스를 수동으로 재부팅해야 적용
- 동적 파라미터 변경 : 기본적으로 변경 즉시 적용
- 새로운 DB 파라미터 그룹을 DB 인스턴스에 연결한 경우, DB 인스턴스가 재부팅된 후 정적 및 동적 파라미터를 적용한다
단, 재부팅하지 않고 다시 동적 파라미터를 변경한 경우, 이는 즉시 적용된다
DB 클러스터 파라미터
- 다중 AZ DB 클러스터의 모든 DB 인스턴스에 적용되는 파라미터
- 정적 파라미터 변경 : DB 클러스터를 수동으로 재부팅해야 적용
- 동적 파라미터 변경 : 기본적으로 변경 즉시 적용
이벤트 알림
발생한 이벤트에 대하여 전송 순서를 보장하지 않음에 유의
이벤트 알림 구독
- 어떤 범주의 이벤트를 수신할 것인지 선택 : DB 클러스터, DB 인스턴스, 파라미터 그룹, ...
- 어떤 이벤트를 수신할 것인지 선택 : 생성, 삭제, 장애, 장애 조치, 점검, ...
- 구독 대상 선택
- 구독 생성
권한 부여
- 기본적으로 SNS 주제에는 동일한 계정 내의 모든 RDS 리소스가 알림을 게시하도록 허용한다
- 사용자 지정 정책을 연결하여 다른 계정의 알림을 허용하거나, 특정 리소스에 대한 액세스를 제한할 수 있다 USER_Events
이벤트에서 트리거되는 규칙 생성
- CloudWatch > 이벤트 > 규칙 생성
- 서비스에 RDS, 이벤트 유형에 RDS 리소스 유형 선택
이벤트 범주 및 유형
App Runner
개요
코드 저장소 또는 컨테이너 이미지로부터 웹 앱을 구동한다
- Auto scailing 자동 수행
인스턴스 당 동시 처리 가능 요청 수 기준 <- 직접 설정해야 함
- 로드 밸런싱 자동 수행
- 자동 갱신되는 TLS 인증서 기본 제공
- 앱 장기 미사용 시 일시 정지 가능 -> 개발 용도로도 적합
- 실행 환경변수 설정 가능
App Runner 배포를 위한 개발
- 웹 앱은 HTTP1.1 요청을 처리해야 한다
현재 timeout은 30초
- 웹 앱은 상태 비저장이어야 한다 - 웹 요청 측면 및 파일 시스템 측면 모두
- PORT 환경 변수가 기본 제공된다
- App Runner 서비스에 IAM 역할 부착 가능
Auto Scaling
크기 조정 계획
- 크기 조정 계획을 지원하는 서비스들에 대한 auto scaling을 손쉽게 구성할 수 있다integrated-services-list
- Aurora : Aurora DB 클러스터의 읽기 전용 복제본 개수에 관해 설정
- EC2 : EC2 Auto Scaling 그룹의 용량에 관해 설정
- ECS : 태스크 수에 관해 설정
- DynamoDB : 읽기 및 쓰기 용량에 관해 설정
- ElastiCache for Redis : 복제본 개수에 관해 설정
- 각 서비스별 사용 가능한 지표가 다르다application-auto-scaling-target-tracking
EC2 Auto Scaling
- Auto Scailing 그룹의 최소 용량, 원하는 용량, 최대 용량을 지정하여 서비스 처리량 유지
- Auto Scailing 그룹의 인스턴스 수명 주기
- Pending : 신규 인스턴스 시작
- Pending:Wait : autoscaling:EC2_INSTANCE_LAUNCHING 후크가 존재하는 경우 Pending에서 천이됨
예. 새 인스턴스에 CodeDeploy 개정을 자동으로 배포할 수 있다 -- Auto Scailing 그룹을 포함하도록 배포 그룹을 생성하거나 업데이트할 때, CodeDeploy 서비스 역할을 사용하여 Auto Scailing 그룹에 수명 주기 후크를 자동 설치
<2023-03-13 140333.png>[원본 보기] CodeDeploy 자동 배포 시, 마지막으로 배포에 성공한 revision을 이용한다
- Pending:Proceed : 수명 주기 후크 완료 시 천이됨
- InService : 인스턴스 구성 완료
- Terminating : 인스턴스 종료 시작
- Terminating:Wait : autoscaling:EC2_INSTANCE_TERMINATING 후크가 존재하는 경우 Terminating에서 천이됨
- Terminating:Proceed : 수명 주기 후크 완료 시 천이됨
- Terminated : 인스턴스 종료 완료
- 인스턴스는 다음 중 하나가 발생할 때까지 InService 상태로 유지된다
- 축소 이벤트 발생
- 인스턴스를 Standby 상태로 천이
- Auto Scailing 그룹으로부터 분리
- 상태 확인 실패 임계 도달
- Standby 상태(대기모드)
인스턴스가 실행 중인 상태에서 서비스 풀에서 분리
- 간편한 모니터링 및 인스턴스 자동 조정 정책(평균 CPU 사용, 인스턴스 당 요청 수, 특정 시간대 등) 지원
CDK, CloudFormation
CloudFormation이란?
- 템플릿에 인프라에 필요한 모든 리소스를 기술하고, 템플릿을 이용해 CloudFormation 스택을 생성하면, 필요한 리소스들을 자동으로 프로비저닝한 후 실행한다
- 전체 인프라 복제를 신속히 배포할 때 유용
- 템플릿은 JSON 또는 YAML 포맷이어야 한다
- 온라인 템플릿 편집기 제공:designer
- 업데이트 배포 가능
- 템플릿 내용 또는 입력 파라미터의 변경을 제출하여 변경 집합 생성
- 변경 집합의 변경 사항 검토
계정 할당량, 업데이트를 지원하지 않는 리소스를 변경하려는 경우, 실행 권한이 부족한 경우를 사전에 확인하지 않음에 유의
- 변경 집합 시작 : 변경 사항들만 기존 스택에 적용
시작하기
로컬 MySQL을 사용하는 단일 EC2 인스턴스로 WordPress 서비스 제공하는 샘플 템플릿을 통해 기본적인 사항을 알아본다원본 yaml
↓ yaml
- 샘플은 6개의 최상위 섹션을 갖지만(AWSTemplateFormatVersion, Description, Parameters, Mappings, Resources, Outputs), 이 중 Resources 섹셕만 필수 요소다
- Resources.WebServer : 템프릿 내에서 리소스 참조에 사용하는 논리적 이름
- Parameters : 템플릿에서 사용할 변수 정의
Ref 함수로 parameter와 resource 접근
- Resources.WebServer.Properties.KeyName = { Ref: "KeyName" }
- Resources.WebServer.Properties.SecurityGroups[0] = { Ref: "WebServerSecurityGroup" }
- Outputs 섹션은 스택 생성 후 출력 탭에서 확인할 수 있는 값을 정의한다
샘플 템플릿
CDK(Cloud Development Kit)
고급 프로그래밍 언어를 이용해 인프라 작성 > CloudFormation 템플릿 자동 생성 > 스택 배포
예시 :hello_world
- CDK 설치 :cli
↓ shell
- 앱 생성(JavaScript)
↓ shell
- ^ 정상인지 확인
↓ shell
HelloCdkStack가 결과에 포함되어야 한다
- 서비스 구성요소 추가
↓ lib/hello-cdk-stack.js
= { HelloCdkStack } - CloudFormation 템플릿 생성
↓ shell
YAML 포맷의 템플릿이 출력되며, cdk.out 디렉터리에 JSON 포맷 템플릿도 작성된다
- 스택 배포
↓ shell
- 스택 정의 업데이트 -- 스택 삭제 시 모든 객체와 버킷을 삭제하도록
↓ lib/hello-cdk-stack.js
- 변경 사항 확인
↓ shell
- 객체 자동 삭제를 위해 Lambda 함수가 추가되는 것을 볼 수 있다
- 추가적으로 cdk synth의 결과를 비교해보는 것도 유용할 수 있다
- 스택 업데이트 배포
↓ shell
- 스택 제거
↓ shell
EC2
개요
- 인스턴스 : 가상 컴퓨팅 환경
- AMI(Amazon machine image) : 인스턴스에서 실행할 운영체제 및 소프트웨어들이 적절히 구성된 상태. 이를 이용해 동일한 상태로 여러 인스턴스들을 쉽게 만들 수 있다
- 인스턴스 유형 : 인스턴스의 CPU, 메모리, 스토리지, 네트워크 대역폭 구성
- 키 페어 : 암호화된 인스턴스 로그인 강제
- 인스턴스 스토어 볼륨 : 임시 데이터 저장. 인스턴스 중단, 최대 절전 모드 전환, 종료 시 삭제
- EBS : 영구 스토리지 볼륨
- 보안 그룹 : 인스턴스 방화벽 기능
- 탄력적 IP(EIP) : 고정 IPv4 주소
AMI
AMI 유형
시작 권한
- 퍼블릭 : 소유자는 모든 AWS 계정에 시작 권한 부여
- 명시적 : 소유자는 특정 AWS 계정, 조직, 조직 단위에 시작 권한 부여
- 암묵적 : 소유자만 암묵적인 시작 권한 소유
공유 AMI 사용 시 보안 유의
액세스 권한을 상실하는 사고를 방지하기 위해 두 개의 SSH 세션을 시작하고, 하나는 작업이 끝날 때까지 계속 유지
- 허용되지 않은 퍼블릭 SSH 키를 확인하고 비활성화
↓ shell
- 루트 사용자 암호 인증 비활성화
↓ sshd_config 파일
파일 수정 후 sshd 서비스 재시작
- 등록된 사용자 중 알 수 없는 계정은 모두 암호를 제거하거나 잠금 설정
- 등록된 모든 cron 작업 확인
루트 디바이스 스토리지
- EBS 지원 AMI : 인스턴스는 EBS 스냅샷에서 생성된 별도 EBS 볼륨과 연결
- 인스턴스 스토어 지원 AMI : S3에 저장된 템플릿으로부터 생성된 볼륨과 연결
특성 | EBS 지원 AMI | 인스턴스 스토어 지원 AMI |
---|---|---|
부팅 시간 | 보통 1분 이하 | 보통 5분 이하 |
루트 디바이스 크기 제한 | 64TiB | 10GiB |
데이터 지속성 | 인스턴스를 종료해도 루트 볼륨이 지속되도록 설정 가능 -- 기본값은 삭제 | 항상 인스턴스 수명 주기 동안만 유지 |
중지 상태 | 인스턴스는 중지 상태일 수 있으며, 루트 볼륨은 EBS에 계속 유지 | 인스턴스는 중지 상태일 수 없음 |
가상화
- HVM : (추천 옵션) 완전히 가상화된 하드웨어 및 부트 세트 제공
- PV : 반가상화 제공. 일부 리전에서 이전 세대 인스턴스에 한해 지원
AMI 수명 주기
AMI 복사
- 리전 내 또는 다른 리전으로 AMI 복사 가능
- 암호화되지 않은 스냅샷을 복사할 때 암호화 설정 가능
AMI 저장 및 복원
S3로 AMI 저장 및 S3로부터 AMI 복원 가능
Amazon Linux
개요
- Amazon Linux는 EC2 애플리케이션을 위한 고성능 보안 실행 환경을 제공하도록 설계
- 컨테이너 이미지도 제공:amazonlinux
- 기본적으로 키 페어를 이용한 보안 SSH 액세스만 허용
- 각 이미지는 식별을 위해 고유한 /etc/image-id 파일을 보유
- 보안 업데이트 알림:Amazon Linux Security Center
- 라이브 패치 제공: 재부팅, 가동 중단 없이 커널 패치 가능
x86_64 아키텍처 && 커널 버전 4.14.165-131.185 이상에 한하여 지원.커널 라이브 패치 적용 절차
- EPEL(Extra Packages for Enterprise Linux) 저장소 활성화
↓ shell
- Amazon Linux 2부터 Extras Library 사용 가능
Java, PHP, R, Go, Nginx, PostgreSQL, tomcat, Docker 등 제공
- topic 목록
↓ shell
- topic 설치
↓ shell
- 지정 버전 topic 설치
↓ shell
- 설치한 topic 제거
↓ shell
- topic 목록
Amazon Linux 2022
- AL2022부터 Amazon Linux의 새로운 메이저 버전은 2년마다 출시
- 각 메이저 버전은 총 5년 동안 지원됨 : 2년 표준 지원(분기별 마이너 업데이트) + 3년 유지 관리
- SELinux 기본 설정
aws configure
인스턴스 내에서 aws cli 명령을 실행하려는 경우, AMI에 미리 자격 증명을 설정하는 것이 편리하다
CodeDeploy agent 설치
↓ shell
JDK(Amazon Corretto) 설치
↓ shell
인스턴스 유형
인스턴스 유형 이름 규칙
인스턴스 유형 이름 ::= 인스턴스 패밀리 || 세대 || 추가 기능(들)
a | AMD 프로세서 |
g | AWS Graviton 프로세서 |
i | 인텔 프로세서 |
d | 인스턴스 스토어 |
n | 네트워크 최적화 |
e | 추가 스토리지 또는 메모리 |
z | 높은 클록 |
범용
- 균형 잡힌 컴퓨팅, 메모리, 네트워킹 리소스 제공
- 인스턴스 패밀리 : M, T
- 일부 인스턴스 유형은 네트워킹 리소스를 항상 100% 활용할 수는 없음에 유의
기준 대역폭 초과 시 적립한 크레딧을 사용하여 한계 성능까지 잠시 확장 가능
- T 패밀리는 CPU 역시 제한
- 시간 당 적립 CPU 크레딧 = 기준 CPU 사용률(%) * vCPU 수 * 60분
기준 CPU 사용률은 단일 vCPU 사용 기준이며, CloudWatch의 메트릭과 동일하다
- 최대 누적 크레딧 = 시간 당 적립 CPU 크레딧 * 24시간
인스턴스 유형 시간 당 적립 크레딧 vCPU vCPU당 기준 사용률 t4g.nano 6 2 5% t4g.medium 24 2 20% t4g.xlarge 96 4 40% - 시간 당 적립 CPU 크레딧 = 기준 CPU 사용률(%) * vCPU 수 * 60분
컴퓨팅 최적화
- 인스턴스 패밀리 : C
- 일부 인스턴스 유형은 네트워킹 리소스를 항상 100% 활용할 수는 없음에 유의
기준 대역폭 초과 시 적립한 크레딧을 사용하여 한계 성능까지 잠시 확장 가능
메모리 최적화
- 인스턴스 패밀리 : R, X, u-, z1d
- 일부 인스턴스 유형은 네트워킹 리소스를 항상 100% 활용할 수는 없음에 유의
기준 대역폭 초과 시 적립한 크레딧을 사용하여 한계 성능까지 잠시 확장 가능
스토리지 최적화
- 만 단위 스토리지 IOPS 제공
- 인스턴스 패밀리 : D, H, I
- 일부 인스턴스 유형은 네트워킹 리소스를 항상 100% 활용할 수는 없음에 유의
기준 대역폭 초과 시 적립한 크레딧을 사용하여 한계 성능까지 잠시 확장 가능
가속 컴퓨팅
- GPU 인스턴스 : G, P
그래픽 카드 드라이버가 설치된 AMI를 이용하거나, 직접 설치 필요
- AWS Inferentia : Inf1
기계 학습 가속
- FPGA : F
병렬로 처리 가능한 CPU 집약 작업 가속
- 일부 인스턴스 유형은 네트워킹 리소스를 항상 100% 활용할 수는 없음에 유의
기준 대역폭 초과 시 적립한 크레딧을 사용하여 한계 성능까지 잠시 확장 가능
인스턴스 구입 옵션
온디맨드 인스턴스
- 인스턴스에 대한 약정 없이 사용한 초 단위로 비용 지불
- 인스턴스 시작~종료를 사용자가 결정
예약 인스턴스
- 특정 기간 동안 약정하여 온디맨드 인스턴스 비용 절감
- 약정한 기간 내에, 계약한 사양과 일치하는 온디맨드 인스턴스를 실제로 사용할 때에만 할인 효과를 볼 수 있다
할인은 1시간 당 3600초 실행 시간에 적용된다. 예를 들어, 1개 용량 예약으로 인스턴스 4개를 시간당 15분씩만 사용하는 것도 최대 할인 혜택을 받는다
- 통합 결제 기능으로 과금되는 경우, 예약 인스턴스 혜택이 공유된다
스팟 인스턴스
- 미사용 중인 EC2 인스턴스 풀에서 인스턴스를 저렴하게 임대하여 사용
- 인스턴스 풀은 계속 변동되므로 스팟 요금 역시 계속 변동되고, 가장 높은 가격으로 주문한 사용자가 우선 낙찰된다
- 가격, 용량 등에 대한 제약사항을 설정하여 주문하는데, 수요 증가로 인하여 언제든지 종료될 수 있다
- 중지/종료 2분전 발행되는 중단 이벤트("detail-type":"EC2 Spot Instance Interruption Warning")를 수신하여 인스턴스가 중단되기 전에 상태 저장, 로그 업로드 등의 작업을 할 수 있다
인스턴스에 대한 중단 이벤트 발생을 보장하지는 않음에 유의
- 또는 인스턴스 메타데이터의 instance-action 항목을 검색하여 중지/종료 설정이 존재하는 지 확인할 수 있다
↓ java
↓ shell
- 스팟 인스턴스의 최대 절전 모드 전환 옵션을 켠 경우, 2분 유예 없이 즉시 절전 모드로 전환됨에 유의
옵션을 켰다면, 인스턴스 시작 시 최대 절전 모드 에니전트를 실행해야 한다
↓ 사용자 데이터
- 중지/종료 2분전 발행되는 중단 이벤트("detail-type":"EC2 Spot Instance Interruption Warning")를 수신하여 인스턴스가 중단되기 전에 상태 저장, 로그 업로드 등의 작업을 할 수 있다
- 스팟 인스턴스 어드바이저 : 리전 - 인스턴스 유형별 중단 빈도 제공instance-advisor
인스턴스 구성
사용자 관리
인스턴스를 여러 사용자가 공유하고, 사용자 별로 별도 작업공간을 가져야 하는 경우, 기본 사용자(ec2-user, ...)를 공유하는 것보다 신규 사용자를 생성하는 것이 보안상 안전하다
- 새 사용자가 이용할 ssh 키 생성
↓ shell
- 인스턴스에서 새 사용자 추가
↓ Amazon Linux 2
- 사용자 전환
↓ shell
- ssh 공개키 추가
↓ shell
시작 시 명령 실행
사용자 데이터 및 shell 스크립트
예. 인스턴스 시작 시 CodeDeploy 실행
↓ 사용자 데이터
- 사용자 데이터는 root 사용자 권한으로 실행된다
- 콘솔 출력은 /var/log/cloud-init-output.log에 기록된다
사용자 데이터 및 cloud-init
- cloud-init패키지는 클라우드 컴퓨팅 환경에서 이미지 부트스트랩을 수행하는 데 사용된다. 인스턴스 시작 시 "사용자 데이터" 필드에 작성한 작업을 cloud-init에 전달하여 초기화를 수행할 수 있다
- 사용자 데이터 포맷
- 예제
- 콘솔 캡처
↓ #cloud-config
인스턴스 메타데이터 서비스
IMDSv2 사용
IMDSv1은 일회성 요청/응답을 교환하는데, IMDSv2는 이에 토큰 헤더를 추가하여 SSRF 공격을 상당 부분 방지한다. 현재 IMDSv2 사용은 선택사항.
- 토큰 생성
↓ shell
- 메타데이터 검색
↓ shell
- 동적 데이터 검색
↓ shell
- 데이터 카테고리
사용 제한
- 인스턴스당 메타데이터 질의는 스로틀링되고, 동시 연결 수에도 제한이 존재한다
매 요청마다 토큰을 새로 할당 받는 것은 좋지 않다
- 쿼리에 실패한 경우, 지수 백오프 전략으로 재시도해야 한다
네트워킹
리전 및 영역
리전
- 개별 지리 영역 : us-east-1(버지니아 북부), us-east-2(오하이오), ...
- 각 리전은 서로 격리되어 있으며, 리전 간 데이터 전송에는 비용이 청구된다
가용 영역
- 리전 내의 격리된 위치 : us-east-1a, us-east-1b, ...
물리적으로 격리되어 있기 때문에, 리전 내 가용 영역 사이의 통신 지연 시간은 그 위치에 따라 달라진다
- 각 가용 영역은 확장 한계가 존재하며, 이미 인스턴스가 존재하는 경우가 아니라면 새 인스턴스를 시작하지 못할 수도 있다
- AZ ID : 가용 영역의 고유한 ID
각 계정들은 독립적으로 가용 영역이 매핑된다. 예를 들어, 두 계정의 us-east-1a 가용 영역은 물리적으로 다른 위치(AZ ID 예: use1-az1, use1-az3)에 존재할 수 있다. 따라서 외부와 가용 영역을 공유할 때는 AZ ID를 이용해야 한다
Local Zone
- 최종 사용자에 가까운 여러 위치에 리소스를 배치 가능 : us-east-1-nyc-1a(뉴욕), us-east-1-mia-1a(마이애미), ...
- 각 Local zone은 독자적으로 인터넷에 연결되고, AWS Direct Connect를 지원한다
Wavelength Zone
- 통신 사업자의 5G 네트워크 엣지에 배포 : us-east-1-wl1-nyc-wlz-1(뉴욕), ...
- 리전과 직접 연결되어 있다 -- 리전의 논리적 확장
AWS Outposts
AWS에서 설계한 하드웨어로 제작된, 구성 가능한 완전관리형 컴퓨팅 및 스토리지 랙을 임의 데이터 센터, 코로케이션, 온프레미스 시설에서 사용
인스턴스 IP 주소 지정
프라이빗 IPv4 주소
프라이빗 IPv4 주소는 동일 VPC 내에서 인스턴스 간 통신에 사용될 수 있다. IPv4 주소 지정 프로토콜은 비활성화할 수 없다. 점유한 프라이빗 IPv4 주소는 인스턴스 종료 시 반환된다
- ↓ RFC 1918
- 10.0.0.0 - 10.255.255.255 (10/8 prefix)
- 172.16.0.0 - 172.31.255.255 (172.16/12 prefix)
- 192.168.0.0 - 192.168.255.255 (192.168/16 prefix)
퍼블릭 IPv4 주소
- 기본 VPC에서 시작된 인스턴스에는 기본적으로 퍼블릭 IP 주소가 할당된다
- 프라이빗 IP 주소와 달리, 할당할 주소를 지정할 수 없다
- 프라이빗 IP 주소와 달리, 인스턴스 중지, 절전 시에도 반환된다 -- 재사용 불가
- DDNS로 도메인과 퍼블릭 IP 주소를 매핑하는 것보다, 탄력적 IP 주소를 사용하는 것이 서비스 다운타임을 줄일 수 있다
- 퍼블릭 IP 주소를 통해 통신하는 경우 전송 비용이 청구된다
탄력적 IP 주소(EIP: Elastic IP)
- 계정에 할당되는 퍼블릭 IPv4 주소
- 자유롭게 인스턴스에 연결, 해제할 수 있다
- 실행 중인 인스턴스에 연결된 EIP 하나는 무료 제공
IPv6 주소
- IPv6 주소는 전역적으로 고유하며, 프라이빗으로 유지하거나 인터넷으로 접속하도록 설정할 수 있다
- VPC에 대한 IPv6 CIDR 블록은 자동으로 할당된다 -- 선택할 수 없다
탄력적 네트워크 인터페이스(ENI)
- ENI는 인스턴스와 자유롭게 탈부착이 가능한 VPC 상의 논리적 네트워크 카드
단, 기본 네트워크 인터페이스는 인스턴스에서 분리할 수 없다
- ENI는 서브넷 안에서 고유하다 -- 다른 서브넷으로 이동 불가
네트워크 대역폭
인스턴스에서 사용 가능한 네트워크 대역폭은 실제 최대 대역폭과 다르다
- 리전 내 : 사용 가능한 최대 대역폭 활용 가능
- 그 외 : vCPU 32개 이상인 현재 세대 인스턴스의 경우 최대 대역폭의 50%까지 활용 가능. 그 외 현재 세대 인스턴스는 최대 5Gbps
배치 그룹
새 인스턴스를 시작하면 기본적으로 기존 인스턴스들과 하드웨어를 적게 공유하도록 분산된다. 배치 그룹을 이용하여 이 동작을 재정의할 수 있다
- 클러스터 : 인스턴스들을 단일 가용 영역에 물리적으로 근접하게 할당
- 파티션 : 한 파티션에 속한 인스턴스는 다른 파티션과 하드웨어(server rack)를 공유하지 않게끔 할당
- 분산 : 모든 인스턴스가 별개 rack에 할당
제한사항
- 한 인스턴스는 하나의 배치 그룹에만 속할 수 있다
- 클러스터 배치 그룹에서 여러 인스턴스 유형을 사용하는 것보다, 단일 유형을 사용하는 것이 성공할 가능성이 높다
- 가용 영역당 파티션은 최대 7개
- 분산형 배치 그룹의 가용 영역당 실행 인스턴스는 최대 7개
- 중지 상태의 인스턴스는 배치 그룹에 추가/삭제 가능
보안
보안 그룹
- 연결을 허용하는 규칙만 추가할 수 있다
- 이미 허용된 연결의 추가 트래픽은 더 이상 규칙 평가를 받지 않는다
- 예를 들어 인바운드 ICMP 트래픽을 허용한다면, 요청에 대한 응답은 아웃바운드 규칙에서 제한하더라도 전송이 허용된다
- 예외적으로 모든 대상(0.0.0.0/0 또는 ::/0)에 대해 인바운드 TCP 또는 UDP 트래픽을 허용하는 동시에, 모든 대상에 대한 아웃바운드 트래픽을 허용하는 경우, 연결은 추적하지 않는다
예. 인바운드 규칙(프로토콜 TCP, 포트 80, 소스 0.0.0.0/0) + 아웃바운드 규칙(프로토콜 All, 포트 All, 타깃 0.0.0.0/0)
- TCP, UDP, ICMP 외의 프로토콜은 IP 주소와 프로토콜 번호만 추적한다
인스턴스에서 다른 호스트로 이러한 프로토콜로 트래픽이 전송됐다면, 600초 이내에 동일한 프로토콜로 응답이 오는 경우 항상 허용된다
- 상태 비저장 규칙이 필요하다면 네트워크 ACL을 이용
스토리지
EBS
- 데이터베이스, IO 집약적 애플리케이션 모두에 적합한 블록 수준 저장소
- 범용 SSD(gp3)
- gp2보다 뛰어난 기본 성능(3,000IOPS, 125MB/s) 제공
- 최대 16,000IOPS 및 1,000MB/s 프로비저닝 가능
- 범용 SSD(gp2)
- 볼륨 크기에 따른 기본 성능 제공 : 1GB당 3IOPS
최소 100IOPS(33.33GB 이하) ~ 최대 16,000IOPS(5,334GB 이상)
- 기준 성능이 3,000IOPS 미만인 볼륨은 크레딧 적립을 이용한 최대 3,000IOPS까지 성능 버스트 제공
- 볼륨 크기에 따른 기본 성능 제공 : 1GB당 3IOPS
- 프로비저닝된 SSD(io1, io2)
- 범용 SSD보다 낮은 장애율
- 범용 SSD보다 높은 IOPS 프로비저닝 한도 제공 : Nitro 시스템의 경우 64,000IOPS, 그 외 32,000IOPS
- EBS 다중 연결 지원
- io2 Block Express 볼륨은 밀리초 미만 지연 시간, 더 높은 처리량, 더 큰 용량
- 처리량 최적화 HDD(st1)
- SSD보다 저렴한 단위 용량당 비용
- 1TB 기준 처리량 : 40MB/s
- 콜드 HDD(sc1)
- 가장 저렴한 단위 용량당 비용
- 1TB 기준 처리량 : 12MB/s
EBS 다중 연결
- 동일한 가용 영역에 있는 최대 16개의 Nitro 시스템 기반 리눅스 인스턴스에 공유 볼륨 연결 가능
- XFS, EXT4와 같은 파일 시스템은 동시에 액세스하도록 설계되지 않았음에 주의
Amazon Data Lifecycle Manager
- EBS 스냅샷 및 AMI 생성 ~ 삭제 자동화 가능
- 정책 실행 주기에 따라 이벤트가 발생하므로 CloudWatch로 모니터링 가능
탄력적 볼륨
사용 중인 볼륨의 크기를 늘리거나 유형을 변경할 수 있다. 인스턴스를 재시작할 필요는 없지만, 크기를 변경한 경우 파일 시스템을 확장해야 한다
I/O 특성
- 단일 I/O의 최대 크기는 SSD의 경우 256KB, HDD의 경우 1MB
- 물리적으로 연속되는 I/O 작업은 단일 I/O 작업으로 병합된다
- 임의 I/O 작업은 크기가 작더라도 단일 I/O 작업으로 실행된다
- IOPS 제한 외에 볼륨 처리량 제한도 존재함에 유의
I/O 단위가 크다면 IOPS 제한량보다 낮은 수준에서 처리량 제한에 도달할 수 있다. 반대로 볼륨 처리량 제한을 너무 높게 잡으면, 도달할 수도 없는 성능을 위해 추가 비용을 지불하는 셈이 된다
- 적정 I/O 처리 대기열은 SSD의 경우 1000IOPS 당 1 이하
인스턴스 스토어
- 인스턴스 스토어는 EC2 인스턴스와 물리적으로 연결된 디스크에 위치하는 임시 스토리지
버퍼, 캐시 등과 같이 자주 변경되는 임시 파일에 적합
- 인스턴스 스토어 볼륨을 사용하더라도, 루트 디바이스 볼륨은 Amazon EBS 볼륨이어야 한다
일부 이전 세대 인스턴스 유형 제외
- 인스턴스 중지 시 인스턴스 스토어 볼륨은 초기화된다
- 인스턴스로부터 AMI 생성 시 인스턴스 스토어 데이터는 보존되지 않는다
Elastic Beanstalk
개요
- 소스 번들로부터 웹 앱을 배포한다
지원하는 언어는 Java, .NET, PHP, Node, Python, Ruby, Go로 다양
- 컨테이너 기반의 App Runner와 달리, 웹 앱은 EC2 인스턴스 하나씩을 독점 사용한다
제자리 업데이트의 경우, 메모리가 부족하면 시간초과되기 십상이므로 램 1GiB 짜리 인스턴스는 부적합
개념
- 애플리케이션 : Elastic Beanstalk 애플리케이션은 환경, 버전, 환경 구성을 포함한 논리적 컬렉션
- 애플리케이션 버전 : 웹 앱의 배포 가능한 코드에 지정된 레이블
- 환경 : 애플리케이션 버전을 실행하는 AWS 리소스 모음
- 웹 서버 환경 : 웹 요청을 직접 받아 처리
- 작업자 환경 : SQS 대기열의 메시지 처리
EC2 인스턴스에 자동으로 데몬이 설치되어, 데몬이 메시지를 웹 앱으로 전달한다
- 환경 구성 : 연관된 AWS 리소스의 작동을 정의하는 설정들
Elastic Beanstalk 생성 시 만들어지는 리소스 목록
- EC2 인스턴스
- EC2 보안 그룹 : 웹 트래픽 수신을 위한 보안 그룹
- 로드 밸런서
- EC2 Auto Scaling 그룹
상태 확인 유형에 EC2만 설정됨에 유의
- S3 버킷 : 소스 번들, Elastic Beanstalk 로그 저장
- CloudWatch 경보 : Auto Scaling 그룹 관련 경보
- CloudFormation 스택
- 도메인 이름 : subdomain.region.elasticbeanstalk.com 기본 제공
고급 설정
- 소스 번들 루트 디렉터리에 .ebextensions 서브 디렉터리를 만들고, *.config 파일들을 둠으로써 Elastic Beanstalk 기본 설정을 재정의할 수 있다
- 가능한 값에 대해서는 다음 링크 참조 : command-options-general
- elastic-beanstalk-samples
ALB에 부여할 보안 그룹 지정
↓ 예. alb.config
SSH를 public으로 공개하는 기본 보안 그룹이 생성되는 문제
- SSHSourceRestriction 옵션을 이용해 SSH 공개 범위를 조정할 수 있다
↓ 예. ec2.config
- 연관 GitHub 이슈 : 44
IAM; Identity and Access Management
AWS 계정
- AWS 계정은 AWS의 기초적인 보안 경계, 리소스 경계, 책임 경계가 된다
- AWS 각 서비스 제한량 역시 AWS 계정을 기준으로 부여할 수 있다
AWS Organizations
- 여러 AWS 계정을 조직에 통합하여 중앙에서 관리하는 서비스
- 효율적인 조직 비용 관리 가능
- 최대 5단계의 OU(조직 그룹) 트리 구성 가능
- 조직 관리자가 정의한 제한은 개별 멤버 계정 관리자보다 우선
IAM이란?
- 단일 계정 내 인증 및 권한 관리 서비스
- 암호나 액세스 키를 공유하지 않고도 권한 부여
- 세분화된 권한 관리
- 다른 곳에 암호가 있는 사용자에게 임시 액세스 권한 부여
- AWS는 PCI DSS 1 레벨1 서비스 공급자 인증을 받음
- IAM과 STS는 추가 비용 없이 제공됨
IAM 작동 방식
Terms
- IAM 리소스
사용자, 그룹, 정책, 자격 증명 공급자 객체는 다른 AWS 서비스와 마찬가지로 IAM에서 추가, 편집, 제거 가능한 리소스다
- IAM 자격 증명
사용자(영구 자격 증명 사용), 그룹, 역할(임시 보안 자격 증명 사용). 식별 및 그룹화에 사용되는 IAM 리소스 객체로, 정책을 이에 연결할 수 있다
- IAM 엔터티
사용자, 역할. AWS가 인증에 사용하는 IAM 리소스 객체
- 보안 주체
AWS 루트 사용자, IAM 사용자, IAM 역할을 사용하여 AWS에 요청하는 사람 또는 애플리케이션
- 최소 권한 원칙
필요한 경우에만 승격된 권한을 사용하도록 제한
Request
보안 주체가 AWS Management Console, AWS API, AWS CLI를 사용해 전송하는 요청에는 다음의 정보가 포함된다 -- 요청 컨텍스트
- 수행하고자 하는 작업
- 작업 대상이 되는 AWS 리소스 객체
- 요청을 보내는 보안 주체
- 환경 데이터 : IP 주소, User agent, SSL 사용 여부 등
- 리소스 객체와 연관된 데이터 : EC2 인스턴스 태그 등
Authorization
AWS는 요청 컨텍스트에 적용되는 각 정책을 확인하여, 하나라도 거부되는 경우 전체 요청을 거부하고 평가를 중지한다. 아래는 요청 평가에 대한 일반 규칙
- 기본적으로 모든 요청은 거부
- 정책에 포함된 명시적 허용은 위 거부를 재정의
- 권한 경계 또는 세션 정책이 있는 경우 위 허용을 재정의
- 정책의 명시적 거부는 위 허용을 무시
ABAC란?
- ABAC(Attribute based access control)는 보안 주체와 리소스의 태그가 일치할 때 권한을 부여한다
- 동종 리소스에 대한 동일 작업에 대한 정책 하나만 가지고도 각 보안 주체가 각각 필요한 리소스에만 접근할 수 있게 한다
IAM 시작하기 > IAM 관리자 및 사용자 그룹 생성
- 루트 사용자로 로그인
- 탐색 표시줄 > 내 계정 > 결제 정보에 대한 IAM 사용자 및 역할 액세스 편집 > IAM 액세스 활성
관리자 사용자가 비용 및 사용량과 상호작용하려면 위 작업 필요
- IAM 콘솔에서 관리자 사용자 추가. 여러 명인 경우 사용자 그룹도 추가
- 사용자 또는 사용자 그룹에 AdministratorAccess 정책 연결
자습서
역할을 사용하여 AWS 계정 간 권한 위임
- 리소스를 가진 계정(A)에서 리소스 액세스 역할 생성
역할 생성 시, 신뢰할 수 있는 엔터티 유형으로 "다른 AWS 계정" 지정
- 권한을 위임받고자 하는 계정(B)에서 적절한 IAM 보안 주체에 AssumeRole 허용 정책 연결
↓ 인라인 정책 예
- 역할 전환 테스트
- AWS 콘솔
- 역할 전환 시 ExternalId를 요구하지 않아야만 가능
- 방법 1 : 역할 생성 시 Role Summary 페이지에서 제공된 url 사용
- 방법 2 : 탐색 표시줄 > Switch Role > 계정 ID 또는 alias, 역할 이름 수동 입력
- AWS CLI
↓ aws-cli
- AWS API
AssumeRole 호출 응답으로 주어진 임시 자격 증명을 사용하여 API 호출
- AWS 콘솔
ABAC 사용
- "access-" 접두사를 가진 역할에 대해, 사용자 태그와 역할 태그가 일치하는 경우 역할 전환할 수 있는 정책 예
↓ json
- SAML 세션 태그를 이용해 역할 전환하는 정책 예
↓ json
- 보안 주체 태그와 리소스 태그가 일치하는 경우 권한을 인가하는 정책 예
↓ json
- ABAC로 권한을 부여받은 보안 주체가 태그 및 리소스 기반 정책을 변경하지 못하도록 하는 정책 예
↓ json
ID
Roles
역할을 사용할 수 있는 주체
- 동일한 AWS 계정의 IAM 사용자
- 다른 AWS 계정의 IAM 사용자
- AWS 서비스(EC2 등)
- SAML 2.0, OpenID Connect 등 외부 자격 증명 공급자(IdP)에 의해 인증된 외부 사용자
EC2 애플리케이션에서 역할 사용
EC2 인스턴스에 IAM 역할을 할당하면 장기 자격 증명을 인스턴스에 배포하지 않아도 된다. 예를 들어, AWS Java SDK에서 인증 정보 없이 서비스 클라이언트 인스턴스 생성 시 DefaultAWSCredentialsProviderChain에 정의된 순서대로 인증 정보를 조회한다
- 환경 변수 : AWS_ACCESS_KEY, AWS_SECRET_KEY
Java SDK 외의 경우엔 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
- Java System Properties : aws.accessKeyId, aws.secretKey
- Web Identity Token credential
- Credential profile : ~/.aws/credentials
- Amazon EC2 container service로 전달되는 인증 정보
- Amazon EC2 metadata service로 전달되는 인증 정보
인스턴스 내부에서 aws cli를 직접 실행하는 경우엔 얘기가 다르다. profile을 추가로 지정해야 하고, 해당 profile로 assume role할 수 있는 권한이 있어야 한다
CloudTrail을 사용하여 이벤트 로깅
- CloudTrail은 IAM, STS 호출을 이벤트로 캡처한다
- 글로벌 리전 서비스가 아닌 경우, 이벤트는 한 리전에만 로깅된다
- 추적을 생성하면 이벤트를 S3 버킷으로 배포할 수 있다
- 추적을 생성하지 않아도 Event history에서 90일 간의 기록을 무료로 확인 가능
CloudTrail 이벤트
- 관리 이벤트 : 관리 작업에 대한 정보
예. 보안 구성, 로깅 설정 등
- 데이터 이벤트 : 리소스 작업에 대한 정보
예. 버킷 및 객체 수준 API, Lambda 실행, DynamoDB 객체 수준 API
- Insignts 이벤트 : 비정상적인 API 호출 비율, 오류 비율 캡처
액세스 관리
정책 및 권한
정책 유형
- 자격 증명 기반 정책 : 관리형 및 인라인 정책을 보안 주체에 연결
- 리소스 기반 정책 : 인라인 정책을 리소스에 연결. 예. S3 버킷 정책, IAM 역할 신뢰 정책
- 권한 경계 : 부여할 수 있는 최대 권한 정의
- Organizations SCP : 조직 단위 계정 멤버에 대한 최대 권한 정의
- ACL : JSON 정책 문서 구조를 사용하지 않고, 액세스할 수 있는 보안 주체 목록으로 제어
- 세션 정책 : 역할 또는 페더레이션 사용자에 대해 임시 세션을 프로그래밍 방식으로 생성할 때 파라미터로 전달하는 고급 정책
JSON 정책 언어 문법(2012-10-17)
↓ text
- Version : 정책 언어 버전
- Id : 정책 식별자
- Statement : 1개 이상의 세부 정책
- Sid : 세부 정책 식별자. API에서 참조되는 값이 아니며, 정책에 대한 서술을 적어도 좋다
- Effect : 세부 정책이 허가/거부를 나타내는 지 여부
- Principal : 리소스 기반 JSON 정책에서, 허가/거부의 대상이 될 보안 주체 지정
- NotPrincipal : Principal과 반대로, 여집합을 지정
"Effect": "Deny"와 함께, 지정한 보안 주체를 제외한 모든 보안 주체에 대해 명시적으로 거부하는 드문 경우에 사용
- Action : 대상 작업 목록. 작업 이름은 대소문자 구별 없음. 와일드카드 * 가능
- NotAction : Action과 반대로, 여집합을 지정
- Resource : 대상 리소스 ARN 목록. 와일드카드 *, ? 가능
- NotResource : Resource와 반대로, 여집합을 지정
- Condition : 요청 컨텍스트에 대한 추가 조건 연산
정책 조건 연산
- 조건 키는 대소문자 구별 없음. aws:ResourceTag/tag-key처럼 키 일부를 사용자가 지정할 수 있는 경우에도 마찬가지로 대소문자 구별 없음에 유의
- 각 조건 키의 평가 결과는 다음 중 하나 : true, false, not present, null(빈 문자열)
- 조건 연산자
연산자 설명 대응 Not 연산자 문자열 조건 연산자 정책 변수 사용 가능 StringEquals 대소문자 구별한 문자열 일치 StringNotEquals StringEqualsIgnoreCase 대소문자 무시한 문자열 일치 StringNotEqualsIgnoreCase StringLike 대소문자 구별한 문자열 일치. 와일드카드 *, ? 허용 StringNotLike 숫자 조건 연산자 정책 변수 사용 불가. 정수 또는 십진수 비교 NumericEquals 일치 NumericNotEquals NumericLessThan 미만 NumericGreaterThanEquals NumericLessThanEquals 이하 NumericGreaterThan 날짜 조건 연산자 정책 변수 사용 불가. ISO 8601 포맷 또는 UNIX epoch 비교 DateEquals 일치 DateNotEquals DateLessThan 미만 DateGreaterThanEquals DateLessThanEquals 이하 DateGreaterThan 부울 조건 연산자 정책 변수 사용 불가. 키를 "true" 또는 "false"와 비교 Bool 일치 이진 조건 연산자 정책 변수 사용 불가 BinaryEquals 지정한 Base64 인코딩 표시와 바이트 단위로 일치 IP 주소 조건 연산자 정책 변수 사용 불가 IpAddress 지정 CIDR에 포함 NotIpAddress ARN 조건 연산자 정책 변수 사용 가능. ARN의 콜론으로 구분된 6개 구성요소 각각 별도로 확인한다 ArnEquals, ArnLike 대소문자 구별한 ARN 일치. 와일드카드 *, ? 허용 ArnNotEquals, ArnNotLike …IfExists 조건 연산자 Null을 제외한 조건 연산자 이름 끝에 IfExists를 추가하면 요청 컨텍스트에 정책 키가 없으면 true로 평가 Null 정책 변수 사용 불가. 조건 키의 유무 검사 - 한 정책에 다수의 조건 연산자가 있는 경우 : AND 평가
- 한 조건 연산자에 다수의 키가 추가된 경우 : AND 평가
- 한 조건 키에 다수의 값이 포함된 경우 : OR 평가
- 값 자체가 다중인 경우, 조건 집합 연산자를 사용할 수 있다
- ForAllValues : 요청 컨텍스트의 값 집합이 지정한 조건 키 집합의 부분집합
- ForAnyValue : 요청 컨텍스트의 값 집합 원소 중 하나라도 지정한 조건 키 집합의 원소
↓ text
- 정책 변수 및 태그
- Resource 요소에서의 사용 : ARN의 5번째 콜론 뒷부분만
↓ text
- Condition 요소에서의 사용 : 허용되는 조건 연산자에서만
↓ text
- 모든 요청에 사용할 수 있는 정보
aws:CurrentTime 현재 시각 aws:EpochTime 현재 시각 aws:TokenIssueTime 임시 보안 자격 증명 발급 시각 aws:PrincipalType 보안 주체 종류 : Account, User, FederatedUser, AssumedRole, Anonymous(S3, SNS, SQS) aws:SecureTransport SSL 요청인지 여부 aws:SourceIp 요청자 IP aws:UserAgent 신뢰성이 떨어지는 클라이언트 정보 aws:userid 보안 주체 고유 ID aws:username IAM 사용자 이름 ec2:SourceInstanceARN EC2에 할당된 IAM 역할을 이용해 들어온 요청인 경우 인스턴스 ARN이 설정됨 - 서비스별 정보
s3:prefix, s3:max-keys, s3:x-amz-acl, sns:Endpoint, sns:Protocol, ...
- 특수 문자 리터럴 표현
- ${*} : 문자 * 표현
- ${?} : 문자 ? 표현
- ${$} : 문자 $ 표현
- 변수가 없는 경우 사용할 기본값 제공
↓ text
- Resource 요소에서의 사용 : ARN의 5번째 콜론 뒷부분만
정책 예제
참고 자료 : access_policies_examples
- MFA 설정 허용 정책
↓ json
- S3 SSL 요청 강제 정책
↓ json
- Lambda 정책 예제
액세스 분석기
IAM Access Analyzer는 외부 엔터티와 공유되는 조직 및 계정 내 리소스를 식별하여 액세스가 의도한 액세스인지, 의도하지 않은 보안 위험인지 확인할 수 있다. 모든 상용 AWS 리전에서 무료로 IAM 콘솔 및 API를 통해 이용 가능
Lambda
개요
Lambda는 상시 가동 중인 서버 없이, 요청/이벤트가 있을 때만 코드를 실행하는 컴퓨팅 서비스. 이러한 특성상 수평적 확장이 상당히 용이하다(초당 수천 개 요청까지 처리 가능)
- 컨테이너 이미지로도 람다 정의 가능
이미지를 주기적으로 가져오므로, ECR 내에 계속 유지해야 한다
- 데이터베이스 프록시로 연결 풀 제공(추가 비용 있음)
- EFS 마운트하여 사용 가능
- 동시에 여러 요청 처리 가능
- 함수 URL을 통한 호출 가능
- 비동기식 호출 가능 -> 이벤트를 대기열에 넣고 즉시 응답
- zip 파일로 함수를 생성한 경우, 함수 계층을 나눌 수 있다
실행 환경의 /opt 디렉터리에 추출된다. 계층은 설정한 순서대로 추출되고, 이름이 동일한 파일이 존재하는 경우 마지막으로 추출된 파일이 유지된다
- Lambda는 함수의 메모리 설정에 비례하여 CPU 용량을 할당한다 -- 1,769MB에서 1vCPU
- 리소스를 함수와 익스텐션이 공유함에 유의
- PostRuntimeExtensionsDuration 지표는 함수 종료 ~ 익스텐션 종료 사이의 시간(누적)을 측정한다
- MaxMemoryUsed 지표는 최대 메모리 사용량을 측정한다
- 버전을 게시한 함수는 코드, 환경 변수를 수정할 수 없다
프로그래밍 모델
- 함수의 클래스는 메모리에 유지되므로, 초기화 코드에서 재사용 가능한 리소스를 생성하면 처리 시간을 절약할 수 있다
- 몇 시간 정도 활성 상태로 유지되는 /tmp 디렉터리를 사용할 수 있다(기본 제한량 512MB)
Lambda 실행 환경이 재사용 될 수 있다고 가정하여 코드를 작성하는 것이 바람직하다 -- 그러나 "재사용 된다고" 가정하는 것은, 잘못된 가정이다
- 함수의 로깅 출력은 CloudWatch Logs로 전송되지만 할당량으로 인해, 또는 인스턴스가 중지될 때 손실될 수 있다
VPC 네트워킹
- 함수는 항상 Lambda 서비스가 소유한 VPC 내에서 실행된다
- Lambda 함수가 계정 VPC의 ENI에 연결하기 위한 Hyperplane ENI를 제공한다
Lambda VPC 및 Hyperplane ENI에 대한 추가 요금은 부과되지 않는다
동시성 제어
- 함수가 요청을 처리하는 시간보다 빠르게 함수가 호출되는 경우, 추가 인스턴스를 실행하여 규모를 확장한다
함수를 실행중이지 않은 인스턴스는 요금이 부과되지 않는다
- 동시에 실행할 수 있는 인스턴스의 수에는 리전 수준 할당량이 적용된다. 기본 1000
- 동시성이 부족한 경우 HTTP 요청은 429 코드로 응답된다
- 한 함수가 너무 많은 동시성을 사용하지 못하도록 '예약된 동시성'을 구성할 수 있다
예약된 동시성은 가용 동시성 풀을 하위 집합을 분할한다
- 예약된 동시성을 0으로 지정하면, 제한을 해제하기 전까지 함수가 호출되지 않는다
- 매우 짧은 지연 시간을 유지해야 한다면, 프로비저닝된 동시성을 사용하여 인스턴스를 항상 실행된 상태로 유지할 수 있다
프로비저닝된 동시성은 함수의 예약된 동시성 및 리전 할당량을 초과할 수 없다. 프로비저닝된 인스턴스는 함수를 실행중이지 않더라도 비용이 청구된다
- Application Auto Scaling을 이용해 프로비저닝된 동시성을 동적으로 조정 가능
비동기 호출
- 이벤트는 함수에 보내지기 전에 대기열(큐)에 삽입된다
- 함수의 동시성이 부족한 경우(429), 시스템 오류(5xx)의 경우 Lambda는 이벤트를 대기열로 반환하고 최대 6시간(설정 축소 가능) 동안 재실행을 시도한다
- 함수가 동일한 이벤트를 여러 번 수신할 수도 있다
- 대기열이 너무 긴 경우, 함수에 이벤트가 보내지기 전에 만료될 수
이벤트 소스 매핑
- 함수를 직접 호출하는 대신, 다른 서비스의 스트림 또는 대기열의 항목 처리
- 지원 AWS 서비스 : DynamoDB, Kinesis, MQ, MSK, SQS
- 그 외 서비스 : 자체 관리형 Apache Kafka
- 기본적으로 이벤트는 배치 처리된다 -- 이벤트들은 함수에 단일 페이로드로 전달된다
MaximumBatchingWindowInSeconds, BatchSize로 조정 가능
- 페이로드는 6MB를 초과할 수 없으며, 이 한도는 수정할 수 없다
이를 초과한다면, 배치 설정과 무관하게 함수에 전달된다
- 오류로 인한 함수 재실행 시에도 전체 배치가 다시 처리된다
함수 URL
- 함수에 고유하게 부여되는 URL. HTTP(S) 요청을 수신한다
- IPv4, IPv6 모두 지원
- AuthType 파라미터 및 리소스 기반 정책 설정으로 액세스 제어 가능
- CORS 구성 옵션 지원
- 함수 alias에 대해 연결도 가능
권한
- 실행 역할 : 함수 실행 시 부여받는 IAM 역할
- 리소스 기반 정책 : 함수 실행 권한을 다른 서비스, 계정, 조직에 부여
- 사용자 권한 : 함수에 대한 읽기/쓰기/태그 권한을 IAM 역할, 사용자, 사용자 그룹에 부여 가능
- 권한 경계 : Lambda 애플리케이션의 권한 경계 설정 가능
런타임
- Lambda 런타임은 함수가 호출될 때 핸들러 메서드를 실행하는 프로그램으로, 임의 프로그래밍 언어로 구현할 수 있다
- 사용자 지정 런타임을 사용하려는 경우, 함수의 런타임을 provided로 설정한다
실행 환경

- 익스텐션은 모니터링, 보안 및 거버넌스를 위한 목적으로 Lambda 수명 주기 및 함수 이벤트에 등록하는 핸들러
zip 압축 파일을 이용하는 경우, 계층 추가를 이용해 익스텐션을 함수에 추가한다
- 외부 익스텐션은 독립 프로세스로 실행되며, 함수 호출이 종료돼도 계속 실행된다
컴파일 언어를 사용하여 구현하는 게 추천된다
- 익스텐션은 Logs API를 사용해 함수의 로그 메시지를 구독할 수 있다

- Init : 총 10초 제한. 첫 번째 함수 호출 시, 또는 프로비저닝된 동시성을 사용하는 경우 호출 전에 단 한 번 실행된다
- Invoke : Next API 요청에 대한 응답으로 Lambda 함수가 호출되면, Lambda는 런타임과 익스텐션에 각각 Invoke 이벤트를 전송한다
함수의 제한 시간은 전체 Invoke에 적용된다. 예를 들어 360초로 설정한 경우, 함수와 모든 익스텐션이 360초 안에 완료되어야 한다
Invoke 단계 중 Lambda 함수가 충돌하거나, 제한 시간을 초과한 경우 Lambda는 실행 환경을 재설정한다. 재설정 중 Shutdown 단계가 실행된다
- Shutdown : 함수가 일정 기간 동안 호출되지 않으면 종료 절차에 돌입한다
- 등록된 익스텐션이 없는 경우 제한 시간은 0초
- 등록된 내부 익스텐션이 있는 경우 제한 시간은 500밀리초
- 등록된 외부 익스텐션이 있는 경우 제한 시간은 2,000밀리초
제한 시간을 초과한 경우, Lambda는 SIGKILL 신호로 종료한다
Lambda@Edge
- CloudFront 요청/응답으로 트리거되는 람다 함수
원본 이미지 1개에 대하여, 여러 사이즈의 캐시 응답을 생성하는 예시 :resizing-images-with-amazon-cloudfront-lambdaedge-aws-cdn-blog
- Lambda Layer는 지원되지 않는다
가능한 실행 지점
- Viewer Request : CloudFront가 요청을 받아, 캐시를 검사하는 시점에 실행
- Origin Request : 캐시에 항목이 없어 원본(origin)을 요청하는 시점에 실행
- Origin Response : 원본(origin) 응답을 받은 이후, 캐시에 적재하기 전에 실행
- Viewer Response : 응답을 엔드 유저에게 전달하기 전에 실행
Proton
개요
컨테이너 기반 서버리스 애플리케이션에 대한 2가지 자동화를 제공한다. 템플릿 생성, 게시, 관리에는 비용이 청구되지 않는다
- 플랫폼 관리자가 정의한 IaC(infrastructure as code) 템플릿대로 인프라를 자동 구축
플랫폼 관리자는 버전 관리되는 환경 및 서비스 템플릿을 정의한다. 환경 템플릿은 서비스들이 공유하는 인프라 집합을 정의하고, 서비스 템플릿은 각 서비스가 필요로 하는 인프라 요소들을 정의한다
- 통합된 CI/CD 기능을 통해 코드 자동 배포
시작하기

- 환경 템플릿 생성 ~ 배포
- 배포한 특정 버전의 환경 템플릿에 인자를 지정하여 환경 생성
- 서비스 템플릿 생성 ~ 배포
- 서비스 생성에 사용할 코드 저장소 - 브랜치 작성
- 배포한 특정 버전의 서비스 템플릿에 인자와 코드 저장소 및 브랜치를 지정하여 서비스 및 서비스 인스턴스 생성
- 최종적으로 개발자가 지정한 환경에 지정한 수량만큼의 서비스 인스턴스가 생성된다
WAF, Firewall Manager, Shield
개요
- WAF(Web application firewall)
규칙(예. 시간-IP당 요청 수)을 기반으로 HTTP/HTTPS 요청에 대한 허용/거부(403 Forbidden) 결정
- Shield
- DDoS 보호 서비스
- Shield Standard : 기본 제공
Elastic Load Balancing(ELB), Application Load Balancer, Amazon CloudFront, Amazon Route 53에 대해 자동으로 활성화
- Shield Advanced : 고급 기능 제공(월 3,000 USD)
- Firewall Manager
조직의 계정과 애플리케이션 방화 규칙에 대한 중앙 관리 서비스
WAF
- Web ACL : 액세스를 결정하는 규칙 리스트. 규칙은 ACL 제한 용량까지만 추가 가능
- Rule : 각 규칙은 조건식을 가지며, 조건식을 만족하는 요청에 대해 허용/거부/카운트/CAPTCHA 중 어느 것을 실행할 지 결정한다
- Rule group : 재사용 가능한 규칙
Rule
Rule action
- Allow : 요청 허용
요청에 커스텀 헤더 추가 가능
- Count : 카운터 증가. 나머지 규칙 평가
요청에 커스텀 헤더 추가 가능. 이후 규칙 평가를 위한 커스텀 레이블 추가 가능
- Block : 요청 거부
- CAPTCHA : 캡차 실행
Rule type
- Regular rule : 조건 일치 요청에 대해 개별 action 결정
- Rate-based rule : 기간(5분) 중 동일 IP에 대해 임계값 초과한 요청에 대해 action 결정
Rule statement
- 모든 요청에 대해 action 실행
- IP 기반 국가 코드 일치하는 요청에 대해 action 실행
- IP 집합 포함 요청에 대해 action 실행
- Label 소지 요청에 대해 action 실행
- Header 패턴 일치 요청에 대해 action 실행
- Query 패턴 일치 요청에 대해 action 실행
- URI 패턴 일치 요청에 대해 action 실행
- Body 패턴 일치 요청에 대해 action 실행
최대 8KB만 평가한다
- HTTP method 패턴 일치 요청에 대해 action 실행
↓ Rule 예시
기타 서비스
- AppConfig
애플리케이션 런타임 환경 배포 -- StartConfigurationSession로 세션을 수립한 클라이언트는 GetLatestConfiguration을 (주기적으로) 호출하여 구성을 가져온다
- Chatbot
- SNS(Simple Notificatino Service)로부터 Amazon Chime 또는 Slack으로의 통지
- Amazon Chime 또는 Slack에서 챗봇 IAM 역할로 명령 실행
- CLI
셸을 이용해 브라우저 기반 AWS Management Console과 동일하게 AWS 서비스와 상호작용
- CloudTrail
보안 주체 활동 로깅CloudTrail을 사용하여 이벤트 로깅
- CloudWatch
AWS 리소스 및 애플리케이션 모니터링
- DMS
- 동종 또는 이종 DBMS 간 마이그레이션 지원
- 소스 엔드포인트에 DDL 변경 감지를 활성화하면, 마스터 유저 외의 유저로 DDL 실행 불가능하다
나중에 트리거를 제거하려면 아래 쿼리를 수동으로 실행해야 한다
↓ sql
- 테이블에 기본키가 없으면 delete, update는 동기화되지 않는다 -- 무시된다
- 시퀀스 자체를 동기화하진 않으므로, 타깃 DB의 시퀀스 시작 번호를 적절히 재설정해야 한다
- EC2 Image Builder
AMI 또는 컨테이너 이미지 자동 빌드
- ECR
AWS 관리형 컨테이너 이미지 레지스트리
- GuardDuty
계정 내의 비정상적인 활동을 식별하고, 활동의 보안 관련성을 분석하며, 호출된 컨텍스트를 제공
- Health
AWS 인프라 이벤트(오류 발생, 복구 등), 예정된 변경 사항 및 영향 받은 리소스에 대해 안내
- Managed Service for Prometheus
Prometheus 호환, 자동 확장 컨테이너 모니터링 서비스
- Network Firewall
VPC 경계 트랙픽 관리 방화. 보안 그룹만으로 불충분한 경우 사용
- Resource Group
리소스들을 그룹화하여 여러 리소스에 대한 작업을 한 번에 실행. 지원하는 서비스 목록:integrated-services-list
- Secrets Manager
암호 중앙 관리자. 암호 검색 API 제공
Rotation을 설정하여 자동으로 갱신하게 설정한 경우 유의사항 : 중간에 수동으로 값을 변경하면 LastRotatedDate가 변경되므로, 다음 자동 갱신 예정 날짜가 이에 맞춰 변경된다
- Security Hub
자동화된 보안 검사 -> 우선순위가 높은 보안 문제 식별
- EFS; Elastic File System
- 용량 제약 없는 분산 네트워크 파일 시스템
- 동시에 수천 개의 인스턴스가 사용할 수 있다
- EBS보다 지연시간은 느리지만, 단위 시간당 처리량은 높다
높은 IOPS에는 부적합
- S3; Simple Storage Service
99.999999999% 내구성. 크기 무제한
2024-11-25부터 ETag를 이용한 조건부 연산 가능. 예. 지정한 ETag와 일치하는 경우에만 덮어쓰기/삭제 수행
- S3 Glacier
저렴한 데이터 아카이빙 S3 스토리지
- ELB; Elastic Load Balancing
EC2 인스턴스, 컨테이너, IP 주소, Lambda 함수 등으로의 부하 분산
로드 밸런서는 모든 트래픽이 거치는 지점이기 때문에, 로드 밸런서 자체도 스케일러블 해야한다 -- 때문에 비전문가가 직접 구성하는 것보단, 클라우드 관리 서비스를 이용하는 것이 단일 장애 지점을 회피할 수 있을 것
- ElastiCache
Redis, Memcached
- CloudFront
글로벌 CDN
- Route 53
엔드 유저의 요청을 적절한 EC2 인스턴스, ELB, S3 버킷 등으로 연결하는 DNS
- Simple Queue Service
메시지 큐
- Simple Notification Service
Pub/Sub 푸시 기반 메시징 서비스. 모바일 푸시, SMS, 이메일 등 가능
- Simple Email Service
- Organizations
- 조직을 나누어 각 조직에 멤버 계정을 생성해 할당할 수 있다
- 각 조직에 대한 정책을 정의할 수 있다
- 단일 마스터 계정이 모든 비용을 지불한다
S3
API 호출 빈도 제한사항
- optimizing-performance
- S3 API는 버킷의 접두어를 기준으로 최소 처리 비율을 보장한다. 버킷에 대해 접두어 개수 제한은 없으므로, 서로 다른 접두어들을 이용함으로써 쉽게 최소 처리량을 확장할 수 있다
2024-05-13 변경사항
AWS 계정 또는 조직 외부에서 발생한 요청에 대해 HTTP 403 응답을 반환하는 요청에 대해서는 요청 및 대역폭 요금이 발생하지 않게 됨
VPC
Client VPN
개요
VPC를 외부에 개방하지 않으면서 인증된 클라이언트와의 네트워킹을 허용하는 클라이언트 기반 VPN 서비스
- Client VPN 엔드포인트
Client VPN 관리자는 Client VPN 엔드포인트에 인증 정보, 클라이언트가 액세스할 수 있는 리소스를 정의
- VPN 클라이언트 애플리케이션
- Client VPN 엔드포인트에 연결하고 보안 VPN 연결을 설정하는 데 사용하는 애플리케이션
- AWS 제공 클라이언트
- OpenVPN 클라이언트
- Client VPN 엔드포인트 구성 파일
VPN 연결을 설정하는 데 필요한 인증 정보가 포함. VPN 클라이언트 애플리케이션에 이 파일을 로드
- Client VPN 네트워크 인터페이스
VPC 서브넷이 Client VPN 엔드포이트와 연결될 떄 해당 서브넷에 생성되는 네트워크 인터페이스. 클라이언트에서 VPC로 보내지는 트래픽은 이 네트워크 인터페이스를 통해 소스 IP 주소가 네트워크 인터페이스의 주소로 교체된다(SNAT: Source network address translation)
인증서 관리
- OpenVPN easy-rsa 저장소 복제
↓ shell
Windows 환경에서는배포 페이지에서 Windows용 번들을 압축 해제하여 EasyRSA-Start.bat 실행
- 도움말 출력
↓ shell
- CA 인증서 생성
↓ shell
- 서버 인증서 생성
↓ shell
- Certificate Manager에 서버 인증서 등록
서버 인증서 공개키, 서버 인증서 비밀키, CA 인증서 공개키 각각 설정하여 등록
- 클라이언트 인증서 생성
↓ shell
- Certificate Manager에 클라이언트 인증서 등록
- 클라이언트 인증서 공개키, 클라이언트 인증서 비밀키, CA 인증서 공개키 각각 설정하여 등록
- 서버와 동일한 CA로 서명되었다면, 클라이언트 인증서는 등록하지 않아도 된다
- 클라이언트 제거
- revoke
↓ shell
- Client VPN 엔드포인트 > 클라이언트 인증서 CRL(Certificate Revocation List) 가져오기 실행
- revoke
- CRL(Certificate Revocation List)을 이용하는 경우 주의사항
CRL 자체에도 만료 시각이 존재하므로, 해당 시각 이전에 CRL을 갱신해줘야 한다
↓ CRL 만료 시각 확인
관련 CloudWatch 메트릭 : CrlDaysToExpiry
<Screen Shot 2023-10-30 at 10.22.33 AM.png>[원본 보기]
클라이언트 인가
- 보안 그룹을 이용해 인가된 트래픽만 허용
- Active Directory, SAML 등 통합된 외부 인증을 사용하는 경우엔 추가적인 규칙을 설정할 수 있다
연결 핸들러
- 람다를 이용하여 추가적인 검증을 수행할 수 있다
인증 정보 검증 --(성공시)--> 람다 실행 --(성공시)--> 인가 정책 평가
- 람다 예.
↓ AWSClientVPN-Auth
분할 터널
- 기본적으로 클라이언트의 모든 트래픽은 VPN 터널로 라우팅된다
- 분할 터널을 사용 설정하면 라우팅 테이블에 존재하는 목적지에 대한 트래픽만 VPN 터널로 라우팅된다
PrivateLink
퍼블릭 인터넷을 통해 트래픽을 보내지 않고 VPC에서 AWS API를 호출
- AWS 계정 생성시 VPC, 서브넷, 라우팅 테이블, 인터넷 게이트웨이, 네트워크 ACL 등은 가용 리전 및 AZ에 대해 기본적으로 생성된다
NAT 게이트웨이 등 사용자가 필요에 의해 직접 추가하는 리소스들은 추가 요금이 발생함에 유의
- VPC; Virtual Private Cloud
AWS 계정 및 AWS 리전에 대해 고유한 전용 네트워크
- AZ; Availability Zone, 가용 영역
AWS 리전은 2개 이상의 가용 영역으로 구성되며, 각 AZ는 서로의 장애로부터 물리적으로 격리된다
- Subnet
- VPC 내 할당 가능한 IP 주소 영역의 일부. AZ 안에 서브넷을 작성할 수 있으며, 다른 AZ와 공유되지 않는다
- Private subnet 안에서 생성된 인스턴스에는 public IP가 부여되지 않는다
또는 인스턴스 실행 시 public IP 부여 여부를 결정할 수 있으며, 인터넷 게이트웨이와 연결되지 않은 라우팅 테이블에 서브넷을 연결하면 결과적으로 public IP가 없는 것과 같은 효과를 갖는다
- Route table
VPC 내부↔외부 네트워크 트래픽을 제어하는 규칙 정의. 라우팅 테이블 : 서브넷 = 1 : N 관계
- Internet gateway
- VPC 내부와 외부 인터넷 사이의 연결 통로
- VPC 내 인스턴스 → 외부 인터넷 : 트래픽의 송신 주소를 인스턴스의 public IP/Elastic IP로 설정
- 외부 인터넷 → VPC 내 인스턴스 : 트래픽의 수신 주소를 인스턴스의 private IP로 설정
- NAT gateway
- private 서브넷 내의 인스턴스가 외부 인터넷과 연결을 맺을 수 있도록 해준다
외부 인터넷이 먼저 연결을 시작할 수는 없다
- VPC 내 인스턴스 → 외부 인터넷 : 트래픽의 송신 주소를 NAT의 Elastic IP로 설정
- 외부 인터넷 → VPC 내 인스턴스 : 트래픽의 수신 주소를 인스턴스의 private IP로 설정
- private 서브넷 내의 인스턴스가 외부 인터넷과 연결을 맺을 수 있도록 해준다
- VPC endpoint
인터넷 게이트웨이를 거치지 않고, VPC 내 인스턴스와 AWS 서비스 또는 엔드포인트 서비스 사이의 직접적인 연결 지원
- NIC; Network Interface Controller
서브넷 내에서, 특정 보안 그룹 집합을 갖는 NIC를 생성할 수 있다. 인스턴스 : NIC = 1 : N 관계이며, 결과적으로 인스턴스는 N개의 private IP 주소를 할당받는다
- Network ACL; Network Access Control List
서브넷(들)에 대한 선택적인 방화벽 계층
보안 그룹과 네트워크 ACL 비교 Security group Network ACL 인스턴스 단위 동작 서브넷 단위 동작 허가 규칙만 존재 허가 + 거부 규칙 존재 Is stateful: 응답은 무조건 허가 Is stateless: 응답도 규칙에 의해 허가되어야 한다 규칙은 순서 없이 모두 평가 규칙은 우선순위에 의해 순차적으로 평가 적용된 인스턴스에 한해 적용 서브넷에 포함된 모든 인스턴스에 자동 적용(따라서 선택적인 보안 계층을 제공함을 의미) - VPC peering connection
두 VPC(서로 다른 AWS 계정이어도 됨) 사이의 연결 지원. 인터넷 게이트웨이, VPN을 거치지 않고 각자의 private IP를 이용하여 AWS backbone을 통해 다이렉트로 암호화된 통신 가능
- Client VPN
OpenVPN을 이용한 사용자 PC와 VPC 사이의 VPN 지원. private IP 주소를 이용한 인스턴스 접근이 가능해진다
- Site-to-Site VPN
VPC와 사용자 네트워크 사이의 VPN 터널 유지
- Traffic Mirroring
두 EC2 인스턴스 사이의 트래픽을 미러링할 수 있다. ALB도 AWS 관리 EC2 인스턴스이므로, EC2 - ALB 사이의 트래픽도 확인할 수 있다.참고 자료

CloudFront
캐시 정책 TTL 관련
- 캐시 정책의 min, max, default TTL을 모두 31536000으로 설정해도 제대로 적용되지 않는 것으로 확인된다(2022-01-06)
- 객체 속성 > 메타데이터에서 Cache-Control값을 "public, max-age=31536000"으로 설정하는 것이 적용률이 높다
그럼에도 불구하고 - 캐시 무효화를 3번이나 반복했음에도 - 모든 파일에 대해 캐시 관련 헤더가 제대로 설정되진 않았다(2022-01-06)
로드 밸런서를 원본으로 사용하는 경우 고려사항
- GET 요청(캐시 대상)이 아닌 경우 성능이 나빠진다
지리적으로 가장 가까운 엣지 포인트를 통해 AWS의 백본 네트워크를 이용하여 통신하므로 빨라질 것이라 기대해봤지만, 그렇지 않았다.
- 테스트(2021-11-26) 조건 : 요청지@서울, 서버@us-east-2
- 로드밸런서를 통해 직접 통신한 경우 190-200ms로 균일한 응답시간 확인
- CDN을 거친 경우, 일부 요청은 10% 정도 빨리 응답(175ms 내외)되었지만, 절반 정도는 2배 이상 소요(670ms 내외)되었다.
- HTTP/3이 활성화되어도 추가 지연이 발생하는 것은 마찬가지(2023-07-28 테스트)
<2023-08-28 172044.png>[원본 보기] - 각 응답 캐시 시간을 Cache-Control: max-age 헤더로 조정cloudfront-cache-files-time
- 쿼리 스트링 캐시 정책 조정QueryStringParameters