0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Terraform】EC2の毎回変わるインスタンスidに発狂して対策を考えました。

Last updated at Posted at 2023-04-18

セキュリティ上よろしくないやり方ですので参考程度で

毎回マネジメントコンソールからインスタンスidを拾ってssh_configを書き直すのがめんどくさい!!

であれば自動化したらいいよね

やりかた

  • EC2モジュールのmain.tfに以下を記述
main.tf

resource "null_resource" "output_instance_id" {
  triggers = {
    xxx_id = aws_instance.xxx.id //xxxは環境に合わせたec2インスタンス名
  }

  provisioner "local-exec" {
    command = "echo yyyy ${aws_instance.xxx.id} >> ec2_id.txt" //yyyはインスタンスの固有名を設定するとわかりやすい例 EC2-AP-1aなど
  }
}

ec2_id.txtにインスタンスidが出力されます。 >> で追記しているのはEC2複数インスタンスがあるからそうしてます。

  • ec2_id.txtを書き換える
ini_convert.sh
#!/bin/bash

file_path="./ec2_id.txt"

# 変数でEC2のIDを取得する
ec2_id_x=$(grep 'xxx' ./ec2_id.txt | awk '{print $2}')
ec2_id_y=$(grep 'yyy' ./ec2_id.txt | awk '{print $2}')


# 挿入するテキストを指定する
new_text="[SSHコンフィグのホスト名]\n hostname = xxx ${ec2_id_x}\n[SSHコンフィグのホスト名]\n hostname = yyy ${ec2_id_y}"

# 挿入するテキストを含めた新しいファイルを作成する
awk -v text="$new_text" '
  {
    if (NR > 2) {
      print
    }
    if (NR == 1) {
      print text
    }
  }
' "$file_path" > /tmp/file.txt

#この方法だとできませんでした。(ssh configは外部の変数を使えません。)一応configごと置き換えられるようにするpythonコードを置いておきます。

sshconfig_rewrite.py
import configparser
import shutil

class sshconfig_rewrite():

    def __init__(self):
        source_file = "./sshconfig.template"
        destination_file = "~/.ssh/config"
        shutil.copyfile(source_file, destination_file)
        self.input_file = "~/.ssh/config"
        config = configparser.ConfigParser()
        config.read('./ec2_id.ini')
        self.replace_text1 = '@@@hostname1@@@'
        self.replace_text2 = '@@@hostname2@@@'
        self.new_text1 = config.get('EC21A-aws-dev','hostname')
        self.new_text2 = config.get('EC21C-aws-dev','hostname')

    def ec2id_add_sshconfig(self):
        with open(self.input_file, 'r') as file:
            content = file.read()
            content = content.replace(self.replace_text1, self.new_text1)

        with open(self.input_file, 'w') as file:
            file.write(content)

        with open(self.input_file, 'r') as file:
            content = file.read()
            content = content.replace(self.replace_text2, self.new_text2)

        with open(self.input_file, 'w') as file:
            file.write(content)

if __name__ == "__main__":
    main = sshconfig_rewrite()
    main.ec2id_add_sshconfig()
    print("Text replacement is complete.")

./sshconfig.temlate

host EC21A-aws-dev
    ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
    User xxxxx
    Port xx
    HostName @@@hostname1@@@
    IdentityFile xxxx

host EC21C-aws-dev
    ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
    User xx-xxxx
    Port xx
    HostName @@@hostname2@@@
    IdentityFile xxxx

このコードを実行するには.sshとssh configのパーミッションを変えなきゃいけません。最悪のやりかたですね。

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?