TL;DR
Terraformのchef provisionerなどで対象ホストにSSH接続させるとき、秘密鍵のファイルパスを指定する必要があります。しかし、TerraformをAtlasで実行する場合、現状のAtlasにはSSH秘密鍵ファイルをアップロードする手段が無いので困ってしまいます。
そこで、環境変数を介してテンポラリなSSH秘密鍵ファイルを作成する手法を提案します。
背景
Terraformには、作成したEC2インスタンス上をChefでプロビジョニングしてくれるchef provisionerというものがあります。
これは、作成したEC2インスタンスにSSH接続してchef-clientを実行する、という仕組みになっています。
SSH接続するときには、適切なSSH秘密鍵へのファイルパスをTerraformに渡してやる必要があります。
AtlasでTerraformを実行することができますが、Atlasには現状SSH秘密鍵ファイルをアップロードする手段がありません。
解決策
今のところは、Atlasの環境変数に、改行を \n
に置き換えたSSH秘密鍵を設定しておいて、
それを以下のようなlocal-exec provisionerでファイルに書き出してやるとよいです。
resource "aws_instance" "web" {
# ...
provisioner "local-exec" {
command = "/bin/bash -c \"echo -e \\\"$SSH_PRIVATE_KEY\\\" > key && chmod 600 key\""
}
provisioner "chef" {
# ...
connection {
user = "ec2-user"
key_file = "key"
}
}
}
local-exec provisionerで > key
として key
というファイルにSSH秘密鍵を書き出して、chef provisionerのconnectionで key_file = "key"
と指定することで、書きだしたSSH秘密鍵を使って Atlas上のTerraformがEC2インスタンスにSSH接続できるようにしています。
SSH_PRIVATE_KEY環境変数には、SSH秘密鍵の改行を \n
に置き換えたものが入っています。
改行を \n
に置き換えているのは、今のところAtlasの環境変数に複数行文字列を指定できない(一行目のみが環境変数の値として設定されている模様)からです。
\n
のままファイルに書き出しても正しいSSH秘密鍵にならないので、それを echo -e
で改行に変換しています。
bashを使っている理由は、local-exec provisionerが使うシェルが sh で、shのechoには -e
オプションが存在しないから…なのですが、今試したところ bash
のecho -e
とshのecho
は同じ結果になるようなので、わざわざbashを使う必要はなかったかも。