๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ๐ŸŒฎ ๐Ÿ’ฌ
๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป/aws

[AWS] lambda function ์œผ๋กœ ec2 instance rebootํ•˜๊ธฐ

by ๋ฐ”์ฟ„๋ฆฌ 2024. 10. 29.

airflow์„ ์šด์˜ํ•˜๋Š” ec2 instance๊ฐ€ ์•„์ฃผ ๋ฌด๊ฒ๊ฒŒ ๋Œ์•„๊ฐ€๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์ด๋‹ค..

๊ทธ๋ž˜์„œ ๊ทธ๋Ÿฐ์ง€ ์ผ์ฃผ์ผ์— ํ•œ๋ฒˆ์”ฉ airflow๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์žˆ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋“ค์ด ์žˆ๋‹ค.

 

์›์ธ ํŒŒ์•…์„ ์ œ๋Œ€๋กœ ํ•˜๊ณ  ๊ฐœ์„ฑํ•ด์•ผํ•˜์ง€๋งŒ ์šฐ์„  ์ง€๊ธˆ ๋‹น์žฅ ๋‚˜์˜จ ์กฐ์น˜๋กœ๋Š” ์ฃผ๊ธฐ์ ์œผ๋กœ ec2 instance๋ฅผ reboot ํ•˜์ž๋Š” ์˜๊ฒฌ!

 

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” rebootํ•˜๋Š” lambda function์„ ์ƒ์„ฑํ•œ ํ›„

CloudWatch Events (EventBridge) ๋กœ ๊ทœ์น™์„ ์ƒ์„ฑํ•ด์„œ, ๊ณ ์ • ๊ฐ„๊ฒฉ์œผ๋กœ ํŠธ๋ฆฌ๊ฑฐ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•!

 

๊ทผ๋ฐ CloudWatch Events (EventBridge) ์‚ฌ์šฉํ•˜๋ฉด ์ถ”๊ฐ€ ์š”๊ธˆ ๋ฐœ์ƒํ•˜๊ธฐ์— .. crontab ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฑธ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.

 

โœ… ์ง„ํ–‰

1. AWS lambda function ์ƒ์„ฑ

2. ์ƒ์„ฑํ•œ lambda function์— ec2 instance reboot ๊ถŒํ•œ ๋ถ€์—ฌ

    2-1. ec2 instance์— ์ ‘๊ทผํ•˜๋Š” Full Access ๊ถŒํ•œ ๋ถ€์—ฌ

    2-2. ํ•ด๋‹นํ•˜๋Š” instance๋งŒ rebootํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ๊ถŒํ•œ ๋ถ€์—ฌ

3. lambda function ์‹คํ–‰ ํ™•์ธ

4. crontab ์ถ”๊ฐ€ํ•˜๊ธฐ

 

1๏ธโƒฃ AWS lambda function ์ƒ์„ฑํ•˜๊ธฐ

reboot-airflow ๋ผ๋Š” ์ด๋ฆ„์˜ lambda function์„ ์ƒ์„ฑํ–ˆ๋‹ค.

ํ•ด๋‹นํ•˜๋Š” region ๊ณผ instance id๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.

import boto3

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name='ap-northeast-2') # region
    
    instance_ids = ['i-000000000aaaaaaaa'] # instance id
    
    response = ec2.reboot_instances(InstanceIds=instance_ids)
    
    return response

 

์ด lambda function์„ ์‹คํ–‰ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ message๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

"errorMessage": "An error occurred (UnauthorizedOperation) when calling the RebootInstances operation: You are not authorized to perform this operation. User: arn:aws:sts::425405151003:assumed-role/reboot-airflow-role-4ofplg3v/reboot-airflow is not authorized to perform: ec2:RebootInstances on resource: arn:aws:ec2:ap-northeast-2:425405151003:instance/i-00000000aaaaaaaa because no identity-based policy allows the ec2:RebootInstances action. Encoded authorization failure message: ...",
  "errorType": "ClientError",
  "requestId": "89210677-e54f-44a7-a472-d538ab1c4e22",
  "stackTrace": [
    "  File \"/var/task/lambda_function.py\", line 8, in lambda_handler\n    response = ec2.reboot_instances(InstanceIds=instance_ids)\n",
    "  File \"/var/lang/lib/python3.12/site-packages/botocore/client.py\", line 565, in _api_call\n    return self._make_api_call(operation_name, kwargs)\n",
    "  File \"/var/lang/lib/python3.12/site-packages/botocore/client.py\", line 1021, in _make_api_call\n    raise error_class(parsed_response, operation_name)\n"
  ]

 

> ํ•ด์„ํ•˜๋ฉด ec2 instance๋ฅผ rebootํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ์—†๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

 

2๏ธโƒฃ lambda function ์— ๊ถŒํ•œ ๋ถ€์—ฌ

2๏ธโƒฃ-1๏ธโƒฃ ec2 instance์— ์ ‘๊ทผํ•˜๋Š” Full Access ๊ถŒํ•œ ๋ถ€์—ฌ

 

IAM > Roles > reboot-airflow-role-4ofplg3v ์„ ํƒ

 

Permissions > Add permissions > Attach policies ์„ ํƒ

 

AmazonEC2FullAccess ์ถ”๊ฐ€

 

EC2์— Accessํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ ์ถ”๊ฐ€๋จ

 

๊ทผ๋ฐ ์ด ๊ถŒํ•œ์€ EC2์— ๊ด€๋ จ๋œ Full Access์— ๊ด€ํ•œ ๊ถŒํ•œ์ด๋ผ ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ๊ธฐ์—

airflow ์„œ๋ฒ„๋งŒ rebootํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ๊ถŒํ•œ๋งŒ ๋ถ€์—ฌํ•˜๋ ค ํ•จ

 

 

2๏ธโƒฃ-2๏ธโƒฃ ํ•ด๋‹นํ•˜๋Š” instance๋งŒ rebootํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ๊ถŒํ•œ ๋ถ€์—ฌ

 

IAM > Policies > Create policy : ๊ถŒํ•œ ์ถ”๊ฐ€ํ•˜๊ธฐ

 

JSON์œผ๋กœ ์„ ํƒํ•˜์—ฌ ์ž…๋ ฅํ•œ๋‹ค.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ec2:RebootInstances",
      "Resource": "arn:aws:ec2:ap-northeast-2:111111111111:instance/i-00000000aaaaaaaa" # ์ˆ˜์ •
    }
  ]
}

 

์ถ”๊ฐ€ํ•˜๋Š” policy์˜ ์ด๋ฆ„๊ณผ ์„ค๋ช…์„ ์ž…๋ ฅํ•œ๋‹ค.

 

reboot-airflow-role-4ofplg3v ์— ์ƒ์„ฑํ•œ ๊ถŒํ•œ์„ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

 

3๏ธโƒฃ lambda function ์‹คํ–‰ ํ…Œ์ŠคํŠธ

์„ฑ๊ณตํ–ˆ๋‹ค๋Š” response๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. → ์ •์ƒ์ ์œผ๋กœ reboot

{
  "ResponseMetadata": {
    "RequestId": "29c08d4e-9d77-4d77-a318-329efbaca204",
    "HTTPStatusCode": 200,
    "HTTPHeaders": {
      "x-amzn-requestid": "29c08d4e-9d77-4d77-a318-329efbaca204",
      "cache-control": "no-cache, no-store",
      "strict-transport-security": "max-age=31536000; includeSubDomains",
      "content-type": "text/xml;charset=UTF-8",
      "content-length": "219",
      "date": "Tue, 29 Oct 2024 00:35:42 GMT",
      "server": "AmazonEC2"
    },
    "RetryAttempts": 0
  }
}

 

4๏ธโƒฃ crontab ์— ์ถ”๊ฐ€

reboot.py

import boto3

def trigger_lambda(function_name):
    lambda_client = boto3.client('lambda',
				region_name='ap-northeast-2',
				aws_access_key_id='aws_access_key_id',
				aws_secret_access_key='aws_secret_access_key'
                                )
    
    response = lambda_client.invoke(
        FunctionName=function_name,
        InvocationType='RequestResponse'
    )
    
    print(response['Payload'].read().decode('utf-8'))

function_name = 'reboot-airflow'

trigger_lambda(function_name)

 

reboot.sh

#!/bin/bash

cd /home/ubuntu
python reboot.py

 

crontab

# reboot server
35 1 * * 6 /home/ubuntu/reboot.sh

๋‚˜๋Š” ๋งค์ฃผ ํ† ์š”์ผ 1์‹œ 35๋ถ„์— ์‹คํ–‰์‹œํ‚ฌ ๊ณ„ํšŒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์œ„์™€ ๊ฐ™์ด ์„ค์ •ํ–ˆ๋‹ค

 

  • crontab ์„ค์ • : ์•ž์—์„œ ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ
    • ๋ถ„ (0 - 59)
    • ์‹œ (0 - 23)
    • ๋‚ ์งœ (1 - 31)
    • ์›” (1 - 12)
    • ์š”์ผ (0 - 7, 0๊ณผ 7์€ ์ผ์š”์ผ)