PR

マシン・イメージを自動構築し、作業効率を高める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のWebサイトにログインすることでさまざまな限定特典を入手できるようになります。

Think IT会員サービスの概要とメリットをチェック

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