Open8
GoogleCloudで遊ぶ
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
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
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
別プロジェクトのリソースをterraformで作成
GCE上のterraform実行
サービスアカウントの権限で実行可能
GCEにSSMエージェントをインストール
AWSへの接続と同じ方法にしたい
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
}
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準備
GKE認証プラグイン
クラスタ情報設定、確認
# 設定
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
クラスタを削除せず、GKEノードを0台にできる?
ノードプールを0にすることで可能
次回0→1台のノードにするときにノードのみの起動(クラスタは起動済)であるため時間短縮出来る
こんな感じにしておけばboolでノード数を管理可能
あとはcronなりスケジューラなりでどうとでもなる
resource "google_container_node_pool" "main" {
node_count = var.GoodNight ? 0 : 1
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の変更を無視すればいいですね