Cloud/AWS

[융복합] AWS Lambda - SSM을 통해 EC2내 Shell Script 실행하기 (2)

Crysis 2022. 7. 20. 20:50

이전에서는 생성한 ec2에 정책 만들어 적용하였다.

 

이전 포스트

 

[융복합] AWS Lambda - SSM을 통해 EC2내 Shell Script 실행하기 (1)

이번 포스트는 이전에 생성해둔 EC2에 정책을 부여하는 포스트이다. AWS에서 정책은 권한이라는 개념으로 생각하면 되며 만일 Lambda나 SSM를 통해 EC2로 접근하고 싶은데 정책이 설정되어 있지 않다

crysis.tistory.com

 

이번 포스트는 Lambda 함수에 정책을 적용하고 Lambda 함수에서 ssm을 통해 ec2에 Run command를 보내는 방법을 알아 볼 예정이다.


1. 정책 생성

 

IAM의 역할 페이지로 이동하여 Lambda에 적용할 새 정책을 하나 만들어 줄 것이다.


 

사용 사례에서 Lambda를 선택하고 권한 추가 페이지로 가도록 한다.

 


2. 권한 추가

 

이번 권한은 3가지 권한이 필요하다.

"AWSLambdaExecute",  "AmazonEC2ReadOnlyAccess", "AmazonSSMFullAccess" 이렇게 3개를 선택해주면 되며

 

각각 S3, EC2, SSM를 사용하기 위한 정책이다.

 

정책 이름을 정해주고 정책을 생성 하도록 한다.

 


3. Lambda

 

Lambda 서비스로 넘어가서 함수 생성을 클릭해서 함수 생성을 진행 할 것이다.

 

 

위 사진에 보이는 대로 함수이름, 업타임, 기존역할(위에서 만든 정책)을 차례로 선택하여 함수 생성하기를 누른다.

필자는 Python을 사용해 Python을 선택하였지만, 파이썬 말고 지원 언어가 다양하게 있으니 편한걸 선택하면 된다.

 

 

함수를 생성하면 코드 소스란에는 작성되어 있지 않고, 원하는 서비스를 이용하는 코드를 작성해야한다.

위에서 보는 코드는 EC2 인스턴스에 접근해서 AWS System Manager를 통해 EC2에 Command를 날려주는 역할을 하는 코드이다

 

현재는 리눅스 현재 디렉토리 위치를 알 수 있는 "pwd"를 작성해 두었다.

 

 

Source Code

import time
import json
import boto3


def lambda_handler(event, context):

    client = boto3.client("ec2")
    ssm = boto3.client("ssm")

    describeInstance = client.describe_instances()

    InstanceId = ['EC2 인스턴스 id']

    for instanceid in InstanceId:
        response = ssm.send_command(
            InstanceIds=[instanceid],
            DocumentName="AWS-RunShellScript",
            Parameters={
                "commands": ["pwd"]
            }, 
        )

        command_id = response["Command"]["CommandId"]

        time.sleep(3)

        output = ssm.get_command_invocation(CommandId=command_id, InstanceId=instanceid)
        print(output)

    return {"statusCode": 200, "body": json.dumps("Thanks from Srce Cde!")}

위의 코드에서 InstanceId에 람다 함수를 적용할 EC2 ID를 삽입하고. deploy를 해야지 람다 함수가 해당 코드를 실행 할 수 있다.


4. Lambda Test

람다 코드를 작성하면 제대로 잘 작동하는지 테스트를 진행을 해봐야 한다.

코드 옆 메뉴에 테스트로 넘어가서 테스트를 해볼 수 있다.

 

테스트를 진행하기 전에 확인해야 할 부분이 한가지 있는데, 람다 함수를 생성하면 default 값으로 실행시간이 3초가 지나가면 실패하도록 설정이 되어있는데 이 부분을 변경해 주어야한다. 

 

구성 탭으로 넘어가서 편집을 누르게 되면 편집 할 수 있는 화면으로 갈 수 있다.

설정 편집에서 제한시간이 0분 3초로 되어 있는것을 넉넉하게 1분으로 잡아주었다.

 

아까도 말했듯 이 함수는 약 5초가 걸리는데 시간을 줄이려면 메모리를 늘려야하는데 1024정도가 적당해보인다

메모리를 많이 주어도 크게 변하지 않았고, 메모리를 많이 늘리면 늘릴수록 함수가 실행될 때 발생하는 비용이 증가하게 되어 적절하게 타협점을 잡는게 좋다.

 

여기에서는 그냥 128로 진행하였다.

 

 

테스트를 실행하면 실행 결과가 보이게 되고 "성공"이라고 뜨면 정상적으로 작동이 잘 된 것이다.

 

 

추가로 EC2내 Shell Script를 실행 시키고 싶다면 "commands": ["/home/crysis/scripts/start.sh"] 이런식으로 작성하면 스크립트가 정상적으로 실행이 된다.