Packerを使ってAMIを使ってみる

  • 14
    Like
  • 0
    Comment
More than 1 year has passed since last update.

Packerを一度も触ったことがなかったので触ってみたメモ。
シェルスクリプトのプロビジョニングでnginxがインストールされたAMIを作成。

参考

環境

  • MacOSX 10.10.5(Yosemite)
  • Packer 0.8.6

インストール

# バイナリをダウンロード
$wget https://dl.bintray.com/mitchellh/packer/packer_0.8.6_darwin_amd64.zip

# ~/packerに配置
$mkdir ~/packer
$mv packer_0.8.6_darwin_amd64.zip ~/packer
$cd ~/packer
$unzip packer_0.8.6_darwin_amd64.zip
$rm packer_0.8.6_darwin_amd64.zip

# PATHを通す.bashの場合、~/.bashrcに追記
$vi ~/.zshrc

# packer
export PATH=$PATH:$HOME/packer

# 確認
$source ~/.zshrc
$packer --version
0.8.6

AWSアクセスキーの設定

AWSのアクセスキーを設定します。
以下のいずれかの設定をしておけば大丈夫のようです。

  • 環境変数に設定。アクセスキーは「AWS_ACCESS_KEY_ID」か「AWS_ACCESS_KEY」。シークレットキーは「 AWS_SECRET_ACCESS_KEY」か「AWS_SECRET_KEY」
  • ~/.aws/credentials
  • EC2上で実行している場合、IamInstanceProfile(IAMロール)による設定

templateの作成

nginxがプリインストールされたAMIを作成するためのテンプレートファイルを作成します。

sample.json
{
  "builders": [
    {
      "type": "amazon-ebs",
      "region": "ap-northeast-1",
      "source_ami": "ami-9a2fb89a",
      "instance_type": "t2.micro",
      "ssh_username": "ec2-user",
      "ssh_timeout": "5m",
      "ami_name": "packer_example {{timestamp}}"
    }
  ],
  "provisioners": [
    {
      "type": "shell",
      "inline": [
        "sudo yum -y update",
        "sudo yum -y install nginx"
      ]
    }
  ]
}

実行してみる

# ファイルの確認
$packer validate sample.json
Template validated successfully.

# ビルド
$packer build sample.json
・・・
    amazon-ebs: sudo: sorry, you must have a tty to run sudo

失敗しました。。。これはよく見るやつです。PackerでUserDataの設定ができるようなのでこれでsudoの設定を変えましょう。

UserDataファイルを作成します。

user_data
#!/bin/bash
sed -i 's/^Defaults.*requiretty$/#Defaults    requiretty/' /etc/sudoers
service sshd reload

templateでuser_data_fileを追加し、上記ファイルを呼び出すようにします。

sample.json

  "builders": [{
    "type": "amazon-ebs",
    "region": "ap-northeast-1",
    "source_ami": "ami-9a2fb89a",
    "instance_type": "t2.micro",
    "ssh_username": "ec2-user",
    "ssh_timeout": "5m",
    "user_data_file": "user_data",
    "ami_name": "packer_example {{timestamp}}"
  }],
 "provisioners": [{
    "type": "shell",
    "inline": [
      "sudo yum -y update",
      "sudo yum -y install nginx"
    ]
  }]
}

実行してみると成功し、AMIが作成されていました。