OpenTofu 入门:用 IaC 在 AWS 创建 VPC 和 EC2

什么是 OpenTofu OpenTofu 是 Terraform 的开源分支,用于以声明式的方式管理云基础设施(IaC,Infrastructure as Code)。 与 AWS CLI 的区别: OpenTofu AWS CLI 方式 声明式(描述终态) 命令式(执行具体操作) 状态管理 有 state 文件,追踪资源状态 无状态 典型场景 创建/销毁一整套基础设施 查询、临时操作 OpenTofu 和 AWS CLI 都直接调用 AWS API,不存在封装关系。 核心概念 Provider Provider 是 OpenTofu 操作各家云服务的插件,tofu init 时自动下载。 required_providers { aws = { source = "hashicorp/aws" version = "~> 5.0" } } Resource vs Data Source resource — 创建资源(EC2、VPC、安全组等) data — 查询已有信息,不创建资源 # 查询最新的 Amazon Linux 2023 AMI(不创建资源) data "aws_ami" "al2023" { most_recent = true owners = ["137112412989"] filter { name = "name" values = ["al2023-ami-2023.*-x86_64"] } } # 创建 EC2 实例(使用上面查到的 AMI ID) resource "aws_instance" "server" { ami = data.aws_ami.al2023.id instance_type = "t2.nano" } Variables 变量分两个文件: ...

Created 29296-04-29 · Updated 19196-10-19 · 7 min · 1329 words · -

Email Hosting: Mailcow、Postfix 与云端方案

自建邮箱常被说成「装一套 Postfix」,云厂商又常被说成「AWS 有邮件服务」。这两句话都只对了一半:Postfix 只是 SMTP 引擎;AWS 现在给新用户提供的是发信 API,不是完整邮箱。下面按用途把常见方案摊开。 更早的 Debian 上手记录见 Debian Postfix and Dovecot,协议背景见 SMTP 和 Dovecot。 先分清三层 层 解决什么 用户能不能在 Thunderbird / 手机里收信 MTA 在互联网上收发 SMTP 不能。还缺 IMAP/POP3 和存储 完整邮箱 SMTP + IMAP + 反垃圾 + DKIM +(可选)Webmail 能 应用发信 程序发验证码、告警、营销信 不能当个人收件箱 Mailcow 属于第二层,内部的 SMTP 容器仍是 Postfix。Amazon SES 属于第三层。把三者放在同一张「哪个更好」的表里没有意义。 graph TD A["完整邮箱Mailcow / Stalwart / Workspace"] B["MTAPostfix / Exim"] C["应用发信SES / Postal / ACS"] A --> B A -.->|"也可把出站交给"| C C -.->|"不提供 IMAP"| D["S3 / Lambda / webhook"] 自建:Postfix + Dovecot 这一路 底层仍是同一套老软件,差别在谁帮你接线。 ...

Created 2026-09-02 · Updated 2026-09-02 · 5 min · 907 words · -

AWS 服务

EC2 Amazon Elastic Compute Cloud,虚拟机服务。按需启动 Linux/Windows 实例,支持多种规格(Instance Type)。常用于部署应用服务器、代理节点等。 S3 Amazon Simple Storage Service,对象存储服务。用于存储文件、静态资源、备份等,支持生命周期策略和版本控制。 Cognito Cognito /kɒɡˈniːtoʊ/ Amazon Cognito,用户身份和访问管理服务。提供用户注册、登录、多因素认证(MFA)、OAuth 2.0 / OpenID Connect 集成等功能。分为两个核心概念: User Pool:管理用户的注册、登录、密码策略、邮件/短信验证 Identity Pool:为已认证用户颁发临时 AWS 凭证,授权访问其他 AWS 服务(如 S3、DynamoDB) Cloud Map AWS Cloud Map,服务发现(Service Discovery)服务。允许为应用中的任何资源(微服务、数据库、队列、API 端点等)注册自定义名称,并通过 DNS 查询或 API 调用动态解析资源的当前位置(IP 地址、端口、URL 等)。 核心概念: Namespace:命名空间,资源名称的顶层容器,对应一个 DNS 域(如 internal.example.com)或 HTTP 命名空间 Service:服务定义,描述一类资源的注册规则和健康检查策略 Service Instance:实例,具体的资源条目,包含 IP、端口、自定义属性等 主要特性: 支持 DNS 和 HTTP API 两种发现方式 内置健康检查(Route 53 健康检查 或 自定义健康检查),自动剔除不健康实例 与 ECS、EKS、Lambda 深度集成,容器启动/停止时自动注册/注销 支持自定义属性(key-value),客户端可按属性过滤实例 典型用场景:微服务架构中,服务间调用不硬编码 IP,而是通过 Cloud Map 查询目标服务的最新地址,实现服务的动态扩缩容和故障转移。 ...

Created 6066-05-06 · Updated 5056-07-05 · 2 min · 281 words · -

AWS Lambda

概述 AWS Lambda 是无服务器(Serverless)计算服务:上传函数代码,由 AWS 按事件触发执行,按实际运行时长计费,无需管理虚拟机。 适合短任务、事件驱动、低频定时作业(配合 EventBridge Scheduler)、轻量 API(API Gateway)、消息消费(SQS / SNS)等场景。不适合长时间常驻进程或持续高 CPU 负载。 核心概念 概念 说明 Function 一个部署单元:代码 + 运行时 + 配置(内存、超时、环境变量) Handler 入口函数名,格式 文件名.函数名,如 lambda_function.handler Runtime 运行环境,如 python3.13、nodejs22.x Execution Role Lambda 扮演的 IAM Role,决定函数内能调用哪些 AWS API Event 触发时传入的 JSON 载荷(Scheduler、SNS、API Gateway 等格式不同) Context 运行时元数据(剩余超时时间、请求 ID 等) Resource-based policy 挂在函数上的策略,声明谁可以调用本函数(aws_lambda_permission) ARN 格式 函数 ARN 示例: arn:aws:lambda:ap-northeast-1:123456789012:function:enx-api-backup 版本与别名会追加后缀(:1、:prod);日常在 Scheduler、SNS 订阅里通常用未限定版本的函数 ARN。 权限模型(两层) Lambda 涉及两类 IAM,容易混淆: 类型 谁配置 解决什么问题 Execution Role 函数自身 role 字段 函数出站能做什么(写日志、调 SSM、读 S3) Resource policy aws_lambda_permission 等 谁可以调用这个函数(Scheduler、SNS、API Gateway) EventBridge Scheduler ──(resource policy: lambda:InvokeFunction)──► Lambda │ ▼ Execution Role (ssm:SendCommand, logs:PutLogEvents, …) │ ▼ EC2 / SSM / … Execution Role 信任策略 Principal 为 lambda.amazonaws.com(见 AWS IAM) 调用方(如 Scheduler)还需要自己的 Role 带 lambda:InvokeFunction;函数侧通常再加一条 aws_lambda_permission 限定 source_arn Handler 约定 以 Python 为例,入口签名固定为 handler(event, context): ...

Created 19196-05-19 · Updated 19196-05-19 · 3 min · 525 words · -

AWS 使用笔记

ARN(Amazon Resource Name) ARN 是 Amazon Resource Name(亚马逊资源名称)的缩写,用于在 AWS 中唯一标识一项资源。IAM 策略、跨服务授权、Lambda 触发器、备份任务等场景里,经常需要写 ARN 来指定「对哪个资源生效」。 基本格式 arn:partition:service:region:account-id:resource 常见字段说明: 字段 说明 partition 分区,一般为 aws;中国区为 aws-cn,GovCloud 为 aws-us-gov service 服务名,如 ec2、s3、iam、lambda region 区域;全局资源(如 IAM 角色)此处为空 account-id 12 位 AWS 账号 ID resource 资源类型与 ID,格式因服务而异 示例: arn:aws:s3:::my-bucket arn:aws:ec2:ap-northeast-1:123456789012:instance/i-0abcd1234 arn:aws:iam::123456789012:role/MyRole 精确到哪一级? ARN 的粒度取决于资源类型,不是固定「只到服务」或「只到实例」。 以 EC2 为例: 资源 ARN 示例(示意) 粒度 某台 EC2 实例 arn:aws:ec2:ap-northeast-1:123456789012:instance/i-0abcd1234 精确到这一台虚拟机 某块 EBS 卷 arn:aws:ec2:region:account:volume/vol-xxx 精确到这一块盘 某个安全组 arn:aws:ec2:region:account:security-group/sg-xxx 精确到这一个安全组 某个 AMI arn:aws:ec2:region:account:image/ami-xxx 精确到这一张镜像 因此:EC2 实例的 ARN 会带上 instance/i-xxxxxxxx,指向某一台具体 VM,而不是只表示「EC2 这个服务」。S3 桶、Lambda 函数、IAM 角色等同理,各自有独立的 ARN。 ...

Created 29296-04-29 · Updated 19196-05-19 · 1 min · 146 words · -

AWS Systems Manager(Run Command)

概述 AWS Systems Manager(简称 SSM) 是 AWS 的运维管理平台:在 EC2、混合机上远程执行命令、打补丁、收集清单、免 SSH 登录等。 本文只聚焦备份场景里用到的一块:Run Command(运行命令)——通过 API 在实例上执行脚本,无需 SSH。 核心组件 组件 说明 SSM Agent 装在 EC2 上的代理,接收并执行 Run Command(Amazon Linux 2023 通常已预装) Managed Instance 已向 Systems Manager 注册的实例(Agent 在线 + IAM 权限正确) Command document 命令模板;常用内置文档 AWS-RunShellScript(跑 shell) SendCommand API:对一台或多台实例下发命令 GetCommandInvocation API:查询某台实例上该次命令的执行结果 调用方(Lambda / CLI / 控制台) → SendCommand(指定 InstanceId + Document + 命令) → SSM Agent 在 EC2 上执行 → GetCommandInvocation 查看 Success / Failed / 输出 与 SSH 的对比 SSH SSM Run Command 网络 通常要开放 22 端口 走 Agent 出站 HTTPS,不必开 22 凭证 SSH 密钥 / 密码 IAM 授权谁可以 SendCommand 调用方 人要登录或脚本 ssh Lambda、CLI、控制台均可 适合 交互式排错 自动化、批量、审计 Session Manager 是同一产品族里的交互式终端(浏览器里连 shell);Run Command 是非交互、一次一条命令。 ...

Created 19196-05-19 · Updated 19196-05-19 · 2 min · 308 words · -

AWS SNS

概述 Amazon Simple Notification Service(SNS)是 AWS 的消息通知服务,采用发布/订阅(pub/sub)模型:向 Topic 发布一条消息,所有 Subscription 都会收到。 常见用途: CloudWatch Alarm 触发后发邮件、短信 应用解耦广播(一个事件通知多个下游) 推送到 Lambda、SQS、HTTP 端点 SNS 不负责监控、不负责排队存消息;它只负责「把通知送出去」。 核心概念 概念 说明 Topic 主题,消息发布的目标(如 enx-api-backup-alerts) Publisher 发布方,调用 Publish 把消息发到 Topic Subscription 订阅,声明 Topic 上的消息要发到哪(邮箱、Lambda 等) Protocol 订阅协议:email、sms、lambda、sqs、https 等 Endpoint 订阅目标地址(邮箱地址、Lambda ARN、队列 ARN 等) Publisher(CloudWatch Alarm / 应用 / 其它 AWS 服务) → Publish → Topic ├─ Subscription: email → 你的邮箱 ├─ Subscription: lambda → 触发函数 └─ Subscription: sqs → 写入队列 与 CloudWatch、SQS 的区别 服务 角色 SQS 消息队列,消费者拉取;适合异步削峰、DLQ 存档 CloudWatch 监控与告警;Alarm 触发时不直接发邮件 SNS 通知;把一条消息推给多个订阅者 备份失败通知链路: ...

Created 19196-05-19 · Updated 19196-05-19 · 2 min · 284 words · -

AWS CloudWatch

概述 Amazon CloudWatch 是 AWS 的监控与可观测性服务:收集指标(Metrics)、写日志(Logs)、配置告警(Alarms)、做看板(Dashboards)。多数 AWS 服务(EC2、Lambda、SQS 等)会自动把基础指标推到 CloudWatch,无需自建 Prometheus/Grafana 也能做基础监控。 CloudWatch Alarm 不是独立产品,而是 CloudWatch 里的「指标超阈值 → 触发动作」能力,常配合 SNS 发邮件、或触发 Auto Scaling。 核心能力 能力 说明 典型用途 Metrics 时序数据(CPU、队列深度、Lambda 错误次数等) 看图、设告警 Alarms 对 metric 设阈值,满足条件时执行动作 DLQ 有消息 → 发邮件 Logs 集中存储应用 / Lambda 日志 aws logs tail 排错 Dashboards 把多个 metric 画在一张图 运维看板 Metrics 从哪来? 来源 示例 AWS 服务自动上报 SQS ApproximateNumberOfMessagesVisible、Lambda Errors、EC2 CPUUtilization 自定义 metric 应用调用 PutMetricData 上报业务指标 Logs Insights / Metric Filter 从日志里统计错误行数生成 metric 基础服务指标通常不单独收 metric 存储费;自定义 metric 和高分辨率 metric 会另计费。 ...

Created 19196-05-19 · Updated 19196-05-19 · 2 min · 417 words · -

AWS SQS

概述 Amazon Simple Queue Service(SQS)是 AWS 的托管消息队列:生产者把消息发到队列,消费者拉取并处理。无需自建 RabbitMQ/Kafka 集群,按 API 请求量计费。 常见用途: 服务之间异步解耦(下单后发消息,库存服务慢慢处理) 削峰填谷(突发流量先排队,Worker 按能力消费) 作为其它服务的 Dead Letter Queue(死信队列,DLQ),收纳处理失败的消息 核心概念 概念 说明 Queue 队列本身,有唯一 URL Message 一条消息,最大 1 MiB(超大 payload 可配合 S3) Producer 发送方,调用 SendMessage Consumer 接收方,调用 ReceiveMessage,处理完后 DeleteMessage Visibility Timeout 消息被某消费者取走后,在超时时间内对其它消费者不可见;超时未删除则重新可见,可被再次处理 标准队列 vs FIFO 队列 类型 特点 适用场景 Standard 至少一次投递、可能乱序、吞吐量高 大多数场景;DLQ 通常用标准队列 FIFO 严格顺序、恰好一次(需配置)、吞吐量较低 订单、账务等强顺序场景 EventBridge Scheduler、Lambda 等配置的 DLQ,一般使用 标准队列。 计费与免费额度 SQS 没有队列月租,按 API 请求次数 计费: 永久免费档:每月 100 万次 SQS 请求(各区域合计,不结转) 超出后(标准队列,东京等区域参考价):约 $0.40 / 百万次 请求 计费细节: ...

Created 19196-05-19 · Updated 19196-05-19 · 3 min · 520 words · -

AWS EventBridge Scheduler

概述 EventBridge Scheduler 是 AWS 托管的定时任务服务,可以在指定时间或按固定频率触发各种 AWS 目标(Lambda、ECS Task、SNS、SQS 等),无需管理服务器。 与老版本的 EventBridge Rules(Cron Rules) 相比,Scheduler 是独立的服务,功能更强: 特性 EventBridge Rules EventBridge Scheduler 时区支持 仅 UTC 支持任意时区 一次性调度 不支持 支持 灵活速率表达式 有限 支持 rate、cron、一次性 目标数 每条规则最多 5 个 每个 Schedule 1 个 错误重试 无内置重试 支持重试策略和死信队列(见 AWS SQS) 时间窗口 无 支持弹性时间窗口 核心概念 Schedule 类型 类型 说明 示例 Rate 固定间隔重复 rate(5 minutes) Cron Cron 表达式,支持时区 cron(0 2 * * ? *) 每天凌晨 2 点 One-time 指定某个时刻执行一次 2026-06-01T00:00:00 Schedule Group Schedule 的逻辑分组,用于统一管理(打标签、批量删除)。默认分组为 default。 ...

Created 18186-05-18 · Updated 19196-05-19 · 3 min · 455 words · -

AWS IAM

核心概念 IAM(Identity and Access Management)是 AWS 的权限管理服务,控制"谁能对哪些资源做什么操作"。 概念 说明 User 人用的账号,有固定 Access Key,用于控制台登录或 CLI Group 用户组,把多个 User 归组,统一附加策略 Role 权限载体,定义"能做什么",不能直接登录,由主体 assume Policy 权限策略(JSON),附加到 User/Group/Role 上 Instance Profile 专用于 EC2 的 Role 容器,EC2 通过它携带 Role User vs Role User:人或应用持有的固定身份,有长期有效的 Access Key。适合人工操作、CI/CD 等场景。 Role:临时身份,被某个主体(EC2、Lambda、另一个账号)“扮演”(assume)后获得临时凭证(15 分钟 ~ 12 小时有效)。不绑定固定密钥,安全性更高。 Instance Profile(EC2 专用) EC2 实例不能直接绑定 IAM Role,必须通过 Instance Profile 作为中间层: EC2 实例 └─ Instance Profile(容器) └─ IAM Role └─ 权限策略(Policy) EC2 启动后通过 IMDS(实例元数据服务,169.254.169.254)自动获取 Role 的临时凭证,aws CLI 和各语言 SDK 会自动读取,无需 aws configure。 ...

Created 18186-05-18 · Updated 18186-05-18 · 2 min · 258 words · -

AWS 存储服务

概览 服务 类型 免费额度 最低月费 S3 对象存储 5 GB(前 12 个月) 极低,详见 S3 EBS 块存储 30 GB(前 12 个月) 按容量计费 EFS 文件存储(NFS) 5 GB(前 12 个月) 按用量计费 RDS 关系型数据库 db.t3.micro 750h(前 12 个月) ~$15/月 Aurora 关系型数据库(高性能) 无 ~$30/月起 DynamoDB KV / 文档 NoSQL 25 GB 存储 + 25 WCU/RCU(永久) 免费起步 ElastiCache 内存缓存(Redis / Memcached) 无 ~$15/月 DocumentDB 文档数据库(MongoDB 兼容) 无 ~$30/月起 Keyspaces 宽列 NoSQL(Cassandra 兼容) 无 按用量计费 Neptune 图数据库 无 ~$50/月起 Timestream 时序数据库 无 按用量计费 OpenSearch 全文检索 / 日志分析 无 ~$20/月起 Redshift 数据仓库(OLAP) 无 ~$180/月起 Athena S3 直接查询 无 $5/TB 查询数据量 NoSQL 数据库(免费首选) DynamoDB AWS 自研全托管 NoSQL,完全 Serverless。 ...

Created 18186-05-18 · Updated 18186-05-18 · 2 min · 369 words · -

AWS S3

简介 Amazon Simple Storage Service(S3)是 AWS 的对象存储服务,用于存储任意类型的文件(备份、静态资源、日志等),按实际使用量计费。 核心概念: Bucket:存储桶,名字在全球所有 AWS 账号、所有区域共享同一命名空间,全球唯一 Object:对象,即一个文件,由 Key(路径)+ 数据 + 元数据组成 Key:对象的唯一标识符,形如 path/to/file.txt,只需在桶内唯一(S3 本身是扁平结构,/ 只是命名惯例) 概念 唯一性范围 Bucket 名字 全球唯一(跨账号、跨区域) Object Key 桶内唯一 数据存储位置 只在创建时指定的区域 区域与高可用 Bucket 在创建时必须指定区域(如 ap-northeast-1 东京),之后无法更改,数据默认只存在于该区域。 S3 在同一个区域内会把数据自动分散到至少 3 个可用区(AZ),设计耐久性是 99.999999999%(11 个 9)。区域内某个数据中心故障,数据不受影响。 如果整个区域发生故障(极罕见),默认情况下无法从其他区域访问该桶的数据。如需跨区域容灾,要显式配置 Cross-Region Replication(CRR): 东京桶(主) --CRR--> 新加坡桶(副本) CRR 要求两个桶都开启版本控制(Versioning),并配置 IAM Role 授权跨桶复制权限。 实践建议:用于数据库备份等灾难恢复场景,单区域已经足够,无需配置 CRR。若担心区域级故障,更简单的做法是用 aws s3 sync 定期同步到另一个区域,或下载到本地存一份。 常用命令 # 列出所有 bucket aws s3 ls # 列出 bucket 内的对象 aws s3 ls s3://my-bucket/ aws s3 ls s3://my-bucket/prefix/ # 上传文件 aws s3 cp local-file.txt s3://my-bucket/path/file.txt # 下载文件 aws s3 cp s3://my-bucket/path/file.txt local-file.txt # 同步目录(本地 → S3) aws s3 sync ./local-dir s3://my-bucket/prefix/ # 同步目录(S3 → 本地) aws s3 sync s3://my-bucket/prefix/ ./local-dir # 删除对象 aws s3 rm s3://my-bucket/path/file.txt # 删除 prefix 下所有对象 aws s3 rm s3://my-bucket/prefix/ --recursive Bucket 管理 # 创建 bucket(指定区域) aws s3api create-bucket \ --bucket my-bucket \ --region ap-northeast-1 \ --create-bucket-configuration LocationConstraint=ap-northeast-1 # 删除 bucket(必须先清空) aws s3 rm s3://my-bucket --recursive aws s3api delete-bucket --bucket my-bucket # 查看 bucket 所在区域 aws s3api get-bucket-location --bucket my-bucket 生命周期策略(Lifecycle) 用于自动过期或转换存储类型,节省费用。 ...

Created 18186-05-18 · Updated 18186-05-18 · 3 min · 446 words · -

aws-cli

aws-cli install # archlinux pacman -Sy aws-cli # macos https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html aws console> iam> user> w10n_ec2>create access key> cli> commands aws configure # default region name: ap-southeast-1 # default output format: json cat ~/.aws/credentials cat ~/.aws/config aws ec2 describe-instances --instance-ids i-xxxxxxxxxxxxxxxxx --query 'Reservations[*].Instances[*].{ID:InstanceId,State:State.Name}' --output table

Created 24246-02-24 · Updated 24246-02-24 · 1 min · 44 words · -