2
0

More than 3 years have passed since last update.

「Terraform」作成した GCE インスタンス中で、GitHub プライベートリポジトリからソースを落とす

Posted at

背景

Terraform を利用して GCP などのリソースを簡単に apply・destroy できるから、必要となる時に、GCE インスタンスを作って、GitHub 上のプライベートリポジトリのソースをインスタンスで動かすという要望はありました。

Terraform バージョン:

  • Terraform v0.12.28
  • provider.google v3.5.0

GitHub アカウントの SSH 秘密鍵

GitHub Docsを参照して、パスフレーズなしの SSH 秘密鍵を作ります。そして、作成した公開鍵(id_rsa.pub)は GitHub アカウントへ追加します。
秘密鍵(id_rsa)は Terraform で GCS バケットの作成とともに、バケットにアップロードします。

Cloud Storage バケット

gcs.tf

# GitHub 秘密鍵を格納するバケット
resource "google_storage_bucket" "github" {
  name          = var.gcp_bucket_github
  location      = var.gcp_region
  force_destroy = true
  storage_class = "STANDARD"
}

# GitHub 秘密鍵
resource "google_storage_bucket_object" "github-id-rsa" {
  name   = "github-id-rsa"
  source = "./id-rsa"
  bucket = google_storage_bucket.github.name
}

Compute Engine インスタンス

gce.tf
resource "google_compute_instance" "demo" {
  name         = "demo"
  machine_type = var.gcp_instance_type
  zone         = var.gcp_zone

  tags = ["demo"]

  boot_disk {
    initialize_params {
      image = "projects/debian-cloud/global/images/family/debian-10"
    }
  }

  network_interface {
    network    = google_compute_network.gcp-network.name
    subnetwork = google_compute_subnetwork.gcp-subnet.name

    // 省略不可
    access_config {
    }
  }

  metadata = {
    startup-script = templatefile("./gce_init.sh",
      {
        bucket_github   = google_storage_bucket.github.name
        id_rsa          = google_storage_bucket_object.github-id-rsa.name
    })
  }

  service_account {
    scopes = ["storage-ro"]
  }

  depends_on = [google_storage_bucket_object.github-id-rsa]
}

templatefile 関数

templatefile 関数を使って、「gce_init.sh」にバケット名とファイル名をパラメータで渡します。

gce_init.sh
#! /bin/bash

apt update
apt install -y git-all

# GitHub の秘密鍵(id_rsa) を GCS からダウンロードする
#echo gsutil cp gs://${bucket_github}/${id_rsa} id_rsa
gsutil cp gs://${bucket_github}/${id_rsa} id_rsa

chmod 400 /id_rsa
GIT_SSH_COMMAND='ssh -i /id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' git clone git@github.com:username/hoge.git

templatefile - Functions により、Terraform 0.12 からは追加されました。Terraform 0.11 までは template_file data sourceを使うことになります。

スコープ

インスタンスから GCS バケットアクセス(read)できるように、「storage-ro」と設定します。ほかのスコープは gcloud compute instances create  |  Google Cloudを参照してください。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0