ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

使用 Renovate 的 aws-machine-image 数据源自动跟踪与升级 AWS EC2 AMI 镜像

使用 Renovate 的 aws-machine-image 数据源自动跟踪与升级 AWS EC2 AMI 镜像 使用 Renovate 的 aws-machine-image 数据源自动跟踪与升级 AWS EC2 AMI 镜像【免费下载链接】renovateHome of the Renovate CLI: Cross-platform Dependency Automation by Mend.io项目地址: https://gitcode.com/GitHub_Trending/re/renovate导读本文围绕 Renovate 的aws-machine-image数据源展开讲解如何通过 AWS EC2 API 自动发现最新的 Amazon Machine ImageAMI并以最小 IAM 权限、hostRules凭据注入和自定义 regex manager 的方式让仓库中写死的ami-xxxxxxxxxxxxxxxxx镜像 ID 随官方镜像发布自动更新。读完本文你将掌握该数据源的凭据配置、packageName过滤器编写、currentImageName注释回写机制以及它在 YAML / TypeScript / HCL 三类文件中的完整落地写法。数据源概览从手动改 AMI ID到自动追踪最新镜像在 AWS EC2 的日常运维中AMI ID形如ami-02ce3d9008cab69cb通常被硬编码在 Terraform、CloudFormation、Ansible 等配置里。由于 AMI ID 是一串无语义的随机字符无法像 npm 版本号那样直接比较大小传统做法是人工登录 AWS 控制台查询最新镜像再手工替换既繁琐又容易遗漏。Renovate 的aws-machine-image数据源正是为解决这个问题而生它直接调用 AWS EC2 的DescribeImagesAPI返回符合指定过滤条件的所有镜像并把最新的镜像作为可升级目标交给 Renovate 的升级流程处理。其核心实现在 lib/modules/datasource/aws-machine-image/index.ts数据源 ID 为aws-machine-image。注意该数据源当前仍标记为experimental实验性其语法和行为可能随时变化。这一点在该数据源的 readme.md 开头有明确警告生产环境接入前请关注版本更新。工作原理DescribeImages 过滤器 按创建时间排序从源码看该数据源的工作链路非常清晰loadConfig(serializedAmiFilter)index.ts把作为packageName传入的迷你化 JSON 解析为数组并逐个元素判断——包含Name和Values字段的元素是真正的 EC2 镜像过滤器Filter其余元素则合并为 AWS 客户端配置region/profile。getEC2Client(config)index.ts创建EC2Client凭据优先取hostRules中hostType: aws-machine-image对应的username/password/token若没有则回退到 AWS SDK 的标准凭据提供链fromNodeProviderChain。getAmiFilterCommand(filters)index.ts将过滤器包装为DescribeImagesCommand并发送。按CreationDate排序index.ts返回的所有镜像按创建时间从旧到新排序最新镜像即数组最后一个元素。结果缓存getSortedAwsMachineImages、getDigest、getReleases都通过withCache以datasource-aws-machine-image为命名空间缓存结果index.ts避免每次运行都重复调用 AWS API。每次请求的缓存 key 中包含完整的序列化过滤器因此不同的过滤器例如不同 EKS 版本的镜像互不干扰。releaseTimestamp 与 isDeprecatedgetReleasesindex.ts返回的每个 release 包含versionAMI IDImageIdreleaseTimestamp镜像的CreationDateisDeprecated当DeprecationTime早于当前时间时标记为已弃用newDigest镜像的Name字段如amazon-eks-node-1.21-v20240703。这些行为在 index.spec.ts 中均有对应的 mock 测试验证例如3 个镜像按创建时间升序返回全部 release带 DeprecationTime 的镜像被标记为 deprecated。一、凭据配置两种方式任选其一方式一复用 AWS SDK 默认凭据链推荐该数据源通过 AWS SDK for JavaScript v3 访问 AWS 服务因此可以直接复用你为awsCLI 配置的凭据。参见 docs/usage/calling-aws-services.md通过AWS_REGION环境变量或~/.aws/config设置区域通过AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY环境变量或~/.aws/credentials文件提供凭据通过AWS_PROFILE环境变量选择要使用的 profile。方式二为该数据源单独配置 hostRules如果你希望凭据只作用于 AMI 查询、不与其他数据源共享可以在 Renovate 配置中新增一条hostRules设置hostType为aws-machine-imageusername为 Access Key IDpassword为 Secret Access Key可选地通过token传入 Session Token{ hostRules: [ { hostType: aws-machine-image, username: access-key-id, password: secret-access-key, token: session-token } ] }关键点这些凭据仅用于 Amazon Machine Image 查询不影响其他数据源当该 host rule缺失或不完整时Renovate 自动回退到默认的 AWS 凭据提供链从源码getEC2Clientindex.ts可以看到只有当username和password同时存在时才使用 host rule 凭据构造客户端测试 index.spec.ts 验证了host rule 凭据优先于 profile这一行为。按 profile / region 精细化隔离在过滤器里指定除了全局凭据你还可以在过滤器 JSON 中混入 AWS 客户端配置对象{profile: ..., region: ...}实现不同资源使用不同 AWS 账号/区域的隔离。类型定义见 types.tsexport interface AwsClientConfig { region?: string; profile?: string; }loadConfig会把这类元素从过滤器中剥离并合并成客户端配置index.ts。测试用例也验证了多个配置对象会被合并、后出现的region覆盖先前的值index.spec.ts。二、最小 IAM 权限该数据源只调用一个 EC2 API——ec2:DescribeImages因此 IAM 策略可以收敛到最小权限{ Sid: AllowEc2ImageLookup, Effect: Allow, Action: [ec2:DescribeImages], Resource: * }将上述策略附加到 Renovate 运行时使用的 IAM 角色或用户即可。更详细的权限说明可参考 AWS IAM Reference 中 Amazon EC2 的授权章节。三、把 DescribeImages 过滤器当作 packageName由于 AMI 不存在通用的包名packageName概念该数据源要求你把 EC2DescribeImages的 Filters 参数写成迷你化 JSON整体作为packageName。以获取 eu-central-1 区域、账号602401143452AWS 官方 EKS 镜像账号、名称匹配amazon-eks-node-1.21-*的最新 EKS 1.21 镜像为例完整的过滤器长这样[ { Name: owner-id, Values: [602401143452] }, { Name: name, Values: [amazon-eks-node-1.21-*] } ]使用前必须迷你化去掉所有空白成一行[{Name:owner-id,Values:[602401143452]},{Name:name,Values:[amazon-eks-node-1.21-*]}]这个迷你 JSON 就是该依赖项的packageName。常用过滤器字段包括过滤器 Name作用示例值owner-id按拥有者 AWS 账号过滤602401143452EKS 官方镜像name按镜像名称匹配支持*通配amazon-eks-node-1.21-*state按镜像状态过滤availablearchitecture按架构过滤x86_64还可以追加{profile:...,region:...}对象来覆盖客户端配置见上文按 profile/region 精细化隔离。四、数据源没有专属 manager用自定义 regex manager 接入截至当前版本aws-machine-image数据源没有配套的 manager因此必须通过 Renovate 的自定义 managercustom managerregex 类型来识别仓库文件中的 AMI 引用。这要求你的仓库开启customManagers配置需要在配置中启用自定义 manager 功能。配置示例JavaScript 形式renovate.config.jsmodule.exports { customManagers: [ { customType: regex, managerFilePatterns: [/.*/], matchStrings: [ .*amiFilter(?packageName.*?)\n(.*currentImageName(?currentDigest.*?)\n)?(.*\n)?.*?(?depName[a-zA-Z0-9-_:]*)[ ]*?[:|][ ]*?[|\]?(?currentValueami-[a-z0-9]{17})[|\]?.*, ], datasourceTemplate: aws-machine-image, versioningTemplate: aws-machine-image, }, ], };配置示例JSON 形式renovate.json{ customManagers: [ { customType: regex, managerFilePatterns: [/.*/], matchStrings: [ .*amiFilter(?packageName.*?)\n(.*currentImageName(?currentDigest.*?)\n)?(.*\n)?.*?(?depName[a-zA-Z0-9-_:]*)[ ]*?[:|][ ]*?[\|]?(?currentValueami-[a-z0-9]{17})[\|]?.* ], datasourceTemplate: aws-machine-image, versioningTemplate: aws-machine-image } ] }正则表达式的分组语义上面的matchStrings是接入该数据源的核心务必理解每个命名分组的作用命名分组含义是否必填packageName迷你化的 DescribeImages 过滤器 JSON即上文第三节内容必填currentDigest当前 AMI 对应的镜像名称来自currentImageName注释可选项可选depName依赖项名称变量名或配置键如my_ami1必填currentValue当前的 AMI ID匹配ami-[a-z0-9]{17}格式必填其中datasourceTemplate: aws-machine-image声明使用该数据源versioningTemplate: aws-machine-image声明使用配套的版本方案。配套的 aws-machine-image 版本方案版本方案实现在 lib/modules/versioning/aws-machine-image/index.ts用正则^ami-(?suffix[a-z0-9]{17})$校验 AMI ID 格式不符合格式的版本视为无效由于 AMI ID 本身无法比较大小_compare恒返回1——即任意两个合法 AMI ID 都认为后者更大。这意味着只要过滤器能查到更新的镜像Renovate 就会生成更新版本比较完全交给数据源的排序逻辑按创建时间决定。测试文件 versioning/index.spec.ts 也验证了这一点isGreaterThan(ami-00, ami-99)与isGreaterThan(ami-99, ami-00)均为true。五、currentImageName在注释中记录镜像名提升可读性由于 AMI ID 是一串随机字符单看配置很难判断当前用的是哪个版本的镜像。该数据源约定了一个可选的currentImageName注释来保存当前 AMI ID 对应的镜像名称Renovate 会自动维护这个注释使其与 AMI ID 保持同步当发现更新的 AMI 时Renovate同时更新 AMI ID 和currentImageName注释该注释是可选的——没有它也能正常工作matchStrings中currentDigest分组整体带?即表示可缺省。从源码看currentImageName对应的是getDigest返回的最新镜像的Name字段index.ts无newValue时返回最新镜像的 Name有newValue时返回与该 AMI ID 精确匹配的镜像 Name。同时数据源的defaultConfig把 PR 正文列改为[Change, Image]并用newDigest镜像名展示变更后的镜像让 PR 信息直观可读index.ts。六、实际文件示例YAML / TypeScript / HCL下面三组示例展示了同一个 regex manager 在不同文件类型中的识别效果以下片段即managerFilePatterns: [/.*/]匹配的典型内容。YAML 配置如.gitlab-ci.yml、values.yaml# With AMI name mentioned in the comments # amiFilter[{Name:owner-id,Values:[602401143452]},{Name:name,Values:[amazon-eks-node-1.21-*]}] # currentImageNameamazon-eks-node-1.21-v20240703 my_ami1: ami-02ce3d9008cab69cb # Only AMI, no name mentioned # amiFilter[{Name:owner-id,Values:[602401143452]},{Name:name,Values:[amazon-eks-node-1.20-*]}] # currentImageNameamazon-eks-node-1.20-v20240615 my_ami2: ami-0083e9407e275acf2 # Using custom aws profile and region # amiFilter[{Name:owner-id,Values:[602401143452]},{Name:name,Values:[amazon-eks-node-1.20-*]},{profile:test,region:eu-central-1}] # currentImageNameamazon-eks-node-1.20-v20240615 ami ami-0083e9407e275acf2 # Without currentImageName comment (also works!) # amiFilter[{Name:owner-id,Values:[602401143452]},{Name:name,Values:[amazon-eks-node-1.19-*]}] my_ami3: ami-0a1b2c3d4e5f6g7h8注意第三行过滤器 JSON 中追加了{profile:test,region:eu-central-1}说明该依赖会使用testprofile 与eu-central-1区域查询。TypeScript 配置文件const myConfigObject { // With AMI name mentioned in the comments // amiFilter[{Name:owner-id,Values:[602401143452]},{Name:name,Values:[amazon-eks-node-1.21-*]}] // currentImageNameamazon-eks-node-1.21-v20240703 my_ami1: ami-02ce3d9008cab69cb, }; /** * AMI with name tracked in comment * amiFilter[{Name:owner-id,Values:[602401143452]},{Name:name,Values:[amazon-eks-node-1.20-*]}] * currentImageNameamazon-eks-node-1.20-v20240615 */ const my_ami2 ami-0083e9407e275acf2; /** * Without currentImageName comment * amiFilter[{Name:owner-id,Values:[602401143452]},{Name:name,Values:[amazon-eks-node-1.19-*]}] */ const my_ami3 ami-0a1b2c3d4e5f6g7h8;HCL / Terraform 配置resource aws_instance web { # AMI with name tracked in comment # amiFilter[{Name:owner-id,Values:[602401143452]},{Name:name,Values:[amazon-eks-node-1.20-*]}] # currentImageNameamazon-eks-node-1.20-v20240615 ami ami-0083e9407e275acf2 count 2 source_dest_check false connection { user root } } resource aws_instance app { # Without currentImageName comment # amiFilter[{Name:owner-id,Values:[602401143452]},{Name:name,Values:[amazon-eks-node-1.19-*]}] ami ami-0a1b2c3d4e5f6g7h8 count 1 }三条规律值得注意amiFilter注释必须紧邻或位于同一依赖项的识别范围内AMI 赋值行regex 才会捕获currentImageName注释可有可无没有它 Renovate 同样能完成升级AMI 赋值符支持:YAML、HCL、/:TypeScript等多种写法正则已兼容。七、升级时的默认行为与 PR 呈现该数据源在 index.ts 中通过defaultConfig定制了升级相关文案因为 AMI 不遵循任何语义化版本规则commitMessageExtra被覆写为to {{{newVersion}}}去掉默认的v前缀并保留to {{{newDigest}}}形式展示镜像名prBodyColumns默认为[Change, Image]其中Image列以代码块形式渲染newDigest即新的镜像名称如amazon-eks-node-1.21-v20240703。因此当 Renovate 发现新镜像后生成的 PR 会明确写出从哪个 AMI ID 更新到哪个 AMI ID / 镜像名方便人工核对。八、测试验证从单元测试理解行为边界该数据源的行为边界在 index.spec.ts 中有完整覆盖可作为理解其语义的官方行为说明书多镜像返回3 张镜像按创建时间2021-08-13→2021-08-26→2021-09-14排序getReleases返回全部而非只返回最新空结果DescribeImages无返回时getReleases/getDigest返回null不会报错弃用标记带DeprecationTime的镜像被标记isDeprecated: truedigest 语义getDigest无参数时返回最新镜像的Name传newValueAMI ID时返回与该 ID 精确匹配的镜像Name凭据优先级host rule 凭据覆盖过滤器中的 profile 配置配置合并多个客户端配置对象按顺序合并后面的region覆盖前面。九、接入 Checklist 与注意事项把以上内容落地到实际仓库时建议按如下顺序检查开启自定义 manager确认 Renovate 配置中允许customManagersregex 类型复制 customManagers 配置将上文 JS 或 JSON 形式的配置写入你的 Renovate 配置文件managerFilePatterns可按需收窄如[**/*.yaml, **/*.tf, **/*.ts]以减少无谓扫描准备过滤器为每一类要追踪的镜像编写并迷你化 DescribeImages 过滤器写入文件注释amiFilter配置凭据优先使用 AWS SDK 默认凭据链环境变量 /~/.aws/credentials/~/.aws/config需要隔离时用hostRules或过滤器内嵌profile/region授权最小 IAM确保执行 Renovate 的 IAM 身份具备ec2:DescribeImages权限验证匹配用 Renovate 的 dry-run / debug 模式确认 regex 能正确识别ami-*值并解析出packageName接受实验性风险该数据源语法可能随版本变化升级 Renovate 后关注 CHANGELOG 与数据源 readme 的变更。结语aws-machine-image数据源为EC2 镜像持续更新提供了开箱即用的自动化方案以 DescribeImages 过滤器为查询维度、以 AMI ID 为版本载体、以镜像名currentImageName/newDigest为可读性补充再配合自定义 regex manager 覆盖 YAML、TypeScript、HCL 等常见配置文件。虽然目前仍是实验性功能且需要手动编写过滤器与正则但对于管理大量 EKS 节点组、自建镜像流水线或基础设施即代码仓库的团队而言它能把查最新 AMI、改配置、提 PR的重复劳动完全交给 Renovate 自动完成。想深入了解实现细节可以继续阅读数据源核心实现lib/modules/datasource/aws-machine-image/index.ts过滤器 / 客户端配置类型lib/modules/datasource/aws-machine-image/types.ts行为测试推荐先读lib/modules/datasource/aws-machine-image/index.spec.ts配套版本方案lib/modules/versioning/aws-machine-image/index.tsAWS 凭据通用配置说明docs/usage/calling-aws-services.md【免费下载链接】renovateHome of the Renovate CLI: Cross-platform Dependency Automation by Mend.io项目地址: https://gitcode.com/GitHub_Trending/re/renovate创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表