Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
2026-06-18 ecspressoのtfstate参照が便利すぎた話
Search
SUZUKI Masashi
June 19, 2026
Technology
46
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
2026-06-18 ecspressoのtfstate参照が便利すぎた話
社内勉強会の内容
ecspressoが便利すぎて勢い余って、自分もインスパイアされてコードを書いた話
https://github.com/masasuzu/clrnd
SUZUKI Masashi
June 19, 2026
More Decks by SUZUKI Masashi
See All by SUZUKI Masashi
2026-04-14 Jagu'e'r Cloud Native分科会 Terraform Stateにおけるシークレットの平文保存という課題とその解決
masasuzu
1
61
2026-03-27 #terminalnight 変数展開とコマンド展開でターミナル作業をスマートにする方法
masasuzu
0
430
2026-03-23 Ops-JAWS Meetup39 Session Managerを使った セキュアなサーバーアクセス
masasuzu
2
160
2026-03-11 JAWS-UG 茨城 #12 改めてALBを便利に使う
masasuzu
3
490
2026-03-03 Jagu'e'r Tech Writer Meetup #19 登壇のネタ作りについて
masasuzu
0
290
2026-02-24 月末 Tech Lunch Online #10 Cloud Runのデプロイの課題から考えるアプリとインフラの境界線
masasuzu
0
200
2025-11-21 社内エンジニア勉強会 改めて理解するVPC Endpoint
masasuzu
0
460
2025-11-08 Security JAWS TerraformによるIAM Policy記述ガイド
masasuzu
2
1.5k
2025-09-25 SRETT #13 ConftestによるTerraformのPolicy as Codeを試してみる
masasuzu
0
610
Other Decks in Technology
See All in Technology
スタートアップにおけるアジャイルの実践について #shibuyagile
murabayashi
3
2.1k
はじめてのWDM
miyukichi_ospf
1
120
AIと共生する開発者プラットフォーム:バクラクのモノレポ×マイクロサービス基盤
sakajunquality
1
870
Mastraエージェント、どのクラウドにデプロイする?
minorun365
PRO
2
170
AI時代における最適なQA組織の作り方
ymty
3
400
完全自律ロボットを作りたくて、先に開発を自律させた話(ROS Japan UG #63 LT)
rryz09
0
350
知らん間に、回ってる
ming_ayami
0
220
AI Agent SaaS を支える自社仮想化基盤への挑戦と実運用 / ai-agent-saas-virtualization
flatt_security
2
1.7k
アカウントが増えてからでは遅い? ~ マルチアカウント統制の勘所 ~
kenichinakamura
0
150
実装だけじゃない! CCA-F取得エンジニアが教えるClaude Code開発プロセス活用術
diggymo
2
330
“ID沼入口” - 基本とセキュリティから始める、考え続けるためのID管理技術勉強会 告知&イントロ
ritou
0
430
ゼロをイチにする仕事が終わったあと
smasato
0
310
Featured
See All Featured
Typedesign – Prime Four
hannesfritz
42
3.1k
Designing for Timeless Needs
cassininazir
1
270
How to build a perfect <img>
jonoalderson
1
5.8k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
How to Think Like a Performance Engineer
csswizardry
28
2.7k
The Curious Case for Waylosing
cassininazir
1
420
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Embracing the Ebb and Flow
colly
88
5.1k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
270
Evolving SEO for Evolving Search Engines
ryanjones
0
240
Into the Great Unknown - MozCon
thekraken
41
2.6k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
62
55k
Transcript
ecspressoのtfstate参照が便利すぎてCloud Run版を作ってしまった ついでにインフラとデプロイの境界線 社内 2026-06-19
おまえだれよ 名前: すずきまさし/x:@masasuz/masasuzu 所属: 株式会社スリーシェイク シニアアーキテクト クラウドインフラ何でも屋さん すきなもの: AWS, Google
Cloud, Terraform 2024-2025 AWS Community Builder Cloud Operations 2025 Japan All AWS Certifications Engineers Google Cloud Partner Top Engineer 2026 2
今日のゴール ecspresso の tfstate 参照 が便利すぎる、という話をします IAM Role ARN や
Secrets Manager ARN を ハードコードせず Terraform (tfstate) から引けます 便利すぎたので Cloud Run 版 (clrnd) を作りました (ついで) インフラとデプロイの 境界線 にも軽く触れます 3
目次 1. ecspresso の tfstate 参照が便利 2. なぜインフラに寄せないのか (ついで) 3.
Cloud Run でも同じ体験を 4. clrnd を作った 4
1. ecspresso の tfstate 参照が便利 5
ecspresso とは Amazon ECS デプロイツール (読みは "espresso" と同じ) ECS の
サービス定義 / タスク定義 を JSON / YAML / Jsonnet でコード管理 テンプレートで 環境変数や Terraform state の値 を埋め込める https://github.com/kayac/ecspresso 6
主要サブコマンド (軽く) コマンド 何をする init 稼働中サービスから設定ファイルを生成 diff 現在の定義との差分表示 verify リソースと設定の検証
deploy サービスをデプロイ (ローリング / Blue-Green) render 設定をレンダリングして出力 ほかに rollback / run / register などもあります。 7
tfstate 連携 タスク定義には IAM Role ARN や Secrets Manager ARN
が必要 これらは Terraform で作る → 今まではそれをコピペしてハードコードしていた 最近tfstate参照できることを知った ecspresso.yml の plugins で tfstate を有効化 plugins: - name: tfstate config: url: s3://my-bucket/terraform.tfstate 8
タスク定義テンプレート例 "taskRoleArn": "{{ tfstate `aws_iam_role.ecs_task.arn` }}", "secrets": [ { "name":
"DB_PASSWORD", "valueFrom": "{{ tfstate `aws_secretsmanager_secret.db.arn` }}" } ] ARN を一切ベタ書きしない。Terraform 側の値をそのまま引ける {{ tfstate "addr" }} で属性値に展開、 {{ tfstatef "...%s..." "idx" }} でインデックス指定 env / must_env / json_escape も利用可能 9
流れ (ECS) ecspresso の tfstate 連携 (ECS) Terraform IAM Role
Secrets Manager サブネット / SG ... tfstate s3://.../ terraform.tfstate ecspresso render / deploy テンプレートを展開 タスク定義 ( 展開後) ARN が埋め込まれた task definition JSON Amazon ECS サービス更新 apply 参照 render deploy タスク定義テンプレート ( 書く側) "taskRoleArn": "{{ tfstate `aws_iam_role.ecs_task.arn` }}", "secrets": [{ "name": "DB_PASSWORD", "valueFrom": "{{ tfstate `aws_secretsmanager_secret.db.arn` }}" }] 展開結果 (ecspresso が埋める) "taskRoleArn": "arn:aws:iam::123456789012:role/ecs-task", "secrets": [{ "name": "DB_PASSWORD", "valueFrom": "arn:aws:secretsmanager:ap-northeast-1: 123456789012:secret:db-xxxxxx" }] インフラの値は Terraform がsource of truth。ecspresso は 参照するだけです。 10
2. なぜインフラに寄せないのか (ついで) 11
「全部 Terraform で書けばいいのでは?」 確かに、デプロイ対象 (タスク定義 / Cloud Run サービス) も
Terraform で管理すれば 値は同じ state の中にある → tfstate 参照すらいらない でも、そうはしたくない 過剰: デプロイのためだけに state を増やし、 plan / apply に巻き込まれる 守備範囲: デプロイはアプリ開発者の領域。そこに Terraform を強いたくない → インフラは Terraform、デプロイは ecspresso。tfstate を境界面にして参照だけする 12
境界線のイメージ インフラとデプロイの境界線 境界線 インフラ = Terraform が管理 デプロイ = ecspresso
/ clrnd が管理 変更頻度が低く・影響が⼤きい VPC / ネットワーク IAM Role Secret Manager Cloud SQL / DB terraform apply 出⼒を tfstate に保存 (ARN / Service Account / IP ...) tfstate S3 / GCS = 境界⾯ 変更頻度が⾼く・アプリ開発の領域 タスク定義 / マニフェスト ( テンプレート) taskRoleArn / serviceAccountName: {{ tfstate "...role.arn" }} ecspresso / clrnd deploy → ECS サービス / Cloud Run サービス アプリ開発者は Terraform を触らない 書き込む 参照 ( 読むだけ) 要点 インフラは Terraform 、デプロイは ecspresso / clrnd 。tfstate を境界⾯にし、デプロイ側は値を参照するだけ。アプリ開発者に Terraform を強いない。 13
3. Cloud Run でも同じ体験を 14
Cloud Run のデプロイ手段 gcloud run deploy (イメージ指定) gcloud run services
replace service.yaml (YAML 適用) Terraform ( google_cloud_run_v2_service ) いずれも、ecspressoのようなかゆいところに手が届く感じがないです 15
欲しかったもの Service Account や Secret を tfstate から引いてマニフェストに埋めたい ecspresso と同じような使い勝手のツールがほしい
調べた範囲では Cloud Run 向けの相当ツールが見当たらなかったのでないならつくればいい AI Coding万歳 16
4. clrnd を作った 17
clrnd とは Cloud Run へのデプロイツール。ecspresso をモデルに自作しました Go tfstate 参照は ecspresso
と 同じ tfstate-lookup (fujiwara) を利用 https://github.com/masasuzu/clrnd 18
サブコマンド コマンド 何をする verify マニフェスト検証 (ローカルのみ、認証不要) diff 既存サービスとの差分表示 deploy Cloud
Run に適用 ( --auto-approve / --dry-run ) load 既存サービスを Knative YAML で取得 19
設定ファイル clrnd.yml project: my-project region: asia-northeast1 service: my-svc manifest: manifest.yaml
tfstate: - location: gs://my-tf-state/app/default.tfstate - name: network location: gs://my-tf-state/network/default.tfstate tfstate は複数指定でき、 name 省略で default 扱い location は gs:// / s3:// / ローカルに対応 20
マニフェスト (Knative YAML + Go template) spec: template: spec: serviceAccountName:
'{{ tfstate "output.run_service_account" }}' containers: - image: '{{ must_env "IMAGE" }}' env: - name: DB_HOST value: '{{ tfstate "google_sql_database_instance.main.private_ip_address" }}' - name: LOG_LEVEL value: '{{ env "LOG_LEVEL" "info" }}' 関数: tfstate "addr" / tfstate "name" "addr" / env / must_env ecspresso と同じ書き味で Service Account 等を引ける 21
使い方 # まず検証 (認証不要・tfstate 展開も確認できる) clrnd verify my-svc manifest.yaml #
差分を確認 clrnd diff my-svc manifest.yaml --project p --region r # デプロイ clrnd deploy my-svc manifest.yaml --project p --region r インストール: go install github.com/masasuzu/clrnd@latest 認証: gcloud auth application-default login (ADC) 22
流れ (Cloud Run) clrnd の tfstate 連携 (Cloud Run) —
ecspresso と同じ形 Terraform Service Account Secret Manager Cloud SQL ... tfstate gs://.../ terraform.tfstate clrnd verify / diff / deploy テンプレートを展開 マニフェスト ( 展開後) 値が埋め込まれた Knative Service YAML Cloud Run サービス更新 apply 参照 render deploy マニフェストテンプレート ( 書く側) spec: template: spec: serviceAccountName: '{{ tfstate "output.run_service_account" }}' containers: - image: '{{ must_env "IMAGE" }}' 展開結果 (clrnd が埋める) spec: template: spec: serviceAccountName:
[email protected]
containers: - image: asia-docker.pkg.dev/.../app:abc123 ecspresso と同じ構図で、tfstate を境界面にできました。 23
現状 (正直ベース) ざっくり欲しいものをつくりました。 設定ファイルがmanifestベースでいいのかは正直まだわからない まずは「tfstate を引いて Cloud Run に deploy
できる」ところまで 24
まとめ 25
まとめ ecspresso の tfstate 参照が便利。ARN を ハードコードせず Terraform から引けます 便利すぎたので
Cloud Run 版 clrnd を作りました。似た書き味で Service Account 等を引けます (ついで) インフラ = Terraform / デプロイ = 専用ツール。tfstate が境界面です 26
ありがとうございました 27