You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过编程方式获取Cloud9 SSH公钥用于自动配置培训环境?

自动化获取Cloud9 SSH公钥并配置EC2实例的可行方案

以下是两种直接解决需求的方案,均支持Terraform/CLI编程实现:

方案1:通过Terraform Cloud9资源属性直接获取公钥

当你在Terraform中创建Cloud9环境(无论是自动生成EC2还是关联现有实例),aws_cloud9_environment_ec2或aws_cloud9_environment资源会直接输出ssh_public_key属性,无需额外调用API。你可以直接将该值注入到目标实例的authorized_keys文件中。

代码示例

# 创建Cloud9环境(关联现有实例的话,添加instance_arn参数)
resource "aws_cloud9_environment_ec2" "training_workspace" {
  name           = "training-${var.participant_id}"
  instance_type  = "t2.micro"
  subnet_id      = var.vpc_subnet_id
  # 若关联现有实例,取消下方注释并替换为实例ARN
  # instance_arn = aws_instance.training_instance.arn
}

# 预配置目标EC2实例(以user_data方式注入公钥)
resource "aws_instance" "training_instance" {
  ami           = "ami-0c55b159cbfafe1f0" # 替换为对应区域的Amazon Linux 2 AMI
  instance_type = "t2.micro"
  subnet_id     = var.vpc_subnet_id

  user_data = <<-EOF
              #!/bin/bash
              mkdir -p /home/ec2-user/.ssh
              echo "${aws_cloud9_environment_ec2.training_workspace.ssh_public_key}" >> /home/ec2-user/.ssh/authorized_keys
              chmod 600 /home/ec2-user/.ssh/authorized_keys
              chown -R ec2-user:ec2-user /home/ec2-user/.ssh
              EOF
}

方案2:通过AWS CLI/API获取已存在Cloud9环境的公钥

如果Cloud9环境已提前创建,你可以通过AWS CLI命令直接查询公钥,在Terraform中可通过external数据源调用该命令实现自动化。

CLI命令示例

aws cloud9 describe-environments --environment-ids <你的Cloud9环境ID> --query 'environments[0].sshPublicKey' --output text

Terraform集成示例

# 调用CLI获取Cloud9公钥
data "external" "cloud9_ssh_key" {
  program = [
    "aws", 
    "cloud9", 
    "describe-environments", 
    "--environment-ids", aws_cloud9_environment.training_workspace.id, 
    "--query", "environments[0].sshPublicKey", 
    "--output", "text"
  ]
}

# 通过remote-exec将公钥写入实例
resource "aws_instance" "training_instance" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
  subnet_id     = var.vpc_subnet_id

  provisioner "remote-exec" {
    connection {
      type        = "ssh"
      user        = "ec2-user"
      private_key = file(var.ssh_private_key_path) # 你的管理密钥对私钥
      host        = self.public_ip
    }

    inline = [
      "echo '${data.external.cloud9_ssh_key.result}' >> /home/ec2-user/.ssh/authorized_keys",
      "chmod 600 /home/ec2-user/.ssh/authorized_keys"
    ]
  }
}

注意事项

  • 确保目标EC2实例的安全组允许Cloud9服务的IP段访问22端口(可通过AWS管理控制台的Cloud9环境详情页获取允许的IP)。
  • 若使用现有实例,需确保实例已关联具有AWSCloud9Member权限的IAM角色,否则Cloud9无法正常连接。

内容的提问来源于stack exchange,提问作者EllisTheEllice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 23:15:59