Skip to content

Latest commit

 

History

History
458 lines (390 loc) · 15.3 KB

Developing_of_AWS.md

File metadata and controls

458 lines (390 loc) · 15.3 KB

Developing_of_AWS

Developing on AWS

  • 개발 환경을 지원하도록 IAM 권한 구성
  • AWS SDK를 사용한 클라우드 네이티브 애플리케이션 설계
  • AWS 리소스를 사용하여 애플리케이션 모니터링 및 유지 관리

AWS에서 개발 시작하기

  • AWS 서비스에 프로그래밍 방식으로 액세스
  • AWS: 인터넷 + 온디멘드 + 종량 요금제 + Infra as a code

AWS REST API

  • 요청: HTTP(S), SigV4, IAM 액세스 키
  • 인스턴스 실행, 버킷 생성 등 대부분의 AWS 서비스를 호출할 수 있다
  • 버전이 업데이트 중임. 특정 버전을 사용하기 위해서는 잠금 필요

HTTP 상태 코드

  • 100시리즈: 정보
  • 200시리즈: 성공
  • 300시리즈: 리디렉션
  • 400시리즈: 클라이언트 오류 (요청이 잘못됨)
  • 500시리즈: 서버 오류

AWS 서비스 액세스

  • HTTP(S) 요청/응답: AWS URL에 직접 접근하여 REST API에 접근한다
  • SDK: 함수를 활용하여 REST API에 접근한다
    • AWS Management Console, CLI 모두 SDK를 활용한다
    • 친숙한 언어를 그대로 활용할 수 있음
    • HTTP 요청 서명을 쉽게할 수 있음

사용할 SDK API 결정

  • 하위 수준 API
    • 서비스 작업당 메서드가 1개 있음
    • 서비스: EC2, S3, DynamoDB 등
def listClient():
    s3_client = boto3.client('s3')
    res = s3_client.list_object_v2(Bucket='mybucket')
  • 상위 수준 API
    • 하위 수준 API보다 정리가 되어있음
    • 개념적 리소스당 1개의 클래스
    • 리소스: 버킷, 테이블 등...
def listResource():
    s3_resource = boto3.resource('s3')
    bucket = s3_resource.Bucket('mybucket')

AWS CLI

  • 터미널 프로그램에서 AWS 서비스 호출
  • aws + 서비스 + 하위명령 + 파라미터 형태
    • aws s3 ls s3:mybucket --recursive

서비스 작업

  • 동기식: 클라이언트가 요청을 하고 명령이 완료되기를 기다림
  • 비동기식: 클라이언트가 요청을 하지만 명령이 완료되기를 기다리지 않음
    • 상태를 가져오기 위해 폴링: 요청을 지속적으로 확인
    • ACTIVE가 될 때까지 대기: 활성화 때까지 확인

IDE

  • AWS 툴킷은 여러 IDE에서 사용 가능
  • AWS Cloud9: 코드 작성, 실행, 디버깅을 위한 클라우드 IDE

권한

  • 개발 환경을 지원하도록 권한 구성
  • IAM 권한을 통한 인증

IAM

  • AWS 서비스를 사용하기 위해 IAM 인증이 필요
    • 인증 (키 또는 id/pw)
  • Root user: full access, 작업용 X, 빌링용
  • IAM User: Account 내 다수 생성 가능
  • IAM Group: IAM User의 권한을 한꺼번에 설정 가능
  • IAM Role
    • 임시 키, 재사용 불가
    • Role 부여시 기존의 권한은 무시됨
    • 연동 유저 (SSO, Federation User)
    • 한꺼번에 설정 불가능
  • Policy: IAM 권한 명시
    • 명시적 거부
    • 명시적 허용
    • 묵시적 거부

보안 인증 우선순위

  1. 코드 또는 CLI
  2. 환경 변수
  3. 보안 인증 정보 파일
  4. 인스턴스 프로파일

서명 버전4 (SigV4)

  • 요청자의 ID 확인
  • 전송 데이터 보호
  • 재전송 공격에서 보호
  • HTTP 권한 부여 헤더

스토리지

  1. 블록 스토리지
    • EBS (하나의 EC2와 연결)
      • 범용 SSD
      • 프로비저닝된 IOPS SSD
      • 처리량 최적화 HDD
      • 콜드 HDD
    • 변경된 블록만 갱신 (DAS)
  2. 파일 스토리지
    • EFS (여러 EC2와 연결)
    • 항상 전체 파일 갱신 (NAS)
  3. 객체 스토리지
    • Amazon S3
    • 계층 구조가 없음. 플랫폼 구조.

Amazon S3

  • 리전 리소스 3개의 AZ에 복제 > 내구성(데이터가 사라지지 않음) & 가용성(필요할 때 바로 사용)
  • 수평 확장 > 객체 수 제한 없음. 1개 객체 크기제한 5TB
  • Standard / Standard IA / Onezone IA / Glacier(백업 및 아키이빙)
  • 빅데이터 분석

태그

  • 객체 그룹화
  • 비용 할당
  • 자동화
  • 액세스 제어 (IAM 정책, 버킷 정책 제어)
  • 운영 지원/모니터링

S3 서비스 엔드포인트

  • 가상 호스팅 방식 URL
    예) https://[bucketname].s3.[Region].amazonaws.com/[key]
  • 웹 사이트 엔드포인트
    예) https://[bucketname].s3-website-[Region].amazonaws.com

AWS S3 CLI 명령

aws s3 ls
aws s3 mb s3://mybucket --region (mb: make bucket) 
aws s3 list-buckets --query 'Buckets[].Name'

SDK를 활용한 S3 작업

버킷 작업

  • 생성, 나열, 삭제, 구성 업데이트

버킷 생성

  • HeadBucket API: 버킷 존재 여부, 액세스 가능 여부 확인
try{
    HeadBucketRequest request = HeadBucketRequest.builder()
        .bucket(myBucket)
        .build();
    HeadBucketRequest result = s3.headBucket(request)
    if(result.sdkHttpResponse().statusCode == 200){ } // Bucket existing
}
catch (AwsServiceException awsEx){
    switch(awsEx.statusCode()){
        case 404: // bucket 없음
        case 403: // 권한 에러
    }
}

// 버킷 생성까지 대기
WaiterResponse<HeadBucketRequest> waiterResponse = s3Waiter.waitUntilBucketExists(bucketRequestWait);
HeadBucketRequest.mathced().response().ifPresent(System.out::println);

객체 작업

  • 업로드, 나열, 다운로드 등..
  • 대량 작업: 복사, 동기화, 배치

객체 업로드:PUT

  • 객체 복사
    • 객체의 사본 생성
    • 원래 객체를 삭제하여 객체 이름 재지정
    • 여러 S3에 걸쳐 객체 이동
    • 객체 메타데이터 업데이트
    • 단일 객체 업로드(권장 100MB, 최대 5GB), 멀티 파트 업로드 (최대 5TB)

데이터 검색: GET 및 HEAD

  • 객체 및 메타데이터
    • GetObject (바이트 범위를 가져올 수도 있음)
  • 객체 메타데이터
    • HeadObject (메타 데이터 정보를 가져옴)
    • GetObjectAcl
    • GetObjectTagging

객체 관련 작업: S3 Select

  • 간단한 SQL 표현식으로 객체에서 데이터 하위 집합만 검색
  • csv 파일 형식으로 받을 수 있음

액세스 권한 부여

  • 미리 서명된 URL을 통해 임시 권한 부여할 수 있음

데이터베이스

  • 관계형: RDS, Redshift
  • 키 값: Dynamo DB
  • 그래프: Neptune
  • 인메모리: ElastiCache

관계형 DB vs 비관계형 DB

관점 관계형 비관계형
데이터 스토리지 행 및 열 키 값, 문서, 와이드컬럼, 그래프
스키마 고정 동적
확장성 수직적 수평적
트랜잭션 지원 유동적
일관성 강력한 무결성과 일관성 최종 및 강력
  • 관계형 DB는 강력한 무결성과 일관성이 중요할 때 사용
    • 신한 은행>우리 은행 이체, 신한에서는 돈이 빠졌는데, 우리 은행에 돈이 들어오지 않으면 안 됨
      트랜잭션을 통한 데이터 무결성이 중요
  • 비관계형 DB는 빅데이터 처리가 중요할 때 사용
    • 한 두개가 어긋나더라도 데이터 분석에 큰 문제가 없음

Amazon DynamoDB

  • 아마존의 키-값 형태의 NoSQL DB
  • 서버리스 (완전관리형)

기본 사항

  • 파티션 키
    • 필수적으로 지정
    • 파티션 키 기반의 파티션에 데이터가 저장됨
    • I/O가 분산될 수 있도록 파티션 키를 지정하도록 권장
      • 일자로 지정했을 때, 특정 일자에서만 I/O가 증가됨
    • 높은 카디널리티 (중복도가 낮음)
    • 잘 알려진 키
  • 정렬 키
    • 선택 사항
    • 기본 키 = 파티션 키 + 정렬 키

읽기 및 쓰기 처리량

  • RCU: 최대 4KB 크기의 항목에 대한 초당 강력한 읽기 일관성 수
    • 1초에 4,000KB에 대한 강력 읽기 일관성: 1,000 RCU 필요
    • 최종 읽기 일관성: 두 DB를 읽고 최신의 데이터를 가져온다 > 최대 4KB 항목을 초당 2번 읽을 수 있음
  • WCU: 초당 1KB 쓰기의 수
    • 1초에 1,000KB 쓰기: 1,000 WCU 필요
  • 쿼리 성능에 비해 테이블 스캔의 성능은 모든 테이블을 읽어 성능이 좋지 않음

보조 인덱스

기본이 아닌 키 속성에 근거하여 데이터 쿼리

  • 로컬 보조 인덱스
    • 테이블의 파티션 키와 같은 파티션 키를 가짐
      • 테이블의 파티션 안에 존재
  • 글로벌 보조 인덱스
    • 파티션 키가 다름

적응형 용량

  • 제한 최소화
  • 필요한 만큼만 프로비저닝
    1. 4개의 파티션에서 100 WCU가 프로비저닝됨
    2. 3개의 파티션에서 50WCU가 요청되어서 150 WCU가 남음
    3. 150 WCU를 다른 파티션에서 사용할 수 있음

Dynamo DB 액세스

DynamoDbClient client = DynamoDbClient.builder()
    .region(Region.US_WEST_2)
    .build()

애플리케이션 로직 처리

컴퓨팅 서비스

  • 인스턴스(EC2): 확장 가능한 컴퓨팅 용량
  • 컨테이너(ECS, EKS): 완전 관리형 컨테이너 오케스트레이션
  • 서버리스(Lambda): 이벤트 중심 서버리스 컴퓨팅
    1. 비동기 이벤트(push): 이벤트가 발생된 쪽에서 람다 함수를 호출
    2. 비동기 이벤트(pull): 이벤트를 쌓아두고, 람다가 이벤트를 한꺼번에 확인한다
    3. 동기 (직접 호출): API를 통해 직접 호출, 호출 권한 필요

Lambda 사용

  • 이벤트 소스 > 함수 > 서비스
  • 구조
    • 액세스 권한 + 트리거
    • 런타임
    • 동시성(동시에 N개 처리), 메모리, 시간제한 (최대 15분)
  • 단순한 구조로 CPU 성능을 향상하고 싶으면 메모리 설정을 조정하면 된다
  • 레이어를 통해서 같은 환경을 재활용할 수 있다 (.zip파일 아카이브)
  • 콜드 스타트를 줄이기 위해 프로비저닝 설정 가능

권한

  • 이벤트 소스에서 Lambda를 호출할 권한 부여
    • AddPermission API 사용
  • 실행 역할을 업데이트

Lambda 함수: 핸들러

  • 이벤트 객체: 호출 시 전송되는 데이터
  • 컨텍스트 객체: 현재 런타임 환경에 대한 정보
  • 핸들러 함수: 호출 시 실행할 함수 (이벤트 객체, 컨텍스트 객체 포함)

Lambda 테스트

  • 메모리 성능 테스트
  • 시간 초과를 로드 테스트
  • Lambda 한도 이해
    • 메모리 할당: 128 ~ 10,240MB
    • 최대 런타임: 15분
    • 버스트 동시성: 500 ~ 3,000
    • 동기식: 6MB / 비동기식: 256KB
    • /tmp 디렉터리 스토리지: 512MB

오류 처리

  • 호출 오류: 응답 코드 400 또는 500
    • 요청: 너무 크거나 유효하지 않음
    • 호출자: 권한이 없음
    • 계정: 최대 함수 인스턴스에 도달함, 요청이 너무 많음
  • 함수 오류
    • 시간 초과
    • 구문 오류

API 관리

Amazon API Gateway

  • 인증, 관리 컨트롤
  • DDos 내성
  • AWS 내 서비스들을 직접 접근하지 않도록 관리
  • WebSocker API, HTTP API, REST API 활용

REST API

  • 리소스
  • 메서드 (Get, POST, HEAD, DELETE, ANY)
  • 리소스 구성 (요청, 응답 통합)

통합 유형

  1. 프록시
    • 유연, 다목적, 효율
    • 통합 요청 또는 통합 응답 X
    • 패스스루 X
  2. 비 프록시
    • 데이터 매핑은 사용자 책임
    • 통합 요청, 통합 응답 모두 구성
    • 패스스루 O
  3. Mock
    • API 테스트에 유용
    • 백엔드에 요청을 보내지 않고 응답을 반환

요청 및 응답 처리 흐름

  • 요청 처리
    • 요청 검증 > 통합 요청 > 요청 모델 > 요청 매핑 > 백엔드 서비스
    • 백엔드 서비스 > 응답 모델 > 통합 응답 > 응답 매핑 템플릿

Swagger를 사용한 API 설계

  • API 설계 가져오기/내보내기 (Json/YAML)
  • 보관 및 재사용

카나리 릴리즈

  • 소수의 사용자에게 카나리 버전을 사용하게 하여 안정성 확인
  • 배포 위험 감소
  • 병렬 개발

현대적 애플리케이션

변화하는 비지니스 환경에 빠르게 대응하는 SW

  • 아키텍처 패턴: 마이크로 서비스
  • 소프트웨어 전송: DevOps
  • 운영 모델: 서버리스

마이크로 서비스 (MSA, MicroService Architecture)

  1. 작은 서비스
    • 큰 문제를 작게 분할하고, 해결한다
    • 결합도를 낮춘다
  2. REST API
    • 요청: 기술 독립적
    • 응답: json, xml
  3. 실행 환경이 독립적 (컨테이너 기술 활용)

모놀리스 애플리케이션 디커플링

  • 분해하기 간단한 서비스를 이용해 소규모로 시작
  • 자주 변경되는 기능 디커플링

DevOps

  • 비지니스에 변화 빠르게 대응
  • 마이크로 서비스가 빠른 배포에 유리

서버리스

  • 서버를 고려하지 않고도 애플리케이션과 서비스를 구축할 수 있음
  • 프로비저닝, 오토스케일링, 로드 밸런싱을 구성하지 않아도 됨
  • 유휴 서버 비용을 거의 지불하지 않음
  • 사용자는 핵심 제품에 집중할 수 있음

스텝 함수

  • 람다 함수끼리 상호작용을 정의
  • 시각적 워크플로를 사용하여 분산 애플리케이션 구성 요소를 조정할 수 있음
    • 장애, 재시도, 병렬화, 서비스 통합, 관찰 기능

애플리케이션 사용자에게 액세스 권한 부여

  • 인증: 사용자의 신원 확인
  • 권한 부여: 원하는 작업을 사용자가 수행할 수 있는지 확인

구성 요소

  • 사용자 아이덴티티
    • 애플리케이션에 로컬로 적용
    • 사용자, 게스트
  • 인증 체계
    • 통합 인증(SSO)
    • 여러 공급자 통합
    • 2FA/MFA
    • 페더레이션 사용자
  • 프레임워크
    • SAML 2.0
    • OAuth 2.0
    • OpenID Connect(OIDC)

Amazon Cognito

  • 웹 및 모바일 앱에 대한 인증, 권한 부여 및 사용자 관리 제공
    • 아이덴티티 저장
    • AWS 리소스에 대한 액세스 제어
    • 규정 준수 <<<<<<< HEAD
  • 서버리스 서비스 =======
  • 서버리스 서비스

사용자 풀

  • 사용자 테이블
  • 로직
    1. 유저가 보안 인증 정보를 제공
    2. Amazon Cognito의 사용자 풀을 통해 인증이 되면 토큰을 발급 (JWT 토큰)
    3. 애플리케이션에서 사용

아이덴티티 풀

  • AWS 서비스를 사용할 때 사용
  • 로직
    1. 사용자 풀이나 SAML 등을 통해 토큰을 받는다
    2. Amazon Cognito의 자격증명 풀을 통해 해당 사용자가 가진 Role을 확인
    3. STS에서 키(일시키+만료시간) 발급받아, AWS 서비스 사용

애프리케이션 배포

  • DevOps 문화
    1. 소규모 개발
    2. 잦은 릴리즈
    3. 지속적인 개선
    4. 운영환경과 동일한 테스트
    5. 가능한 경우 자동화(IaaC)
    6. One Stop 빌드와 배포 CI/CD

AWS SAM

  • 서버리스 배포를 위한 솔루션
  • AWS SAM CLI를 사용하여 애플리케이션 생성, 구축, 테스트, 배포
  • AWS SAM 템플릿 > Cloud Formation 템플릿 > AWS 리소스

애플리케이션 관찰

데이터를 통한 인사이트 도출

요소

  1. 로깅
    • 애플리케이션 내 이벤트의 레코드
    • CloudWatch Logs
  2. 모니터링
    • 시스템의 전반적 성능과 동작을 분석하는 데 필요한 데이터
    • CloudWatch 지표
  3. 추적
    • 사용자 행동을 추적하여 병목 현상을 식별하고 성능 개선
    • AWS X-Ray

CloudWatch

  • 지표: 시스템 성능 관련 데이터
  • 경보: 단일 지표를 관찰하고, 지표를 바탕으로 작업을 수행
  • 로그: 모니터링되는 앱 또는 리소스에서 기록한 활동 레코드

628796bd2c187be45c7ecdfb1d266512049e829d