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

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

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

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

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

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

{
  "variables": {
    "aws_access_key": "",
    "aws_secret_key": ""
  },
  "builders": [{
    "type": "amazon-ebs",
    "access_key": "{{user `aws_access_key`}}",
    "secret_key": "{{user `aws_secret_key`}}",
    "region": "ap-northeast-1",
    "source_ami": "ami-bebda6bf",
    "vpc_id": "vpc-<自分のVPC ID>",
    "subnet_id": "subnet-<自分のサブネットID>",
    "ssh_private_ip": false,
    "associate_public_ip_address": true,
    "instance_type": "t1.micro",
    "ssh_username": "ubuntu",
    "ami_name": "packer-example {{timestamp}}"
  },
  {
    "type": "digitalocean",
    "api_token": "<自分のtoken>",
    "image": "ubuntu-14-04-x64",
    "region": "sgp1",
    "snapshot_name": "packer-sample {{timestamp}}"
  }],
  "provisioners": [{
    "type": "shell",
    "inline": [
      "sleep 30",
      "sudo apt-get update",
      "sudo apt-get install -y apache2"
    ]
  }]
}

これまでと変わった点は「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」の項目を追加します。

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

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

$ export ATLAS_TOKEN=<Atlasのトークン>
$ 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メルマガ会員のサービス内容を見る

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