从“Permission Denied”到生产:我的 AWS 与 Terraform 之旅
Source: Dev.to

从 DigitalOcean 转向 AWS
我在跟随一个课程,该课程使用 DigitalOcean 部署 Java 应用。由于我在尼日利亚,DigitalOcean 不断拒绝我的卡片,导致我陷入僵局。
我没有放弃,而是想起了我的 #30ofAWSTerraform 挑战。AWS 更加复杂,但它是行业领袖。我决定把 DigitalOcean 的 “防火墙” 转换为 AWS 安全组,以获得真实的实践经验。
Source:
1. 使用 Terraform 进行基础设施供应
我的目标是使用基础设施即代码(IaC)来创建一个 EC2 实例。我使用了 aws_instance 和 aws_key_pair 资源。
挑战:SSH 密钥管理
将公钥作为原始字符串变量传递会导致格式错误。
解决方案
使用 Terraform 的 file() 函数直接从磁盘读取公钥,确保将 Windows 机器上的精确字节发送到 AWS。
resource "aws_key_pair" "my_ssh_key" {
key_name = "zacks-key"
public_key = file("C:/Users/Public/id_aws.pub")
}
Terraform 代码示例


2. AMI ID 与用户名之争
即使实例已经“running”,我仍然无法 SSH 登录。我一直看到 InvalidAMIID.NotFound 或 Permission denied (publickey)。
经验教训
| 问题 | 我学到的内容 |
|---|---|
| 区域特定性 | AMI ID 是区域特定的。伦敦地区的 Ubuntu AMI 在北弗吉尼亚 (us-east-1) 是不可用的。 |
| 架构重要性 | t2.micro 需要 x86_64 镜像。使用基于 ARM 的 AMI 会导致 “Not Found” 错误。 |
| 默认用户 | 每个操作系统都有自己的默认 SSH 用户:Amazon Linux 为 ec2-user,Ubuntu 为 ubuntu,等等。 |
3. 部署应用程序(JAR 文件)
一旦我能够通过 SSH 连接到服务器,就需要把 build/libs 目录下的 Java 构件复制到 EC2 实例上。
工具:SCP(安全复制)
scp -i C:\Users\Public\id_aws "C:\Users\...\java-app-1.0-SNAPSHOT.jar" ubuntu@:/home/ubuntu/

将防火墙规则转换为安全组
当讲师在 DigitalOcean 添加防火墙规则时,我在 AWS 中通过在 Terraform 中更新 安全组,打开 8080 端口,从而允许流量访问我的 Spring Boot 应用。
4. Linux 用户管理与安全
为提升安全性,我创建了个人用户 zacks。
已采取的步骤
-
创建用户
sudo adduser zacks -
授予 sudo 权限
sudo usermod -aG sudo zacks -
修复 SSH 授权密钥
我误将密钥文件命名为Authentication_keys,Linux 需要authorized_keys。我还纠正了所有权和权限:sudo mv /home/zacks/.ssh/Authentication_keys /home/zacks/.ssh/authorized_keys sudo chown -R zacks:zacks /home/zacks/.ssh sudo chmod 600 /home/zacks/.ssh/authorized_keys
结论
今天是一次故障排除的高级课程。我了解到 DevOps 不仅仅是写代码;更是要具备适应能力。当一个云门关闭时,我使用 Terraform 在 AWS 上打开了一个更好的门。
(图片占位符 – 用实际 URL 替换)

基础设施已上线,JAR 正在运行,“白标错误页”从未如此美观!

