برنامه نویسی

خودکارسازی مدیریت نمونه EC2 با AWS Lambda و EventBridge با استفاده از Terraform

Summarize this content to 400 words in Persian Lang
معرفی:

نمونه های EC2 سرورهای مجازی برای اجرای برنامه های کاربردی در زیرساخت AWS هستند. این برای ارائه ظرفیت محاسباتی مقیاس پذیر بسیار مهم است و به کاربران امکان می دهد برنامه ها را به طور موثر در فضای ابری استقرار و مدیریت کنند. نمونه‌های EC2 به طور گسترده برای میزبانی وب‌سایت‌ها، اجرای پایگاه‌های داده و مدیریت بارهای کاری محاسباتی مختلف استفاده می‌شوند.

مدیریت نمونه های EC2 به صورت دستی می تواند یک کار دلهره آور باشد، به خصوص زمانی که با چندین نمونه و الگوهای استفاده متفاوت سروکار دارید. خودکار کردن این فرآیند نه تنها باعث صرفه جویی در زمان می شود، بلکه تضمین می کند که از منابع شما به طور موثر استفاده می شود و منجر به صرفه جویی قابل توجهی در هزینه می شود. با استفاده از AWS Lambda، EventBridge و Terraform، می‌توانید یک راه‌حل خودکار ایجاد کنید که نمونه‌های EC2 خود را بر اساس یک برنامه زمان‌بندی شروع و متوقف می‌کند و از استفاده بهینه از منابع و کارایی هزینه اطمینان حاصل می‌کند.

در این راهنما، ما شما را در کل فرآیند راه‌اندازی این اتوماسیون، از ایجاد نمونه‌های EC2 تا پیکربندی توابع Lambda و قوانین EventBridge با استفاده از Terraform، راهنمایی می‌کنیم. بیایید غواصی کنیم و پتانسیل مدیریت خودکار منابع ابری را باز کنیم!

معماری:

EC2: یک نمونه EC2 یک سرور مجازی است که برای اجرای برنامه های کاربردی در زیرساخت AWS استفاده می شود.

لامبدا: AWS Lambda یک سرویس محاسباتی بدون سرور است که به شما امکان می دهد کد را بدون تهیه یا مدیریت سرور اجرا کنید. به طور خودکار برنامه ها را با اجرای کد در پاسخ به رویدادها مقیاس می کند. Lambda به طور گسترده ای برای برنامه های کاربردی رویداد محور، پردازش فایل ها در زمان واقعی و خدمات باطن استفاده می شود.

رویداد پل: Amazon EventBridge یک سرویس اتوبوس رویداد بدون سرور است که اتصال برنامه ها را با استفاده از داده های برنامه های خود، برنامه های SaaS و سرویس های AWS آسان می کند. معماری رویداد محور را با مسیریابی رویدادها بین سرویس ها ساده می کند و به شما امکان می دهد گردش های کاری مقیاس پذیر و مبتنی بر رویداد را برای موارد استفاده مختلف مانند یکپارچه سازی برنامه، اتوماسیون و قابلیت مشاهده بسازید.

نقش IAM: نقش IAM (مدیریت هویت و دسترسی) در AWS مجوزهایی را برای نهادهایی مانند سرویس‌های AWS یا کاربران تعریف می‌کند و دسترسی ایمن به منابع AWS را بدون نیاز به اعتبارنامه‌های بلندمدت تضمین می‌کند. نقش‌ها برای واگذاری مجوزها در سرویس‌های AWS استفاده می‌شوند و برای مدیریت امنیت و کنترل دسترسی در محیط‌های ابری یکپارچه هستند.

پیش نیازها:قبل از اینکه مراحل را بررسی کنیم، بیایید مطمئن شویم که پیش نیازهای زیر را دارید:

حساب AWS: اگر ندارید، برای یک حساب AWS ثبت نام کنید.

Terraform نصب شده: Terraform را از وب سایت رسمی دانلود و نصب کنید.

AWS CLI نصب شده: با دنبال کردن دستورالعمل‌های اینجا، AWS CLI را نصب کنید.

اعتبارنامه AWS پیکربندی شده است: با اجرای aws configure، AWS CLI خود را با اعتبارنامه خود پیکربندی کنید.

روش گام به گام:

ما شما را در تمام مراحل راه اندازی این اتوماسیون با استفاده از Terraform راهنمایی می کنیم. این مراحل شامل پیکربندی ارائه‌دهنده AWS، ایجاد نمونه‌های EC2، تنظیم نقش‌ها و سیاست‌های IAM، تعریف توابع Lambda و ایجاد قوانین EventBridge است.

مرحله 1: یک فایل main.tf ایجاد کنید. این فایل شامل پیکربندی برای ایجاد سه نمونه، نقش IAM برای تابع لامبدا برای دسترسی به نمونه EC2، توابع لامبدا برای راه‌اندازی نمونه‌های EC2 و توقف نمونه‌های EC2، قوانین EventBridge برای راه‌اندازی تابع لامبدا startec2instance و تابع lambda stopec2instance است.

provider “aws” {
region = “ap-south-1”
}

resource “aws_instance” “ec2” {
count = var.instance_count
ami = “ami-02a2af70a66af6dfb”
instance_type = “t2.micro” # Update with your desired instance type
vpc_security_group_ids = [var.security_group_id] subnet_id = var.subnet_id
key_name = var.key
tags = merge(var.default_ec2_tags,
{
Name = “${var.name}-${count.index + 1}”
}
)
}

resource “aws_iam_role” “lambda_role” {
name = “lambda_role”

# Terraform’s “jsonencode” function converts a
# Terraform expression result to valid JSON syntax.
assume_role_policy = jsonencode({
Version = “2012-10-17”
Statement = [
{
Action = “sts:AssumeRole”
Effect = “Allow”
Sid = “”
Principal = {
Service = “lambda.amazonaws.com”
}
},
] })

tags = {
tag-key = “tag-value”
}
}

resource “aws_iam_policy” “lambda_policy_start_stop_instance” {
name = “lambda_policy_start_stop_instance”
path = “https://dev.to/”
description = “My test policy”

# Terraform expression result to valid JSON syntax.
policy = jsonencode({
Version = “2012-10-17”
“Statement”: [
{
“Effect”: “Allow”,
“Action”: [
“logs:CreateLogGroup”,
“logs:CreateLogStream”,
“logs:PutLogEvents”
],
“Resource”: “arn:aws:logs:*:*:*”
},
{
“Effect”: “Allow”,
“Action”: [
“ec2:Start*”,
“ec2:Stop*”,
“ec2:Describe*”
],
“Resource”: “*”
}
] })
}

resource “aws_iam_role_policy_attachment” “test-attach” {
role = aws_iam_role.lambda_role.name
policy_arn = aws_iam_policy.lambda_policy_start_stop_instance.arn
}

resource “aws_lambda_function” “stop_ec2_instance” {
# If the file is not in the current working directory you will need to include a
# path.module in the filename.
filename = “stopec2instance.zip”
function_name = “stop_ec2_instance”
role = aws_iam_role.lambda_role.arn
handler = “stopec2instance.lambda_handler”
source_code_hash = filebase64sha256(“stopec2instance.zip”)

runtime = “python3.11”
}

resource “aws_lambda_function” “start_ec2_instance” {
# If the file is not in the current working directory you will need to include a
# path.module in the filename.
filename = “startec2instance.zip”
function_name = “startec2instance”
role = aws_iam_role.lambda_role.arn
handler = “startec2instance.lambda_handler”
source_code_hash = filebase64sha256(“startec2instance.zip”)

runtime = “python3.11”
}

resource “aws_cloudwatch_event_rule” “stop_ec2_schedule” {
name = “stop_ec2_schedule”
description = “Schedule to trigger Lambda to stop EC2 instances every 2 minutes”
schedule_expression = “rate(2 minutes)”
}

resource “aws_cloudwatch_event_target” “stop_ec2_target” {
rule = aws_cloudwatch_event_rule.stop_ec2_schedule.name
target_id = “lambda”
arn = aws_lambda_function.stop_ec2_instance.arn
}

resource “aws_lambda_permission” “allow_cloudwatch_stop” {
statement_id = “AllowExecutionFromCloudWatch”
action = “lambda:InvokeFunction”
function_name = aws_lambda_function.stop_ec2_instance.function_name
principal = “events.amazonaws.com”
source_arn = aws_cloudwatch_event_rule.stop_ec2_schedule.arn
}

resource “aws_cloudwatch_event_rule” “start_ec2_schedule” {
name = “start_ec2_schedule”
description = “Schedule to trigger Lambda to start EC2 instances every 1 minute”
schedule_expression = “rate(1 minute)”
}

resource “aws_cloudwatch_event_target” “start_ec2_target” {
rule = aws_cloudwatch_event_rule.start_ec2_schedule.name
target_id = “lambda”
arn = aws_lambda_function.start_ec2_instance.arn
}

resource “aws_lambda_permission” “allow_cloudwatch_start” {
statement_id = “AllowExecutionFromCloudWatch”
action = “lambda:InvokeFunction”
function_name = aws_lambda_function.start_ec2_instance.function_name
principal = “events.amazonaws.com”
source_arn = aws_cloudwatch_event_rule.start_ec2_schedule.arn
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

گام 2: فایل variables.tf ایجاد کنید

variable “instance_count” {
description = “Number of EC2 instances to create”
default = 3
}

variable “security_group_id” {
description = “ID of the security group for EC2 instances”

}

variable “subnet_id” {
description = “ID of the subnet for EC2 instances”

}

variable “key” {
description = “Name of the SSH key pair for EC2 instances”

}

variable “name” {
description = “Name prefix for EC2 instances”

}

variable “default_ec2_tags” {
type = map(string)
description = “(optional) default tags for EC2 instances”
default = {
managed_by = “terraform”
Environment = “Dev”
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 3: فایل terraform.tfvars را ایجاد کنید که حاوی پیکربندی هایی مانند تعداد نمونه، شناسه گروه امنیتی، شناسه زیرشبکه، نام جفت کلید، نام نمونه است.

instance_count = 3
security_group_id = “sg-0944b5d5471b421fb”
subnet_id = “subnet-0582feff6651618d4”
key = “mynewkeypair”
name = “EC2-Test-Instance”

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 4: دو فایل پایتون stopec2instance ایجاد کنید، startec2instance این فایل حاوی کد تابع lambda است. مطمئن شوید که فایل های پایتون زیپ شده اند و در همان دایرکتوری قرار دارند.

#stopec2instance
import boto3

def is_dev(instance):
is_dev = False
if ‘Tags’ in instance:
for tag in instance[‘Tags’]:
if tag[‘Key’] == ‘Environment’ and tag[‘Value’] == ‘Dev’:
is_dev = True
break
return is_dev

def is_running(instance):
return instance[‘State’][‘Name’] == ‘running’

def lambda_handler(event, context):
ec2 = boto3.client(‘ec2’, region_name=”ap-south-1″)

try:
response = ec2.describe_instances()
reservations = response[‘Reservations’]

for reservation in reservations:
for instance in reservation[‘Instances’]:
if is_dev(instance) and is_running(instance):
instance_id = instance[‘InstanceId’] ec2.stop_instances(InstanceIds=[instance_id])
print(f’Stopping instance: {instance_id}’)

except Exception as e:
print(f’Error stopping instances: {str(e)}’)

return {
‘statusCode’: 200,
‘body’: ‘Function executed successfully’
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

#startec2instance
import boto3

def is_dev(instance):
is_dev = False
if ‘Tags’ in instance:
for tag in instance[‘Tags’]:
if tag[‘Key’] == ‘Environment’ and tag[‘Value’] == ‘Dev’:
is_dev = True
break
return is_dev

def is_stopped(instance):
return instance[‘State’][‘Name’] == ‘stopped’

def lambda_handler(event, context):
ec2 = boto3.client(‘ec2’, region_name=”ap-south-1″)

try:
response = ec2.describe_instances()
reservations = response[‘Reservations’]

for reservation in reservations:
for instance in reservation[‘Instances’]:
if is_dev(instance) and is_stopped(instance):
instance_id = instance[‘InstanceId’] ec2.start_instances(InstanceIds=[instance_id])
print(f’Starting instance: {instance_id}’)

except Exception as e:
print(f’Error starting instances: {str(e)}’)

return {
‘statusCode’: 200,
‘body’: ‘Function executed successfully’
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Terraform init: – برای مقداردهی اولیه backend، یعنی terraform در این مرحله بررسی می‌کند که ارائه‌دهنده مورد استفاده در اینجا چیست و به‌طور متناظر تمام وابستگی‌های آن ارائه‌دهنده (در مورد ما AWS) را دانلود می‌کند، اگر همه چیز خوب باشد، خروجی تا حدودی مانند این نشان داده می‌شود:

پلان زمینی: در این مرحله terraform به شما نشان می دهد که چگونه بسیاری از منابع ایجاد می کند:

terraform اعمال می شود: در این مرحله در واقع منابع را بر اساس مرحله قبل ایجاد می کند

پس از ایجاد تمام منابع، خروجی به صورت زیر خواهد بود:

نمونه EC2

تابع لامبدا

قوانین EventBridge

هر زمان که تابع لامبدا توسط قوانین EventBridge فعال شود، خروجی به این صورت خواهد بود

اگر می‌خواهید منابع را حذف کنید، باید Terraform را نابود کنید.

نتیجه: با خودکار کردن شروع و توقف نمونه های EC2 با استفاده از Lambda، EventBridge، و Terraform، ما یک راه حل کارآمد و مقرون به صرفه برای مدیریت منابع ابری خود ایجاد کرده ایم. این تنظیمات را می توان به راحتی برای مطابقت با برنامه ها و نیازهای مختلف تطبیق داد.

خودکارسازی مبارک!

معرفی:

نمونه های EC2 سرورهای مجازی برای اجرای برنامه های کاربردی در زیرساخت AWS هستند. این برای ارائه ظرفیت محاسباتی مقیاس پذیر بسیار مهم است و به کاربران امکان می دهد برنامه ها را به طور موثر در فضای ابری استقرار و مدیریت کنند. نمونه‌های EC2 به طور گسترده برای میزبانی وب‌سایت‌ها، اجرای پایگاه‌های داده و مدیریت بارهای کاری محاسباتی مختلف استفاده می‌شوند.

مدیریت نمونه های EC2 به صورت دستی می تواند یک کار دلهره آور باشد، به خصوص زمانی که با چندین نمونه و الگوهای استفاده متفاوت سروکار دارید. خودکار کردن این فرآیند نه تنها باعث صرفه جویی در زمان می شود، بلکه تضمین می کند که از منابع شما به طور موثر استفاده می شود و منجر به صرفه جویی قابل توجهی در هزینه می شود. با استفاده از AWS Lambda، EventBridge و Terraform، می‌توانید یک راه‌حل خودکار ایجاد کنید که نمونه‌های EC2 خود را بر اساس یک برنامه زمان‌بندی شروع و متوقف می‌کند و از استفاده بهینه از منابع و کارایی هزینه اطمینان حاصل می‌کند.

در این راهنما، ما شما را در کل فرآیند راه‌اندازی این اتوماسیون، از ایجاد نمونه‌های EC2 تا پیکربندی توابع Lambda و قوانین EventBridge با استفاده از Terraform، راهنمایی می‌کنیم. بیایید غواصی کنیم و پتانسیل مدیریت خودکار منابع ابری را باز کنیم!

معماری:

توضیحات تصویر

EC2: یک نمونه EC2 یک سرور مجازی است که برای اجرای برنامه های کاربردی در زیرساخت AWS استفاده می شود.

لامبدا: AWS Lambda یک سرویس محاسباتی بدون سرور است که به شما امکان می دهد کد را بدون تهیه یا مدیریت سرور اجرا کنید. به طور خودکار برنامه ها را با اجرای کد در پاسخ به رویدادها مقیاس می کند. Lambda به طور گسترده ای برای برنامه های کاربردی رویداد محور، پردازش فایل ها در زمان واقعی و خدمات باطن استفاده می شود.

رویداد پل: Amazon EventBridge یک سرویس اتوبوس رویداد بدون سرور است که اتصال برنامه ها را با استفاده از داده های برنامه های خود، برنامه های SaaS و سرویس های AWS آسان می کند. معماری رویداد محور را با مسیریابی رویدادها بین سرویس ها ساده می کند و به شما امکان می دهد گردش های کاری مقیاس پذیر و مبتنی بر رویداد را برای موارد استفاده مختلف مانند یکپارچه سازی برنامه، اتوماسیون و قابلیت مشاهده بسازید.

نقش IAM: نقش IAM (مدیریت هویت و دسترسی) در AWS مجوزهایی را برای نهادهایی مانند سرویس‌های AWS یا کاربران تعریف می‌کند و دسترسی ایمن به منابع AWS را بدون نیاز به اعتبارنامه‌های بلندمدت تضمین می‌کند. نقش‌ها برای واگذاری مجوزها در سرویس‌های AWS استفاده می‌شوند و برای مدیریت امنیت و کنترل دسترسی در محیط‌های ابری یکپارچه هستند.

پیش نیازها:
قبل از اینکه مراحل را بررسی کنیم، بیایید مطمئن شویم که پیش نیازهای زیر را دارید:

  1. حساب AWS: اگر ندارید، برای یک حساب AWS ثبت نام کنید.
  2. Terraform نصب شده: Terraform را از وب سایت رسمی دانلود و نصب کنید.
  3. AWS CLI نصب شده: با دنبال کردن دستورالعمل‌های اینجا، AWS CLI را نصب کنید.
  4. اعتبارنامه AWS پیکربندی شده است: با اجرای aws configure، AWS CLI خود را با اعتبارنامه خود پیکربندی کنید.

روش گام به گام:

ما شما را در تمام مراحل راه اندازی این اتوماسیون با استفاده از Terraform راهنمایی می کنیم. این مراحل شامل پیکربندی ارائه‌دهنده AWS، ایجاد نمونه‌های EC2، تنظیم نقش‌ها و سیاست‌های IAM، تعریف توابع Lambda و ایجاد قوانین EventBridge است.

مرحله 1: یک فایل main.tf ایجاد کنید. این فایل شامل پیکربندی برای ایجاد سه نمونه، نقش IAM برای تابع لامبدا برای دسترسی به نمونه EC2، توابع لامبدا برای راه‌اندازی نمونه‌های EC2 و توقف نمونه‌های EC2، قوانین EventBridge برای راه‌اندازی تابع لامبدا startec2instance و تابع lambda stopec2instance است.



provider "aws" {
  region = "ap-south-1"
}

resource "aws_instance" "ec2" {
  count                  = var.instance_count
  ami                    = "ami-02a2af70a66af6dfb"  
  instance_type          = "t2.micro"  # Update with your desired instance type
  vpc_security_group_ids = [var.security_group_id]
  subnet_id              = var.subnet_id
  key_name               = var.key
  tags = merge(var.default_ec2_tags,
    {
      Name = "${var.name}-${count.index + 1}"
    }
  )
}

resource "aws_iam_role" "lambda_role" {
  name = "lambda_role"

  # Terraform's "jsonencode" function converts a
  # Terraform expression result to valid JSON syntax.
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRole"
        Effect = "Allow"
        Sid    = ""
        Principal = {
          Service = "lambda.amazonaws.com"
        }
      },
    ]
  })

  tags = {
    tag-key = "tag-value"
  }
}

resource "aws_iam_policy" "lambda_policy_start_stop_instance" {
  name        = "lambda_policy_start_stop_instance"
  path        = "https://dev.to/"
  description = "My test policy"


  # Terraform expression result to valid JSON syntax.
  policy = jsonencode({
    Version = "2012-10-17"
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:Start*",
                "ec2:Stop*",
                "ec2:Describe*"
            ],
            "Resource": "*"
        }
    ]
  })
}

resource "aws_iam_role_policy_attachment" "test-attach" {
  role       = aws_iam_role.lambda_role.name
  policy_arn = aws_iam_policy.lambda_policy_start_stop_instance.arn
}


resource "aws_lambda_function" "stop_ec2_instance" {
  # If the file is not in the current working directory you will need to include a
  # path.module in the filename.
  filename      = "stopec2instance.zip"
  function_name = "stop_ec2_instance"
  role          =  aws_iam_role.lambda_role.arn
  handler       = "stopec2instance.lambda_handler"
  source_code_hash = filebase64sha256("stopec2instance.zip")

  runtime = "python3.11"
}

resource "aws_lambda_function" "start_ec2_instance" {
  # If the file is not in the current working directory you will need to include a
  # path.module in the filename.
  filename      = "startec2instance.zip"
  function_name = "startec2instance"
  role          =  aws_iam_role.lambda_role.arn
  handler       = "startec2instance.lambda_handler"
  source_code_hash = filebase64sha256("startec2instance.zip")

  runtime = "python3.11"
}


resource "aws_cloudwatch_event_rule" "stop_ec2_schedule" {
    name                = "stop_ec2_schedule"
    description         = "Schedule to trigger Lambda to stop EC2 instances every 2 minutes"
    schedule_expression = "rate(2 minutes)"
  }


resource "aws_cloudwatch_event_target" "stop_ec2_target" {
  rule      = aws_cloudwatch_event_rule.stop_ec2_schedule.name
  target_id = "lambda"
  arn       = aws_lambda_function.stop_ec2_instance.arn
}

resource "aws_lambda_permission" "allow_cloudwatch_stop" {
  statement_id  = "AllowExecutionFromCloudWatch"
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.stop_ec2_instance.function_name
  principal     = "events.amazonaws.com"
  source_arn    = aws_cloudwatch_event_rule.stop_ec2_schedule.arn
}

resource "aws_cloudwatch_event_rule" "start_ec2_schedule" {
    name                = "start_ec2_schedule"
    description         = "Schedule to trigger Lambda to start EC2 instances every 1 minute"
    schedule_expression = "rate(1 minute)"
  }

resource "aws_cloudwatch_event_target" "start_ec2_target" {
  rule      = aws_cloudwatch_event_rule.start_ec2_schedule.name
  target_id = "lambda"
  arn       = aws_lambda_function.start_ec2_instance.arn
}

resource "aws_lambda_permission" "allow_cloudwatch_start" {
  statement_id  = "AllowExecutionFromCloudWatch"
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.start_ec2_instance.function_name
  principal     = "events.amazonaws.com"
  source_arn    = aws_cloudwatch_event_rule.start_ec2_schedule.arn
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

گام 2: فایل variables.tf ایجاد کنید

variable "instance_count" {
  description = "Number of EC2 instances to create"
  default     = 3
}

variable "security_group_id" {
  description = "ID of the security group for EC2 instances"

}

variable "subnet_id" {
  description = "ID of the subnet for EC2 instances"

}

variable "key" {
  description = "Name of the SSH key pair for EC2 instances"

}

variable "name" {
  description = "Name prefix for EC2 instances"

}

variable "default_ec2_tags" {
  type        = map(string)
  description = "(optional) default tags for EC2 instances"
  default = {
    managed_by   = "terraform"
    Environment  = "Dev"
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 3: فایل terraform.tfvars را ایجاد کنید که حاوی پیکربندی هایی مانند تعداد نمونه، شناسه گروه امنیتی، شناسه زیرشبکه، نام جفت کلید، نام نمونه است.

instance_count     = 3
security_group_id  = "sg-0944b5d5471b421fb"
subnet_id          = "subnet-0582feff6651618d4"
key                = "mynewkeypair"
name               = "EC2-Test-Instance"
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 4: دو فایل پایتون stopec2instance ایجاد کنید، startec2instance این فایل حاوی کد تابع lambda است. مطمئن شوید که فایل های پایتون زیپ شده اند و در همان دایرکتوری قرار دارند.

#stopec2instance
import boto3

def is_dev(instance):
    is_dev = False
    if 'Tags' in instance:
        for tag in instance['Tags']:
            if tag['Key'] == 'Environment' and tag['Value'] == 'Dev':
                is_dev = True
                break
    return is_dev

def is_running(instance):
    return instance['State']['Name'] == 'running'

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name="ap-south-1")

    try:
        response = ec2.describe_instances()
        reservations = response['Reservations']

        for reservation in reservations:
            for instance in reservation['Instances']:
                if is_dev(instance) and is_running(instance):
                    instance_id = instance['InstanceId']
                    ec2.stop_instances(InstanceIds=[instance_id])
                    print(f'Stopping instance: {instance_id}')

    except Exception as e:
        print(f'Error stopping instances: {str(e)}')

    return {
        'statusCode': 200,
        'body': 'Function executed successfully'
    }

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

#startec2instance
import boto3

def is_dev(instance):
    is_dev = False
    if 'Tags' in instance:
        for tag in instance['Tags']:
            if tag['Key'] == 'Environment' and tag['Value'] == 'Dev':
                is_dev = True
                break
    return is_dev

def is_stopped(instance):
    return instance['State']['Name'] == 'stopped'

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name="ap-south-1")

    try:
        response = ec2.describe_instances()
        reservations = response['Reservations']

        for reservation in reservations:
            for instance in reservation['Instances']:
                if is_dev(instance) and is_stopped(instance):
                    instance_id = instance['InstanceId']
                    ec2.start_instances(InstanceIds=[instance_id])
                    print(f'Starting instance: {instance_id}')

    except Exception as e:
        print(f'Error starting instances: {str(e)}')

    return {
        'statusCode': 200,
        'body': 'Function executed successfully'
    }

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Terraform init:برای مقداردهی اولیه backend، یعنی terraform در این مرحله بررسی می‌کند که ارائه‌دهنده مورد استفاده در اینجا چیست و به‌طور متناظر تمام وابستگی‌های آن ارائه‌دهنده (در مورد ما AWS) را دانلود می‌کند، اگر همه چیز خوب باشد، خروجی تا حدودی مانند این نشان داده می‌شود:

توضیحات تصویر

پلان زمینی: در این مرحله terraform به شما نشان می دهد که چگونه بسیاری از منابع ایجاد می کند:

توضیحات تصویر

terraform اعمال می شود: در این مرحله در واقع منابع را بر اساس مرحله قبل ایجاد می کند

توضیحات تصویر

پس از ایجاد تمام منابع، خروجی به صورت زیر خواهد بود:

نمونه EC2

توضیحات تصویر

تابع لامبدا

توضیحات تصویر

قوانین EventBridge

توضیحات تصویر

هر زمان که تابع لامبدا توسط قوانین EventBridge فعال شود، خروجی به این صورت خواهد بود

توضیحات تصویر

توضیحات تصویر

توضیحات تصویر

اگر می‌خواهید منابع را حذف کنید، باید Terraform را نابود کنید.

نتیجه:
با خودکار کردن شروع و توقف نمونه های EC2 با استفاده از Lambda، EventBridge، و Terraform، ما یک راه حل کارآمد و مقرون به صرفه برای مدیریت منابع ابری خود ایجاد کرده ایم. این تنظیمات را می توان به راحتی برای مطابقت با برنامه ها و نیازهای مختلف تطبیق داد.

خودکارسازی مبارک!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا