SOULs Gcloud

souls gcloud コマンドでは Google Cloud SDK を使用することができます。

souls help gcloud

$ souls help gcloud
Commands:
  souls gcloud auth_login           # gcloud config set and gcloud auth login
  souls gcloud compute [COMMAND]    # souls gcloud compute Commands
  souls gcloud config_set           # gcloud config set
  souls gcloud enable_permissions   # Enable Google Cloud APIs for SOULs Framework
  souls gcloud functions [COMMAND]  # souls gcloud functions Commands
  souls gcloud help [COMMAND]       # Describe subcommands or one specific subcommand
  souls gcloud iam [COMMAND]        # souls gcloud iam Commands
  souls gcloud pubsub [COMMAND]     # souls gcloud pubsub Commands
  souls gcloud run [COMMAND]        # souls gcloud run Commands
  souls gcloud scheduler [COMMAND]  # souls gcloud schedluer Commands
  souls gcloud sql [COMMAND]        # souls gcloud sql Commands

auth_login

プロジェクトを設定し、Google Cloud へログインします。

$ souls gcloud auth_login

compute

souls gcloud compute コマンド一覧を表示します。

$ souls gcloud compute help
  Commands:
    souls compute help [COMMAND]  # Describe subcommands or one specific subcommand
    souls compute setup_vpc_nat   # Set Up VPC Cloud Nat

setup_vpc_nat

以下の項目が実行されます。

  • VPC ネットワークの作成
  • Firewall TCP ルールの作成
  • Firewall SSH ルールの作成
  • ネットワークサブネット の作成
  • VPC アクセスコネクター の作成
  • Router の作成
  • External IP の取得
  • Cloud NAT の作成

SOULs コマンド:

$ souls gcloud compute setup_vpc_nat
def setup_vpc_nat(range: "10.124.0.0/28")
  create_network
  create_firewall_tcp(range: range)
  create_firewall_ssh
  create_subnet(range: range)
  create_connector
  create_router
  create_external_ip
  create_nat
  nat_credit
end

config_set

ローカルの Google Cloud のプロジェクトを設定します。

souls gcloud config_set

enable_permissions

functions

iam

create_service_account

Google Cloud Service Account を作成します。

SOULs コマンド:

$ souls gcloud iam create_service_account service_account: "souls-app"
def create_service_account(service_account: "souls-app")
  `gcloud iam service-accounts create #{service_account} \
  --description="SOULs Service Account" \
  --display-name="#{service_account}"`
end

create_service_account_key

Google Cloud Service Account Key を生成します。

SOULs コマンド:

$ souls gcloud iam create_service_account_key service_account: "souls-app" project_id: "souls-app"
def create_service_account(service_account: "souls-app")
  `gcloud iam service-accounts create #{service_account} \
  --description="SOULs Service Account" \
  --display-name="#{service_account}"`
end

add_service_account_role

Google Cloud Iam の Policy を追加します。

SOULs コマンド:

$ souls gcloud iam add_service_account_role service_account: "souls-app" project_id: "souls-app" role: "roles/firebase.admin"
def add_service_account_role(
  service_account: "souls-app", project_id: "souls-app", role: "roles/firebase.admin"
)
  system(
    "gcloud projects add-iam-policy-binding #{project_id} \
  --member='serviceAccount:#{service_account}@#{project_id}.iam.gserviceaccount.com' \
  --role=#{role}"
  )
end

add_permissions

Google Cloud Iam の 権限に

以下のロールを追加します。

roles = [
    "roles/cloudsql.editor",
    "roles/containerregistry.ServiceAgent",
    "roles/pubsub.editor",
    "roles/datastore.user",
    "roles/iam.serviceAccountUser",
    "roles/run.admin",
    "roles/storage.admin",
    "roles/storage.objectAdmin"
  ]

SOULs コマンド:

$ souls gcloud iam add_permissions service_account: "souls-app" project_id: "souls-app"
def add_permissions(service_account: "souls-app", project_id: "souls-app")
  roles = [
    "roles/cloudsql.editor",
    "roles/containerregistry.ServiceAgent",
    "roles/pubsub.editor",
    "roles/datastore.user",
    "roles/iam.serviceAccountUser",
    "roles/run.admin",
    "roles/storage.admin",
    "roles/storage.objectAdmin"
  ]
  roles.each do |role|
    add_service_account_role(service_account: service_account, project_id: project_id, role: role)
  end
end

pubsub

create_topic

Google Cloud PubSub Topic を作成します。

SOULs コマンド:

$ souls gcloud pubsub create_topic topic_name: "send-user-mail"
def create_topic(topic_name: "send-user-mail")
  system("gcloud pubsub topics create #{topic_name}")
end

topic_list

Google Cloud PubSub Topic List を取得します。

SOULs コマンド:

$ souls gcloud pubsub topic_list
def topic_list
  system("gcloud pubsub topics list")
end

create_subscription

Google Cloud PubSub Subscription を作成します。

SOULs コマンド:

$ souls gcloud pubsub create_subscription topic_name: "send-user-mail" endpoint: "https:://test.com"
def create_subscription(
  topic_name: "send-user-mail",
  project_id: "",
  service_account: "",
  endpoint: "https:://test.com"
)
  project_id = SOULs.configuration.project_id if project_id.blank?
  service_account = "#{SOULs.configuration.app}@#{project_id}.iam.gserviceaccount.com" if service_account.blank?
  system(
    "gcloud pubsub subscriptions create #{topic_name}-sub \
    --topic #{topic_name} \
    --topic-project #{project_id} \
    --push-auth-service-account #{service_account} \
    --push-endpoint #{endpoint} \
    --expiration-period never
    "
  )
end

update_subscription

Google Cloud PubSub Subscription のエンドポイントを更新します。

SOULs コマンド:

$ souls gcloud pubsub update_subscription topic_name: "send-user-mail" endpoint: "https:://test.com"
def update_subscription(
  topic_name: "send-user-mail",
  endpoint: "https:://test.com"
)
  system("gcloud pubsub subscriptions update #{topic_name}-sub --push-endpoint #{endpoint} ")
end

subscription_list

Google Cloud PubSub Subscription List を取得します。

SOULs コマンド:

$ souls gcloud pubsub subscription_list
def subscription_list
  system("gcloud pubsub subscriptions list")
end

run

awake

対象の URL に 10 分ごとにアクセスします。 これは主に Google Cloud Run の 15 分ごとにスリープ状態に入ることを防ぐときに使用しています。

SOULs コマンド:

$ souls gcloud run awake URL
def awake(url)
  app = SOULs.configuration.app
  system(
    "gcloud scheduler jobs create http #{app}-awake
    --schedule '0,10,20,30,40,50 * * * *' --uri #{url} --http-method GET"
  )
end

sql

create_instance

Google Cloud SQL Instance を作成します。

$ souls gcloud sql create_instance

setup_private_ip

このコマンドによって

  • VPC IP アドレス範囲の作成
  • VPC Peering Connector の作成
  • Cloud SQL の Private IP の有効化

を自動で行っています。

$ souls gcloud sql setup_private_ip
def setup_private_ip
  create_ip_range
  create_vpc_connector
  assign_network
end

assign_network

Google Cloud SQL に VPC Network を接続する

$ souls gcloud sql assign_network
def assign_network
  app_name = SOULs.configuration.app
  instance_name = "#{SOULs.configuration.app}-db"
  project_id = SOULs.configuration.project_id
  system("gcloud beta sql instances patch #{instance_name} --project=#{project_id} --network=#{app_name}")
end

create_ip_range

Google Cloud VPC Network に IP 範囲を作成する

$ souls gcloud sql create_ip_range
def create_ip_range
  app_name = SOULs.configuration.app
  system(
    "
    gcloud compute addresses create #{app_name}-ip-range \
      --global \
      --purpose=VPC_PEERING \
      --prefix-length=16 \
      --description='peering range for SOULs' \
      --network=#{app_name} \
      --project=#{app_name}"
  )
end

create_vpc_connector

Google Cloud VPC Connector を作成する

$ souls gcloud sql create_vpc_connector
def create_vpc_connector
  app_name = SOULs.configuration.app
  system(
    "
    gcloud services vpc-peerings connect \
      --service=servicenetworking.googleapis.com \
      --ranges=#{app_name}-ip-range \
      --network=#{app_name} \
      --project=#{app_name}
    "
  )
end

assign_ip

Google Cloud SQL に 現在使用しているグローバル IP を White List に追加する。

$ souls gcloud sql assign_ip
def assign_ip(instance_name: "", ip: "")
  ip = `curl inet-ip.info` if ip.blank?
  project_id = SOULs.configuration.project_id
  instance_name = "#{SOULs.configuration.app}-db" if instance_name.blank?
  system(
    "
    gcloud beta sql instances patch #{instance_name} \
      --project=#{project_id} \
      --assign-ip \
      --authorized-networks=#{ip} \
      --quiet
    "
  )
end