erlcloud 两种使用模式深度解析:进程字典 vs 配置对象,如何选择?
【免费下载链接】erlcloudAWS APIs library for Erlang (Amazon EC2, S3, SQS, DDB, ELB and etc)项目地址: https://gitcode.com/gh_mirrors/er/erlcloud
erlcloud 是 Erlang 生态中最流行的 AWS API 客户端库(AWS APIs library for Erlang),覆盖 Amazon EC2、S3、SQS、DynamoDB、ELB 等数十个 AWS 服务。对于刚接触 erlcloud 的开发者来说,最容易困惑的问题就是:配置到底应该用configure/2,3还是new/2,3?这两种模式底层有什么区别?生产环境中又该如何选择?本文就带你一次搞清楚 erlcloud 的两种使用模式,并给出可直接套用的选型建议。
一、为什么 erlcloud 会有"两种使用模式"?
翻开 erlcloud 的源码会发现,几乎所有服务模块(如erlcloud_ec2、erlcloud_s3、erlcloud_sns)都同时导出了两组函数:
configure(...)—— 把凭证"存起来",之后调用 API 不用再传配置;new(...)—— 生成一个配置对象,调用 API 时显式传进去。
这个设计源自函数式语言的一个经典取舍:隐式全局状态 vs 显式参数传递。理解这一点,你就掌握了 erlcloud 的命脉。
二、模式一:进程字典模式(configure 一键配置)
这是 erlcloud 最"传统"的用法。以 EC2 为例,只需一行:
erlcloud_ec2:configure("AKIA...", "SecretKey...").之后所有 API 调用都不需要再带配置:
erlcloud_ec2:describe_images(). erlcloud_s3:list_buckets(). % 同样生效它的实现原理非常巧妙:configure/2内部只是执行了一次put(aws_config, new(AccessKeyId, SecretAccessKey))(见erlcloud_ec2.erl第 285-293 行),把配置写进了当前 Erlang 进程的进程字典。当你不传配置调用 API 时,底层会通过default_config()用get(aws_config)从进程字典里取出来(见erlcloud_aws.erl第 380-385 行)。
✅优点:代码最简洁,不需要到处传参;适合单账号、单进程的脚本和演示场景。 ⚠️缺点:配置藏在进程字典里,调用时"看不见",容易踩坑;不同进程之间互相隔离,多账号切换时必须反复configure。
三、模式二:配置对象模式(new 显式传参)
第二种模式是"把配置当普通数据"来处理:
Config = erlcloud_ec2:new("AKIA...", "SecretKey..."). erlcloud_ec2:describe_images(Config).这里的Config是一个#aws_config{}record(字段定义在include/erlcloud_aws.hrl),里面不仅包含 AccessKey/SecretKey,还包含各服务的主机地址、端口、协议、区域等默认值。你可以随意修改其中的字段,比如把ec2_host指向自建的 VPC Endpoint,然后传给任意 erlcloud 函数。
✅优点:显式、可控、无副作用;天然支持多账号、多区域并行;配置对象可复用、可测试,符合函数式编程风格。 ⚠️缺点:每次调用都要多传一个参数,代码稍显啰嗦。
四、一张表看懂两种模式的本质区别
| 对比维度 | 模式一:进程字典 | 模式二:配置对象 |
|---|---|---|
| 入口函数 | configure/2,3 | new/2,3 |
| 配置存放位置 | 进程字典(put/get(aws_config)) | 调用栈(函数参数) |
| 调用方式 | describe_images() | describe_images(Config) |
| 多账号支持 | 差,需反复切换 | 好,可同时持有多个 |
| 并发安全 | 仅限单进程内 | 无共享状态,天然安全 |
| 代码可读性 | 隐式,调用处看不到凭证来源 | 显式,一目了然 |
核心洞察:两种模式底层是同一套#aws_config{}对象,configure本质上只是"把 new 出来的对象放进了进程字典"。区别只在于配置的传递方式。
五、实战选型:什么场景该用哪种模式?
- 快速试验 / 写脚本 / REPL 调试:用模式一,两行代码跑通 EC2、S3 操作,体验最丝滑。
- 生产环境单账号:推荐模式二,显式传参让代码可读、可测试,避免进程字典带来的隐式依赖。
- 多租户、多账号、多区域服务:必须用模式二,为每个账号创建独立 Config 对象并发调用,互不干扰。
- 混合使用:完全可以。先用
configure设默认账号,特殊请求再单独传 Config 覆盖。
另外提醒一点:erlcloud 也支持从环境变量(AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY)和app.config的erlcloud -> aws_config段读取默认配置(见erlcloud_aws.erl第 424-433 行),优先级为:显式传参 > 进程字典 > 应用环境变量 > 系统环境变量。
六、快速上手与常见问题
想亲自体验?克隆仓库即可:
git clone https://gitcode.com/gh_mirrors/er/erlcloudQ1:configure 之后能用 new 覆盖吗?可以。再次调用configure会重新put覆盖进程字典中的配置。
Q2:进程字典模式在多个进程里共享吗?不共享。Erlang 进程字典是进程私有的,每个进程都要各自configure一次。
Q3:想修改 Config 里的某个字段怎么办?用 record 语法更新即可:Config#aws_config{s3_host = "s3.example.com"}。
总结一句话:简单场景用 configure,复杂场景用 new 配置对象。理解了两者"进程字典 vs 显式传参"的本质区别,你就能在 erlcloud 项目中写出既简洁又稳健的 AWS 调用代码。
【免费下载链接】erlcloudAWS APIs library for Erlang (Amazon EC2, S3, SQS, DDB, ELB and etc)项目地址: https://gitcode.com/gh_mirrors/er/erlcloud
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考