ようへいの日々精進XP

よかろうもん

ステイホームなゴールデンウィークなので Packer で EC2 Launch Template の AMI ID を更新するプラグインを作ってみたでごわす

tl;dr

皆さん, 引き続き, ステイホームしてますか, そして, パカパカパッカーしてますか.

Packer で AMI 作って, EC2 Launch Template に登録している AMI を更新するという流れをシームレスにやりたいなーと思って, 見よう見真似で Packer の Post Processor プラグインを作ってみましたのでメモでごわす.

packer-post-processor-aws-update-launchtemplate-version

リポジトリ

github.com

プラグイン名が長くてすいません.

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 リポジトリを参考にしました.

github.com

github.com

github.com

www.packer.io

qiita.com

以上

参考にさせて頂いたリポジトリのコードを読みながら, 見よう見真似が甚だしいプラグインになりましたが, 先人の方のコードを読むのは大変参考になりました. Go もなかなか初心者を脱することが出来ませんが, 少しだけやれる幅が広がった気がした黄金週間な最終日でごわした.