/// BANGBOO BLOG ///
■21/6/9 12:01AM
k8s
全て想像ですが
読み方はケーツと読みます、半端ねーてす

ケツが扱う最小単位がPodで1つの機能を持つ(Podは1つ以上のコンテナを含む)
ReplicaSetは複数のPodを組み合わせてアプリを実現する
DeploymentはReplicaSetを管理、アップデートの際は新規ReplicaSetを作成してバージョン更新を行う
ServiceはDeploymentに対してIPアドレスやLBを設定してサービス提供する
クラスターはServiceが複数動く環境、1つのMasterと複数のNodeから構成され
 Nodeはコンテナを動かす為のサーバ、MasterはNodeを管理しスケジューリングやオートスケールを行う

■流れ
 GKEでクラスタを作成
 Kubectrlをインスコ
 KubectlでPodを立ち上げ>Deploymentができる、複数Podの起動も Kubectlでサービス公開設定
【GCP入門編・第7回】Google Container Engine (GKE) での Docker イメージの立ち上げ方 | 株式会社トップゲート (topgate.co.jp)

 サービスアカウント作成
 ネームスペース、kubeサービスアカウント作成
 サービスアカウントとKubeサービスアカウント紐づけ(gcloudとbubectlの両方)
 Yamlで機能を宣言しKubectlでデプロイ

Pod(論理ホスト/インスタンスみたいな) 一意のIPが自動的に割り当てられる Pod内のコンテナはlocalhostで互いに通信、コンテナ間で共有するストレージ Podを直接作成は非推奨 CPU/メモリの最小と最大を設定
Workload identityでServiceAccountとケツのサービスアカウントを紐づけ認証k8sのsecretはPw/Oauthトークン/SSH key等を含むオブジェクト(base64エンコード生) 使う方法3種類:コンテナにマウント、コンテナの環境変数、Pod生成時にケツがpull  どこに置くか、どう暗号化するか、gitに置かない等の考慮が必要

=========
Dockerがアプリを持ち、k8sがそのオーケストレーション複数台でまとめたクラスターで故障があっても切り替え可用性を保つ そのクラスターをnamespaceで分割し複数チームで利用することも可稼働中にサーバ追加のスケールをしたりロールバックできるpodにIPを割り振ったり、DNS名を振ったり、負荷分散したり自動デプロイでコンテナイメージをサーバ群へ展開するDockerのホスト管理、コンテナのスケジューリング、ローリングアップデート、死活監視、ログ管理等々masterとworkerで構成されmaster3台、worker2台~位のサーバ要るExternalname>LoadBalancer>NodePort>ClusterIPコンテナにはストレージを置かず外部に持たせろユーザ管理も必要Dockerはイメージという感じか、複数OSを入れられるヤツ
で、それらを束ね管理するのがケーツhttps://www.kagoya.jp/howto/rentalserver/kubernetes/https://udemy.benesse.co.jp/development/system/kubernetes.html

=========
↓実際のアプリがないとイメージ沸かん

クイックスタート: 言語に固有のアプリのデプロイ  |  Kubernetes Engine ドキュメント  |  Google Cloud
コンテナ化されたウェブ アプリケーションのデプロイ  |  Kubernetes Engine  |  Google Cloud
Cloud buildを使用してアプリをコンテナイメージにパッケージ化
GKEでクラスタを作成、コンテナイメージをクラスタにデプロイ

PHP のドキュメント  |  Google Cloud
PHP スタートガイド  |  Google Cloud
Firestore でのセッション処理  |  PHP  |  Google Cloud 複数インスタンスのsession管理にはFirestore
PHP でのユーザーの認証  |  Google Cloud IAP(Identity-Aware Proxy)
アプリがPHPならこれを参照

PHP を使用したバックグラウンド処理  |  Google Cloud
 Cloud run(コンテナ化アプリのスケールできる実行、CICDで自動Terraform applyできる?)と
 Pub/Sub(イベントドリブンでメッセージングとデータ取り込み)
Comment (0)

■21/5/20 9:00PM
GCP
■GCP
https://techblog.gmo-ap.jp/category/gcp/
https://tech.zeals.co.jp/entry/2019/01/08/094054
https://techblog.gmo-ap.jp/category/tensorflow/

12 か月間300 ドル分だけ無料
https://console.cloud.google.com

無料だとBigQueryのDML(insert)ができないらしい
予算とアラートを1円で設定(通知チャネルにSMSとメール設定)

辞めるときはプロジェクトをシャットダウン&請求先アカウントの閉鎖
1)プロジェクトの閉鎖
Google Cloud Console > IAMと管理 > 設定 > シャットダウン
2)請求先アカウントの閉鎖(原因不明だが下記画面が出るときと出ないときがった)
Google Cloud Console > お支払い > (左ナビ)アカウント管理 > 請求先アカウントの閉鎖
※お支払い>マイプロジェクト>アクション>無効や請求先変更ができる

セキュリティは使用GoogleアカウントのSMSによる2段階認証、信用するデバイスの設定があるようだ

【GCP入門編・第3回】難しくない! Google Compute Engine (GCE) でのインスタンス起動方法! | 株式会社トップゲート (topgate.co.jp)
【GCP入門編・第12回】 BigQuery を使って気軽にビッグデータの解析を行ってみよう! | 株式会社トップゲート (topgate.co.jp)
【GCP入門編・第25回】 Cloud SQL for MySQL で Master-Slave 構成を組もう! | 株式会社トップゲート (topgate.co.jp)
【GCP入門編・第29回】Cloud Load Balancing で Web アプリケーションにロードバランサーを設定する | 株式会社トップゲート (topgate.co.jp)
【初心者】GCP Identity-Aware Proxy (IAP), Access Context Managerを使ってみる (WEBサーバへのアクセス制限) - Qiita
Cloud Loggingの利用方法 | apps-gcp.com
Cloud Loggingのコスト - Qiita

■IAM(Identity and Access Management) 
https://cloud.google.com/iam/docs/overview?hl=jahttps://cloud.google.com/iam?hl=ja
IAMベストプラクティス https://cloud.google.com/iam/docs/using-iam-securely
操作方法 https://cloud.google.com/iam/docs/how-to?hl=ja
ロール https://cloud.google.com/iam/docs/understanding-roles?hl=jahttps://www.isoroot.jp/blog/1244/https://medium.com/google-cloud-jp/gcp-iam-beginner-b2e1ef7ad9c2

//IAMの機能機械学習を使ったスマート アクセス制御の最適化デバイスのセキュリティ、IP アドレス、リソースタイプ、日時などの属性に基づいて、リソースに対するきめ細かいアクセス制御ポリシー権限の認可、解除、委任に関するすべての監査証跡の履歴ユーザーとグループのプロビジョニングや管理、シングル サインオンの設定、2 要素認証プロセス(2FA)
//IAMポリシー
IDをGroup(●●部)にアサイン Members(Group等)にRoles(●●役)をアサイン  MembersとはグループやドメインやID(Googleユーザアカウント、サービスアカウント) Roles(●●役)にPermissions(権限)を付与
ロールは作成ができ●●世話役みたいな感じか
permissionsは権限で「resourcemanager.projects.get」とかで付与する
 個人や無料アカだと組織がない?→フォルダが作成できない?
 組織がないとグループが作成できない→グループがないとIDにRoleを付与するしか
フォルダは組織ツリー状でリソース管理、組織改編が多いなら業務フォルダでも
ポリシーはMSのGPOみたいものも組み込みで存在する
サービスアカウントはAPI用、人が使うことは基本想定されていない(impersonateできるが
//リソース
階層:Organization > Folders > Project > Resource(Google Cloud services)
割り当て:日や分に対してのデータ量の上限等を設定
必要以上に権限を付与しない組み込みロールが多い、改変してロールを作るか権限はサービス名.リソース.動詞という命名規則
プロジェクト名はGCPグローバルで名前空間を共有しており、企業名等でprefixするのがいい
プロジェクト毎にメールグループを設け、権限はメールグループの参加で管理したい
■authorized view 承認済みview(BQ権限)
設定すると権限を元のテーブルにさかのぼり付与しなくてもいい(設定がないと元テーブルにも権限が要る)
BigQueryの承認済みビュー設定方法 - Qiita
■GCP Cloud asset inventory 5週間分の履歴が保管される CAI exportにより任意のタイムスタンプでBQあるいはGCSに履歴情報を吐き出す gcloud CLIのgcould asset search-all-resourseコマンドにより設定
  BQに吐き出し各種状況のチェックやポリシーのチェックに活用

■他
///gcloudをプロキシで使う環境設定とかhttps://qiita.com/tora470/items/bc00bef8cba9f9acecc7

///サービスアカウントで認証
Google Cloud SDKのインストールと認証の設定について - TASK NOTES (task-notes.com)
秘密鍵さえあれば成り済ませる
 ※サービスアカウントはサービスを有効化したときに動作用に自動作成されたり、別途手動でも作れる

サービスアカウントのキーを作成しローカルに保存SSHでGCEのVMに内容をコピペしてキーファイルを作成下記でSAとしてログインgcloud auth activate-service-account ketsu@un.com --key-file /home/ketsu/sakey.jsoncloud shell terminalでもファイルをアップロードできるのでup後下記でOKgcloud auth activate-service-account ketsu@un.com --key-file sakey.jsonログオン切替終わるとき rm sakey.json
shellセッションごとに環境変数でkeyを設定する方法も
認証のスタートガイド  |  Google Cloud

/// サービスアカウントキーを発行せずにサービスアカウント権限を使うサービスアカウントに直接成り代わって gcloud コマンドを実行する - Qiitaサービスアカウントに使いたいロールを付与(roles/accesscontextmanager.policyAdminとか)自身にroles/iam.serviceAccountTokenCreatorを付与叩く gcloud projects get-iam-policy project-id-xxxxx --impersonate-service-account ※tfだとproviderにimpersonate_service_accountを追加する形
///Loadbalancer
 IAPはhttp LB/GCE/AppEngineに
 Internal LBにExternal IPは無理

///NoSQL
=not only sql、分散kvsだったりの非構造化データ、下記2つのみ提供 キーを指定してCRUD(追加、取得、更新、削除) キーの範囲かキーの前方一致でのスキャン

///bigtable
高スループット低レイテンシー読み書き速く膨大なユーザや数千万件テラ以上でgmail、GA、マップ等々で使われている
///cloud functionsサーバレスでRESTみたいな形でURLでサーバアプリを実行、Node.js/PHP/Python等のコードが直接コンソールに掛ける
 ブラウザでcloud functionsにアクセスしたら下記が出た
Error: Forbidden Your client does not have permission to get URL/kuso-ketsu from this server
呼び出しの認証  |  Google Cloud Functions に関するドキュメントcurl https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME  -H "Authorization: bearer $(gcloud auth print-identity-token)"
↑curlでいいなら、コンソールで[未認証の呼び出しを許可する] 設定 + allusersでも可
///Pub/Sub
パプリッシャーからサブスクライバーにメッセージ転送、順序設定可BQ テーブルにデータをエクスポートする Dataflow ジョブGCS でデータをテキスト ファイルまたは Avro ファイルにエクスポートするための Dataflow ジョブ
///BQ job エラー
bq show -j <job-id>
クエリならjob/query historyでわかるがbq cmdでもエラーが返る
bq query --nouse_legacy_sql 'select ketsu from `prj`.oshi.ri'
 unrecognized name: 'kusofuke@ketsu.com' at [1:149]

///gcloud cmd
gcloud organization list GCP IDやGoogleWorkspace IDが分かる

///Recommender
API の使用 - 推奨事項  |  Recommender のドキュメント  |  Google Cloud

///セック
セキュアなBigQueryの運用方法 - Speaker Deck
 IAM condition: 20時以降はアクセスできない等時間やリソースで権限制御 VPC-ServiceControls: VPC+FWで制限を掛けられなかったがIPやIDで制限を掛ける(クレデンシャル漏洩防御)GCPでセキュリティガードレールを作るための方法と推しテク - Speaker Deck
 サブネット作成の際はセキュリティの観点からフローログを15分で取る 監査ログを有効に ContainerResistryの脆弱性スキャンを有効に ログ:データアクセス/ポリシー拒否は30日、管理アクティビティは400日  BQにバックアップしたい SecurityCommandCenterで脆弱性を検知
■アプリ
公開資料 - App Modernization OnAir 〜 モダンなアプリケーション開発とは 〜 (cloudonair.withgoogle.com)
cloud runの設定だけでCDCIできる(第10回

■ハンズオン(GAE:php+FW+IAP)IAPはGAEが簡単そう(アクセスするのにGoogleの認証プロンプトを出す)
 自前DNSにTXTレコードを設定>確認>IPが表示されAレコードやCnameも登録でき、SSL証明書も使えるようだ
  しかし無くてもgoogle提供のドメインが使え不要 DNS(TXTレコード)による所有権の確認 - Google Search Consoleの使い方 (howtonote.jp)
 WinローカルにGCP SDKインスコし下記にapp.yamlとindex.phpを置いてcmd→ gcloud app deploy
  C:\Users\おまはんのユッザー名\AppData\Local\Google\Cloud SDK\php
 IAPを有効にしIAM secured userの権限とIAMでGAE viewer権限付与で@gmail.comユーザ等は見れる
  外部ドメインを使うときはIdentityPlatform設定が必要そう
止めるにはinstanceを削除する(再度アクセスでinstanceが自動作成される)、IngressをInternal onlyにすると一応止まるか、楽だ
■ハンズオン(GCE+nginx+FW+LB+IAP)
●cloud shell terminalgcloud compute instances list インスタンス一覧●コンソールGCE VMを作成
 instance template作成 ubuntu18
 instance group作成 あるいは VM instance作成(外部からアクセスさせずLBで?)SSHの項目からview gcloud commandで好きなSSHターミナルからアクセスできるcmd出る gcloud beta compute ssh --zone "asia-northeaset1-b" "instance-3" --tunnel -through-iap --project "bangboo-sandbox"●SSHターミナルgcloud init インスコsudo apt-get install nginx Webサーバインスコ、ブラウザで内部IPでアクセスしたかったが不可だったsudo service nginx stop 止める、動かすのは sudo service nginx startps プロセス見るcurl http://10.117.0.19 nginxが動いているか確認cat /var/log/nginx/access.log ログ確認
●nginx
/etc/nginxにあるconf系が設定ファイル
sites-enabled/default だけなので cat default でroot/var/www/htmlが判明 ここへ移動
sudo cp index.nginx-debian.html index.html コピー
sudo nano index.html で編集
設定変更後は sudo service nginx restart●コンソール
FW作成
 fw-bangboo-http-egress-allow ingress - "all instances" - 0.0.0.0/0 デフォルトで許可+ingressが必要
  httpsはIPではダメか、ドメイン/証明書が要るか知らんがhttpではアクセスできる
   GCPのIPを自前のDNSのAレコードに設定しとけば、、
   ウェブとメールを別々のサーバで運営したい?・・・それ、ゾーン設定で出来ます! | さくらのナレッジ (sakura.ad.jp)
   ドメイン所有はDNSにTXTレコード設定ができるようだが、、、
   ウェブマスター セントラル (google.com)LB作成 VMインスタンスグループ(子インスタンス)作成  インスタンステンプレート作成 LBヘルスチェック(閾値)が要る httpLBならIPレンジが要る>VPC networkで同resionで使われていないものを設定  例10.55.20.0/22なら10.55.23.255まで使われているので10.55.25から使うとか  NW計算 ネットワーク計算ツール・CIDR計算ツール | Softel labsVMインスタンス停止、LB停止
sute16 asia-northeast1-b 2021/7/24(91日で33000yen-10/20位まで)
Instance groupはどう止める?>LB削除>LBのバックエンド削除>Instance group削除
 LBはinstance groupがいる、IAPはGCEの場合はLBにSSL証明書要る
  DNSのAレコードを登録しLB設定すれば証明書入る(DNSのTTLを前日に3600から300に変更しておいたり、DNS反映期間があったり)
   毎回検証終了時につぶして、立てるのが面倒そうだな
PHP appサーバ+BigQuery+BigTable+MySQL DBサーバ+α?
【初心者】GCP Identity-Aware Proxy (IAP), Access Context Managerを使ってみる (WEBサーバへのアクセス制限) - QiitaGKEでnginxを外部アクセス可能にするまで - QiitaGCPにセキュアな踏み台サーバーを作成する. GCPのIdentity-Aware… | by Taiga Murakami | google-cloud-jp | Medium

●外部IPExternal IP addressで取得、300円/月位、通常一つは自動で割り当てられる


End
Comment (0)

■21/5/2 10:14PM
Terrafirma
公式https://www.terraform.io/docs/index.html
導入https://www.terraform.io/guides/core-workflow.html推奨方法https://www.terraform.io/docs/cloud/guides/recommended-practices/index.html https://www.terraform.io/docs/cloud/guides/recommended-practices/part1.html https://www.terraform.io/docs/cloud/guides/recommended-practices/part2.html https://www.terraform.io/docs/cloud/guides/recommended-practices/part3.html https://www.terraform.io/docs/cloud/guides/recommended-practices/part3.1.html https://www.terraform.io/docs/cloud/guides/recommended-practices/part3.2.html https://www.terraform.io/docs/cloud/guides/recommended-practices/part3.3.html https://www.terraform.io/docs/cloud/guides/recommended-practices/part3.4.html
チュートリアルhttps://learn.hashicorp.com/collections/terraform/gcp-get-startedHCLhttps://www.terraform.io/docs/language/index.htmlCLI aka cmd(アルファベットリストから使う)https://www.terraform.io/docs/cli/auth/index.htmlGCP用リファレンスhttps://registry.terraform.io/providers/hashicorp/google/latest/docs

お便強https://qiita.com/minamijoyo/items/1f57c62bed781ab8f4d7https://qiita.com/donko_/items/6289bb31fecfce2cda79https://www.apps-gcp.com/infra-automation-01/https://techblog.gmo-ap.jp/2017/11/16/terraform%E3%81%A7gcp%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/https://colsis.jp/blog/gcpterraform/
Infra as codeとしてインフラの構築や設定をコード化できる特にクラウドだと構築の自動化や構成管理等でのレバレッジが強力
■段階
Terraformとは?基本知識とTerraformのメリット4つを紹介 | テックマガジン from FEnetインフラ
必要なリソースをTerraform化>workspaceの活用>main.tfの共通部分をmodule化

Terraform運用事例書きました - pixiv insidemoduleは構成に合わないようなリファクタリングが必要になった時にterraform state mv が必要になってとたんにつらい、moduleを細分化しすぎるとvariable と output が大量に必要になって書きづらい、moduleは再利用できる複数のリソースの単位(プログラミング言語でいうところの関数みたいなもの)で作るのがしっくり

Terraform職人入門: 日々の運用で学んだ知見を淡々とまとめる - Qiitaリソースの差分を無視するlifecycleブロックを使うresource "aws_autoscaling_group" "app_1" {  name = "app-asg-1"  lifecycle {    ignore_changes = ["load_balancers"]    create_before_destroy = true//新しいのを作ってから古いのを削除  }}外部ファイルを文字列として読み込むresource "aws_iam_role" "ec2_role" {  name = "ec2-role"  assume_role_policy = "${file("./ec2_assume_role_policy.json")}"}1つのディレクトリで複数のStateを扱うWorkspaceという機能もあるのですが、個人的には普通にディレクトリを分けて管理する方が楽production/stagingが完全に同じリソース構成で、設定のパラメータの差分がちょっとだけあるという理想的な世界ではWorkspaceでも運用できるかもしれませんが、現実的にはstagingだけリリース前の検証用の一時的なリソースが立ってたりとか、完全に同じ構成にならないことも多いので、モジュールの読み込みの有無や一部の環境だけ存在するリソースなどの差分を吸収できる場所があったほうが都合がよい
Terraform職人再入門2020 - Qiita
モジュールが公式から提供されている
Browse Modules | Terraform Registry

Terraform の terraform.tfvars とは | 30歳未経験からのITエンジニア (se-from30.com)
環境情報は外部ファイルが基本prd/stg/dev環境はprd.tfvars, stg.tfvars, dev.tfvarsを用意.tfvars 各環境の設定 aws_access_key    = "XXXXXXXXXXXXXXXXXXXX" aws_secret_key    = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" aws_region        = "eu-west-1"main.tf terraform {   required_version = "= 0.12.26" } provider "aws" {   version    = "2.66.0"   access_key = var.aws_access_key   secret_key = var.aws_secret_key   region     = var.aws_region }var.tf 空の受け皿 variable aws_access_key {} variable aws_secret_key {} variable aws_region {}

Terraform で変数を使う - Qiita
実行時に-var-fileで値ファイルを指定して環境などを切り替えると良いかもしれない terrafrom plan -var-file=dev.tfvars terrafrom plan -var-file=prod.tfvars
変数ファイル指定がないときは変数でdefaultに入れておく、descriptionで変数の説明もかける variable "foo" {   type = "string"   default = "default-var"   description = "Sample Variable" }
TerraformでGCPのリソースの作成と変数から値を読み込む - y-zumiの日記 (hatenablog.com)credentials等の秘匿したい変数を外部のファイルやコマンドライン引数から読み込むvariable "credentials_file" {} @var.tf 変数を定義し空にしておくcredentials = file(var.credentials_file) @main.tf ファイルを読むがファイル名は変数terraform plan -var 'project=<PROJECT_ID>' -var 'credentials_file=<NAME>.json' @cmd プロジェクトとクレデンをコマンド時に指定
他にもvars.tfvars設定ファイル(行頭variableが不要)、TF_VAR_環境変数による指定
Input Variables - Configuration Language - Terraform by HashiCorp-var-fileで変数ファイルを明示してcmd、ファイル名は.tfvars/.tfvars.json-varで変数を明示してcmd順序があり後の読込でオーバーライド

Terraformのベストなプラクティスってなんだろうか | フューチャー技術ブログ (future-architect.github.io)
Workspace派、module派、ディレクトリ分離派


workspaceは使わない、moduleを限定的に使う
設定をコード化>Gitレポジトリに置く>設定内容、作業履歴の明確化、チームでの運用性向上

■特性TFの影響を反映するのはterraform applyの時だけ、tfファイルとtfstateの差分を実際にリソース作成するimportはtfファイルからtfstateへ記載だけを行う カレントdirの全.tfファイルor.tf.jsonを評価するのでtfファイルの名は何でもいい
各リソースに対してTF化するかは選択ができるが、TFする場合はそのリソースに必要な全記載をTFファイルに行うterraform import tfResourceID.yourSvcName gcpIdentifier のコマンド terrafrom import google_bigquery_dataset.tf-1 bangboo-prj/test-dataset tfResourceIDはTF指定のもの、yourSvcNameは任意のもの 構成ファイル.tfはローカルのものが使われる、importするとtfstateに反映 GCP identifierはTF公式サイトの各サービスの一番下import項目を見ると指定内容が分かるのでGCPを見て拾ってくる terraform state list TF化されているリソースを見る terrarorm apply時にもtfstateは更新される(オプション-refresh=falseで無効可)  またapply時に-target=xxxでデプロイするリソースを特定できる

Syntax - Configuration Language - Terraform by HashiCorp コメントは#が基本、//や/**/も使える
Terraform v0.12で変わるHCLの記述について - Qiita localsや変数、リストやマップ等
Terraform職人再入門2020 - Qiita yamldecodeやjsonencode等
Terraformの基本 - Foreverly (hatenablog.com)
変数 variable(input var)はcmd実行時に変数を上書きできるが、localsはできない outputはapply時にterminalで値が確認できる、moduleから値を取得する

google_bigquery_connection | Resources | hashicorp/google | Terraform Registry
ドット繋ぎで値を扱えるresource "google_sql_database_instance" "instance" {    provider         = google-beta    name             = "my-database-instance"}resource "google_sql_database" "db" {    instance = google_sql_database_instance.instance.name    name     = "db"}

ToSetは値設定をするが順不同で重複を省く
resource "xxx" "aaa" {    for_each = toset(["foo", "bar", "bar"]) でbar, foo    name = each.key}

for_each/eachのループ
locals {
    sg = {        foo = "FOO"
        bar = "BAR"
    }}
resource "xxx" "aaa" {
    for_each = local.sg
    name = each.key
    description = each.value
}
terraform importはリソース単位、更新はできず削除してから追加 terraform state rm google_bigquery_dataset.tf-1 bangboo-prj/test-dataset
 実設定とimportの内容が違う場合は実設定の情報でtfstate化されるようだ(importは項目を入れ込む感じ?)
  なので実環境に変更を加えるにはterrafrom apply、tfstate化もされtfファイル/tfstate/実設定の3者で同じになる
 apply時にtfstateと実設定が違う場合、例えば既存設定がある場合は重複エラーになりapplyできず、importしtfstateと実設定を同じにしてから、tfファイルの内容をapplyすることが必要

■既存リソースのTF化のおおよその作業 作業ディレクトリの作成(プロジェクトに対するローカルのフォルダ) プロバイダを指定したtfファイルの作成(gcsにstateを置く設定が良い
  provider "google" {    project = "bangboo-kuso"  }  terraform {    backend "gcs" {      bucket = "bangboo-kuso-terraform"    }  } terraform init ローカルに対して初期化 リソースタイプと名前を定義したtfファイルを作成する(任意の名前のやつ)
  resource "google_cloudfunctions_function" "fuckin" { ... をtfファイルに記載(tfResourceIDとyourSvcName だけ)
 リソースタイプや個別パラメータは公式ドキュメントを参照しながら定義 https://registry.terraform.io/providers/hashicorp/google/latest/docs
  (簡単)tfファイル内で1行目以外は空で、terraform planをするとエラーで必要なものが分かるので、それを埋める
  planが通ると自動的に値をサーバから拾ってくる(importすればtfstate.tfに入っている or コピーしてTFに入れる)
  ※terraform state show tfResourceID.yourSvcName でstateを見てtfファイルにパラメータを定義していく方法もある  TF定義は複数の方法がある、最終GCP公式のRestAPIで確認するしか terraform importする(公式ドキュメントの一番下にimportコマンドの指定がある) terraform planして差分がなくなるまでtfファイルを修正する  import(tfstate)の修正は一度stateから削除する terraform state rm google_bigquery_dataset.tf-1  (既存リソースがあってもあくまでtfファイルとtfstateの差分なのでinitした状態でplanしてもup-to-dateと表示されるだけ)
 tfstateファイルにおかしなものが無いか確認、keyとか含まれないか

■他に一般的なTF(既存がimportされると以下で変更をapplyして運用) terraform -v 稼働確認 terraform validate ファイルの検証 terraform plan アクションを計画
 terraform apply 最後に変更を適応 terraform show ステータスを確認、一覧 terraform destroy で簡単にインフラの吐き、initができないとき必要そう
■tfenvを使う場合cd my-repoget clone https://bitbucket/bangboo-prj.gitcd bangboo-prjtfenv use 0.14.7 terraform workspace list terraform workspace select default デフォルト  terraform workspace new prod prodという名で作成ならmain.tf作成し記載 terraform fmt tfファイルのフォーマット(書式は適当で書けばいい)  gcloud auth list 認証確認  gcloud auth application-default login クレデンシャルが必要なら   API&Servicesでクレデンシャルは取得できそう、key=xxxxterraform initテラフォーマで既存のリソースを調査するにはterraformer import google list --projects=xxxx-123 で対象のリソース確認terraformer import google --resources=instances,forwardingRules --regions=us-west1 --projects=xxxx-123 とかterrafrom import google_storage_bucket.pri-bucket project-abc123/asia-northeast1/pri-bucket でimportとか terraform refresh tfstateの最新化、どのタイミングで使う?
既存リソースimport
https://www.apps-gcp.com/terraformit-gcp/https://qiita.com/uu4k/items/48d3ecfefe57dba1d7e1

■Terraform applyで意図しない権限削除で障害が発生する
Terraform x GCP で、IAM権限を全削除してしまった - Qiita
resource "google_project_iam_policy" "unko" {  project = "my-project"  role = "roles/noguso"  members = [    "serviceAccount:${google_service_account.baka.email}"  ]}google_project_iam_policy:書き換えるので他は無くなる(他を消したいときに使う)google_project_iam_binding:付与、Authritativeだが他は現状維持?
google_project_iam_member:付与、Non-authoritativeで安全、まとめ難いか
 ※_iam_policyと_iam_bindingとt_iam_memberは一緒に使えない ※_iam_bindingと_iam_memberは一緒に使える
google_bigquery_dataset_iam_binding:(承認済みビューの権限はなくなる>google_bigquery_dataset_accessを使え)google_bigquery_dataset_iam_member:roleとmemberを1対1でresourceを作りまくる、Non-authoritative
 ※_iam_policyや_bindingはまとめ易そうだが権限消しそう

Terraform で GCP のサービスアカウントを管理する - Eng (なりたい) (hatenablog.com)
Terraform で GCP IAM 設定どれ使うのがいいのか - pokutuna (scrapbox.io)
google_project_iam | Resources | hashicorp/google | Terraform Registry
Authoritative: TFに明示していないものをApply時に削除しますという意、TFの権威
Non-authoritative: TFは権威を示さず、TFに明示していないものは現状維持ですという意

■データセット
google_bigquery_dataset | Resources | hashicorp/google | Terraform Registry
スキーマ取得: bq show --schema --format=prettyjson bangboo-prj:test-dataset.tbl001
ビューはコンソール>BQ>該当ビュー>detailからコピー

■組織ポリシー
google_organization_policy | Resources | hashicorp/google | Terraform Registry
制約について  |  Resource Manager のドキュメント  |  Google Cloud

■gcloud cmdhttps://www.devsamurai.com/ja/gcp-terraform-101/ gcloud projects list 権限あるプロジェクトを表示 gcloud config set project [prjID] ワーキングプロジェクトの設定 gcloud services enable iam.googleapis.com サービスの有効化 gcloud iam service-accounts create terraform-serviceaccount \  --display-name "Account for Terraform" サービスアカウント作成 gcloud projects add-iam-policy-binding [PROJECT_ID]  --member serviceAccount:terraform-serviceaccount@[PROJECT_ID].iam.gserviceaccount.com --role roles/editor 権限付与 gcloud iam service-accounts keys create path_to_save/account.json  --iam-account terraform-serviceaccount@[PROJECT_ID].iam.gserviceaccount.com クレデン発行 export GOOGLE_CLOUD_KEYFILE_JSON=path_to/account.json クレデン設定
↑サービスアカウントで認証 環境変数にファイルパスを渡す
 gcloud auth application-default login だと個人
 これにクレデンシャルファイルのパスを渡すとサービスアカウントでgcloudコマンド打てるはず
Terraformで複数リージョンをまたいだリソース制御する (mosuke.tech)
Terraform workspaceを利用して環境毎のリソース名の変更を行う (mosuke.tech)


Comment (0)

Navi: 1 | 2 | 3 | 4  >
-Home
-Column [122]
-Europe [9]
-Gadget [72]
-Web [109]
-Bike [3]

@/// BANGBOO BLOG ///