マシン・イメージを自動構築し、作業効率を高めるPacker入門

2015年4月13日(月)
前佛 雅人(ぜんぶつ まさひと)

DigitalOceanとAWSの両方に展開する方法

Packerは、複数の環境に同時にビルドすることもできます。例えば、AWSの複数リージョンでAMIを作る必要がある場合や、DigitalOcean等、ほかの環境のマシン・イメージを作成したい場合です。これまではそれぞれの環境にあわせて準備をした上で、マシン・イメージを作る必要がありました。しかしPackerがあれば、共通したプロビジョニングを行えるだけでなく、複数の環境を並列に処理しますので、時間の節約にもつながります。

例えばDigitalOceanとAWSの環境で同時にビルドするには、1つのJSONテンプレートの中に複数のビルダーを定義します。具体的にはリスト3のような記述を行います。

リスト3:DigitalOceanとAWSの両方でビルドするためのテンプレート

01{
02  "variables": {
03    "aws_access_key": "",
04    "aws_secret_key": ""
05  },
06  "builders": [{
07    "type": "amazon-ebs",
08    "access_key": "{{user `aws_access_key`}}",
09    "secret_key": "{{user `aws_secret_key`}}",
10    "region": "ap-northeast-1",
11    "source_ami": "ami-bebda6bf",
12    "vpc_id": "vpc-<自分のVPC ID>",
13    "subnet_id": "subnet-<自分のサブネットID>",
14    "ssh_private_ip": false,
15    "associate_public_ip_address": true,
16    "instance_type": "t1.micro",
17    "ssh_username": "ubuntu",
18    "ami_name": "packer-example {{timestamp}}"
19  },
20  {
21    "type": "digitalocean",
22    "api_token": "<自分のtoken>",
23    "image": "ubuntu-14-04-x64",
24    "region": "sgp1",
25    "snapshot_name": "packer-sample {{timestamp}}"
26  }],
27  "provisioners": [{
28    "type": "shell",
29    "inline": [
30      "sleep 30",
31      "sudo apt-get update",
32      "sudo apt-get install -y apache2"
33    ]
34  }]
35}

これまでと変わった点は「builders」で囲まれたビルダーの中に、DigitalOceanとAWSの記述があるだけです。ファイル作成後「packer build」を実行するとし、2つの環境で同時にマシン・イメージの構築作業が始まります。最終的には、図6のように同時にビルドされた結果が表示されます。

図6:DigitalOceanとAWSでの構築作業が並行して行われた

Atlasにpushしてリモートビルド

リモートビルドを実現するAtlas連携

Packerは、HashiCorpの提供するサービスのAtlasと連携させることもできます。通常、Packerを使ってマシン・イメージを変換するには、自分の手元のPCや、ネットワーク上のサーバで作業をする必要があります。そのため、常にネットワークに接続していなくてはいけません。

この問題を解決するのがPackerとAtlasの連携です。Packerは手元のテンプレートをAtlasに送信(プッシュ)し登録することで、Atlasのサービスを通して自動的にビルドを実行(リモートビルド)できます。ビルド中の情報は自動的に記録されるため、AtlasのGUIからの参照もできます(図7)。さらに、作成されたアーティファクトの情報は、そのままAtlas上でも管理できます。これにより、Atlasを通したバージョン管理や、チームや社内でテンプレートやアーティファクトを共有できるようになります。

図7:AtlasとPackerを連携させ、Packerの情報をAtlasから参照する

リモートビルドを使うには

Packerのpushコマンドを使い、テンプレートの情報をAtlasに送信します。事前準備として、AtlasにログインしてAPIのトークンを取得する必要があります。Atlasにログイン後、画面右上の自分の名前をクリックし、左メニューの「tokens」をクリックします。テキスト・フォームには「Packer」などを入力し、「Generate Token」(トークン生成)をクリックします。画面上にトークンが表示されますので、控えておきます。

Packerのテンプレートには、以下のように新たに「push」の項目を追加します。

1"push": {
2  "name": "<自分のAtlasユーザ名>/packer-tutorial"
3}

それから「packer push -create 」を実行すれば、Atlas上にテンプレートが登録されます。

1$ export ATLAS_TOKEN=<Atlasのトークン>
2$ packer push -create example.json

この段階ではアクセスキーが登録されていないため、まだビルドはできません。登録するにはまずAtlasの「Operations」タブをクリックし、画面上の「BUILD CONFIGURATIONS」に先ほどpushしたテンプレート名が表示されているのを確認します。そこをクリックした後「Variables」をクリックし、KeyとValueに「aws_access_key」と「aws_secret_key」を登録します。

最後に「packer push example.json」を実行すれば、以降のビルドはAtlas上で進行させられます。手元でテンプレートを更新したら、そのたびにpacker pushを行う必要がある点に注意してください。

まとめ

Packerはコマンドラインで操作するツールであり、マシン・イメージをGUIで操作するより、正確かつ迅速に行えることが分かると思います。特に何度も同じような作業を繰り返すケースでは、Packerの導入で管理や作業が楽になります。

これまでの連載では、Vagrantで開発環境を整え、Packerを使って様々な環境向けのマシン・イメージを準備するまでを見てきました。次回はこのマシン・イメージを元に、クラウドの基盤上にサーバやオブジェクト・ストレージなどを自動的に構成するTerraformをご紹介します。

※本稿は、2015年4月現在のAtlasおよびPacker v0.7.5に対して確認を行っています。

【参考文献】

Packer(アクセス:2015/04)

https://packer.io/

PACKER DOCUMENTATION(アクセス:2015/04)

https://packer.io/docs

著者
前佛 雅人(ぜんぶつ まさひと)
クリエーションライン株式会社

Technology Evangelist
ホスティングサービスで運用保守サポートに携わった後、現職へ。サポート業務や新技術検証や開発業務を行う傍ら、実家で農作業のため東京と富山を往復する日々。趣味で監視や自動化に関するOSS検証や翻訳を行う。とりわけ運用・監視の省力化・最適化に興味。辛口の日本酒が大好き。
Twitter: @zembutsu (https://twitter.com/zembutsu)

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています