网易首页 > 网易号 > 正文 申请入驻

构建Labmda函数实现AWS资源自动标签

0
分享至

新钛云服已累计为您分享809篇技术干货

本篇文章介绍了一种自动为AWS资源打标签的解决方案,当前支持以下资源的自动打标签:


  • EC2Elastic Compute Cloud

  • EBSElastic Block Store

  • RDSRelational Database Service

  • S3 bucket

  • S3 object(需要开启事件记录,默认不开启)

  • VPCVirtual Private Cloud

  • ELBElastic Load Balancer

  • Target Groups

程序逻辑

通过CloudTrail追踪创建资源事件,EventBridge根据预设的规则判断并触发Lambda函数。Lambda 函数运行 Python代码进行打标签操作。

整个过程实现自动化,无需人工干涉。这种解决方案不仅提高了资源管理的效率,还能帮助组织更好地进行成本管理和合规性检查。

具体实现

Lambda

创建Lambda资源

将编写好的Lambda函数部署到AWS Lambda服务中。配置EventBridge规则,使Lambda函数能够响应预定义的事件,如EC2实例启动、S3对象创建等。

在Lambda函数首页选择创建函数

Lambda 将创建一个名为 Lambda-AutoTag-role-1n9jg0j9 的执行角色,此角色具有将日志上传到 Amazon CloudWatch Logs 的权限。

设置角色权限

在角色列表中找到Lambda角色

点击权限策略

点击编辑角色权限

添加如下权限

JSON
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"ec2:Describe*",
"ec2:CreateTags*",
"rds:AddTagsToResource",
"elasticloadbalancing:AddTags",
"s3:PutObjectTagging",
"s3:PutBucketTagging",
"logs:CreateLogGroup",
"logs:PutLogEvents",
"logs:CreateLogStream"
],
"Resource": [
"*"
]
}
]
}

添加代码到Lambda

在代码源中新增两个python文件

lambda_function.py

用于根据事件名称判断具体触发事件

Python
from __future__ import print_function
import logging
from autotag import AutoTag

logger = logging.getLogger()
logger.setLevel(logging.INFO)


def lambda_handler(event, context):
logger.info(f"{event=}")
detail = event['detail']
eventname = detail['eventName']
logger.info(f"{eventname=}")


tools = AutoTag(event)
if eventname == 'RunInstances':
# EC2
tools.create_tag_to_ec2()

elif eventname == 'CreateDBInstance':
# RDS
tools.create_tag_to_rds()

elif eventname == 'CreateVpc':
# VPC
tools.create_tag_to_vpc()

elif eventname == 'CreateBucket':
# 给 S3 桶打标签
tools.create_tag_to_s3_bucket()

elif eventname == 'CreateLoadBalancer':
# ELB
tools.create_tag_to_elb()

elif eventname == 'CreateTargetGroup':
# TargetGroup ELB目标组
tools.create_tag_to_target_groups()

elif eventname == 'PutObject':
# 给 S3 中 Object 打标签
tools.create_tag_to_s3_object()


else:
logger.error(f'{eventname=} 未定义的操作')
return False

logger.info("Success!")
    return True

autotag.py

提取资源实例ID,并进行具体的打标签操作

Python
import logging
import boto3

logger = logging.getLogger()
logger.setLevel(logging.INFO)

class AutoTag:
def __init__(self, event):
self.detail = event['detail']
self.Tag_Key = 'map-migrated'
self.Tag_Value = 'migX1EPYP8W1L'
self.Tags = [{'Key': self.Tag_Key, 'Value': self.Tag_Value}]

def create_tag_to_ec2(self):
ids = []
client = boto3.resource('ec2')

items = self.detail['responseElements']['instancesSet']['items']
for item in items:
ids.append(item['instanceId'])
logger.info(ids)
base = client.instances.filter(InstanceIds=ids)
for instance in base:
for vol in instance.volumes.all():
ids.append(vol.id)
for eni in instance.network_interfaces:
ids.append(eni.id)
if ids:
logger.info(f"对ec2实例列表: {ids}进行打标")
response = client.create_tags(Resources=ids,
Tags=self.Tags)
logger.info(f"打标完成! {response=}")


def create_tag_to_dynamodb(self):
client = boto3.client('dynamodb')
resource_arn = self.detail['responseElements']['tableDescription']['tableArn']
logger.info(f"对dynamodb实例列表: {resource_arn}进行打标")
client.tag_resource(ResourceArn=resource_arn, Tags=self.Tags)


def create_tag_to_lambda(self):
# Lambda 的实际 API 与文档中并不一致, 其组成为 AIP 名字+版本
client = boto3.client('lambda')

function_arn = self.detail['responseElements']['functionArn']
logger.info(f"对lambda实例列表: {function_arn}进行打标")
client.tag_resource(Resource=function_arn, Tags=self.Tags)

def create_tag_to_rds(self):
client = boto3.client('rds')
resource_arn = self.detail['responseElements']['dBInstanceArn']
logger.info(f"对rds实例列表: {resource_arn}进行打标")
client.add_tags_to_resource(ResourceName=resource_arn, Tags=self.Tags)

def create_tag_to_elb(self):
client = boto3.client('elbv2')
resource_arn = self.detail['responseElements']['loadBalancers'][0]['loadBalancerArn']
ids = []
ids.append(resource_arn)
logger.info(f"对elb实例列表: {ids}进行打标")
client.add_tags(ResourceArns=ids, Tags=self.Tags)

def create_tag_to_target_groups(self):
client = boto3.client('elbv2')
resource_arn = self.detail['responseElements']['targetGroups'][0]['targetGroupArn']
ids = []
ids.append(resource_arn)
logger.info(f"对elb实例列表: {ids}进行打标")
client.add_tags(ResourceArns=ids, Tags=self.Tags)

def create_tag_to_s3_object(self):
s3 = boto3.client("s3")
bucket_name = self.detail['requestParameters']['bucketName']
object_name = self.detail['requestParameters']['key']

tags = [{'Key': 'Owner', 'Value': self.user}, {'Key': 'PrincipalId', 'Value': self.principal}]
s3.put_object_tagging(Bucket=bucket_name, Key=object_name, Tagging={'TagSet': tags})

def create_tag_to_s3_bucket(self):
s3 = boto3.client("s3")
bucket_name = self.detail['requestParameters']['bucketName']
logger.info(f"对s3_bucket: {bucket_name}进行打标")
s3.put_bucket_tagging(Bucket=bucket_name, Tagging={'TagSet': self.Tags})

def create_tag_to_vpc(self):
vpc_id = self.detail['responseElements']['vpc']['vpcId']

ec2 = boto3.resource('ec2')
vpc = ec2.Vpc(vpc_id)
logger.info(f"对vpc: {vpc}进行打标")
        vpc.create_tags(DryRun=False, Tags=self.Tags)

修改预设标签值

按需更改以下三个参数即可:

Python
AutoTag.Tag_Key = 'map-migrated'
AutoTag.Tag_Value = 'migX1EPYP8W1L'
AutoTag.Tags = [{'Key': self.Tag_Key, 'Value': self.Tag_Value}]

创建事件跟踪(CloudTrail)

使用 AWS CloudTrail 来跟踪资源创建事件。CloudTrail能够记录所有对AWS 账户的 API 调用,并生成日志文件。确保 CloudTrail 已经启用,并且记录了所有必要的事件。 重点在于将事件信息发送到CloudWatch。

进入 CloudTrail 首页

选择并创建跟踪

创建 EventBridge 资源

设置AWS EventBridge规则,根据CloudTrail捕获的资源创建事件来触发特定的Lambda函数。EventBridge可以根据事件模式匹配预设规则,从而准确地选择需要处理的事件。

在 CloudWatch 中点击事件规则

创建规则

规则类型选择具有事件模式的规则

事件模式

选择自定义模式(JSON编辑器)

预设触发规则

将以下自定义规则填入事件模式中

JSON
{
"source": [
"aws.ec2",
"aws.s3",
"aws.rds",
"aws.vpn",
"aws.elasticloadbalancing"
],
"detail-type": ["AWS API Call via CloudTrail"],
"detail": {
"eventSource": [
"ec2.amazonaws.com",
"s3.amazonaws.com",
"rds.amazonaws.com",
"vpn.amazonaws.com",
"elasticloadbalancing.amazonaws.com"
],
"eventName": [
"RunInstances",
"CreateBucket",
"CreateDBInstance",
"CreateVpc",
"CreateLoadBalancer",
"CreateTargetGroup",
"PutObject"
]
}
}

预设目标动作

选择刚创建的Lambda函数

生成规则

点击创建规则,并检查Lambda函数是否成功绑定

检查Lambda 函数触发器

创建完成EventBridge后,返回Lambda页面,检查是否自动绑定触发器,如果未绑定,手动添加

结果展示

创建一台EC2服务器,查看标签已经被添加成功

查看其存储卷,自动增加标签

RDS自动增加标签

VPC自动增加标签

ELB自动增加标签

TargetGroup自动增加标签

S3 bucket自动增加标签

如有相关问题,请在文章后面给小编留言,小编安排作者第一时间和您联系,为您答疑解惑。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
灵活就业人数越来越多了

灵活就业人数越来越多了

挪威Talk
2025-09-18 13:23:27
特朗普计划:重回阿富汗基地,部署1万多名美军,威胁中国核基地

特朗普计划:重回阿富汗基地,部署1万多名美军,威胁中国核基地

顾史
2025-09-19 18:21:46
三星开始推送的One UI 8有哪些亮点?值得立刻升级吗?

三星开始推送的One UI 8有哪些亮点?值得立刻升级吗?

手机中国
2025-09-19 15:17:05
国乒大爆冷!国乒男单0:3输球,无缘开门红,非洲冠军阿鲁纳2连胜

国乒大爆冷!国乒男单0:3输球,无缘开门红,非洲冠军阿鲁纳2连胜

国乒二三事
2025-09-19 06:40:24
刚红就塌了?50岁李乃文装可爱惹老总不耐烦,评论区翻车恶评如潮

刚红就塌了?50岁李乃文装可爱惹老总不耐烦,评论区翻车恶评如潮

阿伧说事
2025-09-18 14:16:55
301379,突然20%涨停!这一板块,多股新高!

301379,突然20%涨停!这一板块,多股新高!

证券时报e公司
2025-09-19 14:47:49
别再说没实战,中国高科技战力一战封神,俾路支难题被解决

别再说没实战,中国高科技战力一战封神,俾路支难题被解决

华山穹剑
2025-09-16 21:40:22
戏子误国!这6位为了捞金“坑惨”老百姓,如今下场是咎由自取

戏子误国!这6位为了捞金“坑惨”老百姓,如今下场是咎由自取

小椰的奶奶
2025-09-15 16:09:27
四问速冻西兰花:为何冻?如何冻?营养价值几何?谁在吃?

四问速冻西兰花:为何冻?如何冻?营养价值几何?谁在吃?

经济观察报
2025-09-18 14:18:08
多块查封土地竟能“人间蒸发”,司法权威在广东成为笑话

多块查封土地竟能“人间蒸发”,司法权威在广东成为笑话

几个老记者
2025-09-18 08:47:11
F1阿塞拜疆一练:迈凯伦全场最快,勒克莱尔P3,汉密尔顿P13

F1阿塞拜疆一练:迈凯伦全场最快,勒克莱尔P3,汉密尔顿P13

懂球帝
2025-09-19 17:40:51
再使坏,不给稀土就不让中国航班落地,话音刚落,中方减持257亿美债

再使坏,不给稀土就不让中国航班落地,话音刚落,中方减持257亿美债

墨兰史书
2025-09-19 17:10:07
特朗普称美方正试图收回阿富汗巴格拉姆空军基地

特朗普称美方正试图收回阿富汗巴格拉姆空军基地

新华社
2025-09-19 10:11:35
宇树科技影子股大跌

宇树科技影子股大跌

21世纪经济报道
2025-09-19 13:11:01
工商银行,突发!

工商银行,突发!

券商中国
2025-09-19 13:20:20
解放军目前拥有13个新编集团军,一个集团军到底有多少兵力?

解放军目前拥有13个新编集团军,一个集团军到底有多少兵力?

浩舞默画
2025-09-09 08:43:16
前海港主帅佩雷拉:已报名竞聘国足新帅,我非常符合选帅条件

前海港主帅佩雷拉:已报名竞聘国足新帅,我非常符合选帅条件

雷速体育
2025-09-19 11:59:19
知情人曝:于朦胧妈妈陷入昏迷,醒来情绪不稳,聚会人员集资赔钱

知情人曝:于朦胧妈妈陷入昏迷,醒来情绪不稳,聚会人员集资赔钱

钺鉴
2025-09-18 16:12:03
氢氟酸夺命后续:家属撒谎事发非散步,现场照片流出,谎言被戳穿

氢氟酸夺命后续:家属撒谎事发非散步,现场照片流出,谎言被戳穿

八斗小先生
2025-09-19 14:09:05
俄要将战争进行到底,波兰无限期封锁与白俄罗斯接壤的边境

俄要将战争进行到底,波兰无限期封锁与白俄罗斯接壤的边境

山河路口
2025-09-18 23:38:21
2025-09-19 19:08:49
新钛云服
新钛云服
云管理服务专家
439文章数 30关注度
往期回顾 全部

科技要闻

直击iPhone 17开售:消费者偏爱银色橙色

头条要闻

女子误踩氢氟酸身亡 专家回应"为何遗弃10年仍致命"

头条要闻

女子误踩氢氟酸身亡 专家回应"为何遗弃10年仍致命"

体育要闻

从轮椅到铜牌 他熬了7年:下个目标唱国歌!

娱乐要闻

全智贤被全面抵制!相关代言评论区沦陷

财经要闻

"矿霸"填埋万吨危废 当地政府成立调查组

汽车要闻

对话周光:一个技术理想主义者的“蜕变”

态度原创

游戏
房产
艺术
手机
军事航空

平台跳跃玩家狂喜!小众宝藏续作《尤卡莱莉:回归》10月9日发售

房产要闻

好猛!海南楼市,一批王炸楼盘杀出!

艺术要闻

故宫珍藏的墨迹《十七帖》,比拓本更精良,这才是地道的魏晋写法

手机要闻

追觅将推出首款智能手机Dreame Space,海外预售已获超1亿元订单

军事要闻

卫星图像显示以军坦克集结加沙城周围

无障碍浏览 进入关怀版