[解決済み] TerraformでSSHキーを作成するには?
質問
私は異なるユーザーのためにEC2ボックスの束をスピンアップする必要があります。各ユーザーは他のすべてのユーザーからサンドボックス化されるべきであるので、各EC2ボックスはそれ自身のSSHキーを必要とします。
Terraformでこれを達成する最良の方法は何ですか?
私が見つけたほとんどすべての説明は、手動でSSHキーを作成し、それをテラフォームスクリプトに貼り付けることを求めています。
(悪い)例です。
- https://github.com/hashicorp/terraform/issues/1243 ,
- http://2ninjas1blog.com/terraform-assigning-an-aws-key-pair-to-your-ec2-instance-resource/
- Terraform が Amazon EC2 でキーペアのインポートに失敗する )
多くのユーザーに対して一意のキーをプログラムで生成する必要があるため、これは現実的ではありません。
これは難しいユースケースのようには見えませんが、これに関するドキュメントをどこにも見つけることができません。
いざとなれば、Bashを使ってTerraformスクリプトを生成し、その場でSSHキーを注入することは可能です。しかし、それはまさにTerraformが最初に行うことになっていることのように思えます。
どのように解決するのか?
TerraformはSSL/SSHの秘密鍵を生成するのに
tls_private_key
リソース
.
ですから、もしSSH鍵をその場で生成したかったら、次のようなことができます。
variable "key_name" {}
resource "tls_private_key" "example" {
algorithm = "RSA"
rsa_bits = 4096
}
resource "aws_key_pair" "generated_key" {
key_name = var.key_name
public_key = tls_private_key.example.public_key_openssh
}
data "aws_ami" "ubuntu" {
most_recent = true
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
owners = ["099720109477"] # Canonical
}
resource "aws_instance" "web" {
ami = data.aws_ami.ubuntu.id
instance_type = "t2.micro"
key_name = aws_key_pair.generated_key.key_name
tags {
Name = "HelloWorld"
}
}
これは、Terraformの状態に住むSSHキーペアを作成し(リモート状態を使用していないときにTerraformの状態自体に対して行われるかもしれないこと以外のファイルではディスクに書き込まれません)、公開鍵に基づいてAWSキーペアを作成し、Ubuntu 14.04 インスタンスを作成し、そこで
ubuntu
ユーザがアクセスできる Ubuntu 14.04 インスタンスを生成します。
その後、ステートファイルから秘密鍵を取り出して、それをユーザーに提供する必要があります。そのためには
output
を使って、Terraformが適用されたときにこれを標準出力に直接吐き出すことができます。
セキュリティ上の注意点
ここで指摘しておきたいのは、秘密鍵を受け渡しするのは一般的に良くないということです。開発者が自分でキーペアを作成し、その公開鍵をあなたに渡して、あなた(あるいは開発者)がAWSのキーペアを生成したほうがずっと良いでしょう(潜在的には
aws_key_pair
リソース
のように)、インスタンスを作成する際に指定することができます。
一般的に、私は上記のような SSH 鍵の生成方法を、秘密鍵を誰にも渡す必要がないように管理している、非常に一時的な開発環境に対してのみ使用します。秘密鍵を人に渡す必要がある場合は、安全なチャネルでこれを行うことを確認し、Terraformの状態(秘密鍵を平文で含む)も適切に保護されていることを確認する必要があります。
関連
-
[解決済み】AWS CLI S3 HeadObject操作の呼び出し時に、クライアントエラー(403)が発生しました。Forbidden
-
[解決済み] LATERAL VIEW EXPLODE in presto(ラテラルビュー エクスプロード イン プレスト
-
[解決済み] クラウドフォーメーション Fn::JoinとFn:GetAttの併用
-
[解決済み] エラー: networkMode 'awsvpc' が指定された場合、ネットワーク構成を提供する必要があります。
-
[解決済み] Amazon MQとSQSの違いは何ですか?
-
[解決済み] "保護されていない秘密鍵ファイル!" Amazon EC2インスタンス(AWS)へのSSH利用時のエラーについて
-
[解決済み] SSHキー - まだパスワードとパスフレーズを要求される
-
[解決済み] AWS EFS vs EBS vs S3(違い&いつ使う?)【終了しました。
-
[解決済み】RSA鍵のフィンガープリントを計算する
-
[解決済み】Amazon EC2とAWS Elastic Beanstalkの違いについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] -bash: aws: コマンドが見つかりませんでした。
-
[解決済み] AWS S3 Bucketの名前を変更する方法
-
[解決済み] S3からモデルをロードしようとすると、チェーン内の任意のプロバイダからAWS認証情報をロードできない - エラー - が発生する
-
[解決済み] リクエストに含まれるセキュリティトークンの有効期限が切れている
-
[解決済み] AWSのstsは、1つのコマンドの役割を担う
-
[解決済み] AWS 0.0.0.0/0と::/0の意味は何ですか?
-
[解決済み] AWS - Disconnected : サポートされている認証方法がありません (サーバーは :publickey を送信)
-
[解決済み] `aws s3 cp` vs `aws s3 sync` 動作とコスト [終了しました]。
-
[解決済み] Amazon SNSとAmazon SQSの違いは何ですか?
-
[解決済み】FilezillaとSFTPを使用してAmazon EC2のファイルディレクトリに接続する。