背景
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 バケット
# 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 インスタンス
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」にバケット名とファイル名をパラメータで渡します。
#! /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を参照してください。