Open8

GoogleCloudで遊ぶ

not75743not75743

gcsを試す

  • 作る
    • AWSと違ってリージョンが指定できる
    • ストレージタイプを選ぶ
    • 公開アクセス設定
    • データの暗号化
  • GUIで操作する
    • s3とほぼ同じな気がする
  • CLIで操作する
    • いまのところs3と同じ
# バケット作成
gsutil mb gs://test-gcs-bucket-20240101

# ローカルのファイルコピー
gsutil cp ./test.txt gs://test-gcs-bucket-20240101/

# ファイルの削除
gsutil rm gs://test-gcs-bucket-20240101/test.txt

# バケット削除
gsutil rb gs://test-gcs-bucket-20240101 
not75743not75743

CLIの権限周り

# GoogleCloudアカウントのリスト
gcloud auth list

# 現在のプロジェクトを表示
gcloud config list project

# プロジェクト一覧を確認
gcloud projects list

# 現在のプロジェクトを確認
 gcloud config get-value project

# 既存のプロジェクトへ切り替え
gcloud config set project <プロジェクト名>

configurations周りの操作

# 新しいプロジェクトを作成
gcloud init

# 利用するconfigurationのactivate
gcloud config configurations activate [CONFIGURATION_NAME]

# activateしたconfigurationの設定
gcloud config set project [PROJECT_ID]
gcloud config set account [ACCOUNT]

# configの一覧
gcloud config configurations list
not75743not75743

GCE周りのコマンド

# インスタンス詳細確認
gcloud compute instances describe $InstanceName

# インスタンスの停止
gcloud compute instances stop $InstanceName \
	--zone asia-northeast1-a

# インスタンスの起動
gcloud compute instances start $InstanceName \
	--zone asia-northeast1-a

### firewall
# ファイアウォールルール作成
gcloud compute firewall-rules create test-rule \
  --network=<network name> \
  --direction=INGRESS \
  --priority=1000 \
  --action=allow \
  --rules=tcp:22 \
  --source-ranges=192.168.1.100/32 \
  --target-tags=ssh-access

# プロジェクトで利用可能なファイアウォールを確認
gcloud compute firewall-rules list --filter="network:${ProjectName}"

# ファイアウォールルール削除
gcloud compute firewall-rules delete test-rule

### 権限周り
# インスタンスのサービスアカウント確認
gcloud compute instances describe $InstanceName --format='get(serviceAccounts.email)'

# サービスアカウント作成
gcloud iam service-accounts create test-instance-servicerole --display-name "test-instance-servicerole"

# サービスアカウントのメールアドレス取得
gcloud iam service-accounts list

# サービスアカウント削除(`serviceAccount:`プレフィックスは不要)
gcloud iam service-accounts delete <メールアドレス>

# ロールの割当
gcloud projects add-iam-policy-binding <project id> \
	--member "serviceAccount:<ServiceAccount Mail>" \
	--role "roles/compute.osLogin" \
	--role "roles/storage.objectViewer"

# サービスアカウントの詳細確認
gcloud iam service-accounts describe <ServiceAccount Mail>"

# サービスアカウントに割り当てられたロールの確認
gcloud projects get-iam-policy [PROJECT_ID]

# インスタンスとサービスアカウントの紐付け
gcloud compute instances set-service-account $InstanceName \
	--service-account <ServiceAccount Mail> \
	--zone asia-northeast1-a

# インスタンスとサービスアカウントの紐付けを解除
gcloud compute instances set-service-account $InstanceName \
	--no-service-account \
	--no-scopes \
	--zone asia-northeast1-a
not75743not75743

GCEにSSMエージェントをインストール

AWSへの接続と同じ方法にしたい
https://scrapbox.io/not75743/【AWS%2FSSM】GCEにセッションマネージャーエージェントをインストールし、接続する

GCS/サービスアカウント/GCEをterraformで作る練習

やりたいことは

  • 作成したGCSにアクセス可能
  • セッションマネージャで接続出来る
    • アクティベーションID/コードはterraformの変数側で管理する
terraform
### VPC/Subnet
data "google_compute_network" "vpc" {
  name = "<vpc name>"
}

data "google_compute_subnetwork" "pub_sub_1" {
  name    = "<subnet name>"
  region  = var.gc_region
  project = var.project_id
}

### Storage
resource "google_storage_bucket" "main" {
  name          = "test-bucket-20240103"
  location      = "ASIA"
  force_destroy = true
}

### IAM
resource "google_service_account" "main" {
  account_id   = "gcs-access-sa"
  display_name = "GCS Access Service Account"
}

resource "google_project_iam_binding" "sa_gcs_binding" {
  project = var.project_id
  role    = "roles/storage.admin"

  members = [
    "serviceAccount:${google_service_account.main.email}",
  ]
}

## GCE
resource "google_compute_instance" "main" {
  name         = "test-terraform"
  machine_type = "e2-medium"
  zone         = "asia-northeast1-a"

  boot_disk {
    initialize_params {
      image = "ubuntu-os-cloud/ubuntu-minimal-2204-jammy-v20231213b"
    }
  }

  network_interface {
    network    = data.google_compute_network.vpc.self_link
    subnetwork = data.google_compute_subnetwork.pub_sub_1.name
    network_ip = "<private ip>"
    access_config {}
  }

  service_account {
    email  = google_service_account.main.email
    scopes = ["https://www.googleapis.com/auth/cloud-platform"]
  }

  metadata_startup_script = <<EOF
    #!/bin/bash
    mkdir /tmp/tmpdir
    curl -s https://s3.${var.aws_region}.amazonaws.com/amazon-ssm-${var.aws_region}/latest/debian_amd64/amazon-ssm-agent.deb -o /tmp/tmpdir/amazon-ssm-agent.deb
    apt install -y /tmp/tmpdir/amazon-ssm-agent.deb
    systemctl stop amazon-ssm-agent.service
    amazon-ssm-agent -register -code "${var.activation_code}" -id "${var.activation_id}" -region ${var.aws_region}
    systemctl start amazon-ssm-agent.service
    rm -rf /tmp/tmpdir
    EOF
}
not75743not75743

GKEを試す

terraform
### VPC/Subnet
data "google_compute_network" "vpc" {
  name = "<vpc name>"
}

data "google_compute_subnetwork" "pub_sub_1" {
  name    = "<subnet name>"
  region  = var.gc_region
  project = var.project_id
}

### GKE
resource "google_container_cluster" "main" {
  name                     = "test-cluster"
  location                 = var.zone
  network                  = data.google_compute_network.vpc.self_link
  subnetwork               = data.google_compute_subnetwork.pub_sub_1.name
  remove_default_node_pool = true
  initial_node_count       = 1

  master_auth {
    client_certificate_config {
      issue_client_certificate = false
    }
  }
}

resource "google_container_node_pool" "main" {
  name       = "test-primary-nodes"
  location   = var.zone
  cluster    = google_container_cluster.main.name
  node_count = 1

  node_config {
    preemptible  = false
    machine_type = "e2-medium"

    oauth_scopes = [
      "https://www.googleapis.com/auth/cloud-platform",
    ]
  }
}

kubectl準備

https://kubernetes.io/ja/docs/tasks/tools/install-kubectl/

GKE認証プラグイン

https://cloud.google.com/kubernetes-engine/docs/deprecations/auth-plugin?hl=ja

クラスタ情報設定、確認

# 設定
gcloud container clusters get-credentials [CLUSTER_NAME]

# 確認
~$ kubectl version
Client Version: v1.29.0
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.27.3-gke.100
WARNING: version difference between client (1.29) and server (1.27) exceeds the supported minor version skew of +/-1

いつものnginxを試すやつ

nginx
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
$ kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-57d84f57dc-vsftl   1/1     Running   0          57s
not75743not75743

クラスタを削除せず、GKEノードを0台にできる?

ノードプールを0にすることで可能
次回0→1台のノードにするときにノードのみの起動(クラスタは起動済)であるため時間短縮出来る

こんな感じにしておけばboolでノード数を管理可能
あとはcronなりスケジューラなりでどうとでもなる

resource "google_container_node_pool" "main" {
  node_count = var.GoodNight ? 0 : 1
not75743not75743

GKEノードプール周り

export ClusterName="<クラスタ名>"
export Zone="<ゾーン>"
export NodePool="<ノードプール名>"
export NodeNum=<ノード数>

# ノードプール確認
gcloud container node-pools list --cluster $ClusterName --zone $Zone

# 指定した数にスケーリング
gcloud container clusters resize $ClusterName --node-pool $NodePool --num-nodes $NodeNum --zone $Zone

ノード数はこちらで管理して、terraform側はignore_changesでnode_countの変更を無視すればいいですね