AWS Lambda에서 EC2 인스턴스의 Start/Stop 자동화 시도

10487 단어 AWSPythonlambda

입문


오늘은 Advent Calendar 데뷔전의 Hassaku_입니다.63.나는 평소에 식전교에 있다.
25일이 마지막 날인 줄 모르고 동시 등록돼 올해의 압권을 장식하기로 했다.
신성한 밤에 나 혼자 외롭게 이 기사의 집필과 싸우고 있다...
달력의 제목(?)백업 자동화라고 쓰여 있는데, 옳지 않다. 거짓말이다.
오늘 우리는 자동화 EC2 부팅/정지의 실현 예시를 소개할 것이다.
슬라이드를 SlideShare에 업로드하는 중입니다.이쪽도 같이 참조하세요.

Cloud automator 설치

배경


이번 단락은 원래'서버 없는 구조','Cloud Automator','re:Invent'3개로 시작되었다p>

서버 아키텍처 없음


화제가 됐네요.서버 아키텍처가 없습니다.

서버 운용에서 해방되다니 정말 대단하다p>

Cloud Automator


Cloud Automator는 백업 등의 작업을 자동으로 수행하는 SaaS 도구입니다.서버 작업 제공p>
Cloud Automator에서 할 수 있는 일은 전형적인 사용 상황 ↓p>

  • EC2 인스턴스
  • 를 업무 시간에만 시작
  • EBS 또는 RDS 자동 백업

※ 초밥은 만들 수 있지만 이번 목적은 그곳이 아니기 때문에 상품을 소개하지 않습니다.Cloud Automator는 단락의 계기가 되었으니 용서해 주십시오

re:Invent


는 "Python 대응"과 "일정 기반 실행"을 발표했다.

이 소식에 대한 감정이 고조된 사람도 많을 것이다.

모처럼 이 두 개를 넣은 물건을 만들고 싶다p>

이번에 할 일.


Lambda에서

↑에 소개된 Cloud Automator의 사용 방법: "EC2 인스턴스의 Start/Stop 자동화"br/>
10:00 시작 실례, 19:00 분실.이것을 실시함으로써 실수로 실례를 삭제하는 것을 잊어버리고 고액의 비용을 받는 것을 피할 수 있다p>

구조도


이런 느낌.br/>


현재 Lambda는 스케줄링을 기반으로 시작할 수 있으므로 사용합니다.

구성 요소는 다음과 같은 세 가지가 있습니다.p>
  • Lambda Function...함수 [1]
  • 이벤트 발생을 수신하고 액션을 시작하는 데 사용되는 SNS Topic
  • Lambda Function...함수로 설정[2]

※ 오른쪽 아래 SNS 토픽은 없어도 이동하므로 이번에는 처리하지 않음p>

단계


  1. IAM Role 생성
  2. SNS Topic과 Lambda Function의 모형 만들기
  3. SNS Topic에서 메일 알림 구현
  4. Lambda Function의 이벤트 소스 설정
  5. Lambda Function 구현 및 테스트
  6. Lambda의 Event Source에서 타이머 설정

IAM Role 만들기


이 구성에는 두 가지 Lambda Function이 포함되어 있으므로 적절한 IAM Role을 할당합니다.

Function[1]에서 Publish

사용
Function[2]에서 Publish:Publish:ec2:StartInstances:ec2:StopInstances 권한을 부여합니다.p>

이번에는 람다에게 부여된 IAM Role을 제작할 예정이니 Role Type은 람다를 선택하세요.틀리지 마세요.br/>


SNS Topic 및 Lambda Function 생성


밖에서만 먼저 합니다.

Function[1](시작/중지 시간에 대한 발화) 2개, Function[2](시작/중지 실행) 1개, SNS Topic 최소 1개 만들기p>

Function 코드는 적절한 템플릿을 포함할 수 있습니다.

IAM Role의 분배는 아까 제작된 것에 적용됩니다.p>
Topic의 Subscriptions에서 Function[1]의 Arn을 등록하세요p>

SNS Topic에서 메일 알림 구현


위에서 만든 Topic에서 자신의 취향에 따라 자신의 이메일 주소를 등록하면 동작을 확인할 수 있습니다.

이것은 최악이 아니어도 움직인다.

Subscription 생성에 메일 주소를 입력하면 "Confirm Subscription"에서 확인 메일을 받을 수 있습니다.문서에 기재된 링크를 밟으면 Subscription 로그인이 완료됩니다p>

Lambda Function의 이벤트 소스 설정


Lambda Function의 이벤트 소스입니다.

먼저 시간 기반 시작 함수를 설정합니다[1].



너는 크론으로 쉽게 쓸 수 있다.시간은 지금 UTC밖에 없습니다.JST의 10:00, 평소에 시작하려면 위의 그림처럼p>

Function[2]도 같은 요령이다.

SNS의 Topic만 선택하면 됩니다.정해진 시간에 후보를 표시하는 Topicp>

람다 함수 실시 및 테스트


코드의 예를 들다p>

# EC2起動時刻を知らせるためのLambda Functionコードの例
import json
import boto3

sns_client = boto3.client("sns")

def lambda_handler(event, context):
    print("Received event: " + json.dumps(event, indent=2))

    # publish to SNS Topic ... 
    topic_arn = "my-topic-arn"
    message = dict(Action="start", InstanceIds=["instance-id"])
    param = dict(TopicArn=topic_arn, Subject="subject", Message=json.dumps(message))

    return sns_client.publish(**param)

Topic에'어느 실례'가'어느 조작'을 실행해야 하는지에 대한 정보를 전달했습니다.매개 변수의 규격은

    message = dict(Action="start", InstanceIds=["instance-id"])

이곳의 기술은 전부다.인스턴스 ID가 직접 거는 코드는 매우 터무니없다...괜찮아요.br/>
다음은 실제 작업(시작/정지 실례)을 실행하는 함수의 코드 예시입니다.p>
import json
import boto3

ec2_client = boto3.client("ec2")

def lambda_handler(event, context):
    # Get parameter
    param = json.loads(event["Records"][0]["Sns"]["Message"])

    # Invoke action
    if param.get("Action", "") == "start":
        ret = ec2_client.start_instances(InstanceIds=param.get("InstanceIds", []))
    elif param.get("Action", "") == "stop":
        ret = ec2_client.stop_instances(InstanceIds=param.get("InstanceIds", []))

    return ret

매개 변수를 가져오는 방법이 더럽다고 말하지 마세요.

메시지에서 매개변수를 보고 적절한 인스턴스를 시작합니다.

이런 설치가 완성되었다p>

과제와 반성점


특별히 신경 쓰이는 일을 많이 열거하다.만약 전부 개선될 수 있다면, 현장에 투입해도 용품이 될 수 있다p>

인스턴스 직접 지정


필요한 매개 변수는 외부에서 늘려야 한다.태그라도 지정하면 되나요?p>
통용성을 높이는 방법으로

"이번에 만든 Lambda Function 만들기"를 실현하는 Lambda Function은 API Gateway로 이 Function을 감싸고 오프라인의 자체 검사 매개 변수로 대상 실례를 지정합니다.메타프로그래밍의.이거 언젠가 하고 싶어요.p>

전선이 더럽다


잘못 처리도 생각 안 했어요.p>

SNS 소식


매개 변수에 전달되는 단계에서 JSON을 문자열로 변환하지만 JSON 대상의 형식으로 전달할 수 있는 규격이어야 합니다.이 일대는 공부가 부족하다p>

총결산


Lambda로 EC2의 Start/Stop을 자동화하려고 합니다.

개선의 여지가 많으니 머지않아 갱신될 수 있기를 바랍니다.

이상p>

좋은 웹페이지 즐겨찾기