私はテラフォームに非常に慣れていないので、これは大きな質問ではないかもしれません。しかし、私は[このAmazon EC2の例]を実行していて、ある時点でマシンにSSHで接続しようとしているので、nginxをインストールすると想定しています。これは私にとって常に爆撃であり、サーバーへのログインが繰り返し試行されるのを目にします。
これはおそらく、この最初のログイン試行で、SSHがリモートマシンを信頼してknown_hostsファイルに追加するように要求しているためだと思いました。私が(目に見えて)これを求められるポイントはありません。
だから今、私は、テラフォームがknown_hostsをどのように処理するのか疑問に思います。リポジトリのクローンを作成し、known_hostsを探しましたが、何も見つかりませんでした。
Terraformは、ssh
コマンドラインツールを実行せず、OpenSSH
をライブラリとして使用しません。代わりに、Goで記述された代替のSSHクライアント実装を使用します。
デフォルトでは、このSSHクライアントはホスト検証を行わず、Terraformはこのデフォルトを上書きしません。したがって、ssh
との最初の接続の場合のように、ホストIDを確認する必要はありません。このSSHクライアントライブラリはOpenSSH構成ファイルを考慮しないため、ホストチェックに関するオプションを設定しても効果はありません。
Terraformは、成功するかタイムアウトになるまで、リモートホストへの接続を繰り返し試行します。タイムアウトの一般的な原因は2つあります。
ingress
ルールを1つに追加することで対処できます。インスタンスのセキュリティグループの。connection
ブロック を使用して、Terraformに接続方法を指示できます。パブリックIPアドレスには${self.public_ip}
を使用し、プライベートIPアドレスには${self.private_ip}
を使用します。ここで、public_ip
とprivate_ip
はどちらもaws_instance
リソースタイプの属性です。TerraformがインスタンスのパブリックIPアドレスに接続する場合、セキュリティグループはTerraformが実行されているホストのpublicIPアドレスからのSSH接続を許可する必要があることに注意してください(実際にはNATゲートウェイ)のアドレスである可能性がありますが、プライベートIPアドレスに接続するには、セキュリティグループがTerraformホストのプライベートIP(EC2インスタンスで実行されていると仮定)またはEC2の外部からプライベートIPアドレスにトンネリングするために使用されているVPNゲートウェイの。
最も可能性が高いのは、次のsshオプションを使用していることです。
-o 'StrictHostKeyChecking no'
チェックをバイパスする方法です。答えよりもコメントとして追加したいのですが、できません