Docker ComposeでTerraformを使用しGoogle Cloud開発環境を構築

Docker

こんにちは、KIYONOのエンジニアの西園です。

今回は弊社のサービスであるMAGNETの環境下でDocker ComposeTerraformを使用してGoogle Cloudの開発環境構築をしたのでそちらを解説したいと思います。

なお、Docker ComposeTerraformが何かについては今回割愛させていただきいます。

1. 全体構成

全体の主な構成図は下記の図の通りです。いたって普通なので特に目新しさはありません。

全体構成図

 

2. ファイル構成

ファイル構成は下記のように構成します。

ただし、今回はDocker ComposeTerraformGoogle Cloudの開発環境を構築することに焦点を絞ってますのでその他のファイルはすべて省略しています。なので構築に必要なファイルしか用意していません。

sample_dir/
          ├ gcloud-config/  ← Docker Compose起動後に生成される
          ├ terraform/
          └ docker-compose.yml 

3. docker-compose.ymlの設定

version: '3.9'
services:
  terraform:
    image: hashicorp/terraform:1.2.1
    container_name: 'terraform'
    working_dir: /terraform   #コンテナ内の作業ディレクトリ指定
    volumes:
      - ./terraform/:/terraform:cached   #ローカルのterraformディレクトリ配下をコンテナ内の作業ディレクトリ内にバインドマウント
      - ./gcloud-config:/root/.config   #ローカルのgcloud認証情報をterraform用コンテナにバインドマウント

  gcloud:
    image: google/cloud-sdk:386.0.0-alpine
    container_name: 'gcloud'
    working_dir: /terraform
    volumes:
      - ./gcloud-config:/root/.config

volumes:
  gcloud-config:  #バインドマウント先としてローカルディレクトリ指定、存在しない場合は自動で作成される

バインドマウントとは端的にいうと指定したローカルファイル(or ディレクトリ)指定したコンテナ内のファイル(or ディレクトリ)リンクさせるイメージです。

つまり、ローカルで何かしらファイルやディレクトリを更新すればコンテナにも反映され、コンテナ内でファイルやディレクトリを変更すればローカルにも反映されます。

 

1. gcloudの認証情報をterraformコンテナで利用する流れ

docker-compose.ymlの設定を記載しただけでは、まだTerraformでGoogle Cloudリソースは作成できません。

まずTerraformからGoogle Cloudリソースを作成する場合、認証情報が必要になります。

認証情報取得の流れは下記のようになります。

gcloudコンテナ内にてgcloudコマンドで認証

↓

gcloudコンテナの認証情報が格納されるroot/.config配下をローカルのgcloud-configにマウント

↓

先ほどのマウントで認証情報が入ったローカルのgcloud-configディレクトリ配下をterraformコンテナ内のroot/.configにマウント

↓

terraformコンテナ内でGoogle Cloudのリソース作成可能

こういった流れがありgcloudの認証情報がterraformコンテナで必要なため、terraformコンテナ側のvolumes“./gcloud-config/:/root/.config”を設定することでコンテナ内で認証情報を使用できるようにしています。

ここで勘違いして欲しくないことがあります。

それは、コンテナはそれぞれ独立しているということです。

図で表すと下記のような状態です。

Docker Composeのコンテナ同士の概念図

つまりdocker-compose.ymlvolumesworking_dirなど2つのコンテナで共通している値を設定していますが、それぞれコンテナごと別物です。

下記にて「ここ」で表した部分です。

version: '3.9'
services:
  terraform:
    image: hashicorp/terraform:1.2.1
    container_name: 'terraform'
    working_dir: /terraform ← ここ①
    volumes:
      - ./terraform/:/terraform:cached
      - ./gcloud-config:/root/.config ← ここ②

  gcloud:
    image: google/cloud-sdk:386.0.0-alpine
    container_name: 'gcloud'
    working_dir: /terraform ← ここ①
    volumes:
      - ./gcloud-config:/root/.config ← ここ②

volumes:
  gcloud-config:

 

3. 環境構築手順

それでは実際に環境構築をどうやるのかを解説します。

まずはgloudコンテナ内でGoogle Cloudの認証情報取得を行います。これができればほぼ終わりです。

$ docker compose run --rm gcloud gcloud auth application-default login --project <使用するプロジェクトID>

上記のコマンドを実行すると下記のような指示が出ます。

You are authorizing client libraries without access to a web browser. Please run the following command on a machine with a web browser and copy its output back here. Make sure the installed gcloud version is 372.0.0 or newer.gcloud auth application-default login --remote-bootstrap="<ここに認証に必要な情報が出力されます。(省略)>"  出力されたコマンド Enter the output of the above command: 

上記の指示は出力されたgcloudから始まるコマンドをローカルのPC環境上で実行して出てきた出力値を“Enter the output of the above command:”に貼り付けなさいという指示なのでそれを実行します。

よって別タブを開いて下記を実行します。

$ gcloud auth application-default login --remote-bootstrap="<ここに認証に必要な情報が出力されます。(省略)>"

※ローカル環境にCloud SDKをインストールしないとgcloudコマンドは使用できません。(インストール方法はこちらの公式ドキュメントから確認してください。)

※ちなみにGoogle Cloud内のCloud Shellを使用してもエラーになるのでローカルで実行してください。

上記コマンドを実行するといろいろ出力されますが、その中から“https://localhost~”で始まる部分をコピーして先ほどの“Enter the output of the above command:”に貼り付けて実行します。

実行して下記のように出力されたら認証成功です。

Credentials saved to file: [/root/.config/gcloud/application_default_credentials.json]

These credentials will be used by any library that requests Application Default Credentials (ADC). Quota project "プロジェクト名" was added to ADC which can be used by Google client libraries for billing and quota. Note that some services may still bill the project owning the resource. Updates are available for some Google Cloud CLI components.  To install them, please run:   $ gcloud components update

ここまでできたらterraformコンテナ内でGoogle Cloudの認証情報が利用できるので、

あとはterraformディレクトリ配下に各種Google Cloudのリソース設定ファイルを記載して作成するだけです。

ここまでで環境構築は終わりです。

 

4. まとめ

いかがだったでしょうか。Dockerを利用すればこんなに簡単にterraformを使ったGoogle Cloudリソースを作成できる環境が構築できます。

もし、Dockerを使用せずに構築するとなるといちいちパッケージをインストールしたりローカル環境を汚さないといけません。

最近はこんな形で環境をサッと立ち上げる際は常にDockerを使用してます。かなり便利です。

みなさんもぜひ利用してみてください。

 

コメント

タイトルとURLをコピーしました