はじめてのGoogle Cloud Platform(GCP)

この投稿はアイスタイル Advent Calender 2020 の21日目の記事になります。

目次

はじめに

はじめまして。日々レガシーな環境と闘っているインフラエンジニアのkoderakです。

アイスタイルにジョインして2年経ちましたが、オンプレのレガシー環境に立ち向かう毎日で、
なかなか新しいことにチェレンジできない悶々とした日々を過ごしておりました。

最近になって、やっと弊社でもクラウドを積極的に使っていこうという流れになりつつあり、
今回の記事もどうせ書くなら自分が書いていて楽しいネタにしたいという理由でGCPにしました。

ちなみにGCPは今回はじめて触ります。
使い方を調べたりしていて、ブログの投稿に間に合うか心配でしたが、ちょうどいいタイミングだったので頑張りました。
GUIの操作からコマンド、自動化と内容を詰め込んだので記事が長くなってしまいましたが、私のようにはじめてGCPを触る人でも理解してもらえるようにしたつもりなので、どこか興味あるところだけでも読んでいただいて、参考にしていただけたら幸いです。

Google Cloud Platform(GCP) とは

Googleが提供するクラウドサービスになります。
他の代表的なクラウドサービスだとアマゾンのAWSやマイクロソフトのAzureがありますね。

やること

インフラエンジニアなので、まず仮想マシンの構築を試しておきたいですね。
GUIで操作を試したら、Infrastructure as Code実践のためにコマンドとAnsibleでも仮想マシンが作れるか試しておきたいと思います。
過去にAWSを触っていたので同じノリでイケるかなと。
GCPで仮想マシンを作るにはGoogle Compute Engineのサービスを利用します。AWSでいうとEC2にあたるものですね。

GCPコンソールとgcloudコマンド、Ansibleの3パターンで仮想マシンを作ってみます。

操作方法 GCPコンソール(GUI) gcloudコマンド Ansible
名前 prd-gcp-vm01 prd-gcp-vm02 prd-gcp-vm03
リージョン asia-northeast1 asia-northeast1 asia-northeast1
ゾーン asia-northeast1-a asia-northeast1-a asia-northeast1-a
マシンタイプ e2-small e2-small e2-small
OS CentOS 8 CentOS 8 CentOS 8
ブートディスク 標準の永続ディスク30GB 標準の永続ディスク30GB 標準の永続ディスク30GB
ネットワーク default default default
サブネットワーク default default default
内部IP エフェメラル(自動) エフェメラル(自動) エフェメラル(自動)
外部IP 静的IP(prd-gcp-vm01-ip) 静的IP(prd-gcp-vm02-ip) 静的IP(prd-gcp-vm03-ip)
Shielded VM 有効 有効 有効

前提

GCPの無料トライアルを利用して試します。
今回はVPCなどのネットワーク的な作り込みまではやりません。

GCP初期登録

Google Cloud Platform にアクセス。

[無料で開始]をクリック。

GoogleアカウントでChromeにログインしている場合はアカウントが表示されます。チェックボックスをオンにして[続行]クリック。

「アカウントの種類」を今回は「個人」にしてその他必要な情報を入れて、[無料トライアルを開始]をクリック。

「OK」をクリック。

GCPコンソールが表示されます。

画面左上に「My First Project」という名でプロジェクトが作成されています。
▼をクリックすると現在のプロジェクト名とIDが表示されます。

新しくプロジェクトを作成することもできますが、今回はこのままデフォルトのプロジェクトを使用します。このIDは後ほど使います。確認したら[キャンセル]で戻ります。

GCPコンソールで仮想マシンを作成

それでは早速仮想マシンを作成してみたいと思います。

Compute Engineの操作

[Compute Engine]> [VM インスタンス]の順にクリック。

[課金を有効にする]をクリック。

[アカウントを設定]をクリック。

以下のような画面になるので、[作成]をクリック。

仮想マシン作成に必要な情報を入れていきます。

ここでは以下の情報を登録し、最後に[作成]クリックします。

項目 設定
名前 prd-gcp-vm01
リージョン asia-northeast1(東京)
ゾーン asia-northeast1-a
マシンタイプ e2-small(2 vCPU、2GB メモリ)
オペレーティング システム CentOS
バージョン CentOS 8
ブートディスクの種類 標準の永続ディスク30GB

GCPコンソールに作成した仮想マシンが表示されますので、仮想マシンをクリック。

この段階で外部IPはまだ固定ではないので静的IPに変更します。[編集]をクリック。

[ネットワーク インターフェース]の編集ボタンをクリックした後に、外部IPの「エフェメラル」を[IPアドレスを作成]にしてクリック。

「新しい静的IPアドレスの予約」のポップアップウインドウが表示されるので、名前を登録して[予約]をクリック。(今回はprd-gcp-vm01-ipで名前を登録)

戻った画面で[完了]クリック。

最後に[保存]クリックして編集を完了させます。

ちなみにShielded VMの有効化は仮想マシンを停止した状態でないと有効にできないので、一度仮想マシンを停止した後にまた編集画面に戻って、[セキュアブートをオンにする]のチェックボックスを有効化します。Shielded VMについてはこちらを参照してみてください。

GCPコンソールによる仮想マシンの作成は以上となります。

Cloud ShellからgcloudコマンドでSSHログイン

GCPコンソールにはブラウザからコマンドラインで操作できるCloud Shellが用意されています。

画面右上にボタンがあるのでクリックします。

すると画面下部にコマンドラインの画面が表示されます。[続行]をクリックします。

コマンドが打てる状態になります。

このままコマンド直打ちでもいいですが、SSHの▼ボタンをクリックして[gcloud コマンドを表示]をクリックします。

[CLOUD SHELL で実行する]をクリックします。

Cloud Shellにコマンドが入力された状態になるのでこのまま実行します。

「Cloud Shell の承認」画面が表示されるので、[承認]をクリックします。

初回はSSH鍵ペアの作成を求められるので、画面の指示にしたがって操作します。

*****@cloudshell:~ (spry-catcher-298120)$ gcloud beta compute ssh --zone "asia-northeast1-a" "prd-gcp-vm01" --project "spry-catcher-298120"
WARNING: The private SSH key file for gcloud does not exist.
WARNING: The public SSH key file for gcloud does not exist.
WARNING: You do not have an SSH key for gcloud.
WARNING: SSH keygen will be executed to generate a key.
This tool needs to create the directory [/home/*****/.ssh] before
 being able to generate SSH keys.
Do you want to continue (Y/n)?  Y
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/*****/.ssh/google_compute_engine.
Your public key has been saved in /home/*****/.ssh/google_compute_engine.pub.
The key fingerprint is:
SHA256:vehzEphT1vSNiZoEkJ+UYFJfdxJ6r8HZOMywRoFDN6Q *****@cs-272511964829-default-default-bpfth
The key's randomart image is:
+---[RSA 2048]----+
|  ..==.+* +..    |
|   o..*+ =.o     |
|     oE++o.o +   |
|      o.+Oo=+ .  |
|       *SoX o    |
|      +.+. =     |
|       ...o      |
|       .o .      |
|        .+       |
+----[SHA256]-----+
Updating project ssh metadata...⠹Updated [https://www.googleapis.com/compute/beta/projects/spry-catcher-298120].
Updating project ssh metadata...done.
Waiting for SSH key to propagate.
Warning: Permanently added 'compute.5545359228681388031' (ECDSA) to the list of known hosts.
Enter passphrase for key '/home/*****/.ssh/google_compute_engine':
Last login: Wed Dec  9 21:59:58 2020 from 35.235.242.48

SSHログインできたら、サーバの状態確認しておきましょう。

[*****@prd-gcp-vm01 ~]$ cat /etc/redhat-release
CentOS Linux release 8.2.2004 (Core)

[*****@prd-gcp-vm01 ~]$ grep -i process /proc/cpuinfo | wc -l
2

[*****@prd-gcp-vm01 ~]$ free -m
              total        used        free      shared  buff/cache   available
Mem:           1826         239        1284           8         302        1441
Swap:             0           0           0

[*****@prd-gcp-vm01 ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        897M     0  897M   0% /dev
tmpfs           914M     0  914M   0% /dev/shm
tmpfs           914M  8.4M  905M   1% /run
tmpfs           914M     0  914M   0% /sys/fs/cgroup
/dev/sda2        30G  2.6G   28G   9% /
/dev/sda1       200M  6.9M  193M   4% /boot/efi
tmpfs           183M     0  183M   0% /run/user/1000

Macなどの端末からSSHログイン

仮想マシンをクリックして、「VMインスタンスの詳細」画面で[編集]をクリックします。
「SSH 認証鍵が0 個あります」のところで、SSHログインするユーザの公開鍵を登録します。

SSH鍵認証でログインしてみる。

$ ssh -i ~/.ssh/id_rsa *****@34.85.46.107
Enter passphrase for key '/Users/*****/.ssh/id_rsa':
[*****@prd-gcp-vm01 ~]$

gcloudコマンドで仮想マシン作成

gcloudコマンドで仮想マシンを作成します。
gcloudはGCPコンソールのCloud Shellを使うか、PCなどのローカル環境にGoogle Cloud SDKをインストールして使うことができます。
今回はmacOSにGoogle Cloud SDKをインストールして、gcloudコマンドを使って仮想マシンを作成してみます。

macOSのバージョン
macOS(Big Sur)にバージョンアップしています。

  • ProductName:macOS
  • ProductVersion:11.0.1
  • BuildVersion:20B29

Pythonの要件

macOS 用のクイックスタート に以下のように記載されています。

Cloud SDK には Python が必要です。サポートされているバージョンは 3.5~3.7、2.7.9 以降です。

macOSにGoogle Cloud SDKインストール

Pythonのバージョンを確認します。Python3だと対応していないですね。

$ python -V
Python 2.7.16

$ python3 -V
Python 3.9.0

Cloud SDKをダウンロードします。
※wgetがインストールされていない場合は入れてください。

$ wget https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-308.0.0-darwin-x86_64.tar.gz

展開します。

$ tar zxvf google-cloud-sdk-308.0.0-darwin-x86_64.tar.gz

macOS(Big Sur)だとPython3.9で要件から外れているため、インストールスクリプトを暫定的にPython2で実行するように以下を実行します。
(インストール後にGoogle SDKをアップデートすればPython3.9で動きます)

$ export CLOUDSDK_PYTHON=python

インストールスクリプト実行(画面の指示に従って進めてください)

$ ./google-cloud-sdk/install.sh

Google Cloud SDK 初期化

以下を実行します。

$ gcloud init

Googleユーザー アカウントを使用してログインします。「Y」で実行

Welcome! This command will take you through the configuration of gcloud.

Your current configuration has been set to: [default]

You can skip diagnostics next time by using the following flag:
  gcloud init --skip-diagnostics

Network diagnostic detects and fixes local network connection issues.
Checking network connection...done.
Reachability Check passed.
Network diagnostic passed (1/1 checks passed).

You must log in to continue. Would you like to log in (Y/n)?

ブラウザで「アカウントの選択」画面が表示されるので、アカウントを選択します。

[許可]をクリックします。

ターミナルに戻り、プロジェクトを指定して実行します。

 Pick cloud project to use:
 [1] spry-catcher-298120
 [2] Create a new project
Please enter numeric choice or text value (must exactly match list
item):
 

デフォルトのリージョンとゾーンを設定するので「Y」で実行。

 Your current project has been set to: [spry-catcher-298120].

Do you want to configure a default Compute Region and Zone? (Y/n)?
 

使用可能なゾーンが表示されるので指定して実行します。
今回は34のasia-northeast1-a(東京)で実行します。

 If you do not specify a zone via a command line flag while working
with Compute Engine resources, the default is assumed.
 [1] us-east1-b
 [2] us-east1-c

...(省略)...

 [34] asia-northeast1-a
...(省略)...

 [49] asia-northeast2-c
 [50] asia-northeast3-a
Did not print [24] options.
Too many options [74]. Enter "list" at prompt to print choices fully.
Please enter numeric choice or text value (must exactly match list
item):
 

これで初期化は完了です。以下でバージョンを確認しておきます。

$ gcloud version
Google Cloud SDK 308.0.0
bq 2.0.60
core 2020.08.28
gsutil 4.53
Updates are available for some Cloud SDK components.  To install them,
please run:
  $ gcloud components update

上記メッセージの通りアップデートして起きます。(長いメッセージのあとに「Y」でアップデート実行します)

$ gcloud components update

アップデート後にターミナル再起動して、gcloudのバージョン確認。(バージョンアップしたのでPython3.9で動いています)

$ gcloud version
Google Cloud SDK 319.0.0
bq 2.0.62
core 2020.11.13
gsutil 4.55

認証アカウントを確認します。

$ gcloud auth list
    Credentialed Accounts
ACTIVE  ACCOUNT
*       *****@gmail.com

To set the active account, run:
    $ gcloud config set account `ACCOUNT`

複数のアカウントを切り替えて使いたい場合、gcloud initで新しいユーザを登録すれば上記のリストに出てくるようになります。
切り替えたいときは上記メッセージ時の通り gcloud config set account [ACCOUNT] を実行すればアカウントが切り替えられます。

コンフィグの確認

$ gcloud config list
[compute]
region = asia-northeast1
zone = asia-northeast1-a
[core]
account = *****@gmail.com
disable_usage_reporting = False
project = spry-catcher-298120

Your active configuration is: [default]

Google Cloud SDK に関する情報確認。(Python3.9で動いていることが確認できます)

$ gcloud info
Google Cloud SDK [319.0.0]

Platform: [Mac OS X, x86_64] uname_result(system='Darwin', node='*****', release='20.1.0', version='Darwin Kernel Version 20.1.0: Sat Oct 31 00:07:11 PDT 2020; root:xnu-7195.50.7~2/RELEASE_X86_64', machine='x86_64')
Locale: ('ja_JP', 'UTF-8')
Python Version: [3.9.0 (default, Nov 21 2020, 14:55:42)  [Clang 12.0.0 (clang-1200.0.32.27)]]
Python Location: [/usr/local/bin/python3]
Site Packages: [Disabled]
...(省略)...

gcloudコマンドの操作

まず静的外部IPの予約をします。

$ gcloud compute addresses create prd-gcp-vm02-ip --region asia-northeast1

確認します。

$ gcloud compute addresses describe prd-gcp-vm02-ip --region asia-northeast1
address: 34.84.37.66
addressType: EXTERNAL
creationTimestamp: '2020-12-11T01:55:47.828-08:00'
description: ''
id: '3340424723740687564'
kind: compute#address
name: prd-gcp-vm02-ip
networkTier: PREMIUM
region: https://www.googleapis.com/compute/v1/projects/spry-catcher-298120/regions/asia-northeast1
selfLink: https://www.googleapis.com/compute/v1/projects/spry-catcher-298120/regions/asia-northeast1/addresses/prd-gcp-vm02-ip
status: RESERVED

上記で作成した静的外部IPを使って仮想マシンを作成します。

$ gcloud compute instances create prd-gcp-vm02 \
> --image=centos-8-v20201112 --boot-disk-size=30GB --image-project=centos-cloud \
> --machine-type=e2-small \
> --shielded-secure-boot \
> --address=34.84.37.66 \
> --zone=asia-northeast1-a

確認します。(GCPコンソールで作成した仮想マシンも表示されています)

$ gcloud compute instances list
NAME          ZONE               MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
prd-gcp-vm01  asia-northeast1-a  e2-small                   10.146.0.2   34.85.46.107  TERMINATED
prd-gcp-vm02  asia-northeast1-a  e2-small                   10.146.0.3   34.84.37.66   RUNNING

詳細情報の確認。

$ gcloud compute instances describe prd-gcp-vm02 --zone=asia-northeast1-a
canIpForward: false
cpuPlatform: Intel Broadwell
creationTimestamp: '2020-12-11T02:01:33.822-08:00'
deletionProtection: false
disks:
- autoDelete: true
  boot: true
  deviceName: persistent-disk-0
  diskSizeGb: '30'
  guestOsFeatures:
  - type: SEV_CAPABLE
  - type: VIRTIO_SCSI_MULTIQUEUE
  - type: UEFI_COMPATIBLE
  index: 0
  interface: SCSI
  kind: compute#attachedDisk
...(省略)...

gcloudコマンドでSSHしてみる。GCPコンソールのときと同様に初回はSSH鍵ペアの作成が求められます。

$ gcloud compute ssh --zone "asia-northeast1-a" "prd-gcp-vm02" --project "spry-catcher-298120"
WARNING: The private SSH key file for gcloud does not exist.
WARNING: The public SSH key file for gcloud does not exist.
WARNING: You do not have an SSH key for gcloud.
WARNING: SSH keygen will be executed to generate a key.
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/*****/.ssh/google_compute_engine.
Your public key has been saved in /Users/*****/.ssh/google_compute_engine.pub.
The key fingerprint is:
SHA256:v88dHrNvJSsU4TkKV/vhIYppaD49PHjS1rxxd7i+PAI *****@*****
The key's randomart image is:
+---[RSA 3072]----+
|                 |
|            o    |
|           o +   |
|        . . B o  |
|       .S= o * o |
|      o +.E . +..|
|     o * ooo. *oo|
|      = O o=o=oB.|
|       = oooo+O=.|
+----[SHA256]-----+
Updating project ssh metadata...⠹Updated [https://www.googleapis.com/compute/v1/projects/spry-catcher-298120].
Updating project ssh metadata...done.
Waiting for SSH key to propagate.
Warning: Permanently added 'compute.2091523348746927507' (ECDSA) to the list of known hosts.
Enter passphrase for key '/Users/*****/.ssh/google_compute_engine':
[*****@prd-gcp-vm02 ~]$

gcloudコマンド使っての仮想マシン作成はこれでOK!

Ansibleで仮想マシンを作成

AnsibleもmacOS(Big Sur)で試してみました。
公式ドキュメント Google Cloud Platform ガイド を参考にしてます。

事前準備

Ansibleをインストールしていなければ、入れておきます。今回はバージョン2.10.3で試しています。
※brewのインストールは割愛します。

$ brew install ansible

pipでGCPのモジュールを入れる必要があります。macにはpip3が入っていたのでこちらでインストール。

$ pip3 install requests google-auth

GCPモジュールを使うには、JSON形式の認証情報が必要なので以下の流れで取得します。

  1. [IAMと管理] > [サービスアカウント]

  2. [サービス アカウントを作成]クリック

  3. 「サービス アカウントの詳細」でサービスアカウント名を入れて、[作成]クリック。
    サービスアカウント名:service_ansible

  4. 「このサービス アカウントにプロジェクトへのアクセスを許可する (省略可)」の「ロールを選択」で[Compute Engine] > [Compute 管理者]の順に選択します。

  5. 「ユーザーにこのサービス アカウントへのアクセスを許可 (省略可)」で、今回はこのまま[完了]をクリックします。

  6. 「鍵を作成」をクリックします。

  7. 「秘密鍵の作成」で「作成」をクリックします。

  8. 新しい公開鍵と秘密鍵のペアが生成され、端末にJSON形式の認証情報ファイルがダウンロードされます。

playbookの準備

認証情報をモジュールのパラメータとして指定するため、以下の内容を事前に確認しておきます。

パラメータ 内容 今回使用する値
auth_kind 使用される認証のタイプ serviceaccount
service_account_file JSON認証情報ファイルへのパス credentials/spry-catcher-298120-e5008440b6c8.json
project プロジェクトID spry-catcher-298120

playbookの作成

ディレクトリを作成して移動します。

$ mkdir gcp_compute
$ cd gcp_compute

ダウンロードしたJSON認証情報ファイルを置くため、ディレクトリを作って配置します。

$ mkdir credentials
$ cp ~/Downloads/spry-catcher-298120-e5008440b6c8.json credentials/

ダイナミックイベントリーを使うため、ansible.cfgに以下を追加します。

[inventory]
enable_plugins = gcp_compute

ちなみにansible.cfgの内容は以下のとおりです。

$ cat ansible.cfg
[defaults]
error_on_undefined_vars = True
retry_files_enabled = False
[privilege_escalation]
become=True
[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no
[inventory]
enable_plugins = gcp_compute

ダイナミックイベントリーのファイルを用意します。

$ vi inventory.gcp.yml
plugin: gcp_compute
projects:
  - spry-catcher-298120
auth_kind: serviceaccount
service_account_file: credentials/spry-catcher-298120-e5008440b6c8.json

ここまでのディレクトリ構造は以下の通りです。

$ tree ../gcp_compute
../gcp_compute
├── ansible.cfg
├── credentials
│   └── spry-catcher-298120-e5008440b6c8.json
└── inventory.gcp.yml

試しに仮想マシンの情報が取れるか試してみます。
うまくいけばすでに作成している2台のインスタンス情報が取得できると思います。

$ ansible-inventory -i inventory.gcp.yml --list --yaml

ここまで出来たら、あとは仮想マシンを作成するためのplaybookを作成します。

$ vi create_gce_instance.yml
- hosts: localhost
  gather_facts: no
  vars:
    gcp_project: spry-catcher-298120
    gcp_cred_kind: serviceaccount
    gcp_cred_file: credentials/spry-catcher-298120-e5008440b6c8.json
    zone: "asia-northeast1-a"
    region: "asia-northeast1"

  tasks:
  - name: create a disk
    gcp_compute_disk:
      name: 'prd-gcp-vm03'
      size_gb: 30
      source_image: 'projects/centos-cloud/global/images/centos-8-v20201112'
      zone: "{{ zone }}"
      project: "{{ gcp_project }}"
      auth_kind: "{{ gcp_cred_kind }}"
      service_account_file: "{{ gcp_cred_file }}"
      state: present
    register: disk

  - name: create a network
    gcp_compute_network:
      name: 'default'
      auto_create_subnetworks: 'true'
      project: "{{ gcp_project }}"
      auth_kind: "{{ gcp_cred_kind }}"
      service_account_file: "{{ gcp_cred_file }}"
      state: present
    register: network

  - name: create a address
    gcp_compute_address:
      name: 'prd-gcp-vm03-ip'
      region: "{{ region }}"
      project: "{{ gcp_project }}"
      auth_kind: "{{ gcp_cred_kind }}"
      service_account_file: "{{ gcp_cred_file }}"
      state: present
    register: address

  - name: create a instance
    gcp_compute_instance:
      state: present
      name: prd-gcp-vm03
      machine_type: e2-small
      disks:
        - auto_delete: true
          boot: true
          source: "{{ disk }}"
      network_interfaces:
        - network: "{{ network }}"
          access_configs:
            - name: 'External NAT'
              nat_ip: "{{ address }}"
              type: 'ONE_TO_ONE_NAT'
      shielded_instance_config:
        enable_secure_boot: yes
      zone: "{{ zone }}"
      project: "{{ gcp_project }}"
      auth_kind: "{{ gcp_cred_kind }}"
      service_account_file: "{{ gcp_cred_file }}"
    register: instance

最終的なディレクトリ構造は以下になりました。

$ tree ../gcp_compute
../gcp_compute
├── ansible.cfg
├── create_gce_instance.yml
├── credentials
│   └── spry-catcher-298120-e5008440b6c8.json
└── inventory.gcp.yml

それではplabybookを実行して、仮想マシンを作成してみたいと思います。
今回はリモートホストではなくローカルで実行するため、ローカルのsudoパスワード(macのsudo)入力で必要な-Kオプションを使います。

まずは対象ホストを確認。

$ ansible-playbook -i inventory.gcp.yml create_gce_instance.yml -K -C --list-host

playbook: create_gce_instance.yml

  play #1 (localhost): localhost    TAGS: []
    pattern: ['localhost']
    hosts (1):
      localhost

ドライラン。

$ ansible-playbook -i inventory.gcp.yml create_gce_instance.yml -K -C
BECOME password:

PLAY [localhost] ***************************************************************************************************************************************************************************************************************************************************************

TASK [create a disk] ***********************************************************************************************************************************************************************************************************************************************************
skipping: [localhost]

TASK [create a network] ********************************************************************************************************************************************************************************************************************************************************
skipping: [localhost]

TASK [create a address] ********************************************************************************************************************************************************************************************************************************************************
skipping: [localhost]

TASK [create a instance] *******************************************************************************************************************************************************************************************************************************************************
skipping: [localhost]

PLAY RECAP *********************************************************************************************************************************************************************************************************************************************************************
localhost                  : ok=0    changed=0    unreachable=0    failed=0    skipped=4    rescued=0    ignored=0

実行。

$ ansible-playbook -i inventory.gcp.yml create_gce_instance.yml -K
BECOME password:

PLAY [localhost] ***************************************************************************************************************************************************************************************************************************************************************

TASK [create a disk] ***********************************************************************************************************************************************************************************************************************************************************
changed: [localhost]

TASK [create a network] ********************************************************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [create a address] ********************************************************************************************************************************************************************************************************************************************************
changed: [localhost]

TASK [create a instance] *******************************************************************************************************************************************************************************************************************************************************
changed: [localhost]

PLAY RECAP *********************************************************************************************************************************************************************************************************************************************************************
localhost                  : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

作成した仮想マシン確認。(先にGCPコンソールとgcloudコマンドで作成した仮想マシンも表示されています。)

$ gcloud compute instances list
NAME          ZONE               MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
prd-gcp-vm01  asia-northeast1-a  e2-small                   10.146.0.2   34.85.46.107  TERMINATED
prd-gcp-vm02  asia-northeast1-a  e2-small                   10.146.0.3   34.84.37.66   TERMINATED
prd-gcp-vm03  asia-northeast1-a  e2-small                   10.146.0.4   34.85.74.179  RUNNING

macのターミナルからログイン確認。

$ gcloud compute ssh --zone "asia-northeast1-a" "prd-gcp-vm03" --project "spry-catcher-298120"
Enter passphrase for key '/Users/*****/.ssh/google_compute_engine':
[*****@prd-gcp-vm03 ~]$

ここまでできればホストを変数にして複数台の並列処理もできそうですね。。再利用のためにタスクをロールにしてミドルのインストールや設定まで処理をつなげたいところです。(別の機会にチャレンジ)

最後に

今回はじめてのGCPということで、Infrastructure as Codeの登竜門となる仮想マシンの構築をGCPコンソール操作からgcloudコマンド、Ansibleまで一気にやってみました。
Infrastructure as Codeは十分やれそうな手応えが得られてよかったと思います。
GCPにはGoogle Compute Engine以外にも様々なサービスがあるので、いろいろ試してGCPに強いインフラエンジニアを目指します!

それほどレガシーも嫌いじゃないインフラエンジニア。コマンドのワンライナーとか好み。