aws-devops-zero-to-hero:EC2实例自动化管理脚本

aws-devops-zero-to-hero:EC2实例自动化管理脚本

【免费下载链接】aws-devops-zero-to-hero AWS zero to hero repo for devops engineers to learn AWS in 30 Days. This repo includes projects, presentations, interview questions and real time examples. 【免费下载链接】aws-devops-zero-to-hero 项目地址: https://gitcode.com/GitHub_Trending/aw/aws-devops-zero-to-hero

引言:DevOps工程师的EC2管理痛点与解决方案

你是否还在手动配置每台EC2实例?面对成百上千台服务器时,重复性的初始化操作、合规性检查和监控配置是否让你焦头烂额?本文将通过Terraform基础设施即代码(IaC)AWS Lambda自动化脚本,展示如何在30分钟内实现EC2实例的全生命周期自动化管理。读完本文,你将掌握:

  • 使用Cloud-Init(User Data)实现实例初始化标准化
  • 通过Terraform批量部署具备高可用架构的EC2集群
  • 基于AWS Config和Lambda构建实例合规性自动检查机制
  • 从零开始搭建包含负载均衡器的Web服务架构

一、EC2实例初始化自动化:Cloud-Init脚本深度解析

1.1 User Data工作原理与执行流程

Cloud-Init是AWS EC2实例启动时自动执行的初始化脚本,通过user_data参数注入,支持bash、Python等多种脚本语言。其执行流程如下:

mermaid

1.2 生产级初始化脚本模板

以下是支持Apache服务自动部署的标准化User Data脚本(来自day-24/userdata.sh):

#!/bin/bash
apt update
apt install -y apache2

# 获取实例元数据中的实例ID
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)

# 安装AWS CLI
apt install -y awscli

# 创建动态HTML页面,集成实例标识与动画效果
cat <<EOF > /var/www/html/index.html
<!DOCTYPE html>
<html>
<head>
  <title>Auto-Configured Web Server</title>
  <style>
    @keyframes colorChange {
      0% { color: red; }
      50% { color: green; }
      100% { color: blue; }
    }
    h1 { animation: colorChange 2s infinite; }
  </style>
</head>
<body>
  <h1>Terraform Project Server</h1>
  <h2>Instance ID: <span style="color:green">$INSTANCE_ID</span></h2>
  <p>Automatically deployed via Cloud-Init</p>
</body>
</html>
EOF

# 配置服务自启动
systemctl start apache2
systemctl enable apache2

关键特性解析

  • 元数据服务调用:通过169.254.169.254获取实例唯一标识
  • 软件自动化部署:apt包管理器无交互安装Web服务
  • 动态内容生成:使用Here Document创建包含实例ID的个性化页面
  • 服务持久化配置:确保实例重启后服务自动恢复

二、基础设施即代码:Terraform自动化部署架构

2.1 高可用EC2集群架构设计

本方案采用跨可用区部署架构,通过Terraform实现以下资源的自动化编排:

mermaid

2.2 核心Terraform配置解析

以下是实现上述架构的关键Terraform配置(来自day-24/main.tf):

# 定义EC2实例资源
resource "aws_instance" "webserver1" {
  ami                    = "ami-0261755bbcb8c4a84"  # Amazon Linux 2 AMI
  instance_type          = "t2.micro"               # 符合免费套餐条件
  vpc_security_group_ids = [aws_security_group.webSg.id]
  subnet_id              = aws_subnet.sub1.id
  user_data              = base64encode(file("userdata.sh"))  # 注入初始化脚本
  
  tags = {
    Name = "Auto-Configured-WebServer-1"
  }
}

# 负载均衡器配置
resource "aws_lb" "myalb" {
  name               = "myalb"
  internal           = false
  load_balancer_type = "application"
  security_groups    = [aws_security_group.webSg.id]
  subnets            = [aws_subnet.sub1.id, aws_subnet.sub2.id]
  
  tags = {
    Name = "Auto-Deployed-ALB"
  }
}

# 目标组与健康检查
resource "aws_lb_target_group" "tg" {
  name     = "myTG"
  port     = 80
  protocol = "HTTP"
  vpc_id   = aws_vpc.myvpc.id
  
  health_check {
    path     = "/"
    port     = "traffic-port"
    interval = 30
    timeout  = 5
  }
}

自动化亮点

  • 多可用区部署:通过subnet1和subnet2实现跨AZ高可用
  • 自动负载均衡:ALB自动分发流量并进行健康检查
  • 安全组精细化控制:仅开放80(HTTP)和22(SSH)端口
  • UserData集成:通过base64编码注入初始化脚本

2.3 部署与扩展命令速查表

操作场景Terraform命令说明
初始化工作目录terraform init下载AWS Provider插件
预览资源变更terraform plan生成执行计划,无实际操作
应用配置terraform apply -auto-approve自动确认并创建资源
扩展实例数量修改count参数后执行apply支持蓝绿部署和滚动更新
销毁环境terraform destroy -auto-approve清理测试环境资源
状态查看terraform show显示当前部署的资源详情

三、EC2合规性自动化监控:Lambda+AWS Config实现

3.1 监控与合规架构设计

通过AWS Config和Lambda实现EC2实例配置合规性自动检查的完整流程:

mermaid

3.2 合规检查Lambda函数实现

以下Lambda函数代码实现对EC2实例详细监控状态的检查(来自day-25/lambda_function.py):

import boto3
import json

def lambda_handler(event, context):
    # 初始化AWS客户端
    ec2_client = boto3.client('ec2')
    config_client = boto3.client('config')
    
    # 从事件中提取实例ID
    config = json.loads(event['invokingEvent'])
    configuration_item = config["configurationItem"]
    instance_id = configuration_item['configuration']['instanceId']
    
    # 获取实例监控状态
    instance = ec2_client.describe_instances(
        InstanceIds=[instance_id]
    )['Reservations'][0]['Instances'][0]
    
    # 评估合规性
    compliance_status = "COMPLIANT" if instance['Monitoring']['State'] == "enabled" else "NON_COMPLIANT"
    
    # 向AWS Config报告结果
    evaluation = {
        'ComplianceResourceType': 'AWS::EC2::Instance',
        'ComplianceResourceId': instance_id,
        'ComplianceType': compliance_status,
        'Annotation': '详细监控未启用' if compliance_status == "NON_COMPLIANT" else '监控配置合规',
        'OrderingTimestamp': config['notificationCreationTime']
    }
    
    return config_client.put_evaluations(
        Evaluations=[evaluation],
        ResultToken=event['resultToken']
    )

3.3 AWS Config规则配置步骤

  1. 创建配置记录器

    aws configservice put-configuration-recorder \
      --configuration-recorder name=default,roleARN=arn:aws:iam::ACCOUNT_ID:role/AWS_ConfigRole \
      --recording-group allSupported=true,includeGlobalResources=false
    
  2. 创建交付通道

    aws configservice put-delivery-channel \
      --delivery-channel name=default,s3BucketName=config-bucket-ACCOUNT_ID,configSnapshotDeliveryProperties={deliveryFrequency=One_Hour}
    
  3. 部署Lambda函数

    zip function.zip lambda_function.py
    aws lambda create-function \
      --function-name EC2-Monitoring-Check \
      --runtime python3.9 \
      --role arn:aws:iam::ACCOUNT_ID:role/Lambda-Config-Role \
      --handler lambda_function.lambda_handler \
      --zip-file fileb://function.zip
    
  4. 创建自定义Config规则

    aws configservice put-config-rule \
      --config-rule file://rule.json
    

四、实战部署指南:从0到1搭建自动化环境

4.1 环境准备与前置条件

  • AWS账户及管理员权限
  • 已安装AWS CLI并配置凭证:
    aws configure
    # 输入Access Key、Secret Key、区域(us-east-1)和输出格式(json)
    
  • Terraform 1.0+安装:
    # Ubuntu系统示例
    wget https://releases.hashicorp.com/terraform/1.3.7/terraform_1.3.7_linux_amd64.zip
    unzip terraform_1.3.7_linux_amd64.zip
    sudo mv terraform /usr/local/bin/
    

4.2 完整部署流程

  1. 克隆项目仓库

    git clone https://gitcode.com/GitHub_Trending/aw/aws-devops-zero-to-hero
    cd aws-devops-zero-to-hero/day-24
    
  2. 初始化Terraform工作目录

    terraform init
    # 输出应显示"Terraform has been successfully initialized!"
    
  3. 预览资源部署计划

    terraform plan
    # 确认将创建的资源数量(约15-20个资源)
    
  4. 执行资源部署

    terraform apply -auto-approve
    # 部署过程约需3-5分钟,等待"Apply complete!"提示
    
  5. 验证部署结果

    # 获取ALB DNS名称
    ALB_DNS=$(terraform output -raw loadbalancerdns)
    
    # 测试Web服务可用性
    curl http://$ALB_DNS
    # 应返回包含实例ID的HTML页面
    
  6. 部署合规检查组件

    cd ../day-25
    aws lambda create-function ...  # 参考3.3节命令
    aws configservice put-config-rule ...
    

4.3 常见问题排查与解决方案

问题现象可能原因解决方案
EC2实例无法访问互联网子网未关联公有路由表检查aws_route_table_association资源配置
ALB健康检查失败Apache服务未启动查看实例系统日志:aws ec2 get-console-output --instance-id <INSTANCE_ID>
Terraform初始化失败AWS Provider版本不兼容修改provider.tf指定版本:version = "~> 4.0"
Lambda无权限访问EC2IAM角色权限不足附加策略:AmazonEC2ReadOnlyAccess
User Data脚本不执行脚本格式错误检查是否以#!/bin/bash开头且base64编码正确

五、总结与进阶路线

本文展示的EC2自动化管理方案通过Terraform实现基础设施即代码部署,结合Cloud-Init和Lambda分别解决了初始化标准化和持续合规性监控问题。该方案的核心优势在于:

  1. 一致性:消除手动配置导致的"配置漂移"问题
  2. 可重复性:通过代码实现环境的一致部署
  3. 可审计性:所有变更都通过版本控制系统追踪
  4. 自动化:从部署到监控的全流程无人干预

进阶学习路线

  1. 基础设施管道化:集成CodePipeline实现Terraform配置的CI/CD

    resource "aws_codepipeline" "terraform_pipeline" {
      # 配置代码源、构建和部署阶段
    }
    
  2. 自动修复能力:扩展Lambda函数实现不合规实例的自动修复

    # 添加自动修复逻辑
    if compliance_status == "NON_COMPLIANT":
        ec2_client.monitor_instances(InstanceIds=[instance_id])
    
  3. 成本优化:结合AWS Cost Explorer实现资源的自动扩缩容

  4. 多环境管理:使用Terraform工作区区分开发/测试/生产环境

立即行动清单

  •  克隆项目仓库并部署基础架构
  •  修改User Data脚本添加自定义应用部署
  •  扩展Lambda函数实现更多合规检查规则(如磁盘加密、标签合规)
  •  配置CloudWatch告警接收合规性违规通知
  •  将方案应用到现有EC2环境的迁移中

通过持续实践这些技术,你将逐步构建起企业级的AWS资源自动化管理能力,向DevOps工程师的"零到英雄"之路迈出坚实一步。

【免费下载链接】aws-devops-zero-to-hero AWS zero to hero repo for devops engineers to learn AWS in 30 Days. This repo includes projects, presentations, interview questions and real time examples. 【免费下载链接】aws-devops-zero-to-hero 项目地址: https://gitcode.com/GitHub_Trending/aw/aws-devops-zero-to-hero

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值