EC2自动磁盘扩展(Lambda+CloudWatch+SNS)
#aws #教程 #python #lambda

1-创建具有权限的AMI Polint。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cloudwatch:PutMetricData",
                "cloudwatch:GetMetricStatistics",
                "cloudwatch:ListMetrics",
                "ec2:DescribeTags"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:GetParameter"
            ],
            "Resource": "arn:aws:ssm:::parameter/AmazonCloudWatch-*"
        }
    ]
}

2-为EC2创建功能(角色),并添加步骤1中创建的策略。

3-在实例中安装CloudWatch代理。 (在此示例中,我在Linux Ubuntu机器中使用)。

wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb
sudo dpkg -i -E ./amazon-cloudwatch-agent.deb

收集必要的妈妈运行命令:

cd /opt/aws/amazon-cloudwatch-agent/bin 
wget https://raw.githubusercontent.com/railandermarques/cloudwatchmonitoring/master/config.json 
cd /opt/aws/amazon-cloudwatch-agent/etc/ 
cp -av ../bin/config.json amazon-cloudwatch-agent.json 
mkdir -p /usr/share/collectd/ 
touch /usr/share/collectd/types.db 
sudo sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s 
systemctl enable amazon-cloudwatch-agent 
systemctl status amazon-cloudwatch-agent

4-cry a t.pica nhs带有您选择的名称。

5-访问AWS上的CloudWatch>所有警报>创建警报>选择“度量控制台”,然后搜索Cwagent,请检查具有光盘的内容。

  • 与党派的道路选择母亲 - disk_used_percent”。 (在这种情况下,我正在监视扩展根盘。)

Image description

  • 定义要接收警报的时期,并指示您希望光盘扩展的相等或更高百分比。然后单击“下一步”。

Image description

6-在“通知”选项卡中,选择“警报”,“选择现有SNS”,然后选择步骤4中创建的吨位。然后单击“ Next”。P>

Image description

7-定义警报的名称,单击“下一步”,然后“创建警报”。

8-此示例将警报发送给一组不和谐,为此,有必要将“请求”层添加到lambda。按照以下步骤操作:

Image description

9-创建一个带有您选择的名称的lambda函数,选择Python 3.9并分配一个允许访问所有EBS和实例EC2的函数(在此示例中,它已使用管理员访问权限,但是可以调整此功能获得较窄的许可)。

10-在lambda函数内,在“层”选项卡上,单击“添加一层”,然后在步骤8中选择创建的图层。

11- lamba_function.py

观察:这样,正在扩展root专辑,party /dev /xvda 1,type ext4。如果磁盘具有不同的配置,则有必要更改行50的命令。
第41行 - 将扩展的更改音量ID。
第48行 - 更改实例ID。
第55行 - 更改Discord Webhok地址(放置将收到扩展饰面警告的聊天)。
第56行 - 要发送到Discord的警报的编辑消息。

import boto3
import time
import json
import requests


def expandir_volume_ebs(volume_id):
    ec2_client = boto3.client('ec2')

    response = ec2_client.describe_volumes(VolumeIds=[volume_id])
    current_size = response['Volumes'][0]['Size']
    new_size = current_size + 1

    response = ec2_client.modify_volume(
        VolumeId=volume_id,
        Size=new_size
    )

    return response

def executar_comandos_shell(instance_id, comandos):
    ssm_client = boto3.client('ssm')

    response = ssm_client.send_command(
        InstanceIds=[instance_id],
        DocumentName="AWS-RunShellScript",
        Parameters={'commands': comandos}
    )

    return response

def enviar_mensagem_discord(webhook_url, message):
    data = {
        'content': message
    }
    response = requests.post(webhook_url, json=data)
    if response.status_code != 204:
        print('Falha ao enviar mensagem para o Discord:', response.text)

def lambda_handler(event, context):
    volume_id = "vol-0d2dfdd723adb27bd"

    response = expandir_volume_ebs(volume_id)
    print("Volume expandido:", response)

    time.sleep(180)

    instance_id = "i-0ac8a7a16a50b9f06"

    comandos = ['sudo su', 'growpart /dev/xvda 1', 'resize2fs /dev/xvda1']

    response = executar_comandos_shell(instance_id, comandos)
    print("Comandos executados:", response)

    webhook_url = 'https://discord.com/api/webhooks/1123651003187728464/OYQ_--_Am'
    message = 'O disco root /dev/xvda 1 da instância i-0ac8a7a16a50b9f06 foi expandido!'
    enviar_mensagem_discord(webhook_url, message)

    return {
        'statusCode': 200,
        'body': json.dumps('Lambda executada !')
    }

12-apã³slambda将被执行您在Webhook障碍聊天中收到警报。

Image description