あめも

初心者インフラエンジニアの仕事や日常の事をそれとなく書いていくブログです

GCPでPackerを使ったときのメモ

Google Cloud PlatformのCompute Engineで、Packerを使ったときのメモになります。

GCPでPackerを使った記事が中々無くて少し苦労しました。

Packerとは

好みの仮想マシンイメージを作成してくれるソフト。仮想マシンの初期設定やミドルウェア、その他ソフトウェアを最新の状態にしてイメージを作成してくれて便利。詳しくは下記。

thinkit.co.jp

Compute Engineから仮想マシンの起動

Packer実行用のマシンを作成します。

今回はCentOS7を使います。名前やゾーン、マシンタイプはお好みで。

f:id:sora_rain:20170925021826p:plain

サービスアカウントのアクセス範囲は、今回作成するVMから仮想マシンの作成/削除など行うので、「各APIにアクセス権を設定」→「読み取り / 書き込み」を選択します。

デフォルトのままだとCompute Engineへの権限が無効になっているので、packer実行時にエラーが出ます。

※ちなみにこの「Compute Engine default service account」を消してしまうと、コントロールパネル上からは復活させることができないので注意してください。(自分はそれをやらかしてしまって新しいプロジェクトを作成する羽目になってしまいました…)

f:id:sora_rain:20170925021721p:plain

 作成が完了したら、gcloudコマンドでSSH接続します。

PackerのダウンロードとTemplate作成

Packerは下記コマンドでダウンロードしました。

[hogehoge@instance-1 ~]$ curl -O https://releases.hashicorp.com/packer/1.1.0/packer_1.1.0_linux_amd64.zip

CentOS7の場合だと、unzipが入っていないのでyumでインストールしましょう。

解凍後、packerが起動することを確認しておきます。

[hogehoge@instance-1 ~]$ ./packer version
Packer v1.1.0

Templateは、接続先のGCP Project名や、ベースとなるイメージ、カスタマイズしたい内容を記載するファイルになり、json形式で作成します。

今回は例としてyum updateとNginxをインストールする下記Templateでイメージを作成しました。

それぞれの環境に合わせて修正する必要があるのは、「project_id」「source_image」「ssh_username」です。

「project_id」は現在使っているGCPのProject ID、source_imageはベースとしたいイメージ名(Compute Engineコンソールの「イメージ」から確認できます)、ssh_usernameは先程作成してSSHログインした仮想マシンのユーザー名を入力します。

****.json で保存して、packerを解凍した同じディレクトリに置きます。

{
"builders": [
{
"type": "googlecompute",
"project_id": "hoge-project",
"source_image": "centos-7-v20170918",
"zone": "asia-northeast1-b",
"ssh_username": "hogehoge"
}
],
"provisioners": [{
"type": "shell",
"inline": [
"sudo yum -y update",
"sudo yum -y install nginx"
]
}]
}

 Templateチェックと実行

作成したTemplateが問題ないか、構文チェックを下記コマンドで行います。 

[hogehoge@instance-1 ~]$ ./packer validate test.json
Template validated successfully.

 問題がなければpacker build [Templateファイル]でイメージ作成を実行します。

[hogehoge@instance-1 ~]$ ./packer build test.json
googlecompute output will be in this color.

==> googlecompute: Checking image does not exist...
==> googlecompute: Creating temporary SSH key for instance...
==> googlecompute: Using image: centos-7-v20170918
==> googlecompute: Creating instance...
googlecompute: Loading zone: asia-northeast1-b
googlecompute: Loading machine type: n1-standard-1
googlecompute: Loading network: default
googlecompute: Requesting instance creation...
googlecompute: Waiting for creation operation to complete...
googlecompute: Instance has been created!
==> googlecompute: Waiting for the instance to become running...
...省略

処理が終わると、build終了のメッセージと作成されたイメージ名が出ます。

==> Builds finished. The artifacts of successful builds are:
--> googlecompute: A disk image was created: packer-1506272358

作成されたイメージの確認

Compute Engineのコントロールパネルから、「イメージ」を選択します。

最後のメッセージに記載されていたpackerイメージが作成されているはずです。

f:id:sora_rain:20170925030058p:plain

最後に

Templateで指定するsource_image名は更新される度に、「***-v日付」となるみたいなので修正するのが地味に面倒そうなので、何か回避策が無いか調べてます(ご存じの方いらっしゃいましたら教えてください…)

次はPackerとAnsibleを合わせて実行してみたいと思います。