Packerを使ったAMIの構築

記事タイトルとURLをコピーする

全国のPacker愛好家の皆様こんにちは。 技術四課 岩本です。

早速ではござますが、Packerを使って、AMIの構築自動化をやってみました&作ってみました。

Packerとは?

Packerとは、HashiCorp社が提供するマシンイメージの自動生成・管理を行うコマンドライン・ツールです。
Templateと呼ばれるテンプレートファイルから、マシンイメージの作成が行えます。
AWS以外にも、HyperV、GCP、DigitalOceanやVMwareなどにも対応しています。
詳しくは、こちらをご覧ください。

出来上がったものがこちら。

出来上がったものがこちらになります

これは何?

  • Packerを使ったEC2(RHRL7)の構築テンプレートです。

何ができるの?

  • Cloudinitの設定ファイルを置き換えます。
    • ロケールの変更
    • タイムゾーンの変更
    • 詳細はcloud-init_cfg/jp.cfgを参照
  • 指定した設定ファイルを含めた、AMIのカスタムイメージが作成されます。
  • 実行AWSアカウント内にAMIが作成され、作成された指定した別AWSアカウントに(プライベートイメージとして)共有されます
  • EBSは、20GBのルートデバイスと、20GBの追加デバイスが作成されます。
"launch_block_device_mappings": [
    {
        "volume_type": "gp2",
        "device_name": "/dev/sda1",
        "volume_size": 20,
        "delete_on_termination": "true"
    }
],
"ami_block_device_mappings": [
    {
        "volume_type": "gp2",
        "device_name": "/dev/sdb",
        "volume_size": 20,
        "delete_on_termination": "true"
    }
]

Packerの仕組み(概要)

Templateと呼ばれるテンプレートファイルをJSON形式で定義します。
AWSの場合、Templateを元に、EC2インスタンスが立ち上がり、定義されたコマンド・操作が実行されます。
EC2インスタンスを元にAMIが作成され、起動されたEC2は削除されます。
EC2起動時に利用されるキーペアも自動的に作成され、AMI削除後には自動的に削除されます。
Packerを利用する事で、上記の一連の流れを自動化できます。

使い方

事前準備

  • Packerのインストール
  • Homebrewの場合

$ brew install packer

パラメータの指定

  • 利用環境に合わせてsetup.jsonvariablesセクションの各値を書き換えます。
"variables": {
    "name": "rhel_no_ami_dayo",
    "region": "ap-northeast-1",
    "ami-id": "ami-XXXXX",
    "sg-id": "sg-XXXXX",
    "vpc-id":"vpc-XXXXX",
    "subnet-id":"subnet-XXXXX",
    "cloud-init_cfg": "jp.cfg",
    "shared-aws-account": "XXXXXXXXXXX"
}
  • name
    • 作成されるAMI名です。
  • region
    • 作成するAWSリージョン
  • ami-id
    • 元となるAMI-ID
  • sg-id
    • AMIの元となるEC2が起動時に利用するセキュリティグループ
  • vac-id
    • AMIの元となるEC2が起動時に配置されるVPC
  • subnet-id
    • AMIの元となるEC2が起動時に配置されるサブネット
  • cloud-init_cfg
    • cloud-init_cfg/以下にあるCloudinit用ファイル
  • shared-aws-account
    • AMI作成後に共有するAWSアカウント

実行

  • バリデーションチェック
$ packer validate setup.json
Template validated successfully.
  • 実行
    • AWS CLIにて、アクセスキー/シークレットキーが設定されている事を想定
$ AWS_PROFILE=XXXXXX packer build setup.json

amazon-ebs output will be in this color.

==> amazon-ebs: Prevalidating AMI Name: rhel_no_ami_dayo-20180603-0953
    amazon-ebs: Found Image ID: ami-XXXXXXXXXX
==> amazon-ebs: Creating temporary keypair: packer_5b13ba82-be94-4a97-f629-934d758eae62
==> amazon-ebs: Launching a source AWS instance...
==> amazon-ebs: Adding tags to source instance
    amazon-ebs: Adding tag: "Name": "Packer Builder"
    amazon-ebs: Instance ID: i-XXXXXXXXXX
==> amazon-ebs: Waiting for instance (i-XXXXXXXXXX) to become ready...
==> amazon-ebs: Waiting for SSH to become available...
==> amazon-ebs: Connected to SSH!
==> amazon-ebs: Uploading ./cloud-init_cfg/jp.cfg => /tmp/00_local.cfg
==> amazon-ebs: Provisioning with shell script: /var/folders/z9/bdh0bp_j2fbgvq9d8lplld5m0000gn/T/packer-shell985180930
==> amazon-ebs: Stopping the source instance...
    amazon-ebs: Stopping instance, attempt 1
==> amazon-ebs: Waiting for the instance to stop...
==> amazon-ebs: Creating the AMI: rhel_no_ami_dayo-20180603-0953
    amazon-ebs: AMI: ami-df498da0
==> amazon-ebs: Waiting for AMI to become ready...
==> amazon-ebs: Modifying attributes on AMI (ami-XXXXXXXXXX)...
    amazon-ebs: Modifying: users
==> amazon-ebs: Modifying attributes on snapshot (snap-XXXXXXXXXX)...
==> amazon-ebs: Adding tags to AMI (ami-XXXXXXXXXX)...
==> amazon-ebs: Tagging snapshot: snap-XXXXXXXXXX
==> amazon-ebs: Creating AMI tags
    amazon-ebs: Adding tag: "Name": "rhel_no_ami_dayo"
==> amazon-ebs: Creating snapshot tags
==> amazon-ebs: Terminating the source AWS instance...
==> amazon-ebs: Cleaning up any extra volumes...
==> amazon-ebs: No volumes to clean up, skipping
==> amazon-ebs: Deleting temporary keypair...
Build 'amazon-ebs' finished.

==> Builds finished. The artifacts of successful builds are:
--> amazon-ebs: AMIs were created:
ap-northeast-1: ami-XXXXX

  • 上記の様にコマンドを実行すると、順にタスクが実行され出来上がったAMIのIDが表示されます。

まとめ

EC2内(OS以上)の構成を行う場合、Ansible、Chefなど様々なプロビジョニングツールがあります。
弊社の様に様々なお客様環境を作成する場合、お客様要件によっては完全クローズドのAWS環境など、OSへの外部からの接続が行えない場合や、
インターネットへの接続は別途Proxyの設定が必要となる場合があります。
Packerの機能を用いれば、別AWSアカウント上でAMIを作成し、Packer内で別AWSアカウントへの共有まで行えます。
事前に必要なパッケージやアップデートを適用したEC2を、クローズドな環境でも構築できます。