728x90
반응형

IAM TAG

 

- IAM 태그를 사용하면 Key - Value 페어의 형태로 사용자 또는 역활에 사용자 지정 속성을 추가할 수 있음

 

- 태그를 사용하면 AWS에서 권한을 제어할 수 있음

 

- IAM 정책을 생성할때 IAM 태그와 연관된 태그 조건 키를 사용하여 다음중 하나를 수행하기 위한 액세스를 제어

  • 리소스 : 리소스에 대한 태그를 기반으로 사용자 또는 역활에 대한 액세스를 제어 

    (iam:ResourceTag/key-name 조건 키를 사용하여 리소스에 연결된 태그를 기반으로 IAM 리소스에 대한 액세스를 허용할지 여부를 결정)

  • 요청 : 어떤 태그가 IAM 요청에 전달될 수 있는지 제어

    (aws:RequestTag/key-name 조건 키를 사용하여 어떤 태그를 IAM 사용자 또는 역활에서 추가 ,변경 또는 제거할 수 있는지 지정)

  • 보안 주체 : 요청을 한 사람(보안주체)이 자신의 자격증명에 연결된 태그를 기반으로 수행할 수 있는 권한을 제어

    (aws:PrincipalTag/key-name 조건 키를 사용하여 요청을 허용하려면 어떤 태그가 보안 주체에 연결되어야 하는지 지정)

  • 권한 부여 프로세스의 일부 : aws:TagKeys 조건 키를 사용하여 특정 태그 키를 리소스, 요청 또는 보안 주체에서 사용할 수 있는지 여부를 제어 (이 경우 값은 중요하지 않음)

  • 태그키 : aws:TagKeys 조건 키를 사용하여 리소스 또는 요청에서 특정 태그 키를 사용할 수 있는지 여부를 제어

 

 

 

IAM 태그를 사용한 액세스 제어

 

리소스에 대한 액세스 제어

 

- IAM 정책에 태그를 사용하여 IAM 사용자 및 역활에 대한 액세스를 제어 (IAM은 그룹에 대한 태그를 지원하지 않으므로 태그를 사용하여 그룹에 대한 액세스를 제어할 수 없음)

 

- Ex. status=terminated 태그가 지정된 사용자의 삭제를 허용

 

 

 

요청에 대한 액세스 제어

 

- IAM 정책에서 태그를 사용하여 IAM 사용자 또는 추가, 변경 또는 제거할 수 있는 태그를 제어

 

- Ex. department=HR 또는 department=CS 태그만을 사용하는 사용자 태그 지정을 허용

 

 

 

보안 주체에 대한 액세스 허용

 

- IAM 정책에 태그를 사용하여 요청자(보안 주체)가 자신의 자격 증명에 연결된 태그를 기반으로 수행할 수 있는 작업을 제어

 

- Ex. tagManager=true 태그가 지정된 사용자가 IAM 사용자, 그룹 또는 역활을 관리

 

 

 

태그 키를 사용한 액세스 제어

 

- IAM 정책에서 태그를 사용하여 리소스, 요청 또는 보안 주체에 특정 태그 키를 사용할 수 있는지 여부를 제어

 

- Ex. project 키가 있는 태그만 사용자로부터 제거

 

 

 

 

태그를 사용한 액세스 제어

 

리소스에 대한 액세스 제어

 

- IAM 정책의 조건을 사용하여 태그를 기반으로 AWS 리소스에 대한 액세스를 제어

 

 

- EC2 인스턴스의 시작 또는 중지를 허용하였지만 인스턴스 태그 Owner가 사용자의 이름 값과 같은 경우로 제한

 

- 인스턴스 태그 값에 사용자 이름과 계정 사용자가 동일해야 액세스 제어 허용

 

- 해당 정책을 IAM 사용자에게 연결할 수 있는데 이름이 test인 사용자가 EC2 인스턴스를 시작하려는 경우 Owner=test, owner=test 태그가 지정되어야함, 그렇지않으면 액세스가 거부되는데 태그키는 owner로 일치하지만 조건 키가 대/소문자를 구분하지 않기 때문 (태크기는 대소문자 구분없이 인식하지만 조건키는 대소문자를 구분함)

 

 

요청에 대한 액세스 제어

 

- IAM 정책의 조건을 사용하여 어떤 태그를 AWS 리소스에 추가, 변경 또는 제거할 수 있는지 제어

 

 

- 태그에 environment, preprod, production 값이 포함된 경우에만 EC2 CreateTags 작업을 사용하여 태그를 인스턴스에 연결할 수 있음

 

- ForAllValues 변경자를 aws:TagKeys 조건키와 함께 사용하여 요청에서 environment만 허용됨을 표시 (Environment와 같은 한자리의 대문자가 포함되면 거부됨, 조건키를 사용하여 태그 값과 완벽히 일치해야함)

 

 

태그 키 제어

 

- IAM 정책에서 조건을 사용하여 리소스 또는 요청에 특정 키를 사용할 수 있는지 여부를 제어

 

- 정책을 사용하여 태그를 사용한 액세스를 제어할 때 aws:TagKeys 조건 키를 사용해야 함

 

 

- Secrets Manger 비밀 생성 및 태그 지정이 가능하지만 태그 키 environment 또는 cost-center을 포함해야함

 

- environment 또는 cost-center 태그가 포함되어 있다면 CreateSecret, TagResource를 허용

 

 

예제

 

 

- 지정된 태그 (키 : project, 값 : myapp) 가 붙어 있는 인스턴스만 시작 / 중지 가능

 

 

참조 URL

 

https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/access_iam-tags.html

반응형

'AWS' 카테고리의 다른 글

AWS IAM  (0) 2019.04.09
AWS IAM 정책 설명  (0) 2019.04.09
AWS ElasticSearch  (0) 2019.04.09
AWS CloudWatch  (0) 2019.04.09
AWS CloudWatch Logs  (0) 2019.04.09
728x90
반응형

IAM 란?

 

Identify and Access Management의 약자로 AWS 리소스를 사용하는 유저, 그룹, 사용권한 등을 전체적으로 관리하는 서비스

 

 

 

메뉴 설명

 

- Groups : 그룹 추가, 삭제 및 그룹별 세부적인 리소스 사용권한을 부여하고 유저들을 그룹별로 묶어서 관리할 수 있음 (그룹에 소속된 유저는 자동으로 그룹이 가지고 있는 권한을 부여받음)

 

- Users : 유저 추가, 삭제 및 유저를 그룹에 소속시키거나 특정 유저에게만 권한 부여 가능

 

- Roles : 유저나 그룹에 권한을 부여하는 것이 아닌 AWS의 리소스에 권한을 부여하는 개념 

(Ex. EC2 Instance에서 Lambda 리소스 함수를 부를 경우 EC2는 Lambda를 사용할 수 없는 권한이 없기 때문에 접근이 불가능하다. 이러한 경우 EC2 리소스에 Lambda 사용권한을 부여하게 되면 Lambda 서비스에 접근 가능)

 

- Policies : 정책이라는 의미지만 실질적으로는 권한 부여에 좀 더 가까운 메뉴

(Ex. EC2의 Nano2 Instance만 실행할 수 있도록 함 / S3의 특정 버켓만 읽기 전용으로 접근 등등)

 

- Account settings : 계정의 비밀번호 정책을 설정 

 

 

 

용어 설명

 

용어

 

- 리소스 : IAM에 저장된 사용자, 역활, 그룹 및 정책 개체

 

- ID : 식별 및 그룹화에 사용되는 IAM 리소스 객체 (사용자, 그룹 및 역활이 포함)

 

- 개체 : AWS가 인증에 사용하는 IAM 리소스 객체 (사용자 및 역활이 포함)

 

- Principal : 엔티티를 사용하여 AWS에 로그인하고 요청하는 사람 또는 애플리케이션

 

 

보안 주체 

 

- AWS 리소스에 대한 작업을 요청할 수 있는 사람 또는 애플리케이션

 

 

요청

 

- 작업 또는 작동 : 보안 주체가 수행하고자 하는 작업 또는 작동

 

- 리소스 : 수행된 작업 또는 작동에 따른 AWS 리소스 객체

 

- 보안 주체 : 엔티티(사용자 또는 역활)를 사용하여 요청을 보내는 사람 또는 애플리케이션 (보안 주체에 대한 정보는 보안 주체가 로그인하는데 사용된 엔티티와 관련된 정책이 포함)

 

- 환경 데이터 : IP 주소, 사용자 에이전트, SSL 사용 상태 또는 시간대와 같은 정보

 

- 리소스 데이터 : 요청되는 리소스와 관련된 데이터 (DynamoDB 테이블 이름 또는 EC2 인스턴스 태그와 같은 정보가 포함)

 

- AWS에서 요청을 평가하고 승인하는데 사용되는 요청 콘텍스트로 이 요청 정보를 수집

 

 

인증

 

- 보안 주체가 AWS에게 요청을 보내려면 IAM 엔티티를 사용하여 인증을 받아야함

 

- S3 및 STS와 같은 몇몇 서비스는 익명 사용자의 몇 가지 요청을 허용하지만 이것들은 규칙 예외

 

 

승인

 

- AWS는 요청 콘텍스트의 값을 사용하여 요청을 허용할지 거부할지 여부를 적용되는 정책을 점검하고 정책을 사용하여 허용 / 거부 결정

 

- 대부분의 정책은 AWS에 JSON 문서로 저장되며 보안 주체 엔티티에 대한 권한을 지정

 

- AWS는 요청 콘텍스트에 적용되는 각 정책을 확인하는데 단일 권한 정책에 거부된 작업이 포함된 경우 AWS는 전체 요청을 거부하고 평가를 중지 (명시적 거부)

 

- 요청은 기본적으로 거부되므로 AWS는 적용 가능한 권한 정책이 요청의 모든 부분을 허용하는 경우에 요청에 대한 권한을 부여

 

- 단일 계정 내 요청 평가 로직

  • 기본적으로 모든 요청을 거부

  • 권한정책 (자격 증명 기반 또는 리소스 기반) 에 포함된 명시적 허용은 이 기본 작동을 재정의

  • 조직 SCP, IAM 권한 경계 또는 세션 정책이 있는 경우 허용이 재정의함, 하나 이상의 이러한 정책 유형이 존재하는 경우 이들 정책 유형 모두가 해당 요청을 허용해야함, 그렇지 않은 경우 이 값은 묵시적으로 거부

  • 어떠한 정책의 명시적 거부는 허용을 무시함

 

 

작업 또는 연산

 

- 요청이 인증 및 권한이 부여된 후 AWS가 요청의 작업 또는 작동을 승인

 

- 작업은 서비스로 정의되며 리소스 보기, 생성, 편집 및 삭제와 같이 리소스에 대해 수행할 수 있는 사항

 

- 보안 주체가 작업을 수행할 수 있도록 허용하려면 보안 주체 또는 영향을 받은 리소스에 적용되는 필요한 작업을 정책에 포함해야함

 

 

리소스

 

- AWS가 요청의 작업을 승인하면 계정 내의 관련 리소스에서 해당 작업을 수행할 수 있음

 

- 리소스는 서비스 내에 존재하는 객체

 

 

 

아키텍처

 

 

- 인증 (Authentication) : 사용자의 신원을 증명하는 것 / 클라이언트가 자신이 주장하는 사용자와 같은 사용자인지를 확인하는 과정 (로그인한 사용자는 인증된 사용자)

 

- 인가 (Authorization) : 권한 부여, 클라이언트가 하고자 하는 작업이 해당 클라이언트에게 허가된 작업인지를 확인 / 특정 리소스에 접근할 수 있는 권한을 부여 (접근 제어)

 

 

작동 순서

 

1. Principal이 인증을 요청

 

2. Principal은 IAM의 자격 증명을 통해 사용자 확인 (인증)

 

3. 인증이 완료된 사용자는 요청 콘텍스트 값을 사용하여 JSON 파일로 정의된 정책의 권한을 확인 후 허가된 권한 부여 (인가)

 

4. 인증과 인가를 통해 사용자가 확인되고 지정된 권한이 부여되면 AWS는 부여된 정책에 따라 사용자에게 허용된 작업을 승인

 

5. 작업을 승인하고 사용자가 작업할 수 있는 작업 대상 리소스를 지정

 

 

 

IAM Role 사용자 접근 동작

 

 

1. 사용자는 자신에게 부여된 IAM Role에게 자신이 보유한 액세스 Key의 인증을 요청

 

2. IAM Role은 해당 요청에 정의된 정책을 확인하고 부여된 권한에 대한 인가 후 임시 접근 Key 발급

 

3. 사용자는 IAM Role에게 전달 받은 임시 접근 Key를 통해 리소스에 접근

 

 

 

IAM Role 리소스 접근 동작

 

 

1. 관리자가 IAM을 사용하여 역활을 만들고 이 역활의 정책에는 EC2 인스턴스 만이 해당 역활을 맡을 수 있도록 지정 (정책은 S3 Bucket에 대한 읽기 전용 권한만 부여)

 

2. 사용자가 EC2 인스턴스를 시작하고 관리자가 생성한 역활을 할당

 

3. 애플리케이션이 실행되면 인스턴스 메타데이터에서 보안 자격 증명 검색에 설명된 대로 EC2 인스턴스 메타데이터에서 임시 보안 자격 증명을 가져옴 (이 자격증명은 제한된 시간 동안에만 유효한 임시 보안자격증명으로 역활을 나타냄)

 

4. 애플리케이션은 가져온 임시 자격 증명을 사용하여 S3 Bucket에 접근 (역활에 정의된 정책대로 읽기 전용 권한만 사용 가능)

 

- 애플리케이션은 현재 자격 증명이 만료되기 전에 인스턴스 메타데이터에서 새 자격 증명을 가져와야함 (인스턴스에서 제공되는 임시 보안 자격 증명은 만료되기 전에 자동으로 교체되므로 항상 유효한 설정을 사용할 수 있음)

 

 

참조 URL

 

https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/intro-structure.html

https://www.slideshare.net/awskorea/20150109-aws-black-belt-iam-younjin

https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/id_roles_use_switch-role-ec2.html

반응형

'AWS' 카테고리의 다른 글

AWS IAM Tag  (0) 2019.04.09
AWS IAM 정책 설명  (0) 2019.04.09
AWS ElasticSearch  (0) 2019.04.09
AWS CloudWatch  (0) 2019.04.09
AWS CloudWatch Logs  (0) 2019.04.09
728x90
반응형

정책 요약

 

1. 권한 (노란색으로 표시되는 부분은 오류 배너)

 

- 정책 요약 or {} JSON 

  • 정책 요약과 JSON 파일 전환을 표시

 

- 서비스 (A)

  • 정의된 서비스(리소스)가 나열되고 각 서비스의 세부정보를 표시

  • 서비스에 노란색 느낌표 표시가 나오는 것은 정책에서 인식할 수 없는 서비스가 포함된 경우이다. (미분류 서비스라고 표현)

  • 서비스 이름에 오타가 있는 경우 / 정책 요약이 지원되지 않는 정책 / 사용자 지정 서비스일 경우 (위의 예제는 오타)

 

- 액세스 레벨 (G)

  • 각 정책이 액세스 레벨 (목록 / 읽기 / 쓰기)의 작업에 대해 전체 또는 제한 중 어느 권한을 정의했는지 표시

  • 전체 : 서비스가 사용 가능한 4개 액세스 레벨(목록 / 읽기 / 쓰기 / 권한 관리)에 모두 권한이 있는것을 의미

  • 전체 - 읽기 : 서비스가 액세스 레벨 중 읽기에 관한 모든 권한만 있는 것을 의미

  • 제한 - 정책이 나열된 각 액세스 레벨 중 하나 이상의 작업에 대한 액세스 권한만 제공

  • 제한 - 읽기 : 서비스가 액세스 레벨 중 읽기 권한에 대해서 부분적인 권한만 가지고 있는 것을 의미 

 

- 리소스 (H)

  • 각 서비스에 대해 지정한 리소스를 표시

  • 모든 리소스 : 서비스가 보유한 액세스 레벨의 정책을 모든 리소스에 허용된 것을 의미

  • 다중(Multiple) / 여러 개를 실행할 수 있습니다 : 서비스가 보유한 액세스 레벨의 정책이 둘 이상의 리소스에 허용된 것을 의미

  • 리소스 텍스트 : 서비스가 보유한 액세스 레벨의 정책이 리소스 전체에 대한 것이 아닌 리소스 안에서 특정 부분에 대한 것만 허용된 것을 의미 (BucketName = developer_bucket, ObjectPath=ALL)

 

- 요청 조건 (I)

  • 서비스가 보유한 액세스 레벨의 정책에서 리소스에 대한 특정한 조건을 의미 (해당 조건이 일치해야 정책이 허용)

  • 없음 : 정책이 서비스에 대한 조건을 포함하지 않음

  • 다중 : 정책이 서비스에 대한 둘 이상의 조건을 포함 (복수의 조건에 따라 허용, 정책을 보려면 JSON파일을 확인해야함)

  • Condition text : 정책이 서비스에 대한 조건 하나를 포함 (위의 예제에서는 amz-acl = public-read 로 표시하였는데 acl 조건에 따라 허용된 203.0.113.0/24와 IP가 일치하는 경우에만 정책이 허용)

 

 

- 허용 / 명시적 거부

  • 명시적 거부 : 서비스가 리소스에 접근하는 것을 거부함 (정의된 정책의 액세스 레벨을 거부)

  • 허용 : 서비스가 정의된 액세스 레벨로 리소스에 접근하는 것을 허용

  • 위의 경우는 모든 리소스에 S3가 정의된 액세스 레벨로 접근하는 것을 허용하였으나 특정 리소스에 대해서는 접근할 수 없도록 구성한 것

 

 

2. 정책 사용

 

 

- 해당 Role이 포함된 그룹이나 사용자 표시

 

- 새로운 사용자나 그룹을 해당 정책에 연갈할 수 있음

 

 

3. 정책 버전

 

 

- 정의된 정책을 버전별로 저장하여 관리 및 롤백할 수도 있음

 

 

4. 액세스 관리자

 

- 사용자에게 부여된 서비스 권한과 해당 서비스에 마지막으로 액세스한 시간을 표시하여 관리자가 관리

 

 

 

서비스 요약

 

 

1. 서비스 (노란색으로 표시되는 부분은 오류 배너)

 

- 작업 (5)

  • 정책내에 정의된 작업이 나열되고 각 작업에 해당하는 리소스와 조건이 표시 

 

- 인식되지않은 리소스 유형 (7)

  • 정책 또는 서비스에 대한 정책내에서 인식되지 않은 리소스 유형이 존재 (오타 / 사용자 지정 서비스 / 정책 요약 지원 안함 등) 

 

- 인식되지않은 작업 (8)

  • 정책 또는 서비스에 대한 정책내에서 인식되지 않은 작업이 존재  (오타 / 사용자 지정 서비스 / 정책 요약 지원 안함 등) 

 

- 목록 (9)

  • 정책이 허용 / 거부하는 액세스 레벨에 따라 1-4개의 섹션으로 작업을 그룹화

  • 섹션에는 목록 / 읽기 / 쓰기 / 권한 관리가 있음 

 

- 액세스 권한 없음 (10)

  • 이 정책에 권한을 제공하지 않는 작업이 존재

 

- 리소스 (13)

  • 서비스에 대해 정의된 리소스를 표시

  • 위의 예제에서는 S3 서비스의 작업이 S3의 developer_bucket 리소스만 허용되는 것으로 구성

  • 리소스 정책에 오류가 있는지 검사하려면 정책 시뮬레이터를 사용해야함

 

- 리소스 경고 (14)

  • 전체 권한을 제공하지 않는 리소스를 포함하는 경우 경고메시지 표시

  • This action does not support resource-level permissions. 리소스에 대하여 와일드카드(*)가 필요합니다 : 정책에 리소스 수준의 권한은 있지만 작업 수준에 대한 권한을 제공하려면 “Resource” : [ “*” ] 를 포함해야 함을 의미

  • 이 작업은 적용할 리소스가 없습니다 : 지원되는 리소스 없이 작업이 정책에 포함됨을 의미

  • 이 작업은 적용할 리소스 및 조건이 없습니다 : 지원되는 리소스 및 조건 없이 작업이 정책에 포함됨을 의미 (이 경우 서비스 정책에 포함된 조건도 있지만 작업에 적용되는 조건이 없음)

 

- 요청 조건 (15)

  • 리소스와 연결된 작업에 조건이 적용되는지 여부를 표시 (JSON 파일을 통해 검토 가능)

 

- 조건 경고 (16)

  • 전체 권한을 제공하지 않는 조건을 포함하는 경우 경고메시지 표시

  • <CONDITION_KEY>는 이 작업에 대해 지원되는 조건 키가 아닙니다 : 정책의 작업에 지원되지 않는 서비스 조건 키가 있음

  • 해당 작업은 여러 개의 조건 키를 지원하지 않습니다 : 정책의 작업에 지원되지 않는 서비스 조건 키가 두개 이상 있음

  • 위의 예제에서 GetObject의 경우 정책에 s3:x-amz-acl 조건 키가 포함되어 있지만 키는 해당 작업에서 작동하지 않음, 작업이 리소스를 지원하더라도 조건이 이 작업에 대해 true가 되지 않기 때문에 정책에서 작업을 위한 권한을 부여하지 않음

 

 

 

작업 요약

 

 

- 리소스 (4)

  • 정책이 선택한 서비스에 대해 정의한 리소스가 표시

  • 위의 예제에서는 PutObject 작업이 모든 객체 경로와 developer_bucket 에서만 허용되는 것으로 구성

  • IAM가 제공하는 정보에 따라 arn:aws:s3:::developer_bucket/* 등의 ARN이 표시되거나 BucketName=developer_bucket, ObjectPath=All 등의 정의된 리소스 유형이 표시

 

- 리전 (5)

  • 리소스가 정의된 리전을 표시

  • 모든 리전 : 리소스와 연결된 작업은 모든 리전에 적용

  • 리전 텍스트 : 리소스와 연결된 작업은 한 리전에 적용 (리전 지정 가능)

 

- 계정 (6)

  • 리소스와 연결된 서비스 또는 작업이 특정 계정에 적용되는지를 나타냄

  • 모든 계정 : 리소스와 연결된 작업은 모든 계정에 적용

  • 현재 계정 : 리소스와 연결된 작업은 현재 로그인된 계정에만 적용

  • 계정 번호 : 리소스와 연결된 작업은 지정된 계정번호의 계정에만 적용

 

- 요청 조건 (7)

  • 리소스와 연결된 작업에 조건이 적용되는지를 표시

  • 위의 예제에서는 s3:x-amz-acl=public-read 조건이 포함되었는데 acl 조건에 따라 허용된 203.0.113.0/24와 IP가 일치하는 경우에만 정책이 허용되는 것

반응형

'AWS' 카테고리의 다른 글

AWS IAM Tag  (0) 2019.04.09
AWS IAM  (0) 2019.04.09
AWS ElasticSearch  (0) 2019.04.09
AWS CloudWatch  (0) 2019.04.09
AWS CloudWatch Logs  (0) 2019.04.09
728x90
반응형

ElasticSearch

 

- Elasticsearch 클러스터를 쉽게 배포, 운영 및 조정할 수 있는 관리형 서비스

 

- 로그 분석, 실시간 애플리케이션 모니터링, 클릭 스트림 분석 같은 사용 사례를 위한 오픈소스 검색 및 분석 엔진

 

- AWS ES (Elasticsearch Service)를 사용하면 Elasticsearch API에 바로 액세스해 기존 코드 및 애플리케이션을 서비스를 통해 원활하게 사용할 수 있음

 

- JSON 포맷으로 RESTfull 방식의 분산 검색 엔진

 

- Apache Lucene을 바탕으로 하고 있으며 대량의 데이터보단 크지 않은 데이터를 보관하는 역방향 인덱싱 DB 시스템이라 생각할 수도 있음

 

 

특징

 

- Scale

  • 다양한 CPU, 메모리 및 스토리지 용량 구성 (인스턴스 유형이라 함)

  • 최대 3PB의 인스턴스 스토리지

  • AWS EBS 스토리지 볼륨

 

- 보안

  • AWS IAM 액세스 제어

  • VPC 및 VPC 보안 그룹을 사용하는 쉬운 통합

  • 저장 중 데이터 암호화 및 노드 간 암호화

  • Kibana에 대한 AWS Conito 인증

 

- 안정성

  • 리소스를 위한 여러 지리적 위치 (리전 및 가용 영역이라 함)

  • 동일한 리전의 가용 영역 두 개 또는 세 개에 노드 할당 (Multi AZ)

  • 클러스터 관리 작업 부담을 줄여주는 전용 마스터 노드

  • 자동 스냅샷으로 AWS ES 도메인 백업 및 복원

 

- 유명 서비스와 통함

  • Kibana를 사용하는 데이터 시각화

  • AWS ES 도메인 지표 및 설정 경보 모니터링을 위한 CloudWatch와의 통합

  • AWS ES 도메인에 대한 구성 API 호출 감사를 위한 CloudTrail과의 통합

  • AWS ES로 스트리밍 데이터 로드를 위한 S3, Kinesis 및 DynamoDB와 통합

 

 

장점

 

- 아파치 루씬 기반으로 루씬의 기능을 대부분 지원 (자바로 개발)

 

- 분산시스템 (여러개의 노드 [검색하는 단위 프로세스] 로 구성)

 

- 확장 시 기존 노드에 새 노드를 실행하여 연결

 

- 각 노드에 데이터 분산 저장 (복사본 유지하여 충돌로부터 보호)

 

- 높은 가용성 (실패할 경우 다른 노드로 이동)

 

- JSON으로 저장 (REST API 지원)

 

- HTTP Method 지원 (9200 포트부터)

 

- Kibana와 연동되어 시각화 가능

 

- ElasticSearch 생성시 IAM 권한이 필요하고 Kibana 접근시 액세스 정책을 IP 기반으로 열어줘야함

 

 

 

아키텍처

 

 

1. 데이터 스트림 (데이터의 지속적인 흐름, 전달)이 AWS ES로 보내지면 지정된 인덱스 패턴에 의해 인덱스가 생성 (예를 들어 Stream1_날짜로 하면 위의 그림처럼 일별로 인덱스가 생성)

 

2. 각 AZ에 ES 데이터 인스턴스와 각 기본 데이터에 대한 복제본 하나가 배포 (샤드는 기본 및 복제본이 서로 다른 인스턴스에 배포되어 있음)

 

3. Elasticsearch에서 위의 과정으로 업데이트 처리를 하며 해당 업데이트가 새 문서 또는 업데이트된 문서를 수신하는 모든 기본 및 복제본으로 전송

  • 업데이트를 처리하는데 몇가지 중요한 특성이 존재

  • 첫째로는 각 인덱스 패턴은 기본*, 복제본 수*, 전체 샤드 보존 기간을 배포

  • 둘째로는 이 인덱스 패턴에 인덱스가 3개 있더라도 타임 슬라이싱은 새 문서가 이러한 인덱스 중 하나(해당 인덱스 패턴에 대한 활성 인덱스)에만 적용됨을 의미

  • 셋째로는 벌크 데이터를 전송하고 임의로 배포된다고 가정하면 해당 인덱스의 모든 샤드는 업데이트를 수신하고 기록

 

 

내부 용어

 

 

- Document : 검색 단위 문서

 

- ID : 각 문서에 대한 인식자

 

- Shard : 인덱스의 부분을 가지는 Lucene 인스턴스

 

- Index : 검색 데이터 집합

 

 

참조 URL

 

https://mykumi.tistory.com/entry/AWS-ElasticSearchKibanaFluentd-1-AWS-ElasticSearch-%EC%83%9D%EC%84%B1

https://cloud.hosting.kr/techblog_180718_t-shirt-size-your-domain/

반응형

'AWS' 카테고리의 다른 글

AWS IAM  (0) 2019.04.09
AWS IAM 정책 설명  (0) 2019.04.09
AWS CloudWatch  (0) 2019.04.09
AWS CloudWatch Logs  (0) 2019.04.09
AWS Auto Scaling  (0) 2019.04.09
728x90
반응형

CloudWatch

 

- AWS의 각종 자원들을 모니터링

 

- Resource의 측정치와 연결하여 Action을 서비스에 취할 수 있음

 

- 지표에 기반한 알람 서비스 및 그래프를 통한 가시화

 

 

 

아키텍처

 

 

- 리소스 사용 및 유저 데이터에 대한 모니터링 값을 메트릭스로 표현하는데 각 네임스페이스 별로 격리하여 표현

 

- CloudWatch Alarm을 통해 지정한 Resource 임계값이 초과되거나 미만이 되면 알람을 보내고 지정된 작업을 실행 (Auto Scaling을 통한 EC2 인스턴스 scale in/out)

 

- 통계자료를 그래프를 통한 가시화하여 AWS 콘솔을 통해 출력하거나 사용자 지정 통계로 출력

 

 

 

CloudWatch 용어

 

네임스페이스 (NameSpace)

 

- CloudWatch 지표용 컨테이너

 

- 다른 네임스페이스의 지표는 서로 격리되어 있으므로 다른 애플리케이션의 지표가 실수로 동일하게 집계되는 일은 없음

 

- 기본 네임스페이스는 없고 CloudWatch에 게시하는 각 데이터 요소의 네임스페이스를 지정해야함 (사용자 지표를 생성할때 네임스페이스 이름을 지정할 수 있음)

 

- 네임스페이스는 AWS/services 라는 명명 규칙을 사용

 

 

지표 (Metrics)

 

- 지표는 CloudWatch의 기본 개념으로 CloudWatch에 게시된 시간 순서별 데이터 요소 세트를 나타냄

 

- 지표를 모니터링할 변수로 생각하면 데이터 요소는 시간에 따른 변수의 값을 나타냄 (Ex. EC2 인스턴스의 CPU 사용량은 EC2가 제공하는 하나의 지표)

 

- 각 지표 데이터 요소에는 타임스탬프가 표시되는데 타임스탬프는 최대 2주전이고 최대 2시간 빠를 수 있음 (타임스탬프를 제공하지 않으면 CloudWatch는 데이터 요소를 받은 시간을 기준으로 타임스탬프를 생성)

 

- 각 지표는 최대 15개월동안 보관되는데 기간이 설정된 데이터 요소마다 보관기간이 다름

 

 

차원

 

- 지표를 고유하게 식별하는 이름/값 페어로 최대 지표에 차원을 10개까지 할당 가능

 

- 모든 지표에는 자신을 설명하는 고유한 특징이 있고 차원은 이렇나 특징에 대한 범주로 생각할 수 있음

 

- 차원을 사용하면 통계 계획을 위한 구조를 설계할 수 있음 (차원은 지표에 대한 고유한 식별자의 일부이므로 지표 중 하나에 이름/값 쌍을 추가할 때마다 해당 지표의 새로운 변형이 생성된 것)

 

- CloudWatch로 데이터를 전송하는 AWS 서비스는 각 지표에 차원을 연결하고 차원을 사용하여 CloudWatch가 반환하는 결과를 필터링할 수 있음 (지표를 검색할 때 InstanceId 차원을 지정하여 인스턴스에 대한 통계을 얻음)

 

 

통계

 

- 지정한 기간에 걸친 지표 데이터 집계

 

- CloudWatch에서는 사용자 지정 데이터를 통해 제공되었거나 다른 AWS 서비스에서 CloudWatch에 제공한 지표 데이터 요소를 기반으로 통계를 제공

 

 

백분위수 

 

- 데이터 세트에서 값의 상대적 위치를 나타냄 (Ex. 95백분위는 데이터의 95%가 이 값보다 아래에 있고 5%가 이 값보다 위에 있다는 것을 의미)

 

 

경보

 

- 경보를 사용하여 작업을 자동으로 시작할 수 있음

 

- 경보는 지정한 기간에 단일 지표를 감시하고 시간에 따른 임계값에 대한 지표 값을 기준으로 지정된 작업을 하나 이상 수행함

 

 

 

 

CloudWatch Event

 

개념

 

- 이벤트

  • 이벤트는 AWS 환경이 변경되었음을 나타냄

  • AWS 리소스는 상태 변경시 이벤트를 생성할 수 있음

  • CloudTrail은 API가 호출될 때 이벤트를 게시

 

- 대상

  • 대상은 이벤트를 처리 (JSON 형식으로 이벤트를 수신)

  • EC2 인스턴스, Lambda 함수, Kinesis 스트림, ECS 작업, Step Functions 상태 시스템, SNS 주제, SQS대기열, 기본 제공 대상 등이 여기에 해당

 

- 규칙

  • 규칙은 들어오는 이벤트에서 일치하는 것을 찾아서 대상으로 라우팅하여 처리

  • 단일 규칙으로 여러개의 대상으로 라우팅할 수 있으며 이들은 모두 병렬 처리

  • 규칙이 처리되는 특별한 순서는 없음

 

 

참조 URL

 

https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html

https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/events/WhatIsCloudWatchEvents.html

https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html

 

반응형

'AWS' 카테고리의 다른 글

AWS IAM 정책 설명  (0) 2019.04.09
AWS ElasticSearch  (0) 2019.04.09
AWS CloudWatch Logs  (0) 2019.04.09
AWS Auto Scaling  (0) 2019.04.09
AWS Auto Scaling 종료 정책  (0) 2019.04.09
728x90
반응형

CloudWatch Logs

 

- 소스에서 로그 파일을 모니터링, 저장 및 액세스할 수 있음

 

 

- 기능

  • EC2 인스턴스 로그 모니터링

    • CloudWatch Logs를 사용하면 로그 데이터를 통해 애플리케이션과 시스템을 모니터링할 수 있음

      (예를 들어 CloudWatch Logs에서는 애플리케이션 로그에서 발생하는 오류의 수를 추적하고 오류 비율이 지정한 임계값을 초과할 때마다 알림을 전송)

    • CloudWatch Logs는 모니터링하는데 로그 데이터를 사용하므로 코드를 변경할 필요가 없음

      (특정 리터럴문자<NullReferenceException>에 대한 애플리케이션 로그를 모니터링 하거나 로그 데이터의 특정 위치<Apache 액세스 로그의 404 상태 코드>에서 리터럴 문자의 출현 횟수를 계산)

    • 검색할 단어가 발견되면 CloudWatch Logs는 지정한 CloudWatch 지표로 데이터를 보고 (로드 데이터는 전송시는 물론 저장시에도 암호화)

  • AWS CloudTrail 기록 이벤트 모니터링

    • CloudWatch에서 경보를 생성하고 CloudTrail에서 포착된 특정 API 활동에 대한 알림을 수신하며 이러한 알림을 사용하여 문제 해결을 할 수 있음

  • 로그 보존

    • 기본적으로 로그는 무기한 저장되고 만료기관은 없음

  • 로그 데이터 보존

    • CloudWatch Logs를 사용하여 내구성이 뛰어난 스토리지에 로그데이터를 저장할 수 있음

    • CloudWatch Logs 에이전트를 사용하면 호스트에서 로그 서비스로 로테이션된 로그 데이터와 로테이션 되지 않은 로그 데이터를 모두 쉽고 빠르게 전송할 수 있음

  • Route 53 DNS 쿼리 로깅

    • CloudWatch Logs를 사용하여 Route53이 수신하는 DNS 쿼리에 대한 정보를 기록할 수 있음

    

 

Logs 개념

 

- 로그 이벤트

  • 로그 이벤트는 모니터링 중인 애플리케이션 또는 리소스에 기록된 일부 활동에 대한 레코드

  • CloudWatch Logs가 파악한 로그 이벤트 레코드에는 이벤트가 발생한 시점에 대한 타임스탬프와 원시 이벤트 메시지 등 두개의 속성이 포함

  • 각 메시지는 UTF-8로 인코딩되어야 함

 

- 로그 스트림

  • 로그 스트림은 동일한 소스를 공유하는 로그 이벤트 시퀀스

  • 로그 스트림은 모니터링 중인 애플리케이션 인스턴스나 리소스에서 나온 이벤트의 시퀀스를 표시하는데 주로 사용

  • 로그 스트림은 특정 호스트의 Apache 액세스 로그에 연결될 수 있음

 

- 로그 그룹

  • 로그 그룹은 동일한 보존 기간, 모니터링 및 액세스 제어 설정을 공유하는 로그 스트림 그룹을 정의

  • 각 로그 스트림은 하나의 로그 그룹에 속해야함 (Ex. 각 호스트의 Apache 액세스 로그에 대해 별도의 로그 스트림이 있으면 로그 스트림을 MyWebSite.com/Apache/access_log라는 하나의 그룹으로 묶을 수 있음)

  • 하나의 로그 그룹에서 포함할 수 있는 로그 스트림의 수에는 제한이 없음

 

- 지표 필터

  • 지표 필터를 사용하여 수집된 이벤트에서 지표 관찰값을 추출하고 이를 CloudWatch 지표의 데이터 요소로 변환할 수 있음

  • 지표 필터는 로그 그룹에 할당이 되고 로그 그룹에 할당된 모든 필터들은 로그 스트림에 적용

 

- 보전 기간 설정

  • CloudWatch Logs에 로그 이벤트를 보관하는 기간을 설정하는데 사용할 수 있음

  • 기간이 만료된 로그 이벤트는 자동으로 삭제

  • 지표 필터와 마찬가지로 보존 기간 설정 역시 로그 그룹에 할당되며 로그 그룹에 할당된 보존 기간은 로그 스트림에 적용

 

 

 

CloudWatch Logs .conf File (에이전트 구성 파일)

 

[general]

state_file = value

logging_config_file = value

use_gzip_http_content_encoding = [true | false]

 

[logstream1]

log_group_name = value

log_stream_name = value

datetime_format = value

time_zone = [LOCAL|UTC]

file = value

file_fingerprint_lines = integer | integer-integer

multi_line_start_pattern = regex | {datetime_format}

initial_position = [start_of_file | end_of_file]

encoding = [ascii|utf_8|..]

buffer_duration = integer

batch_count = integer

batch_size = integer

 

 

[general]

 

- state_file (상태 파일)

  • 상태 파일이 저장되는 장소를 지정

 

- logging_config_file (기본 구성 파일 위치)

  • 스크립트를 통해 에이전트를 설치한 경우 기본 파일 위치 : /var/awslogs/etc/awslogs.conf

  • rpm을 통해 에이전트를 설치한 경우 : /etc/awslogs/awslogs.conf

 

- use_gzip_http_content_encoding 

  • true(기본)로 설정되어 있으면 gzip http 콘텐츠 인코딩을 활성화하여 CloudWatch Logs로 압축된 페이로드를 전송

  • CPU 사용량을 줄이고 NetworkOut을 낮추며 PUT 레코드 지연시간을 줄일 수 있음

 

 

[logstream1] 

 

- log_group_name

  • 대상 로그 그룹을 지정

  • 로그 그룹이 없는 경우 이 설정에 따라 로그 그룹이 자동으로 생성

 

- log_stream_name

  • 대상 로그 스트림을 지정

  • 리터럴 문자열이나 미리 정의된 변수({instance_id}, {hostname}, {ip_address}) 또는 이 둘의 조합을 사용하여 로그 스트림 이름을 정의

  • 로그 스트림이 없는 경우 이 설정에 다라 로그 스트림이 자동으로 생성

 

- datetime_format

  • 타임 스탬프가 로그에서 추출되는 방법을 지정

  • 타임 스탬프는 로그 이벤트를 검색하고 지표를 생성하는데 사용

  • datetime_format이 제공되지 않는 경우에는 각 로그 이벤트에서 현재 시간이 사용

     

 

- time_zone

  • 로그 이벤트 타임 스탬프의 시간대를 지정

 

- file

  • CloudWatch Logs에 푸시하고 싶은 로그 파일을 지정

  • 파일은 특정 파일을 가리키거나 여러 개의 파일을 가리킬 수 있음 (/var/log/system.log* 와 같은 와일드카드 사용)

  • 파일 수정 시간에 따라 최신 파일만 CloudWatch Logs로 푸시

  • 여러 종류의 파일을 지정하려면 로그 파일의 종류에 따라 다른 로그 스트림에 들어가도록 구성파일에 또 다른 로그스트림 항목을 추가

 

- file_fingerprint_lines

  • 파일을 식별하기 위한 줄의 범위를 지정

  • 유효한 값은 하나의 숫자 (Ex. 1)나 대시로 구분된 두 개의 숫자 (Ex. 2-5)

  • 기본 값은 1이기 때문에 지문 산출을 위해 첫번째 줄이 사용

  • 지정된 모든 줄이 사용 가능한 상태가 되지않는 한 지문줄은 CloudWatch Logs로 전송되지 않음

 

- multi_line_start_pattern

  • 로그 메시지의 시작을 식별하기 위해 패턴을 지정

  • 로그 메시지는 패턴과 일치하는 하나의 줄과 패턴과 일치하지 않는 나머지 줄들로 이루어짐

  • 유효한 값은 {datetime_format}

  • {datetime_format}을 사용할때는 반드시 datetime_format 옵션이 지정되어 있어야함

  • 기본 값은 '^[^\s]' 이기 때문에 공백이 아닌 문자로 시작되는 줄이 있으면 이전의 로그 메시지가 종료되고 새로운 로그 메시지가 시작

 

- initial_position

  • 데이터 읽기를 시작할 지점(start_of_file 또는 end_of_file)을 지정

  • 기본 값은 파일의 시작 지점 (start_of_file 또는 end_of_file)

  • 해당 로그 스트림에서 지속되는 상태가 없을때만 사용

 

- encoding

  • 파일을 정확하게 읽을 수 있도록 로그 파일의 인코딩을 설정

  • 기본 값은 utf_8

 

- buffer_duration

  • 로그 이벤트를 일괄 처리하는 기간을 지정

  • 최소값은 5000ms이고 기본값은 5000ms

 

- batch_count

  • 일괄 처리할 로그 이벤트의 최대 수를 지정

  • 10000까지 가능하고 기본값은 10000

 

- batch_size

  • 일괄 처리할 로그 이벤트의 최대 크기를 바이트로 지정 

  • 1048576 바이트까지 가능하고 기본값은 1048576 바이트

 

참조 URL

 

https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/logs/AgentReference.html

https://medium.com/@eunsu.shin/aws-cloudwatch-%EC%95%8C%EB%9E%8C-%EC%84%A4%EC%A0%95-aafc19ed5749 - 로그 필터 패턴

반응형

'AWS' 카테고리의 다른 글

AWS ElasticSearch  (0) 2019.04.09
AWS CloudWatch  (0) 2019.04.09
AWS Auto Scaling  (0) 2019.04.09
AWS Auto Scaling 종료 정책  (0) 2019.04.09
AWS CloudFormation 내장함수  (0) 2019.04.09
728x90
반응형

Auto Scaling 이란

 

- 사용자가 정의한 정책, 일정 및 상태 확인에 따라 자동으로 EC2 인스턴스를 시작하거나 종료하도록 설계된 웹 서비스

 

- 내결함성 향상

  • 비정상 상태일 때를 감지하여 종료 후 이를 대체할 인스턴스를 시작

  • 복수의 AZ에 배포하도록 Auto Scaling Group을 구성하였을때 하나의 AZ가 사용 불가 상태가 되어도 다른 AZ에 같은 수의 인스턴스가 새로 배포되어 서비스 제공

 

- 가용성 향상

  • 현재 트래픽 요구를 처리할 수 있는 적절한 용량을 갖춤

 

- 비용 관리 개선

  • 필요에 따라 동적으로 인스턴스 수를 확장 / 축소 하면서 사용한 EC2 인스턴스에 대해서만 비용을 지불

 

- Auto Scaling Group 안에 인스터스를 추가 / 제외할 수 있음

 

- 트러블 슈팅을 위해 인스턴스를 Standby 상태로 유지할 수 있음

 

- 소프트웨어를 설치하고 로그를 검색하기 위해 인스턴스를 Pending 상태로 유지할 수 있음

 

- 기동중인 인스턴스의 Launch Configuration을 기반으로 Auto Scaling Group을 생성할 수 있음

 

 

 

Auto Scaling 제한

 

1. 리전 제한

 

- 리전별 시작 구성 : 200

 

- 리전별 Auto Scaling Group : 200

 

 

2. Auto Scaling Group 제한

 

- Auto Scaling Group 조정 정책 : 50

 

- Auto Scaling Group 예약된 작업 : 120

 

- Auto Scaling Group 수명주기 후크 : 50

 

- Auto Scaling Group SNS 주제 : 10

 

- Auto Scaling Group Classic Load Balancer : 50

 

- Auto Scaling Group 대상 그룹 : 50

 

 

3. 조정 정책 제한

 

- 조정 정책당 단계 조정 : 20

 

 

4. Auto Scaling API 제한

 

- 한번에 최대 20개의 인스턴스 ID에 AttachInstances, DetachInstances, EnterStandby 및 ExitStandby를 사용할 수 있음

 

- 한번에 최대 10개의 로드밸런서에 AttachLoadBalancers 및 DetachLoadBalancers를 사용할 수 있음

 

- 한번에 최대 10개의 대상 그룹에 AttachLoadBalancerTargetGroups 및 DetachLoadBalancerTargetGroups를 사용할 수 있음

 

 

 

Auto Scaling LifeCycle

 

- Auto Scaling Group의 EC2 인스턴스는 다른 EC2 인스턴스와 다른 경로 또는 수명주기를 가지고 있음 (일반적으로 생성된 인스턴스와는 다르다는 것을 의미)

 

- Auto Scaling Group 설정에 따라 인스턴스를 시작하고 서비스에 추가되었을 때 수명주기가 시작

 

- 인스턴스를 종료할 때 Lifecycle이 종료되거나 Auto Scaling Group 설정에 따라 서비스에서 인스턴스를 종료할 수 있음

 

 

1. Auto Scaling Type

 

- Vertical Scaling 

  • 인스턴스 사이즈 변경, EBS Capacity 증가

 

-Horizontal Scaling 

  • 인스턴스를 추가하거나 삭제, ELB 활용

 

 

2. Auto Scaling 시나리오

 

- Auto Scaling Group에 최소 / 최대 운영할 인스턴스 개수 정의

 

- 언제 Scaling 할지에 대한 정책 설정 (Scaling Plan)

 

- CloudWatch를 통해 사용량 데이터 수집 및 Scaling 시도

 

- 지정한 Spot에 Scaling Group에 지정된 형태로 인스턴스 확장

 

 

3. Resource 사용량 측정

 

- CloudWatch

  • 다양한 항목에 대해 사용량을 모니터링하고 관리할 수 있는 서비스

  • 알람을 설정하고 측정된 데이터를 기반으로 어떠한 액션을 취할 수 있도록 알람을 설정할 수 있음

 

- CloudWatch Alarm

  • CloudWatch에서 알람은 특정 기간 동안 하나의 메트릭을 모니터링하는 것 (메트릭은 모니터링할 대상을 의미 - CPU Used / Network In Traffic 등등)

 

- 모니터링 항목에 대해 지정한 범위 안의 값이 변경되었을때 알람이 상태를 변경

 

 

4. Auto Scaling Group 계획 관리

 

- 인스턴스를 생성하고 구성하는데 얼마나 시간이 소요되는지

 

- 어떠한 모니터링 항목이 어플리케이션의 성능을 측정하는데 적정한지

 

- 기존의 어떠한 자원 (EC2 인스턴스 나 AMIS)는 Auto Scaling Group의 일부로 사용할 수 있음

 

- 몇개의 AZ에 Auto Scaling Group이 확장시킬 것인지

 

- 인스턴스를 Auto Scaling 한 후 Application 기동을 수행할 역활 지정

 

 

5. Auto Scaling Group에서의 부하 분산

 

- 들어오는 웹 트래픽에 대해서는 자동으로 분산해야 함

 

- 어플리케이션에 접근하기 위한 싱글 포인트

 

- 로드밸런서와 EC2 인스턴스의 사용량 데이터는 CloudWatch로 보내짐

 

- 어플리케이션을 확장하는데 ELB 모니터링 항목을 사용할 수 있음

 

 

6. 아키텍처

 

 

 

 

Auto Scaling Lifecycle Hooks

 

- 사용자가 지정한 액션을 오토스케일링이 수행되거나 중단될 때 수행할 수 있게 한다.

 

https://docs.aws.amazon.com/ko_kr/autoscaling/ec2/userguide/lifecycle-hooks.html

 

 

1. 아키텍처

 

 

 

2. Bootstrapping

 

- bootstrapping 으로 수행할 수 있는 기능

  • Software 설치

  • S3로부터 Data Copy

  • DNS에 등록

  • 서비스 기동

  • 패키지 업데이트

  • Reboot 수행

  • 80 Port 오픈 (ELB에 등록, Device Mount)

 

- Bootstrapping 도구

  • 인스턴스에 포함된 스크립트 (Bash, PowerShell)

  • 설정 관리 도구 (Chef, Puppet)

  • AWS Opsworks

 

 

3. EC2 Metadata와 UserData

 

- 모든 EC2 인스턴스는 로컬 인스턴스의 Metadata와 Userdata 서비스에 접근할 수 있음

 

- http://169.254.169.254/latest/meta-data/ 의 Metadata를 통해 Hostname, AMI ID, Instance ID, Public/Private DNS, Availability Zone등을 검색할 수 있음

 

- 인스턴스 생성시 text 16KB까지 사용 가능

 

- text는 인스턴스에서 설정작업을 위해 스크립트로 Parsing 할 수 있어야 함

 

- Cloud-init은 인스턴스 최초 부팅 시 UserData를 수행할 수 있어야 함

 

- Cloud-init은 AWS Linux, RHEL, Ubuntu에 설치되어 있음 (각 플랫폼 별 repo를 통해 설치 가능)

 

- EC2Config는 Windows Server AMIs에 설치 되어 있음

 

- UserData를 통해 Apache나 Mysql 등의 패키지를 설치하고 EIP를 연결할 수 있음

 

 

참조 URL

https://sarc.io/index.php/aws/545-aws-auto-scaling

https://sori-nori.gitlab.io/youngkyung-done/ASG-1/

https://tech.lezhin.com/2017/08/10/deployment-with-auto-scaling-group

 

반응형

'AWS' 카테고리의 다른 글

AWS CloudWatch  (0) 2019.04.09
AWS CloudWatch Logs  (0) 2019.04.09
AWS Auto Scaling 종료 정책  (0) 2019.04.09
AWS CloudFormation 내장함수  (0) 2019.04.09
AWS CloudFormation  (0) 2019.04.09
728x90
반응형

Auto Scaling 종료 정책

 

- OldestInstance 

  • 그룹에서 가장 오래된 인스턴스를 종료

  • ASG의 인스턴스를 새로운 EC2 인스턴스 유형으로 업그레이드할 때 유용

  • 이전 유형의 인스턴스를 새로운 유형의 인스턴스로 점진적으로 교체할 수 있음

 

- NewestInstance

  • 그룹에서 가장 새로운 인스턴스를 종료

  • 해당 정책은 새로운 구성을 테스트하지만 프로덕션 상태로 유지하고 싶지 않은 경우에 유용

 

- OldestLaunchConfiguration

  • 가장 오래된 시작 구성을 가진 인스턴스를 종료

  • 해당 정책은 그룹을 업데이트하고 이전 구성에서 인스턴스를 단계적으로 종료할 때 유용

 

- ClosestToNextInstanceHour

  • 다음 번 결제 시간에 가장 근접한 인스턴스를 종료

  • 해당 정책은 인스턴스의 사용을 극대화하고 사용 비용을 관리할 수 있도록 함

 

- Default

  • 기본 종료 정책에 따라 인스턴스를 종료

  • 해당 정책은 그룹에 대한 조정 정책이 둘 이상일 경우에 유용

 

- OldestLaunchTemplate

  • 시작 템플릿이 가장 오래된 인스턴스를 종료

  • 먼저 현재 템플릿이 아닌 템플릿을 종료한 후 현재 시작 템플릿의 가장 오래된 버전을 종료

  • 이 정책은 그룹을 업데이트하고 이전 구성에서 인스턴스를 단계적으로 종료할 때 유용

 

- AllocationStrategy

  • ASG의 인스턴스를 종료하여 온디맨드 및 스팟 인스턴스의 할당 전략, 햔재 선택되어 있는 인스턴스 유형, N 최저가 스팟 풀 배포에 인스턴스 배포를 맞춤

 

 

https://docs.aws.amazon.com/ko_kr/autoscaling/ec2/userguide/as-instance-termination.html

반응형

'AWS' 카테고리의 다른 글

AWS CloudWatch Logs  (0) 2019.04.09
AWS Auto Scaling  (0) 2019.04.09
AWS CloudFormation 내장함수  (0) 2019.04.09
AWS CloudFormation  (0) 2019.04.09
AWS Resource Group  (0) 2019.04.09
728x90
반응형

CloudFormation 내장함수 

 

Ref 함수

 

- 지정한 파라미터나 리소스의 값을 취득하는 함수

 

- 동적으로 값이 정해지는 항목을 템플릿에 기재할 때 사용 

(VPC와 Subnet을 만들 때 Subnet 측에서 VPC의 ID를 지정할 필요가 있다. 하지만 VPC의 ID는 구축 시에 동적으로 결정되므로 템플릿에 기재가 불가능 하다. 이런 경우 Ref 함수를 이용해 동적으로 정해지는 항목을 기재)

 

- 유사 파라미터라고 하는 AWS가 사전에 정의한 값을 Ref 함수에서 참조할 수 있음

(Ex. < !Ref "AWS::Region > 이라고 하면 CloudFormation이 실행된 리전을 취득 / < !Ref "AWS::AccountId" > 라 하면 실행 계정의 계정 ID를 취득)

 

- Ref 함수를 잘 사용하면 리전이나 계정에 의존하지 않는 템플릿 작성 가능

 

- 사용 예제

SampleVPC :

    Type : 'AWS::EC2::VPC'

    Properties :

        CidrBlock : '192.168.0.0/16'

SamplePublicSubnet :

    Type : 'AWS::EC2::Subnet'

    Properties :

        AvailabilityZone : 'ap-northeast-1a'

        CidrBlock : '192.168.0.0/24'

        VpcId : !Ref SampleVPC

 

 

FindInMap 함수

 

- Mappings 섹션에서 값을 취득하는 함수

 

- 사전에 맵 형식의 정수를 정의할 수 있음

(Ex. EC2 인스턴스를 시작할 때 AMI의 이미지 ID를 지정해야 하지만 이 이미지 ID는 리전마다 다름, 그래서 Mappings 섹션에서 이미지 ID의 매핑을 정의함)

 

- 사용 예제

Mappings :

         RegionMap :

                us-east-1 :

                       hvm : "ami-a4c7edb2"

                 ap-northeast-1 :

                       hvm : "ami-3bd3c45c"

 

  •  이 RegionMap에 대해 Fn::FindInMap 함수를 사용해 이미지 ID를 지정하면 대상 리전에 연관된 이미지 ID를 취득할 수 있음

  • Ex. ImageID: !FindInMap [ RegionMap, !Ref "AWS::Region", hvm ] )

  • 유사 파라미터와 Ref 함수를 조합해서 "!Ref "AWS::Region"" 으로 실행 리전을 취득하고 있음 (템플릿을 정의하는 것으로 리전 정보의 하드코딩을 피할 수 있음)

 

 

Select 함수

 

- Select는 리스트에서 지정한 값을 취득하는 함수

 

- 사용 예제

!Select [ "1", [ "ap-northeast-1a", "ap-northeast-1c" ] ]

 

  • ap-northeast-1c를 취득할 수 있음 (리스트의 선두를 0으로 나타내므로 여기서는 2번째 요소가 취득)

  • Fn::GetAZs 함수와 함께 사용하는 경우가 많음 

 

 

GetAZs 함수

 

- GetAZs는 지정한 리전의 가용 영역(AZ)의 리스트를 취득하는 함수

 

- 예를 들어 서브넷을 AZ마다 1개씩 작성하고 싶다면 Select 함수와 조합해서 작성

 

- 사용 예제

SamplePublicSubnet :

         Type : 'AWS::EC2::Subnet'

         Properties :

                 AvailabilityZone :

                        Fn::Select:

                              - 0

                              - Fn::GetAZs: ""

                 CidrBlock : '192.168.0.0/24'

                 VpcId : !Ref SampleVPC

SamplePublicSubnet2 : 

         Type : 'AWS::EC2::Subnet'

         Properties : 

                 AvailabilityZone :

                        Fn::Select:

                              - 1

                              - Fn::GetAZs: ""

                 CidrBlock : '192.168.1.0/24'

                  VpcId : !Ref SampleVPC

                    

 

ImportValue 함수

 

- 다른 스택에서 출력된 값(Output - export => importvalue)을 취득할때 사용 (값을 가져오는데만 사용)

 

- 시스템의 규모가 커지면 레이어마다 스택을 나누는 경우가 있음

(예를 들어 VPC나 서브넷을 만드는 네트워크 스택과 EC2 인스턴스를 생성하는 서버 스택처럼 분리해서 템플릿을 단순하게 만듬, 이때 네트워크 스택이 만든 서브넷의 ID를 서버 스택 측에서 참조해야 하지만 이런 경우에 ImportValue 함수를 이용하면 서브넷 ID를 취득할 수 있음)

 

- 동일 리전에서만 값을 가져올 수 있고 다른 스택에서 참조중인 스택은 수정하거나 삭제할 수 없음

 

- 출력의 경우 리소스에 의존하는 Ref 또는 GetAtt 함수를 Export의 Name 속성값으로 사용할 수 없음

 

- 선언 방식

1) JSON

{ “Fn::ImportValue” : sharedValueToImport }

 

2) YAML

Fn::ImportValue: sharedvalueToImport 또는 !ImportValue sharedValueToImport

  • !ImportValue가 포함되면 !Sub의 짧은 형식을 사용할 수 없음 (CloudFormation은 유효하지만 YAML에 대해 유효하지 않음)

    • !ImportValue

         !Sub “{NetworkStack}-SubnetID

    • Fn::ImportValue:

          !Sub "${NetworkStack}-SubnetID"

 

- 사용 예제 (스택 A에서 스택 B로 값 내보내기)

1) 스택 A (Output 스택에서 Export로 값 내보내기)

Outputs :

    VPC

       Description : reference VPC

       Value : !Ref VPC

         Export :

              Name : ProdVPC

 

2) 스택 B (Resources 스택에서 ImportValue 함수로 값 가져오기)

Resources :

   MyTargetGroup :

       Type : AWS::ELBV2::TargetGroup

       Properties :

           VpcId :

                Fn::ImportValue: ProdVPC

 

Sub 함수

 

- 입력 문자열의 변수를 지정한 값으로 바꿈

 

- 템플릿에 이 함수를 사용해 스택을 생성하거나 업데이트해야만 사용할 수 있는 값이 포함된 명령 또는 출력을 만들 수 있음

 

- 템플릿 파라미터, 리소스의 논리적 ID 또는 String 파라미터의 리소스 속성만 바꾸는 경우 변수 맵을 지정하면 안됨

 

- 사용예제-1

Fn::Sub:

  - String

  - { Var1Name: Var1Value, Var2Name: Var2Value }

 

  • String 

    • 변수가 포함된 문자열로 CloudFormation은 실행 시간 시 이를 연결된 값으로 바꿈, 변수를 ${MyVarName}으로 사용

    • 변수는 템플릿 파라미터 이름, 리소스의 논리적 ID, 리소스 속성 또는 키-값 맵의 변수일 수 있음

    • 템플릿 파라미터 이름, 리소스의 논리적 ID 및 리소스 속성만 지정하는 경우에는 키-값 맵을 지정하면 안됨

    • 템플릿 파라미터 이름 또는 리소스의 논리적 ID(Ex. ${InstanceTypeParameter})를 지정하는 경우 CloudFormation에서는 Ref 내장 함수를 사용했을 때와 동일한 값을 반환

    • 리소스 속성(Ex. ${MyInstance.PublicIp})을 지정하는 경우 CloudFormation에서는 Fn::GetAtt 내장함수를 사용했을 때와 동일한 값을 반환

  • VarName

    • String 파라미터에 포함된 변수의 이름

  • VarValue

    • CloudFormation은 실행 시간 시 연결된 변수 이름을 이 값으로 바꿈

 

- 사용 예제-2 (매핑을 사용하여 ${Domain} 변수를 Ref 함수의 결과 값으로 바꿈)

Name: !Sub

  - www.${Domain}

  - { Domain: !Ref RootDomainName }

 

  • ${Domain}의 값이 test라면 해당 값을 Ref 함수를 사용하여 RootDomainName의 값으로 변경

 

 

GetAtt 함수

 

- 템플릿의 리소스에서 속성 값을 반환

 

- 사용 예제-1

Fn::GetAtt: [ logicalNameOfResource, attributeName ]

 

  • logicalNameOfResource : 원하는 속성을 포함하는 리소스의 논리적 이름

  • attributeName : 값을 가져올 리소스 관련 속성의 이름

 

- 사용 예제-2 (논리적 이름이 myELB인 로드밸런서의 DNS 이름을 포함하는 문자열을 반환)

!GetAtt myELB.DNSName

 

 

Join 함수

 

- 지정된 구분 기호로 구분된 값 세트를 단일 값에 추가 (구분 기호가 빈 문자열이면 값 세트는 구분 기호 없이 연결)

 

- 사용 예제-1

Fn::Join: [ delimiter, [ comma-delimited list of values ] ]

 

  • delimiter : 조각 두 개 사이에서 발생하길 원하는 값 (구분 기호는 조각 사이에서만 발생하고 최종값을 종료하지 않음)

  • ListOfValues : 결합하려는 값 목록

 

- 사용 예제-2 (a:b:c를 반환)

!Join [ ":", [ a, b, c ] ]

 

- 사용 예제-3

!Join

  - ''  # 빈 문자열로 구분 기호 없이 연결

  - - 'arn:'

    - !Ref Partition

    - ':s3:::elasticbeanstalk-*-'

    - !Ref 'AWS::AccountId'

 

  • 출력 결과 - arn:!Ref Partition:s3:::elasticbeanstalk-*-:!Ref ‘AWS::AccountId'

 

 

Split 함수

 

- 결과로 얻은 문자열 목록에서 요소를 선택할 수 있도록 문자열을 분할

 

- 쉽표(,)와 같은 구분 기호를 사용하여 분할 위치 지정

 

- 문자열 분할한 후 Fn::Select 함수를 사용하여 특정 요소를 선택

 

- 사용 예제-1

Fn::Split: [ delimiter, source string ]  # 전체 함수 이름 구문

 

!Split [ delimiter, source string ]  # 짧은 형식 구문

 

  • delimiter : 원본 문자열을 분할할 위치를 결정하는 문자열 값

  • source string : 분할할 문자열 값

 

- 사용 예제-2 ([“a”, “b”, “c”] 를 반환, 각 세로 막대[ | ]에서 문자열을 분할하는 예제)

!Split [ "|" , "a|b|c" ]

 

- 사용 예제-3 (연속하는 구분 기호로 문자열을 분할할 경우 결과 목록에 빈 문자열이 포함, 연속하는 구분 기호와 추가 구분 기호로 문자열을 분할하는 방법의 예제, [“a”, ””, ”c”, “”]를 반환)

!Split [ "|" , "a||c|" ]

 

- 사용 예제-4 (Fn::Select 함수에 지정된 대로 가져온 출력 값을 분할한 다음 서브넷 ID의 결과 목록에서 세번째 요소를 선택하는 예제)

!Select [2, !Split [",", !ImportValue AccountSubnetIDs]]

 

 

Transform 함수

 

- 스택 템플릿의 일부부분인 사용자 지정 처리를 수행하는 매크로를 지정

 

- 매크로를 통해 찾기 및 바꾸기 작업 같은 간단한 작업부터 전체 템플릿 변형과 같은 작업까지 템플릿에 대한 사용자 지정 처리를 수행

 

- 사용 예제-1

Fn::Transform:  # 전체 함수 구문의 이름

  Name : macro name

  Parameters :

          Key : value

 

!Transform { "Name" : macro name, "Parameters" : {key : value, ... } }  # 짧은 형식의 구문

 

  • Name : 처리를 수행하고자 하는 매크로의 이름

  • Parameters : 매크로에 전달하는 키-값 페어로 지정된 목록 파라미터

 

- 사용 예제-2 (AWS::Include 변형을 호출하여 템플릿 코드 조각을 검색하는 위치가 InputValue 파라미터에 전달되도록 지정)

'Fn::Transform':

    Name: 'AWS::Include'

    Parameters: {Location: {Ref: InputValue}}

 

- 사용 예제-3 (AWS::Include 변형 호출하여 템플릿 코드 조각을 검색하는 위치가 RegionMap 매핑에 위치하고, 키는 us-east-1, 중첩된 키가 s3Location에 있음을 지정)

'Fn::Transform':

    Name: 'AWS::Include'

    Parameters: {Location: {'Fn::FindInMap': [RegionMap, us-east-1, s3Location]}}

 

 

Base64 함수

 

- 입력 문자열의 Base64 표시를 반환

 

- 일반적으로 UserData 속성을 통해 인코딩된 데이터를 EC2 인스턴스에 전달하는데 사용

 

- 사용 예제-1

Fn::Base64: valueToEncode  # 전체 함수 이름 구문

 

!Base64 valueToEncode  # 짧은 형식의 구문

 

  • valueToEncode : Base64로 변환할 문자열 값

 

- 사용 예제-2 (짧은 형식을 사용하고 valueToEncode 파라미터에 다른 함수를 바로 포함할 경우 최소 하나 이상의 함수에 대해 전체이름을 사용해야 함)

!Base64 !Sub string

!Base64 !Ref logical_ID

=> 잘못된 구문

 

!Base64

  "Fn::Sub": string

 

Fn::Base64:

  !Sub string

=> 정상적 구문

 

 

Cidr 함수

 

- CIDR 주소 블록의 배열을 반환 (반환된 CIDR 블록의 수는 count 파라미터에 따라 다름)

 

- 사용 예제-1

Fn::Cidr:  # 전체 함수 구문

  - ipBlock

  - count

  - cidrBits

 

!Cidr [ ipBlock, count, cidrBits ]  # 짧은 형식 구문

 

  • ipBlock : 작은 CIDR 블록으로 분활되는 사용자 지정 CIDR 주소 블록

  • count : 생성할 CIDR의 수 (유효 범위는 1-256)

  • cidrBits : CIDR에 대한 서브넷 비트 수 (해당 파라미터에 대한 값으로 8을 지정하면 24마스크의 CIDR이 생성, 32Bit-8Bit=24Bit)

 

- 사용 예제-2 (24마스크의 CIDR 내부에서 27 서브넷 마스크의 CIDR 6개를 생성)

!Cidr [ "192.168.0.0/24", 6, 5 ]

 

- 사용 예제-3 (IPv6 활성화 서브넷 생성)

Resources:

    ExampleVpc:

        Type: AWS::EC2::VPC

        Properties:

            CidrBlock: "10.0.0.0/16"

     IPv6CidrBlock:

        Type: AWS::EC2::VPCCidrBlock

        Properties:

            AmazonProvidedIpv6CidrBlock: true

            VpcId: !Ref ExampleVpc

     ExampleSubnet:

        Type: AWS::EC2::Subnet

        DependsOn: IPv6CidrBlock

        Properties:

            AssignIpv6AddressOnCreation: true

            CidrBlock: !Select [ 0, !Cidr [ !GetAtt ExampleVpc.CidrBlock, 1, 8 ]]

            Ipv6CidrBlock: !Select [ 0, !Cidr [ !Select [ 0, !GetAtt ExampleVpc.Ipv6CidrBlocks], 1, 64 ]]

            VpcId: !Ref ExampleVpc

 

 

참조 URL

 

https://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-cidr.html

반응형

'AWS' 카테고리의 다른 글

AWS Auto Scaling  (0) 2019.04.09
AWS Auto Scaling 종료 정책  (0) 2019.04.09
AWS CloudFormation  (0) 2019.04.09
AWS Resource Group  (0) 2019.04.09
AWS CodeBuild  (0) 2019.04.09
728x90
반응형

CloudFormation 이란?

 

- AWS 리소스의 설정을 JSON 형식 또는 YAML 형식으로 기재한 템플릿을 만들고 해당 템플릿에서 AWS 리소스를 자동으로 구축하는 서비스

 

- CloudFormation에는 스택과 템플릿으로 구성

  • 스택

    • CloudFormation 기능으로 자동 생성된 AWS 리소스의 집합을 나타냄

    • CloudFormation은 스택 단위로 리소스를 관리하기 위해 스택에 연관된 리소스를 한번에 구축하거나 한번에 제거할 수 있음

    • 리소스간에는 의존관계가 있는 경우가 많은데 예를 들어 VPC와 EC2 인스턴스에서 VPC가 없다면 인스턴스를 만들 수 없다. 이같은 의존 관계를 CloudFormation이 자동 구축 시에 판단하고 구축하는 순서에 모순이 없도록 결정

  • 템플릿

    • 스택 구성을 결정하는 설계자로서 CloudFormation의 핵심 요소

    • JSON이나 YAML 형식으로 기술

    • 템플릿은 AWS 리소스를 기술하는 장소, 실행조건을 기술하는 장소 등의 몇 개 섹션으로 구성

    • 템플릿 생성을 지원하는 내장함수가 존재하며 이 내장함수를 사용해 범용성 높은 템플릿 구성 가능

  • 변경 세트

    • 스택에서 실행 중인 리소스를 변경해야 하는 경우 스택을 업데이트

    • 리소스를 변경하기 전에 제안된 변경 사항이 요약된 변경 세트를 생성할 수 있음

    • 변경 세트를 사용하면 변경  사항을 구현하기 이전에 해당 변경이 실행중인 리소스에 미치는 영향을 확인할 수 있음

    • Ex. RDS DB 인스턴스의 이름을 변경한 경우 CloudFormation에서 새 DB를 생성하고 이전 DB를 삭제하므로 아직 백업하지 않은 경우 이전 DB 데이터를 잃게 됨

 

 

 

템플릿 섹션

 

 

Resources (리소스)

 

- 구축하는 AWS 리소스를 정의하는 섹션 (사용하는 AWS 서비스의 정의를 기술)

 

- 템플릿 중에서도 가장 중요한 섹션

 

- 사용 예제-1

Resources :

    EC2InstanceWeb :   # Logical ID로 템플릿내에 고유해야함, 논리적 이름을 사용하여 템플릿의 다른 부분에 있는 리소스를 참조

        Type : 'AWS::EC2::Instance'  # 리소스의 유형을 지정

        Properties :  # 리소스에 지정할 수 있는 추가 옵션으로 속성을 지정

                InstanceType : 'm2.large'  # 인스턴스 유형 지정

                InstanceInitiatedShutdownBehavior : 'stop'  # 셧다운할 때 동작을 지정

 

- 사용 예제-2 (MyInstance 리소스는 MyQuere 리소스를 UserData 속성의 일부로서 포함)

Resources:

  MyInstance:

    Type: "AWS::EC2::Instance"

    Properties:

      UserData:

        "Fn::Base64":

          !Sub |

            Queue=${MyQueue}

      AvailabilityZone: "us-east-1a"

      ImageId: "ami-0ff8a91507f77f867"

  MyQueue:

    Type: "AWS::SQS::Queue"

    Properties: {}

 

 

Parameters (파라미터)

 

- 템플릿 실행 시에 사용자가 선택하는 항목을 정의하는 섹션

 

- 동일한 템플릿에도 용도에 따라 템플릿 설정 값을 변경하려는 경우 사용 (예를 들어 인스턴스 유형을 운영환경에서는 t2.large로 사용하지만 개발환경에서는 t2.small로 지정하고 싶은 경우) 

 

- 파라미터 섹션을 이용해 CloudFormation 실행 사용자에게 인스턴스 유형을 선택하게 할 수 있음

 

- 파라미터를 통해 스택을 생성하거나 업데이트 할 때마다 템플릿에 사용자 지정 값을 입력할 수 있음

 

- 사용 예제

Parameters :

        InstanceType :

              Type : String

              Default : t2.micro

              AllowedValues :

                     - t2.mircro

                     - t2.small

                     - t2.medium

                     - t2.large

               Description : Select EC2 instance type.

 

  • 이 템플릿을 실행하면 파라미터 입력이 요구 됨

  • 입력 값을 참조할 수 있음

    Resources :

           EC2InstanceWeb :

                  Type : 'AWS::EC2:Instance'

                  Properties :

                          InstanceType : !Ref InstanceType

    • 사용자가 입력한 값은 Ref 함수로 참조할 수 있음

 

 

Mappings (매핑)

 

- Map 형식의 변수를 정의하는 섹션

 

- 템플릿의 실행 환경에 따라 달라질 수 있는 값을 사전에 맵 형식으로 정의할 수 있음

 

- 리전마다 설정 값이 다른 경우 등은 Mappings 섹션에 정의해 두고 리전마다 사용하는 값을 변경할 수 있게함

 

- 사용 예제-1

Mappings :

         MappingName :  # Mapping 이름

                  Key1 :    # 키 이름

                          Name1 : Value1-1   # 이름과 값의 페어

                          Name2 : Value1-2

                  Key2 :

                          Name1 : Value2-1

 

- 사용 예제-2

Mappings:

  RegionMap:

    us-east-1: #키는 리전의 이름

      "HVM64": "ami-0ff8a91507f77f867”  # 값은 리전의 HVM64 AMI용 AMI ID

    us-west-1:

      "HVM64": "ami-0bdb828fd58c52235"

    eu-west-1:

      "HVM64": "ami-047bb4163c506cd98"

    ap-southeast-1:

      "HVM64": "ami-08569b978cc4dfa10"

    ap-northeast-1:

      "HVM64": "ami-06cd52961ce9f0d85"

 

- 사용 예제-3 (FindInMap 함수를 사용하여 지정한 키에 따라 명명된 값을 반환할 수 있음, FindInMap 함수르 통해 ImageId 속성이 할당된 EC2 리소스가 포함)

AWSTemplateFormatVersion: "2010-09-09"

Mappings:

  RegionMap:

    us-east-1:

      HVM64: ami-0ff8a91507f77f867

      HVMG2: ami-0a584ac55a7631c0c

    us-west-1:

      HVM64: ami-0bdb828fd58c52235

      HVMG2: ami-066ee5fd4a9ef77f1

    eu-west-1:

      HVM64: ami-047bb4163c506cd98

      HVMG2: ami-0a7c483d527806435

    ap-northeast-1:

      HVM64: ami-06cd52961ce9f0d85

      HVMG2: ami-053cdd503598e4a9d

    ap-southeast-1:

      HVM64: ami-08569b978cc4dfa10

      HVMG2: ami-0be9df32ae9f92309

Resources:

  myEC2Instance:

    Type: "AWS::EC2::Instance"

    Properties:

      ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", HVM64]  #FindInMap 함수는 키를 스택이 생성되는 리전으로 지정하여 HVM64를 매핑할 값으로 지정

      InstanceType: m1.small

 

 

Conditions (조건)

 

- 조건에 따라 템플릿의 동작을 바꾸고 싶은 경우 사용 (예를 들어 조건을 충족할때만 EC2 인스턴스를 시작하는 경우) 

 

- 사용 예제-1 (운영 환경과 그 외의 환경에서 생성할 IAM 사용자를 변경하고 싶을 때 템플릿을 정의하는 방법 (운영 환경 사용자외 이외 사용자를 서로 다르게))

1) 파라미터 섹션에서 환경을 나타내는 파라미터 생성

Parameters :  # 조건에서 평가하고자 하는 입력을 정의, 조건은 이러한 입력 파라미터의 값에 따라 true 또는 false로 평가, 조건에서 가상 파라미터를 평가하고자 하는 경우 이 섹션에서 가상파라미터를 정의할 필요가 없음

       Env :

               Type : String

               AllowedValues :

                      - production

                      - test

                      - develop

               Default : test

               Description : Select Env.

 

2) Conditions 섹션에 선택된 Env 에 의해 운영 환경인지 아닌지 판단하는 값을 판단하는 값인 IsProduction을 생성

Conditions :  # 내장 조건 함수를 사용 하여 조건을 정의, 이러한 조건은 CloudFormation에서 연결된 리소스가 생성되는 경우를 결정

         IsProduction : !Equals [ !Ref Env, production ]

 

3) 마지막으로 리소스 측에서 IsProduction의 값에 따라 사용자를 만들것인지를 판단

Resources :  # Resources 및 Outputs 섹션에서 조건부로 생성할 리소스나 출력을 조건과 연결, Condition 키와 조건의 논리적 ID를 사용하여 리소스나 출력과 연결, 속성을 조건부로 지정하려면 Fn::If 함수를 사용

        ProdUser :

                Type : AWS::IAM::User

                Condition::IsProduction

                Properties :

~~~~

 

  •  Conditions 섹션을 활용하면 '운영 환경만 CloudWatch의 모니터링을 추가한다', '검증 환경에만 검증 권한을 가진 IAM 사용자를 생성한'다라는 정의를 할 수 있음

 

- 사용 예제-2

AWSTemplateFormatVersion: "2010-09-09"

Mappings:

  RegionMap:

    us-east-1:

      AMI: "ami-0ff8a91507f77f867"

      TestAz: "us-east-1a"

    us-west-1:

      AMI: "ami-0bdb828fd58c52235"

      TestAz: "us-west-1a"

    us-west-2:

      AMI: "ami-a0cfeed8"

      TestAz: "us-west-2a"

    eu-west-1:

      AMI: "ami-047bb4163c506cd98"

      TestAz: "eu-west-1a"

    sa-east-1:

      AMI: "ami-07b14488da8ea02a0"

      TestAz: "sa-east-1a"

    ap-southeast-1:

      AMI: "ami-08569b978cc4dfa10"

      TestAz: "ap-southeast-1a"

    ap-southeast-2:

      AMI: "ami-09b42976632b27e9b"

      TestAz: "ap-southeast-2a"

    ap-northeast-1:

      AMI: "ami-06cd52961ce9f0d85"

      TestAz: "ap-northeast-1a"

Parameters:

  EnvType:

    Description: Environment type.

    Default: test

    Type: String

    AllowedValues:

      - prod

      - test

    ConstraintDescription: must specify prod or test.

Conditions:

  CreateProdResources: !Equals [ !Ref EnvType, prod ]

Resources:

  EC2Instance:

    Type: "AWS::EC2::Instance"

    Properties:

      ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", AMI]

  MountPoint:

    Type: "AWS::EC2::VolumeAttachment"

    Condition: CreateProdResources

    Properties:

      InstanceId:

        !Ref EC2Instance

      VolumeId:

        !Ref NewVolume

      Device: /dev/sdh

  NewVolume:

    Type: "AWS::EC2::Volume"

    Condition: CreateProdResources

    Properties:

      Size: 100

      AvailabilityZone:

        !GetAtt EC2Instance.AvailabilityZone

Outputs:

  VolumeId:

    Condition: CreateProdResources

    Value:

      !Ref NewVolume

 

 

Output (출력)

 

- 구축된 리소스에 관한 정보 중에서 관리 콘솔 등에 출력하는 정보를 정의

 

- 정의한 값은 관리 콘솔에서 확인할 수 있을뿐더러 다른 AWS 리소스를 구축할 때 사용할 수 있음

 

- 사용 예제-1 (EC2 인스턴스의 인스턴스 ID 출력) 

Outputs :

         InstanceID :

               Description : The Instance ID

               Value : !Ref TestEC2Instance01

 

- 사용 예제-2 (다른 스택에서 출력 값을 사용하고 싶은 경우에 Export 사용)

Outputs :

        InstanceID :

              Description : The Instance ID

              Value : !Ref TestEC2Instance01

              Export :

                      Name : !Sub "${AWS::StackName}-InstanceID"

위의 내용을 Fn::ImportValue 함수를 사용해 참조하는 것이 가능

Fn::ImportValue:

      !Sub "${AWS::StackName}-InstanceID"

 

 

Metadata (메타데이터)

 

- 템플릿에 대한 세부 정보를 제공하는 임의 JSON 또는 YAML 객체를 포함할 수 있음 (특정 리소스에 대한 템플릿 구현 세부 정보를 포함할 수 있음)

 

- 스택 업데이트 중에는 메타데이터 섹션을 자체적으로 업데이트할 수 없음, 리소스를 추가 / 수정 / 삭제하는 변경 내용을 포함할 때만 업데이트할 수 있음

 

- 사용 예제-1 (메타데이터 키)

Metadata:

  Instances:

    Description: "Information about the instances"

  Databases:

    Description: "Information about the databases"

 

  • AWS::CloudFormation::Init 

    • cfn-init 헬퍼 스크립트에 대한 구성 작업을 정의

    • EC2 인스턴스에서 애플리케이션을 구성 및 설치할 때 유용

  • AWS::CloudFormnation::Interface

    • CloudFormation 콘솔에 표시되는 입력 파리미터의 그룹화 순서를 정의

    • 기본적으로 콘솔에는 파라미터가 논리적 ID별 영문자순으로 정렬

  • AWS::CloudFormation::Designer

    • CloudFormation Designer에서 리소스가 배치되는 방식을 설명

    • Designer에서 템플릿을 생성 및 업데이트할 때 이 정보가 자동으로 추가

 

 

Transform (변환)

 

- 템플릿을 처리하는데 사용하는 하나 이상의 매크로를 지정

 

- CloudFormation에서는 지정된 순서에 따라 매크로를 실행하고 변경 세트를 생성할 때 CloudFormation에서 처리된 템플릿 콘텐츠를 포함시키는 변경 세트를 생성 (변경사항을 검토하고 변경 세트를 실행)

 

- AWS::Serverless 변환

  • CloudFormation에 의해 호스팅 되는 매크로인 AWS::Serverless 변형은 AWS SAM 구문에서 작성된 전체 템플릿을 가져온 다음 이를 변형 후 규정 준수 템플릿으로 확장

  • 사용자 지정 매크로와는 달리 AWS::Serverless 변형은 특별한 사용 권한을 필요로 하지않는데 CloudFormation에서 호스팅 되기 때문

  • CloudFormation 내에 있는 모든 계정의 템플릿에서 사용할 수 있음

  • 사용 예제-1

    Transform: "AWS::Serverless-2016-10-31”  # 변환 선언을 보여주는 예 (변환 선언 값은 리터럴 문자열이어야 하며 파라미터나 함수를 사용하여 변환 값을 지정할 수 없음)

  • 사용 예제-2 (AWS SAM 구문을 사용하여 Lambda 함수 및 해당 실행 역활의 선언을 간소화)

    Transform: AWS::Serverless-2016-10-31

    Resources:

       MyServerlessFunctionLogicalID:

       Type: AWS::Serverless::Function

       Properties:

         Handler: index.handler

         Runtime: nodejs8.10

         CodeUri: 's3://testBucket/mySourceCode.zip'

 

- AWS::Include 변환

  • CloudFormation에서 호스팅된 매크로인 AWS::Include 변형을 사용하여 보일러플레이트 콘텐츠를 템플릿에 삽입

  • AWS::Include 변형을 사용하여 S3 버킷에서 템플릿 코드 조각에 대한 참조를 생성할 수 있음

  • AWS::Include 함수는 프래그래밍 언어로 include, copy 또는 import 지시문과 비슷하게 동작

  • 사용 예제-1 (Transform 섹션에 있는 템플릿 최상위에 AWS::Include 변형을 포함)

    Transform:

     Name: 'AWS::Include'

     Parameters:

       Location: 's3://MyAmazonS3BucketName/MyFileName.yaml’  # 위치는 구체적인 파일 이름이 S3버킷인 URL

     

 

참조 URL

 

https://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/cfn-whatis-concepts.html

https://www.slideshare.net/awskorea/6-infra-auto-deploy-awscloudformation-advanced-skill

반응형

'AWS' 카테고리의 다른 글

AWS Auto Scaling 종료 정책  (0) 2019.04.09
AWS CloudFormation 내장함수  (0) 2019.04.09
AWS Resource Group  (0) 2019.04.09
AWS CodeBuild  (0) 2019.04.09
AWS CodeCommit  (0) 2019.04.09

+ Recent posts