我正在尝试使用 cloudformation 模板中的 cloud-init 在启动时使用已知 SSH 主机密钥配置 EC2。但现在我无法通过 SSH 进入服务器。调试起来很棘手 :-)
这是我的模板中的 EC2 片段的用户数据部分:
"UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [
"#cloud-config", "\n",
"ssh_keys:", "\n",
"- rsa_private: |", "\n",
" -----BEGIN RSA PRIVATE KEY-----", "\n",
" MIIEowCBAAKCAQF71D8K9C/+K0a2fO+S9s441kSI44lF5ml++ewD+Mp115x9", "\n",
" /XwwTlvqxCIpxdzpzq4xXEqH48StHyYIjAOPxoS1/QG0Ti6OqU893PpukLdmV", "\n",
" kLZKn2ph4fTT2aMl...", "\n",
" -----END RSA PRIVATE KEY-----", "\n",
"rsa_public: ssh-rsa AAAAB...", "\n",
根据文档,我也有 (ec)dsa_public/private 的条目。
cloudinit 是否有些奇怪,我还必须指定 ssh_authorized_keys?我假设我的密钥对的公钥现在没有被 Amazon 推送到我的 EC2 上...
答案1
您问题中的 UserData 基本上是一个在实例首次启动时运行的 shell 脚本。请参阅UserData 文档了解更多详细信息。
如果你想配置一组民众键,您可以使用AWS::CloudFormation::Init反而。
在文件部分,声明authorized_keys文件:
"files" : {
"/home/ec2-user/.ssh/authorized_keys" : {
"content" : { "Fn::Join" : ["", [
{ "Fn::FindInMap" : [ "Admins", "userx", "sshPublicKey"] }, "\n",
{ "Fn::FindInMap" : [ "Admins", "usery", "sshPublicKey"] }, "\n"
]] },
"mode" : "000600",
"owner" : "ec2-user",
"group" : "ec2-user"
}
...
本例中的用户数据来自映射部分cloudformation 模板:
"Admins" : {
"userx" : { "sshPublicKey" : "ssh-rsa AAAABxxxxx...xxxxBSES/H userx" },
"usery" : { "sshPublicKey" : "ssh-rsa AAAABxxxxx...xxxxKM+aSe usery" }
}
请先使用不同的文件名来测试授权密钥,事实上,当您犯下最轻微的错误时,您就会被锁定在您的实例之外。
答案2
我需要这样做是因为我没有 AWS 中 prod 环境的密钥,无法通过 SSH 进入实例来调试 CFN 部署失败的原因。出于各种原因,包括我正在排除 cfn-init 本身的故障,我发现更好的策略是将以下行添加到 UserData 的顶部并将参数传递tempSSHkey
给 CFN:
Properties:
LaunchTemplateData:
UserData:
Fn::Base64: !Sub |
#!/bin/bash -ex
sudo echo 'ssh-rsa ${tempSSHkey} temp-ssh-key' >> /home/admin/.ssh/authorized_keys