System Manager 란?

System Manger는 수작업 스크립트 작성 등이 필요한 유지보수 작업을 돕는 도구로 다음과 같은 업무를 수행합니다.

참고 : https://docs.aws.amazon.com/ko_kr/systems-manager/latest/userguide/what-is-systems-manager.html
 

AWS Systems Manager란 무엇입니까? - AWS Systems Manager

AWS Systems Manager란 무엇입니까? AWS Systems Manager는 AWS 클라우드에서 실행되는 애플리케이션 및 인프라를 관리하는 데 도움이 되는 기능 모음입니다. Systems Manager는 애플리케이션 및 리소스 관리를

docs.aws.amazon.com

- 온프레미스와 EC2 패키지 업그레이드
- 설치 소프트웨어 목록 생성
- 새 애플리케이션 설치
- EBS 스냅샷을 이용한 AMI 이미지 생성
- IAM 인스턴스 프로파일 부착
- S3 버킷에 대한 퍼블릭 접근 차단 
System Manger 주요 기능
  • 액션 (Action)
  • 인사이트 (Insights)

 

액션 (Actions)
  • 자동화(Automation) 액션 : AWS 리소스에 대한 작업을 수행
    • 다수의 EC2 인스턴스 재시작 , CloudFormation 스택 업데이트 ,AMI 패치등의 작업을 일괄처리 가능
    • 또한, 개별 작업을 세분화 방식으로 처리 하거나 일괄적으로 전체 자동화 업무 처리 , 단계적 처리 등을 할 수 있습니다.
    • 자동화 액션은 한 번에 몇개의 리소스를 처리 대상으로 삼을지 숫자 or 퍼센트로 설정 가능
  • 명령 (Command) 액션 : Linux  or Windows 인스턴스에 대한 작업을 수행
    • 자동화 액션이 AWS리소스에 작업 수행이라면 Run 명령은 대상 인스턴스에 대한 작업 수행 <로그인 없이 접속 및 커스텀 스크립트 실행을 위해 서드파티 도구 실행>
    • EC2 인스턴스에 설치된 에이전트를 통해 관련 작업 수행 <Window Server / Amazon Linux / Ubuntu Server AMI등에 기본적 설치되어 있음 , 이외에는 수동 설치 가능>
    • 다양한 문서를 제공하고 있으며, AWS-InstallApplication 문서는 window 소프트웨어 / RunShellScript는 Linux등 소프트웨어별 다양한 문서를 제공한다.
    • 대상은 태그로 필터링 or 개별 선택 가능 , 자동화 옵션 사용시 , 한 번에 다중 인스턴스 지정 가능
  • 정책 (Policy) 액션 : 관리 중인 인스턴스로부터 목록 데이터를 수집하는 과정을 정의
  • Session Manager :  세션 매니저는 시큐리티 그룹, NACL에서 인바운드 포트 개방 없이 혹은 퍼블릭 서브넷에 인스턴스를 두지 않고도 Linux와 인스턴스에 대한 Bash 및 PowerShell 접속을 지원합니다.
    • Bastion 설정 및 SSH 키 없이 다이렉트로 SSM을 통해 접속이 가능합니다.(모든 Linux 버전 및 Window Server 2008 R2 부터 최신의 2016까지 지원합니다.)
    • 웹 콘솔 or AWS CLI로 시작 가능 <로컬 머신에 Session Manger 플로그인을 사전작업으로 설치 진행 해야 한다.
    • Session Manager를 이용한 연결은 TLS 1.2로 보호되며, 모든 로드는 CloudTrail에 저장하고, 세션에서 실행하는 모든 명령은 S3 버킷에 저장됩니다.
  • Patch Manger : 패치 매니저는 Linux 및 Windows 인스턴스 패치 업무의 자동화 도구이며, 다음과 같은 OS를 지원합니다. 
    • Windows Server ,Ubuntu Server, Red Hat Enterprise, Linux(RHEL)SUSE ,Linux Enterprise Server(SLES), CentOs, Amazon Linux ~2 
    • 패치 대상 인스턴스는 태그 등을 기준으로 선택할 수 있으며, 패치 그룹을 생성해서 작업을 진행할 수 있습니다. 패치 그룹은 Patch Group 태그 키를 지닌 인스턴스 모음입니다.
    • 예를 들어, Webservers라는 패치 그룹에 인스턴스 몇 개를 포함시키려는 경우 태그 키는 Patch Group으로 태그 밸류는 Webservers로 입력하면 됩니다. 이 때 태그 키는 대소문자를 구별합니다.
    • 패치 매니저는 패치 베이스라인을 통해 패치 작업을 수행할 대상을 정의하며, 이후 자동으로 패치 소프트웨어를 설치하거나 승인 후 설치 작업을 진행하도록 할 수 있습니다.
AWS 기본 베이스라인을 통해 보안 수준, 민감성 , 중요성 ,필요성 등을 기준으로 패치 소프트웨어를 분류합니다.
베이스라인은 Ubuntu를 제외한 다른 모든 OS에서 7일 후 자동으로 승인 및 설치되며 , 이를 자동 승인 지연이라 칭합니다. < 베이스라인은 커스텀 또한 가능합니다.>

패치가 승인되면 설정한 유지보수 일정에 패치 작업이 진행되도록 하거나, 유지보수 일정이 도래하기 전에 즉각적으로 인스턴스에 대한 패치 작업을 실행할 수 있습니다. 패치 매니저는 패치 작업 수행을 위해 AWS-RunPatchBaseline 도큐먼트를 실행합니다.

  • State Manager
    • 스테이트 매니저는 인스턴스에 대해 일회성으로, 혹은 미리 정해진 일정에 따라, 자동으로 명령 및 정책 도큐먼트를 실행합니다. 예를 들어, 스테이트 매니저를 이용해서 인스턴스에 안티바이러스 소프트웨어를 설치한 뒤 관련 인벤토리를 가져올 수 있습니다.
    • 스테이트 매니저를 사용하려면, 우선 실행할 명령 도큐먼트를 정의한 연계(association) 객체를 생성한 뒤, 전달할 파라미터, 타겟 인스턴스, 스케줄을 설정합니다. 스테이트 매니저는 타겟 인스턴스에 대해 온라인으로 즉시 실행된 뒤 이후 스케줄에 따라 실행됩니다.
    • 현재 스테이트 매니저와 함께 사용할 수 있는 정책 도큐먼트로 AWS-Gather SoftwareInventory가 있습니다. 이 도큐먼트는 인스턴스로 부터 소프트웨어 인벤토리 등 특정 메타데이터를 수집하도록 하며, 여기엔 네트워크 환경설정, 파일 정보, CPU 정보 그리고 Windows의 경우 레지스트리 값 등이 포함됩니다.
패치 매니저가 인스턴스에 대한 동일한 패치 수준을 유지하도록 돕는 도구라면, 스테이트 매니저는 여러분이 정의한 방식대로 소프트웨어를 가져오고 환경을 설정하는 환경설정 도구라고 할 수 있습니다.

 

인사이트 (Insights)
인사이트는 AWS 리전 내 리소스 모음인 AWS 리소스 그룹에 따라 카테고리화 되며, 사용자는 tag : Value 를 이용해서 리소스 그룹을 정의할 수 있습니다.
ex ) EC2 인스턴스 , S3버킷 , EBS 볼륨 , SG 그룹 등 특정 애플리케이션과 관련된 모든 리소스에 동일 태그 적용 가능
  • 빌트인 인사이트 : 빌트인 인사이트는 System Manager가 기본적으로 제공하는 모니터링 내경을 담고 있다.
    • AWS Config Compliance : AWS Role 및 리소스별 Config 가 추적한 환경설정에 대한 변경 이력
    • AWS CloudTrail Events : 리소스 그룹 , 타입 , 해당 리소스에 대해 CloudTrail이 기록한 마지막 이벤트 이력
    •  AWS Personal Health Dashboard : 리소스에 영향을 미칠 수 있는 각종 이슈에 대한 경고 제공 
    • AWS Trusted Advisor Recommendations : 비용최적화 , 성능 , 보안 , 내 오류성 등의 측면에서 최적화 및 권장 사항 제공에 대한 이력
Trusted Advisor는 Business and Enterprise 지원 가능 하며 , 그 이외에는 서비스가 제한된다.
  • 인벤토리 매니저 : 인벤토리 매니저는 OS, 애플리케이션 버전 등 인스턴스의 데이터를 수집하며, 수집 내역은 다음과 같습니다.
OS 이름 및 버전애플리케이션 및 파일네임, 버전, 사이즈IP 및 MAC 주소 등 네트워크 환경설정Windows 업데이트, 롤, 서비스, 레지스트리 밸류CPU 모델, 코어, 스피드
  • 컴플라이언스 : 컴플라이언스 인사이트는 사용자가 정한 환경 설정 규칙이 인스턴스의 패치 및 상태 관리에 어떻게 적용되고 있는지 보여줍니다.
    • 패치 컴플라이언스(Patch Compliance)는 패치 베이스라인이 적용된 인스턴스의 수 및 설치된 패치의 세부 정보를 보여줍니다.
    • 어소시에이션 컴플라이언스(Association Compliance)는 패치 작업이 성공적으로 실행된 인스턴스의 수를 보여줍니다.

 

이전의 실습을 통하여 EC2 인스턴스를 스케줄링을 통하여 자동화 프로세스를 구현해 보았다.
보다 간편한 방법을 찾고자 AWS의 System Manger Automation 문서를 통하여 자동화를 구현해 보겠다.

 

사전 사항
  • EC2 인스턴스 생성
  • EC2 인스턴스에게 IAM 역할 할당
  • EC2 인스턴스의 Agent 미설치 시 설치 진행
  • AWS SSM 플릿 매니저의 인스턴스 등록 확인 

 

테스트

1. EC2 생성 및 Role 부여

SSM에서 EC2의 접근하기 위한 다음과 같은 정책을 부여하여 Role 위임
임의의 EC2 인스턴스를 다음과 같이 생성

 

2. Cloudwatch EventBridge 생성

  • 이전 실습 처럼 지정할 특정 시간 설정

  • 대상 설정

SSM Automation 문서인 AWS-StopEC2instance  설정 특정 인스턴스 지정 위에서 만든 IAM Role arn 기입

  • 테스트 진행

다음처럼 지정된 인스턴스가 SSM 자동화 문서를 통하여 stop 됨을 확인 할 수 있었다.

 

3. SSM - State Manager를 통한 자동화

  • State Manager 생성대상 지정

대상을 여러개 지정 가능합니다.
Tag를 지정하여 여러개를 컨트롤 할것입니다.

  • 일정 지정

Crontab을 이용하여 시간 일정 지정
대상 및 오류 시 작업 중지 커스텀 설정이 가능

  • 동작 확인

 

결론

이전 실습에서 Lambda 와 달리 해당 실습에서 SSM을 통해서 정해진 문서를 통해서 별도의 작업 없이 프로세스 과정만 간단하게 연결 하면 되서 편리하였다. 다만 문서가 정해져 있는 것으로 이용하였기에 코드를 잘 다룰수 있다면 Lambda가 좀더 용이할 것이라고 판단이 된다. SSM에는 다양한 문서가 존재하여 SSM을 잘 다룰수 있으면 용이 할 것이다.

'Automation' 카테고리의 다른 글

image builder 2  (0) 2021.06.16
Image Builder -golden ami 생성  (0) 2021.03.29
auto-scaling scale-out시 run-command동작  (0) 2021.03.29
Lambda Ec2 start / stop Tag기반  (0) 2021.01.20

CloudFormation 이란?
AWS의 리소스들을 자동으로 생성해주는 IAC(Infrastructure as Code)이다.
즉, AWS의 리소스들을 미리 코드화 하여 배포를 쉽고 빠르게 하는것이다.
이외에도 Terraform을 통하여도 리소스를 자동화 배포가 가능하나 
AWS의 서비스인 CloudFromation을 다루도록 하겠다.

CloudFormation 동작 순서                                                                                                                      

  1. 템플릿 코드 작성
  2. 템플릿 업로드 
  3. 스택 생성
  4. 리소스 생성 

템플릿 형싱 : JSON or YAML 

해당 과정에서는 VPC를 포함한 전반적인 네트워크 구성을 진행할것이다.


MetaData                                                                                                                                                                                             

해당 섹션에서는 Parameter 항목에서 선언될 항목들을 그룹핑하여 스택 배포시 좀더 보기 쉽게 구분 하도록 한 것이다.        

AWSTemplateFormatVersion: "2010-09-09"
Description: VPC Configuration

Metadata: #파라미터들의 그룹들을 Label 작업
  AWS::CloudFormation::Interface: 
    ParameterGroups: 
      - 
        Label: 
          default: "Network Configuration"
        Parameters: 
	      - VpcCIDR
          - PubCIDR1
          - PubCIDR2
          - PriCIDR1
          - PriCIDR2

      - 
        Label: 
          default: "Amazon EC2 Configuration"
        Parameters: 
          - InstanceType
          - KeyName
          - AMI

 Mappings 

Mappings 항목에서는 인스턴스를 생성시 AMI같은 값이 리전마다 다르기 때문에 각 리전마다의 데이터를 미리 지정해두어 사용자의 환경의 부합 하는 값을 매핑해두는 것이다.

#key: value 쌍으로 이루어지며 각기 다른 리전마다의 값을 지정가능
# 사용자의 환경마다 다르기에 그에 맞는 조건을 매핑해둔것
Mappings: 
  Regionmap:  
    ap-northeast-2:
      Linux2: ami-0f2c95e9fe3f8f80e
      window: ami-0685efd12a23690f5
    us-east-1:
      HVM64: ami-0ff8a91507f77f867
      HVMG2: ami-0a584ac55a7631c0c

Parameter

파라미터 섹션에서는 템플릿 실행 시 사용자가 선택하는 항목을 정의하는 섹션이다.

  • 용도에 맞게끔 리소스 구성 시 사용자의 요구 조건에 맞는 선택이 가능하다 
  • 예를 들어, 동일한 템플릿을 배포하더라도 인스턴스 타입이나 서브넷등이 다를경우 해당 parameter섹션을 통해 리스트 항목들중 선택하여 값을 지정할수도 있어 유용하게 사용한다.
Parameters:   
  EnvironmentName: #변수값으로 저장하여 리소스들의 공통된 네임 지정
    Description: A common name for your resources
    Type: String 

  VpcCIDR:
    Description: Please enter the IP range (CIDR notation) for this VPC
    Type: String
    Default: 10.0.0.0/16

  PubCIDR1:
    Description: Please enter the IP range (CIDR notation) for the public subnet in the first Availability Zone
    Type: String
    Default: 10.0.2.0/24
  PubCIDR2:
    Description: Please enter the IP range (CIDR notation) for the public subnet in the first Availability Zone
    Type: String
    Default: 10.0.4.0/24

  PriCIDR1:
    Description: Please enter the IP range (CIDR notation) for the private subnet in the first Availability Zone
    Type: String
    Default: 10.0.32.0/24
  PriCIDR2:
    Description: Please enter the IP range (CIDR notation) for the private subnet in the first Availability Zone
    Type: String
    Default: 10.0.64.0/24
  


  InstanceType: #인스턴스 타입
    Description: WebServer EC2 instance type
    Type: String
    Default: t2.micro
    AllowedValues: # 드롭박스 목록으로 해당 타입들을 지정해둔다.
      - t2.nano
      - t2.micro
      - t2.small
      - t2.medium
      - t2.large
      - m4.large
      - m4.xlarge
      - m4.2xlarge
      - m4.4xlarge
      - m4.10xlarge
      - m3.medium
      - m3.large
      - m3.xlarge
      - m3.2xlarge
      - c4.large
      - c4.xlarge
      - c4.2xlarge
      - c4.4xlarge
      - c4.8xlarge
      - c3.large
      - c3.xlarge
      - c3.2xlarge
      - c3.4xlarge
      - c3.8xlarge
      - r3.large
      - r3.xlarge
  
 
  AMI:
    Description: AMI of EC2
    Type: String
    Default: Linux2
    AllowedValues:
      - Linux2
      - window

  KeyName: #자신의 리전의 있는 keypair 사용하도록 지정
    Description: Name of KeyPair
    Type: AWS::EC2::KeyPair::KeyName

  SSHLocation:
    Description: The IP address range that can be used to SSH to the EC2 instances
    Type: String
    MinLength: '9'
    MaxLength: '18'
    Default: 0.0.0.0/0
    AllowedPattern: "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})"
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.

AMI parameter 같은 경우 위에서 mapping 값으로 등록을 해두어 리소스 구성 시 참조 하면 되지만 스택 배포 시 사용자가 Linux or window 등 값들의 항목들을 선택할수 있도록 Allowedvalue 옵션과 함께 default 값은 Linux2로 지정했다.

Resource

실제 스택 배포 시 해당 섹션에 선언 된 구문들로 인하여 리소스가 생성이 되는 부분이다.

VPC  생성

VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VpcCIDR
      EnableDnsSupport: true  #해당 VPC의 DNS활성화
      EnableDnsHostnames: true #VPC의 DNS호스트네임 활성화
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName} VPC #변수값으로 저장된 이름호출

서브넷 생성

#서브넷은 총 az당 public과 private으로 나눈다.
PublicSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [ 0, !GetAZs ] 
	  #GetAZs옵션은 리전의 가용영역을 알파벳 순으로 나열하여 반환한다.
      #ex 서울리전의 경우 4개의 az 이므로 a,b,c,d 순으로
	  # Select 내장함수를 이용해 나열된 abcd의 az를 인덱스값으로 지정
      CidrBlock: !Ref PubCIDR1
      MapPublicIpOnLaunch: true #해당 서브넷의 퍼블릭 ip 자동활성화 여부
      Tags: # Tag 값으로 리소스 식별
        - Key: Name
          Value: !Sub ${EnvironmentName} Public Subnet 1  
			#parameter 섹션에 정의된 선언문을 통해 해당 변수명을 참조한다.
  PublicSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [ 2, !GetAZs ]
      CidrBlock: !Ref PubCIDR2
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName} Public Subnet 2

  PrivateSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [ 0, !GetAZs ]
      CidrBlock: !Ref PriCIDR1
      MapPublicIpOnLaunch: false
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName} Private Subnet 1
  PrivateSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [ 2, !GetAZs ]
      CidrBlock: !Ref PriCIDR2
      MapPublicIpOnLaunch: false
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName} Private Subnet2

가용영역은 서울 같은 경우 4개의 az로 이루어져 있으나 a 와 c 가 가장 무난하여 default 로 가져가기 위해 GetAZs 내장 함수를 통해 사용자가 배포하는 리전의 AZ 를 나열 한 후 Select 내장 함수와 함께 인덱스 값으로 선택 하여 지정했다.

PublicSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: ap-northeast-2a
      
or 
Parameters:
    AZ:
      Type: AWS::EC2::AvailabilityZone::Name
      Description: Choose your az

이처럼 직접 지정해주는 방식 및 parameter 선언을 통한 방식이 있으니 참고바람

igw 생성 및 연결

  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName} igw

  Attachigw:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      InternetGatewayId: !Ref InternetGateway
      VpcId: !Ref VPC

Internet gateway를 생성하기 위해서는 사용될 VPC를 연결 해줘야하므로 참조할 VPC를 Ref 내장함수를 통해 참조한다.

이때, 리소스의 속성 값이 아닌 논리적 ID를 가지고 오는것이다.

NAT 생성 및 EIP

NatGatewayEIP: #NAT gw를 사용하기 위한 EIP 생성
    Type: AWS::EC2::EIP
    DependsOn: Attachigw # DependsOn 명령을 통해 해당 선언보다 우선시 진행
    Properties:
      Domain: vpc    

  NatGateway:
    Type: AWS::EC2::NatGateway
    Properties:
      AllocationId: !GetAtt NatGatewayEIP.AllocationId
      SubnetId: !Ref PublicSubnet1
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName} NAT

위에서 GetAtt 같은 경우는 Ref 와 달리 가지고 오고자 하는 값의 속성 값을 불러오는 것이다. 해당 선언에서는 NateGateWay의 사용될 ElasticIP의 속성값을 참조하는 것이다.

라우팅 생성

PublicRouteTable: #라우팅 테이블 생성 
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName} PublicRT

  PublicRoute: #인터넷과 통신될 퍼블릭 라우팅 테이블 생성
    Type: AWS::EC2::Route
    DependsOn: Attachigw
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway

  PublicSubnetRouteTableAssociation: #해당 테이블의 연동될 서브넷 지정
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref PublicRouteTable
      SubnetId: !Ref PublicSubnet1
   
  PublicSubnet2RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref PublicRouteTable
      SubnetId: !Ref PublicSubnet2

  PrivateRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName} PrivateRT

  PrivateRoute:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref PrivateRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      NatGatewayId: !Ref NatGateway
  PrivateSubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref PrivateRouteTable
      SubnetId: !Ref PrivateSubnet1

  PrivateSubnet2RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref PrivateRouteTable
      SubnetId: !Ref PrivateSubnet2

보안그룹 생성

sshsecurity: # SSH 접속을 위한 22번포트 활성화 
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Test
      GroupName: !Sub ${EnvironmentName} ssh-security
      VpcId:
        !Ref VPC
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 22
        ToPort: 22
        CidrIp: !Ref SSHLocation
     
	  websecurity: #web 접속을 위한 80포트 open
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Test
      GroupName: !Sub ${EnvironmentName} web-security
      VpcId:
        !Ref VPC
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 80
        ToPort: 80
        CidrIp: 0.0.0.0/0
      - IpProtocol: tcp
        FromPort: 22
        ToPort: 22
        SourceSecurityGroupId: !Ref sshsecurity

인스턴스 생성

bastion:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: !Ref InstanceType
      ImageId: !FindInMap [Regionmap, !Ref 'AWS::Region', Linux2] 
	 #mapping 된 ami를 findmap함수를 통해 참조 이때 Linux2라고 지정하거나 
	 #parameter에 선언한 ami 리스트를 이용할수도 있다. !Ref AMI
      #AWS::Region의 경우는 사용자가 배포할 템플릿의 리전의 값을 자동으로 참조한다.
      KeyName: !Ref KeyName
      SecurityGroupIds: 
      - !Ref sshsecurity
      SubnetId: !Ref PublicSubnet1
      Tags:
      - 
        Key: Name
        Value: bastion

webserver:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !FindInMap [Regionmap, !Ref 'AWS::Region', Linux2]
      KeyName: !Ref KeyName
      AvailabilityZone: !GetAtt PrivateSubnet1.AvailabilityZone
	 #GetAtt옵션을 통해서 해당 서브넷의 az속성값을 추출가능
	 #사실 서브넷의 az가 지정되어 있어 az를 별도로 지정해주지 않아도 되긴한다.
      InstanceType: t2.micro
      SubnetId: !Ref PublicSubnet1 #테스트를 위해 public지정
      SecurityGroupIds:
        - !Ref websecurity
      UserData:
        Fn::Base64:
          !Join [ "", [
          "#!/bin/bash\n",
          "yum install -y  httpd \n",
          "systemctl enable httpd \n",
          "systemctl start httpd \n"] ]
      Tags:
        - Key: Name
          Value: Web Server

기본적으로 bastion 점프 서버와 간단한 webserver를 생성해보았다


확인 테스트

VPC-Ec2.yml
0.01MB

'IAC' 카테고리의 다른 글

cloudformation 정리  (0) 2021.06.24

CloudFormation 이란?

  • aws 리소스의 설정을 json or yaml 형식으로 기재한 템플릿을 만들도 해당 템플릿에서 aws 리소스를 자동으로 구축하는 서비스
  1. 스택
    • cloudforamtion 기능으로 자동 생성된 aws 리소스의 집합
    • cloudformation은 스택 단위로 리소스를 관리하기 위해 한번에 구축 or 제거가능
    • 리소스간에는 의존관계가 있는 경우가 많다 (ex vpc와 ec2인스턴스에서 vpc가 없을시 생성불가) → 이같은 의존 관계를 자동 구축 시에 판단하고 구축하는 순서에 모순이 없도록 결정
  1. 템플릿
    • 스택 구성을 결정하는 설계자로서 핵심요소
    • Json or yaml 형식의 기술
    • 템플릿은 aws 리소스를 기술하는 장소, 실행조건을 기술하는 장소 등의 몇 개 섹션으로 구성
    • 템플릿 생성을 지원하는 내장함수가 존재하며 이 내장함수를 사용해 범용성 높은 템플릿 구성 가능
  1. 변경 세트
    • 스택에서 실행 중인 리소스를 변경해야 하는 경우 스택 업데이트
    • 리소스 변경하기 전 제안된 변경 사항이 요약된 변경 세트 생성 가능
    • 변경 세트 사용시 변경 사항을 구현하기 이전에 해당 변경이 실행중인 리소스에 미치는 영향을 확인
    • Ex. RDS DB 인스턴스의 이름을 변경한 경우 CloudFormation에서 새 DB를 생성하고 이전 DB를 삭제하므로 아직 백업하지 않은 경우 이전 DB 데이터를 잃게 됨

템플릿 구조
  • Resources (리소스) : 구축하는 aws 리소스를 정의하는 섹션(aws 서비스 정의를 기술)-필수

    → 가장 중요하며 기본이 되는 섹션

    Resources :
        EC2InstanceWeb :   # Logical ID로 템플릿내에 고유해야함, 논리적 이름을 사용하여 템플릿의 다른 부분에 있는 리소스를 참조
            Type : 'AWS::EC2::Instance'  # 리소스의 유형을 지정
            Properties :  # 리소스에 지정할 수 있는 추가 옵션으로 속성을 지정
                    InstanceType : 'm2.large'  # 인스턴스 유형 지정
    -> 그외에도 많은 파라미터들이 존재한다.
  • Description(설명) : 템플릿을 설명하는 텍스트 문자열.템플릿 포맷 버전 섹션 다음에실행
  • metadata(메타데이터):템플릿에 대한 세부 정보를 제공하는 임의 json 또는 yaml객체포함

    → 특정 리소스에 대한 템플릿 구현 세부 정보 포함

    • 스택 업데이트 중에는 메타데이터 섹션을 자체적으로 업데이트할 수 없음, 리소스를 추가 / 수정 / 삭제하는 변경 내용을 포함할 때만 업데이트할 수 있음
    • CF는 meta 섹션에 포함된 정보를 변환, 수정 또는 삭제 하지 않음→ 해당 섹션을 사용하여 암호나 보안 암호와 같은 민감 정보를 저장하지 않는것이 좋다.
    - 사용 예제-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에서 템플릿을 생성 및 업데이트할 때 이 정보가 자동으로 추가
  • 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 형식의 변수를 정의하는 섹션
    • Map 형식의 변수를 정의하는 섹션
    • 템플릿의 실행 환경에 따라 달라질 수 있는 값을 사전에 맵 형식으로 정의할 수 있음
    • 리전마다 설정 값이 다른 경우 등은 Mappings 섹션에 정의해 두고 리전마다 사용하는 값을 변경할 수 있게함
    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"
    
    
    - 사용 예제-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
    
    Resources:
      myEC2Instance:
        Type: "AWS::EC2::Instance"
        Properties:
          ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", HVM64]  
      #FindInMap 함수는 키를 스택이 생성되는 리전으로 지정하여 HVM64를 매핑할 값으로 지정
          InstanceType: m1.small
    
    

     

  • conditions(조건) : 조건에 따라 템플릿의 동작을 바꾸고 싶은경우(ex:조건 충족시동)
    사용 예제-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 : ~
    - 사용 예제-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"
    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"
    
    
  • transfrom(변환) : 템플릿을 처리하는데 사용하는 하나 이상의 매크로를 지정

    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

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

 

'IAC' 카테고리의 다른 글

cloudformation- VPC  (0) 2021.06.24

개요

기존 apache 상태의 web 서버 구성에서 일일히 스크립트를 구성요소에 두지않고 git을 통하여 받아와 해당 구성요소를 이용하여 ami를 생성해보겟다.

1. 자신의 github이용

> github의 해당 index.html 파일을 임의로 작성해둔다

2. 해당 git 저장소의 링크를 복사        

 

3. image builder - 구성요소 설정

 

4. Yaml작성

code.txt
0.00MB

  • git 명령을 사용하기 위한 git 패키지 설치                
  • git clone 명령을 이용한 해당 repository로 부터 index.html 파일의 경로를 이동시킨다.
  • 정상 적인 이동의 확인을 위한 검증 명령 및 최종 test 확인 까지의 스크립트다.

 

5. 구성 요소 생성

 

6. 새 버전의 이미지 레시피 생성

 

7. 버전 변경

 

8. 생성된 구성요소 추가

> 우선순위로 해당 구성요소를 설정 가능합니다.

 

9. 업데이트 버전 이미지 레시피 생성

>같이 배포될 구성요소들의 버전을 동일하게 설정 합니다. 그래야만 빌드 및 배포가 가능합니다.

 

10. 파이프라인 - 이미지 버전 변경

세부 정보 보기를 누른 후 해당 파이프라인으로 이동해 줍니다
현재 버전을 확인 후 새로운 이미지 레시피로 버전 변경을 위해 작업 -> 파이프라인 편집을 눌러줍니다.
하단의 위에서 생성된 1.3.0에 대한 레시피 버전을 선택합니다.
버전 변경됨을 확인합니다.

11. 파이프라인 실행

버전이 변경된 파이프라인을 실행합니다.

12. 빌드 및 배포 진행

 

13. AMI-EC2 생성

정상적인 이미지 파이프라인 배포 및 테스트 진행이 완료됨

 

'Automation' 카테고리의 다른 글

SSM Automation을 통한 자동화  (0) 2022.08.23
Image Builder -golden ami 생성  (0) 2021.03.29
auto-scaling scale-out시 run-command동작  (0) 2021.03.29
Lambda Ec2 start / stop Tag기반  (0) 2021.01.20

개요

💡
Pre-signed URL이란 AWS 자원에 대한 접근 권한을 제공하기 위해서 사용되는 이름 그대로 사전에 적절한 권한을 가진 자격증명에 의하여 Signed 된 URL입니다. CloudFront의 signed URL과의 비슷한 개념이라고 생각하면 됩니다
      • 사용 도구
        RestAPI, AWS CLI,AWS CDK를 통해서 java,Net,Ruby,PHP,Node.js,python등을 통해 생성 가능합니다.
      • CLI :https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/install-cliv2-windows.html 

         

        테스트

        <AWS CLI를 통하여 Presigned URL을 생성>

        • 버킷 생성
          • 해당 index.html 파일을 업로드 하여 테스트를 진행합니다.

           

        • CLI를 통한 Presigned URL 생성
          aws s3 presign s3://s3 object path –expires-in “만료시간” –region “대상리전”
          1. CLI를 통한 URL 정보 획득
            • 해당 URL은 S3 특정 Object를 다운로드할 수 있는 권한이 적용되어 있는 URL입니다.
            • 해당 expires 시간은 120 : 2분입니다.
          1. Presigned URL TEST
            1. 기존 bucket url을 통한 접속
              • 차단 확인 - 기본적으로 프라이빗 이기 때문
            1. Presigned-URL 접속
            1. Time over
        • 추가

          Bucket Policy를 이용하여 Presinged URL의 지정된 권한을 무시하여 방지

          지정된 VPC외부로 S3에 저장된 데이터를 공유하는 것을 방지 할 수 있습니다

          1. 정책 편집
            {
                "Version": "2012-10-17",
                "Statement": [
                    {
                        "Sid": "Allow Bucket Access From specified VPC only",
                        "Effect": "Deny",
                        "Principal": {
                            "AWS": "arn:aws:iam::123456789012:user/username"
                        },
                        "Action": "s3:GetObject",
                        "Resource": "arn:aws:s3:::bucketname/*",
                        "Condition": {
                            "StringNotEquals": {
                                "aws:sourceVpce": "vpce-xxxxxxxx"
                            }
                        }
                    }
                ]
            }
          1. Presigned URL 생성
          1. 접속 test
            • 접근 차단 확인
          • boto 3 이용시
            import boto
            conn = boto.connect_s3()
            url = conn.generate_url(120, 'GET', bucket='presignedurl-sample-bucket', key='test.txt')
            print url

         

        결론

        따라서, Presigned URL 은 S3 Bucket을 공유할 때(다운로드 or 업로드) 편리하게 사용할 수 있다는 장점이 있지만 S3 Bucket에 대한 권한이 없는 환경에서도 Bucket 에 대한 접근 권한을 줄 수 있다는 점에서 조심스럽게 사용되어야 합니다.또한, 누구나 Presigned URL을 생성가능하며 permission이 필요하지 않습니다. 공유 대상이 되는 S3 Bucket 도 별도의 제한없이 지정이 가능합니다. 왜냐하면 S3 Presigned URL 은 공유 대상이 되는 S3 Bucket 과 Object 를 지정하고 공유를 하는 IAM 자격증명의 권한을 함께 지정함으로써 최종적으로 누군가가 Presigned URL 로 접근했을 때 Presigned URL 에 포함되어 있는 권한을 검사하여 해당 요청을 허용/차단하도록 동작하기 때문입니다. 즉, 최종적인 권한 검사는 Presigned URL 을 이용한 요청이 유입되었을 때 이루어지기 때문에 Presigned URL 을 생성하는 단계에서 어떤 제한을 적용할 수는 없습니다.따라서, Bucket Policy나 IAM Policy에 다양한 Condition을 적용하여 권한을 적절하게 제한하여 사용하는 것이 중요합니다.

         

         

 

 

 

 

'aws' 카테고리의 다른 글

RDS → s3 백업  (0) 2021.03.29
Elastisearch 를 사용 VPC FLOWLOGS  (0) 2021.03.29
CloudWatch / SSM Agent  (0) 2021.03.29
lb -acm 인증서를 이용한 접속  (0) 2021.02.09
route 53 도메인 연결  (0) 2021.02.09

+ Recent posts