개요

AWS EC2 를 사용 하다보면 비용을 줄이고자 미사용 시간에 정지를 해야할 필요가 있다

이를 Lambda 와 EventBridge 로 구성하면 모든 EC2 에 대하여 자동으로 관리가 가능하다

 


 

작업내용

Lambda 코드 작성

EventBridge 설정

 


 

상세 작업

 

1. Lambda 코드

  • boto3 ec2 client 를 사용한다
  • ec2.describe_instances() 를 사용하여 현재 생성된 전체 EC2의 Instance_id 를 추출한다
  • ec2 client 의 ec2.stop_instances 를 사용하여 추출한 Instance_id 의 EC2를 종료 한다
import boto3

def lambda_handler(event,context):
    # Get the EC2 client
    ec2 = boto3.client('ec2')
    
    # Get the list of all instances
    describe_instance_assets = ec2.describe_instances()

    
    ec2_instance_list =[]
    for reservation in describe_instance_assets['Reservations']:
        for instance in reservation['Instances']:
            instance_id = instance['InstanceId']
            
            ec2_instance_list.append(instance_id)
            ec2.stop_instances(InstanceIds=[instance_id])
            
    # print(ec2_instance_list)

 

※주의사항

Lambda의 정상적인 실행을 위해서는 Lambda 권한에 EC2 제어 권한이 필요하다

 

 

2. EventBridge 설정

  • EventBridge - 일정 부분에 스케줄을 생성 한다

  • 일정 패턴 편집
  • 원하는 시간대로 설정
  • 시간대를 Asia/Seoul 로 설정하면 현지 시간으로 지정이 가능하다

  • 대상으로 람다 지정
  • 추가 설정 확인(불필요함으로 미지정)

 

  • 위와같이 생성하면 Eventbidge 에서 자동으로 Lambda 를 실행할 권한을 생성하게 된다
  • 설정한 시간대에 EventBridge 가 실행 되고, Lambda 를 호출하여 모든 EC2를 종료 하게 된다

 

 

 

 

'AWS' 카테고리의 다른 글

RDS 이벤트 구독을 통한 RDS 관리  (1) 2024.01.07
EKS fargate 생성을 위한 설정  (0) 2023.12.18
AWS EKS LB Controller Install  (0) 2023.09.29
AWS EC2/RDS Instance 정보 조회 Lambda 코드  (0) 2023.09.24
Route53 라우팅 정책  (0) 2023.08.05

AWS EC2 / RDS 의 인스턴스 정보를 조회하는 boto3 코드

  • 태그값을 지정하여 원하는 태그를 추출 가능

 

import json
import boto3

def lambda_handler(event, context):
    # TODO implement
    ec2_asset()
    rds_asset()


######EC2#####################################################
def ec2_asset():
    ec2 = boto3.client('ec2')   
    #ec2_info = []
    
    describe_ec2_instance = ec2.describe_instances()
    print("################EC2 Instance Info####################")
    for reservation in describe_ec2_instance['Reservations']:
        for instance in reservation['Instances']:
            instance_id = instance['InstanceId']
            instance_type = instance['InstanceType']
            tagName = None
            tagComponent = None
            for instance_Tags in instance['Tags']:
                               
                if instance_Tags['Key'] == 'Name':
                    tagName = instance_Tags['Value']
                    
                
                if instance_Tags['Key'] == 'Component':
                    tagComponent = instance_Tags['Value']
            print(instance_id,"\t", instance_type,"\t", tagName,"\t", tagComponent)    

                

######RDS#####################################################
def rds_asset():
    rds = boto3.client('rds')
    print("################RDS Instance Info####################")
    describe_rds_instance = rds.describe_db_instances()
    for dbInstances in describe_rds_instance['DBInstances']:
        for instance in dbInstances['DBInstanceIdentifier']:
            instance_zone = dbInstances['AvailabilityZone']
            instance_type = dbInstances['DBInstanceClass']            
            instance_endpoint = dbInstances['Endpoint']['Address']
            instance_engine = dbInstances['Engine']
            instance_enginevesion = dbInstances['EngineVersion']
            
            tagName = None
            tagComponent = None
            for instance_Tags in dbInstances['TagList']:
                if instance_Tags['Key'] == 'Name':
                    tagName = instance_Tags['Value']
                if instance_Tags['Key'] == 'Component':
                    tagComponent = instance_Tags['Value']

        print(tagName ,"\t",tagComponent,"\t", instance_type,"\t", instance_zone, "\t",instance_engine,"\t",instance_enginevesion,"\t",instance_endpoint)

 

 

'AWS' 카테고리의 다른 글

AWS EC2 종료 Lambda with EventBridge  (0) 2023.11.28
AWS EKS LB Controller Install  (0) 2023.09.29
Route53 라우팅 정책  (0) 2023.08.05
AWS Route53 DNA Type  (0) 2023.07.22
AWS Gateway Endpoint  (0) 2023.07.21

AWS는 Amazon EC2 인스턴스 또는 Elastic Load Balancer의 탄력적 네트워크 인터페이스에서 대상으로 네트워크 트래픽을 복사할 수 있는 트래픽 미러링을 제공합니다.

트래픽 미러링 세션의 대상은 EC2 인스턴스 또는 Network Load Balancer일 수 있습니다. EC2 인스턴스를 대상으로 사용하는 경우 해당 인스턴스에서 패킷 캡처 소프트웨어를 실행하여 검사를 위해 모든 트래픽을 캡처할 수 있습니다. tcpdump 또는 Wireshark와 같은 패킷 캡처 소프트웨어를 이 용도로 사용할 수 있습니다.

 

보안 및 모니터링 어플라이언스는 개별 인스턴스로 배포하거나 UDP 리스너가 있는 Network Load Balancer 또는 Gateway Load Balancer 뒤에 인스턴스 집합으로 배포할 수 있습니다. 트래픽 미러링은 필터 및 패킷 자르기를 지원하므로 선택한 모니터링 도구를 사용하여 관심 있는 트래픽만 추출할 수 있습니다.

 

 

 

개념

  • Source — 모니터링할 네트워크 인터페이스입니다.
  • 필터 — 미러링되는 트래픽을 정의하는 규칙 집합입니다.
  • 대상 — 미러링된 트래픽의 대상입니다.
  • 세션 — 소스, 필터 및 대상 간의 관계를 설정합니다.

이점

  • 간소화된 작업 — EC2 인스턴스에서 패킷 전달 에이전트를 관리할 필요 없이 VPC 트래픽의 모든 범위를 미러링합니다.
  • 향상된 보안 - 사용자 공간에서 비활성화하거나 변조할 수 없는 탄력적 네트워크 인터페이스에서 패킷을 캡처합니다.
  • 향상된 모니터링 옵션 — 미러링된 트래픽을 모든 보안 장치로 보냅니다.

 

https://docs.aws.amazon.com/ko_kr/vpc/latest/mirroring/Traffic_Mirroring_Scenarios.html

'AWS > ANS' 카테고리의 다른 글

AWS VPN 터널 시작 옵션  (0) 2023.08.05
AWS Gateway Load Balancer(GWLB)  (0) 2023.07.30
Amazon Route 53 Resolver  (0) 2023.07.16
AWS TGW Appliance  (0) 2023.07.16
AWS Service Catalog  (0) 2023.07.11

IMDS 란

인스턴스 메타데이터(IMDS)는 실행 중인 인스턴스를 구성 또는 관리하는 데 사용될 수 있는 인스턴스 관련 데이터입니다. 인스턴스 메타데이터는 예를 들어 호스트 이름, 이벤트 및 보안 그룹과 같은 범주로 분류됩니다. 인스턴스 메타데이터를 사용하여 인스턴스를 시작할 때 지정한 사용자 데이터에도 액세스할 수 있습니다. 예를 들어, 인스턴스를 구성하기 위한 파라미터를 지정하거나 단순 스크립트를 포함시킬 수 있습니다.

 

IMDS 버전

  • 인스턴스 메타데이터 서비스 버전 1(IMDSv1) – 요청/응답 방법
  • 인스턴스 메타데이터 서비스 버전 2(IMDSv2) – 세션 지향 방법

 

IMDSv2 설정 방법

새 AMI를 등록하거나 기존 AMI를 수정할 때 imds-support 파라미터를 v2.0로 설정할 수 있습니다. 이 AMI에서 시작된 인스턴스의 Metadata version(메타데이터 버전)은 V2 only (token required)(V2 전용(토큰 필요))(콘솔)로 설정되거나 HttpTokens는 required(AWS CLI)로 설정됩니다. 이러한 설정을 사용하면 인스턴스에서 인스턴스 메타데이터를 요청할 때 IMDSv2를 사용하도록 지정됩니다. imds-support를 v2.0으로 설정하면 이 AMI에서 시작된 인스턴스의 Metadata response hop limit(메타데이터 응답 홉 제한)(콘솔) 또는 http-put-response-hop-limit(AWS CLI)도 2로 설정됩니다.

 

IMDSv2 설정 방법 공식 문서

https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/configuring-IMDS-new-instances.html

 

새 인스턴스에 대한 인스턴스 메타데이터 옵션 구성 - Amazon Elastic Compute Cloud

AMI 소프트웨어가 IMDSv2를 지원하지 않는 한 이 파라미터를 사용하지 마세요. 값을 v2.0으로 설정한 후에는 이를 실행 취소할 수 없습니다. AMI를 “재설정”하는 유일한 방법은 기본 스냅샷에 새 AM

docs.aws.amazon.com

 

IMDSv2 상세 내용 및 설명 영상

https://aws.amazon.com/ko/blogs/security/defense-in-depth-open-firewalls-reverse-proxies-ssrf-vulnerabilities-ec2-instance-metadata-service/

 

 

Add defense in depth against open firewalls, reverse proxies, and SSRF vulnerabilities with enhancements to the EC2 Instance Met

July 27, 2021: We’ve updated the link to the 2019 re:Invent session on this topic. Since it first launched over 10 years ago, the Amazon EC2 Instance Metadata Service (IMDS) has helped customers build secure and scalable applications. The IMDS solved a b

aws.amazon.com

https://www.youtube.com/watch?v=2B5bhZzayjI 

 

개요 : EC2 에서 k8s 를 구성하여 사용중 pod 에서 AWS Network 대역대 DNS 를 찾지 못한 현상이 발생하여, k8s CoreDns 에 지정된 DNS 조회 주소를 변경

 


방법 : CoreDns ConfigMap 수정 후 pod 재실행


 

기본 설정된 내용은 아래와 같습니다.

  • 아래 yaml 파일중 forward . /etc/resolv.conf 부분을 forward . 169.254.169.253 로 변경
  • 169.254.169.253 IP 는 AWS Private Subnet 에서 사용하는 DNS 서버 IP 입니다.
k edit cm -n kube-system coredns
##기본 설정된 내용
apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health {
           lameduck 5s
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }
        prometheus :9153
        forward . /etc/resolv.conf  {
           max_concurrent 1000
        }
        cache 30
        loop
        reload
        loadbalance
    }

https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html

+ Recent posts