読者です 読者をやめる 読者になる 読者になる

kzk-casino.com

一人前のITエンジニアを目指して

packerで作成したAMIのIDをboto3で自動取得する

f:id:kzk_casino:20161127184527p:plain

packerを使用すればAWSやDigitalOcean上にローカルからイメージを作成することができます。

www.packer.io

packer自体の使用方法は割愛しますが、例えばAWSに対してAMIを作成する際に、下記のように標準出力に出力されます。

$ packer build \
> -varaws_access_key=XXXXXXXXXXXXXXXXXXXXX' \
> -var ‘aws_secret_key=XXXXXXXXXXXXXXXXXXXXXXXXXXXX' \
> example.json
amazon-ebs output will be in this color.

==> amazon-ebs: Prevalidating AMI Name...
==> amazon-ebs: Inspecting the source AMI...
==> amazon-ebs: Launching a source AWS instance...
    amazon-ebs: Instance ID: i-0ea94a0f2372a0227
==> amazon-ebs: Waiting for instance (i-0ea94a0f2372a0227) to become ready...
==> amazon-ebs: Waiting for SSH to become available...
==> amazon-ebs: Connected to SSH!
==> amazon-ebs: Provisioning with shell script: /var/folders/8r/5hc93gp51x1ghs9zpt8yysc930p1j4/T/packer-shell167406152
    amazon-ebs: Ign http://ap-northeast-1.ec2.archive.ubuntu.com trusty InRelease
    amazon-ebs: Get:1 http://ap-northeast-1.ec2.archive.ubuntu.com trusty-updates InRelease [65.9 kB]
  (略)
==> amazon-ebs: Stopping the source instance...
==> amazon-ebs: Waiting for the instance to stop...
==> amazon-ebs: Creating the AMI: packer-example 1480239268
    amazon-ebs: AMI: ami-4a3e882b
==> amazon-ebs: Waiting for AMI to become ready...
==> amazon-ebs: Terminating the source AWS instance...
==> amazon-ebs: Cleaning up any extra volumes...
==> amazon-ebs: No volumes to clean up, skipping
Build 'amazon-ebs' finished.

==> Builds finished. The artifacts of successful builds are:
--> amazon-ebs: AMIs were created:

ap-northeast-1: ami-4a3e882b

また、packerをpythonでWrapして実行できるようなライブラリも公開されています。

GitHub - nir0s/python-packer: A Packer interface for Python


これらのツールを用いていろいろ試していましたが、一つ問題があって、

「最終的に作成されたAMI-IDが取得できないからその後の処理を自動化できない!」

という悩みがありました。


そこで、せっかくpythonでpackerを実行できるライブラリがあるので、pythonAWS SDKであるboto3を使って

AMI-IDを自動取得できるようにしました。


GitHub - kzk-maeda/packer-get-ami-id: To get AMI-ID from packer build result

import packer_get_id
import boto3

# Set Pacer File
packerfile = 'packer_file/example.json'

# Set Credentials
vars = {"aws_access_key": "XXXXXXXXXXXXXXXXXXXX",
        "aws_secret_key": "XXXXXXXXXXXXXXXXXXXXXXXXXXXX"}

# packer Build
p = packer_get_id.Packer(packerfile, vars=vars)
p.build(parallel=False, debug=False, force=False, machine_readable=False)

# Get Image Info via AWS API
client = boto3.client('ec2')
response = client.describe_images(Owners=['self'])

# Get Image Number
num = len(response['Images'])

# Set List
date = []
for image in response['Images']:
    date.append(image['CreationDate'])

# Get Max Value of Date
latest_date = max(date)

# Get Latest Image ID
for image in response['Images']:
    if image['CreationDate'] == latest_date:
        latest_image_id = image['ImageId']

print(latest_image_id)


・・自動取得といえば聞こえはいいですが、要するにpacker build実行後に最新のAMI-IDを取得しているだけです。

より確実にpackerによって作成されたAMI-IDを取得できるようにするには、AMIの名前でFIlterかけたり、Tagを使って管理するといいと思います。


とりあえず現時点でもメモ程度に。