Cloudformationテンプレートでcloud-initを使用して、起動時に既知のSSHホストキーでEC2を設定しようとしています。しかし、今はサーバーにSSHで接続できません。デバッグするのは難しいです:-)
テンプレートからのEC2フラグメントのuserdata部分は次のとおりです。
"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にプッシュされていないと思います...
質問のUserDataは基本的に、インスタンスの最初の起動時に実行されるシェルスクリプトです。詳細については、 serDataに関するドキュメント を参照してください。
publicキーのセットを設定する場合は、代わりに 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" }
}
authorized_keysの代わりに別のファイル名を使用して最初にテストしてください。実際、わずかなミスをするとインスタンスからロックアウトされます。
これを行う必要があったのは、CFNデプロイメントが失敗した理由をデバッグするためにインスタンスにSSH接続するためのAWSのprodenvへのキーがなかったためです。 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