[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

【超过500家企业部署】AWS搭建、运维、监控服务

【超过500家企业部署】AWS搭建、运维、监控服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

[仅适用于 WordPress] 云服务器“Web Speed”

[仅适用于 WordPress] 云服务器“Web Speed”

[便宜]网站安全自动诊断“快速扫描仪”

[便宜]网站安全自动诊断“快速扫描仪”

[预约系统开发] EDISONE定制开发服务

[预约系统开发] EDISONE定制开发服务

[注册100个URL 0日元] 网站监控服务“Appmill”

[注册100个URL 0日元] 网站监控服务“Appmill”

【兼容200多个国家】全球eSIM“超越SIM”

【兼容200多个国家】全球eSIM“超越SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

【全球专属服务】Beyond北美及中国MSP

【全球专属服务】Beyond北美及中国MSP

[YouTube]超越官方频道“美由丸频道”

[YouTube]超越官方频道“美由丸频道”

关于部署定期删除 EC2 实例的 Lambda 函数的故事

我叫寺冈,是一名基础设施工程师。
这次,我想总结一下部署 Lambda 函数供内部使用的故事。

除了客户服务器运行的AWS账户外,
我们还管理账户供内部工程师进行技术验证。

该账户的登录安全设置(IAM用户角色/MFA认证)是按照规则设置的,但
账户内的操作可以自由地进行,不受具有权限的成员的任何限制。
虽然是为了验证,但如果规则太多,也会变得很难处理。

在我们的例子中,验证过程中最频繁创建的资源是 EC2 实例,
虽然我们可以自由创建它,但我们经常忘记停止或删除它。

当然,如果这种情况频繁发生,就会造成不必要的成本。
有一个前提是,当您使用完 EC2 实例后,必须停止或删除它们,但
为了防止您忘记,我们引入了一种使用 Lambda 定期自动删除 EC2 实例的机制。

所以我将在下面总结我所做的事情。

创建 Lambda 函数

我用Python写的。
就我个人而言,我对Golang了解得更多,所以我觉得我应该把它写在那里。

导入 json 导入 boto3 导入 o​​s 导入请求 def 终止(事件,上下文): EXCLUDE_TERMINATE_TAG = os.environ['EXCLUDE_TERMINATE_TAG'] CHATWORK_API_KEY = os.environ['CHATWORK_API_KEY'] CHATWORK_ROOM_ID = os.environ['CHATWORK_ROOM_ID'] CHATWORK_ENDPOINT = os. environ['CHATWORK_ENDPOINT'] ec2 = boto3.client('ec2') without_tag = ec2.describe_instances() with_tag = ec2.describe_instances( Filters=[{ '名称': '标签:' + EXCLUDE_TERMINATE_TAG, '值': [' true'] }] ) without_tag_set = set(ec2['InstanceId'] for resId in without_tag['Reservations'] for ec2 in resId['Instances']) with_tag_set = set(ec2['InstanceId'] for resId in with_tag[ resId['Instances'] 中 ec2 的 'Reservations']) target_instances = without_tag_set - with_tag_set list_target_instances = list(target_instances) if len(list_target_instances) != 0: TerminateInstances = ec2.terminate_instances( InstanceIds=list_target_instances ) notify_instances = '' if len (with_tag['Reservations']) != 0: 对于 with_tag['Reservations'] 中的预订:例如在reservation['Instances'] 中: if len(instance['Tags']) != 0: instance_name = '' for tag in instance['Tags']: if tag['Key'] == 'Name': instance_name = tag['Value'] instance_state_enc = json.dumps(instance['State']) instance_state_dec = json.loads( instance_state_enc) if instance_name != '': notification_instances += instance['InstanceId'] + ' -> ' + instance_name + '(' + instance_state_dec['Name'] + ')'+ '\n' else: notify_instances +=实例['InstanceId'] + ' -> ' + '无' + '(' + instance_state_dec['名称'] + ')'+ '\n' 消息 = '[To:350118][To:1786285][info ][title][超越 POC] list_target_instances } print(响应)返回响应 def PostChatwork(ENDPOINT,API_KEY,ROOM_ID,MESSAGE): post_message_url = '{}/rooms/{}/messages'。格式(ENDPOINT,ROOM_ID) headers = { 'X-ChatWorkToken': API_KEY } params = { 'body': MESSAGE } resp = requests.post(post_message_url, headers=headers, params=params)

我想你看代码就能明白了。

  • 删除没有排除标签的实例
  • 通知 Chatwork 不删除的实例

它会做这个过程。
在某些情况下,如果没有提出任何问题就删除帖子,就会出现问题,因此

,我们已在公司内部制定了规则,您应该添加排除标签“EXCLUDE_TERMINATE:true”

无服务器框架设置

关于如何将您编写的代码部署到 Lambda 的故事。

我们正在使用一种称为无服务器框架的工具。
https://serverless.com


是一个CLI工具,根据指定的配置文件将功能部署
到Lambda等无服务器服务上,对于Lambda来说,它与CloudFormation结合执行部署。

准备名为 serverless.yml 的配置文件。

# 欢迎使用无服务器! # # 该文件是您服务的主要配置文件。 # 目前它非常小,并且使用默认值。 # 您可以随时添加更多配置选项以进行更多控制。 # 只需取消注释其中的任何一个即可获取该配置选项。 # # 有关完整的配置选项,请查看文档:# docs.serverless.com # # 快乐编码!服务:beyond-poc 插件:- serverless-prune-插件提供商:名称:aws 运行时:python3.8 配置文件:${opt:profile, ''} 区域:ap-northeast-1 角色:[IAM 角色名称] 环境:EXCLUDE_TERMINATE_TAG:EXCLUDE_TERMINATE CHATWORK_API_KEY:[ChatWark API 密钥] CHATWORK_ROOM_ID: [ChatWark ROOM ID] CHATWORK_ENDPOINT: https://api.chatwork.com/v2 timeout: 10 # 我的自定义环境 custom: prune:automatic: true number: 5 # 您可以在此处覆盖默认值 # stage: dev #region: us- east-1 # 可以在这里添加打包信息 #package: # include: # - include-me.py # - include-me-dir/** # except: # - except-me.py # - except-me-dir /** 函数: 终止实例: 处理程序: handler.terminate 事件: - 计划: cron(0 15 ? * * *) 超时: 120 内存大小: 128 保留并发: 1

排除标签和ChatWork认证信息被设置为环境中的环境变量。
功能部分按字面意思设置功能。
计划在事件部分中设置,
通过此设置,它将与 CloudWatchEvents 结合在每天 15:00 (UTC) 定期执行。
如果是 JST,那就是午夜。

将需要部署的代码保存到该配置文件所在目录中。

$ sis deploy --profile [AWS 配置文件名称]

从命令行
运行和部署Serverless Framework自动创建的CloudFormation堆栈

最后

我正在写一个关于它的博客,但
我实际上是公司里最忘记删除它的人,抱歉。 。 。

如果您觉得这篇文章有帮助,请点赞!
1
加载中...
1 票,平均:1.00 / 11
2,344
X Facebook 哈特纳书签 口袋
[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

[大阪/横滨] 积极招募基础设施工程师和服务器端工程师!

[大阪/横滨] 积极招募基础设施工程师和服务器端工程师!

写这篇文章的人

关于作者

寺冈由纪

于 2016 年加入 Beyond,目前是他担任基础设施工程师
MSP 的第六个年头,他负责排除故障,同时
使用 AWS 等公共云设计和构建基础设施。
最近,我
一直在使用 Terraform 和 Packer 等 Hashicorp 工具作为构建 Docker 和 Kubernetes 等容器基础设施以及自动化操作的一部分,并且我
还扮演了在外部学习小组和研讨会上发言的传播者的角色。

・GitHub
https://github.com/nezumisannn

・演示历史
https://github.com/nezumisannn/my-profile

・演示材料(SpeakerDeck)
https://speakerdeck.com/nezumisannn

・认证:
AWS认证解决方案架构师-
谷歌云专业云架构师