これはなんですか
- PackerでCompute Engineのイメージを焼いてる時にOSログインで詰まったので備忘としてメモしておきます。
- コンテナ全盛の時代にイメージ焼いてます。
Packer と OSログイン
PackerとGCEのOSログイン設定について軽く説明する。
Packer
各種イメージを焼いてくれるすごいやつ。GCP向けには、Compute Engine向けのイメージを作成するためのBuilderが用意されている。
具体的な動作は次の通り:
- イメージ作成用のインスタンスを所定のネットワーク上に作成する
- インスタンスに接続し、イメージを焼くための各種操作を行う
- イメージを作成する
- インスタンスを削除する
JSONファイルで設定を記述し、packer build
コマンドを実行すると、上記の順でイメージが作成される。設定は主に「何のイメージを作るか」を定義する Builder と「どのようにイメージ用インスタンスを構成するか」を定義する複数の Provisioner からなる。
OSログイン
VMインスタンスへのSSH接続、特権昇格をCloud IAMで制御するための機能。GCP的にはGCEを使う際の推奨設定らしい。設定方法はメタデータに enable-oslogin: TRUE
を設定するだけ。
PackerはOSログインに対応していない
以下のIssue参照。
https://github.com/hashicorp/packer/issues/7663
回避方法
イメージ作成用のインスタンスのメタデータに enable-oslogin: FALSE
を設定する。GCEのメタデータはプロジェクト単位、インスタンス単位で設定でき、同じキーについてはインスタンスの設定が優先される。そのため、Packer の Compute Engine Builder にメタデータを設定することで、プロジェクト単位でOSログインが設定されている状況でもイメージが作成できるようになる。
{
"builders": [
{
"type": "googlecompute",
"account_file": "{{user `account_file_path`}}",
"project_id": "{{user `project_id`}}",
"source_image_family": "{{user `source_image_family`}}",
"ssh_username": "packer",
"zone": "asia-northeast1-a",
"image_family": "{{user `image_family`}}",
"image_name": "{{user `image_family`}}-{{timestamp}}",
"metadata": {
"enable-oslogin": "FALSE"
}
}
],
"provisioners": [
...
]
}
重要なのは以下の metadata
設定。
"metadata": {
"enable-oslogin": "FALSE"
}
このブロックの中に、インスタンスのカスタムメタデータを記述する。
まとめ
- OSログインが有効な環境ではPackerが使えない。
- インスタンス単位でOSログインを無効化することで回避した。
- しばらくはおまじない感覚で入れておくのが良さそう
- そもそもPacker使う人がどれくらいいるか問題はあるが。。。