十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

实例自省指南:erlcloud 读取 EC2 元数据(IMDSv2)完整教程

实例自省指南:erlcloud 读取 EC2 元数据(IMDSv2)完整教程 实例自省指南erlcloud 读取 EC2 元数据IMDSv2完整教程【免费下载链接】erlcloudAWS APIs library for Erlang (Amazon EC2, S3, SQS, DDB, ELB and etc)项目地址: https://gitcode.com/gh_mirrors/er/erlcloud在云端开发中EC2 元数据Instance Metadata就像一台服务器的身份证实例 ID、可用区、公网 IP、IAM 角色临时凭证全都藏在这个本地魔法地址里。而IMDSv2Instance Metadata Service Version 2正是 AWS 力推的会话令牌防护机制用来抵御 SSRF 攻击。如果你正用 Erlang 开发 AWS 应用erlcloud 这款成熟的 AWS APIs 库已经为你封装好了整套EC2 元数据读取方案——本文就用最通俗的方式带你 5 分钟学会它。一、为什么 EC2 元数据值得你关注想象一下你的 Erlang 服务跑在 EC2 上启动时不知道自己是谁、在哪个可用区、有哪些 IAM 权限。与其写死配置不如让程序自省。通过元数据服务你能轻松拿到 可用区如 us-east-1a用于就近路由或 VPC 端点亲和性 实例 ID、本地/公网 IP、主机名 绑定在实例上的 IAM 角色与临时安全凭证 启动时注入的 User Data 用户脚本⚙️ 内核、计费、Spot 竞价等动态信息在 erlcloud 中这一切都浓缩在一个轻量模块src/erlcloud_ec2_meta.erl里四个核心函数即可覆盖全部场景。二、IMDSv2 是什么先搞懂这套安全机制老版的 IMDSv1 只要对着http://169.254.169.254/latest/meta-data/发 GET 请求就能拿数据容易成为 SSRF 攻击的跳板。IMDSv2 的读取流程则引入了一道令牌关卡先 PUT 请求/latest/api/token带上有效期 TTL换取一个会话令牌之后的每次 GET 请求都要在请求头携带X-aws-ec2-metadata-token令牌过期后自动失效最大可设 6 小时好消息是erlcloud 把这两步都封装好了。在erlcloud_ec2_meta.erl中generate_session_token/1,2—— 负责 PUT 令牌请求只需传入期望的存活秒数get_instance_metadata/0,1,2,3—— 读取元数据第三参数传入令牌即可甚至你完全不需要手动管理令牌erlcloud_aws:maybe_imdsv2_session_token/1内部会自动帮你请求 60 秒有效期的令牌取不到时优雅降级。你只管调用细节交给库。三、最快配置方法三步搭建 IMDSv2 读取环境要在项目里使用这些能力路径非常平坦引入依赖在 rebar.config 中声明 erlcloud或直接git clone https://link.gitcode.com/i/42e0889d9bfe751dd5033d3f1c7a234c到本地执行make编译。启动应用在 Erlang shell 里执行application:ensure_all_started(erlcloud).确认元数据服务地址默认指向169.254.169.254:80该配置定义在src/erlcloud.app.src的应用环境变量ec2_meta_host_port中。如果你在用 EC2 元数据代理改这里即可无需动业务代码。四、核心玩法一行代码读取实例自省信息4.1 读取基础元数据%% 获取实例所在可用区erlcloud 会自动走 IMDSv2 令牌流程 {ok, AZ} erlcloud_ec2_meta:get_instance_metadata(placement/availability-zone), io:format(我的可用区是~s~n, [AZ]).其他常用路径同理instance-id、local-ipv4、public-ipv4、mac、hostname……只需把路径字符串替换进去。4.2 读取动态数据与用户数据动态数据get_instance_dynamic_data/0,1,2,3例如竞价实例的instance-identity/document能拿到镜像 ID、架构等身份信息。用户数据get_instance_user_data/0,1,2读取实例启动时注入的脚本或配置非常适合做配置自举。4.3 手动掌控 IMDSv2 令牌进阶如果你希望完全掌控令牌生命周期%% 自己换一个 300 秒的令牌再带上它去读数据 {ok, Token} erlcloud_ec2_meta:generate_session_token(300), {ok, Data} erlcloud_ec2_meta:get_instance_metadata(instance-id, Config, Token).在erlcloud_ec2_meta.erl的第 113-116 行maybe_token_header/1负责把令牌塞进X-aws-ec2-metadata-token请求头——这就是 IMDSv2 校验的最后一环。五、进阶玩法让 erlcloud 自动从元数据获取凭证元数据最有价值的用途是帮 Erlang 应用自动发现 IAM 临时凭证。在src/erlcloud_aws.erl中这套流程完全自动化调用erlcloud_aws:auto_config()它会依次尝试环境变量、ECS 容器凭证、再到EC2 实例元数据逐级降级寻找凭证底层get_credentials_from_metadata/1会先读iam/security-credentials/拿到角色名再取对应角色的 AccessKey、SecretKey 与 Token凭证会缓存在应用环境变量中到期前 5 分钟自动刷新见get_metadata_credentials/2避免频繁访问元数据服务也就是说你的 Erlang 服务只要挂上正确的 IAM 角色无需写死任何密钥开机即自动获得云上身份。六、常见问题与避坑清单在本地开发时调用报错元数据服务只在 EC2 实例内可达本地请用 Mock 或直接配置环境变量凭证。令牌过期了怎么办不用担心erlcloud 的自动流程每次都会重新请求令牌手动场景记得在令牌 TTL 内完成任务。访问被拒绝检查实例是否启用了 IMDSv2 强制模式HttpTokens required此时不带令牌的 IMDSv1 请求会被拒绝——这正是安全设计。如何切换元数据服务地址通过erlcloud.app.src中的ec2_meta_host_port配置项即可测试环境代理场景很实用。七、小结用 erlcloud 读取 EC2 元数据本质就是调用erlcloud_ec2_meta模块的四组函数配合erlcloud_aws:auto_config()的凭证自举你的 Erlang 服务就能在云端自主认知。无论是 IMDSv2 令牌的生成、可用区感知的 VPC 端点路由还是 IAM 角色的无缝接入这套开源库都已替你考虑周全。现在就试试在实例上跑一段get_instance_metadata(instance-id)体验一把实例自省的乐趣吧【免费下载链接】erlcloudAWS APIs library for Erlang (Amazon EC2, S3, SQS, DDB, ELB and etc)项目地址: https://gitcode.com/gh_mirrors/er/erlcloud创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表