Carpe Diem

備忘録

Packer で AWS の AMI を作成する

概要

AWSのAMIをPackerから作ります。基本的にAnsibleで使用するパッケージをインストールします。
簡単のためNginxだけインストールしたAMIを作ります。
Packerのインストールは「Packer で Virtualbox 用の VagrantBox を作成する」を参考にしてください。

環境

フォルダ構成

├── builders
│   ├── nginx.json
│   └── variables.json
├── provisioners
│   ├── inventory
│   │   └── aws
│   ├── nginx.yml
│   └── roles
│       └── nginx
│           └── tasks
│               └── main.yml
└── scripts
    └── ansible.sh

簡単に説明すると以下です。

フォルダ名 役割
builders packer用スクリプト
provisioners ansibleのplaybook
scripts build時に実行したいシェルスクリプト

Scripts

Ubuntuにansibleをインストールするやつです。

# Add ansible repository
sudo apt-add-repository -y ppa:ansible/ansible

# Install ansible
sudo apt-get update
sudo apt-get -y install software-properties-common
sudo apt-get -y install ansible

Ansible Playbookの用意

inventory/aws

inventoryです。ansible-localなのでlocalhostと指定します。

[nginx]
localhost

nginx.yml

playbookです。

---
- name: Nginx
  hosts: nginx
  sudo: yes
  roles:
  - nginx

roles/nginx/tasks/main.yml

roleです。簡単のためインストールするだけです。

---
- name: Install Nginx
  apt: name=nginx state=latest update_cache=yes

- name: Register Nginx as a service
  service: name=nginx state=started enabled=yes

Builderの用意

gitで管理することを考えてアクセスキーは分けることにします。
variables.jsonの方はバージョン管理に入れない感じです。

variables.json

自分のAWSアカウントのアクセスキー、シークレットキーを記述してください。

{
  "aws_access_key": "xxxxxxxxxxxxxxxxxxxxx",
  "aws_secret_key": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
}

nginx.json

access_key, secret_keyではUser variablesを利用します。
variablesセクションで定義し、{{user `変数名`}}で参照します。
source_amiGUI上から無料のUbuntuを選んでます。

{
  "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-936d9d93",
    "instance_type": "t2.micro",
    "ssh_username": "ubuntu",
    "ami_name": "nginx_{{timestamp}}"
  }],
  "provisioners": [{
    "type": "shell",
    "scripts": [
      "../scripts/ansible.sh"
    ]
  }, {
    "type": "ansible-local",
    "playbook_file": "../provisioners/nginx.yml",
    "inventory_file": "../provisioners/inventory/aws",
    "role_paths": [
      "../provisioners/roles/nginx",
    ]
  }]
}

実行と確認

$ packer build -var-file=variables.json nginx.json

実行中はPackerBuilder用のインスタンスができてます。 f:id:quoll00:20150515132532p:plain

完了すると左メニューのAMIに登録されます。 f:id:quoll00:20150515132838p:plain

以上です。お疲れ様でした。

その他

 amazon-ebs: Error querying AMI: Request has expired. 

が出た場合は実行マシンの時刻がおかしいと思うので、ntpを入れて正確にしておいてから実行してください。

ソース