LoginSignup
3
4

More than 5 years have passed since last update.

Atlas上のTerraformがEC2インスタンスにSSH接続できるようにする方法

Last updated at Posted at 2015-09-19

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 オプションが存在しないから…なのですが、今試したところ bashecho -eとshのechoは同じ結果になるようなので、わざわざbashを使う必要はなかったかも。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4