tl;dr
皆さん, 引き続き, ステイホームしてますか, そして, パカパカパッカーしてますか.
Packer で AMI 作って, EC2 Launch Template に登録している AMI を更新するという流れをシームレスにやりたいなーと思って, 見よう見真似で Packer の Post Processor プラグインを作ってみましたのでメモでごわす.
packer-post-processor-aws-update-launchtemplate-version
リポジトリ
プラグイン名が長くてすいません.
packer-[プラグインタイプ]-[名前]
というのが命名ルールのようなので, 目的をはっきりさせようとしてこのような長ったらしい名前になってしまいました.
Packer テンプレート
パカパカ Packer のテンプレートは以下のような感じになります.
{ "variables": { "aws_access_key": "{{env `AWS_ACCESS_KEY_ID`}}", "aws_secret_key": "{{env `AWS_SECRET_ACCESS_KEY`}}", "ssh_keypair_name": "{{env `KEYPAIR_NAME`}}", "ssh_private_key_file": "{{env `PRIVATE_KEY_PATH`}}", "ami_name": "packer-sample-{{timestamp}}" }, "builders": [ { "type": "amazon-ebs", ... snip .... } ], "provisioners": [ { "type": "shell", "inline": [ "echo 'shell'" ] } ], "post-processors": [ [ { "type": "aws-update-launchtemplate-version", "template_id": "lt-xxxxxxxxxxxxxxxxxxxxx", "source_template_version": "latest" } ] ] }
EC2 Launch Template の更新とは, 新しいバージョンを作成することになりますが, このプラグインはテンプレートを 1 から作るのではなく, 既存のテンプレートをコピーして新規作成することを想定しています.
コピー元のテンプレートは最新 (latest
), デフォルト (default
), 任意のバージョン (バージョン番号) の何れかを指定することになります. 上記の例だと, 最新のテンプレートをコピーして, AMI ID だけを差し替えることになります.
以下は実行例です.
$ packer build sample.json amazon-ebs: output will be in this color. ==> amazon-ebs: Prevalidating any provided VPC information ==> amazon-ebs: Prevalidating AMI Name: packer-sample-1588773879 ... 略 ... ==> amazon-ebs: Connected to SSH! ==> amazon-ebs: Running local shell script: /var/folders/w_/w3rfn_250g7803h_hkk90jfw0000gn/T/packer-shell172250629 amazon-ebs: shell-local ==> amazon-ebs: Provisioning with shell script: /var/folders/w_/w3rfn_250g7803h_hkk90jfw0000gn/T/packer-shell497132425 amazon-ebs: shell ==> amazon-ebs: Stopping the source instance... amazon-ebs: Stopping instance ... 略 ... ==> amazon-ebs: Running post-processor: aws-update-launchtemplate-version ==> amazon-ebs (aws-update-launchtemplate-version): Creating New Launch Template Version (Template ID: lt-xxxxxxxxxxxxxx Source Version: 1, AMI ID: ami-xxxxxxxxxxxxxxxxxxx)
参考
以下のドキュメントや Github リポジトリを参考にしました.
以上
参考にさせて頂いたリポジトリのコードを読みながら, 見よう見真似が甚だしいプラグインになりましたが, 先人の方のコードを読むのは大変参考になりました. Go もなかなか初心者を脱することが出来ませんが, 少しだけやれる幅が広がった気がした黄金週間な最終日でごわした.