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
Operating CI / CD with two Stack
Search
Wataru Manji
August 02, 2018
Technology
1
200
Operating CI / CD with two Stack
OpenStack Days Tokyo 2018で発表。
Wataru Manji
August 02, 2018
Tweet
Share
More Decks by Wataru Manji
See All by Wataru Manji
明日からできる、st2のActionのつくりかた
manji0
1
3.7k
GoogleHomeとStackStorm
manji0
0
640
Other Decks in Technology
See All in Technology
信頼されるためにやったこと、 やらなかったこと。/What we did to be trusted, What we did not do.
bitkey
PRO
0
820
Unlearn Product Development - Unleashed Edition
lemiorhan
PRO
2
160
Fearsome File Formats
ange
0
540
2024年にチャレンジしたことを振り返るぞ
mitchan
0
170
I could be Wrong!! - Learning from Agile Experts
kawaguti
PRO
7
1.4k
サイボウズフロントエンドエキスパートチームについて / FrontendExpert Team
cybozuinsideout
PRO
5
39k
深層学習と3Dキャプチャ・3Dモデル生成(土木学会応用力学委員会 応用数理・AIセミナー)
pfn
PRO
0
310
AI×医用画像の現状と可能性_2024年版/AI×medical_imaging_in_japan_2024
tdys13
0
1.1k
20241218_今年はSLI/SLOの導入を頑張ってました!
zepprix
0
250
エンジニアリングマネージャー視点での、自律的なスケーリングを実現するFASTという選択肢 / RSGT2025
yoshikiiida
3
1.7k
Alignment and Autonomy in Cybozu - 300人の開発組織でアラインメントと自律性を両立させるアジャイルな組織運営 / RSGT2025
ama_ch
1
780
20241220_S3 tablesの使い方を検証してみた
handy
4
850
Featured
See All Featured
KATA
mclloyd
29
14k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.2k
Raft: Consensus for Rubyists
vanstee
137
6.7k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
29
940
Unsuck your backbone
ammeep
669
57k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.2k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Testing 201, or: Great Expectations
jmmastey
41
7.2k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
44
9.3k
Learning to Love Humans: Emotional Interface Design
aarron
274
40k
Building Applications with DynamoDB
mza
92
6.1k
A Philosophy of Restraint
colly
203
16k
Transcript
Copyright© 2018 NTT TechnoCross Corporation CI/CDを2つの「Stack」で運用する話 クラウド上でクラウド開発? NTTテクノクロス株式会社 IoTイノベーション事業部 第二事業ユニット
萬治 渉 <
[email protected]
>
Copyright© 2018 NTT TechnoCross Corporation 2 自己紹介 氏名: 萬治 渉
(Manji Wataru) 所属: • NTTテクノクロス株式会社 IoTイノベーション事業部 • 日本StackStormユーザ会 専門: • OpenStack • StackStorm • Ansible
Copyright© 2018 NTT TechnoCross Corporation 3 はじめに 「特殊な要件の自動テスト環境」を OpenStackとStackStormで解決した話をします。
4 Copyright© 2018 NTT TechnoCross Corporation 本編: 35分 質疑: 5分
• 本編 1. 自動テストしようとしたコードの話 2. 自動テストのために解決すべき課題 3. 解決策となる2つの「Stack」 4. 動作イメージ 5. 今後の展望 • 質疑
Copyright© 2018 NTT TechnoCross Corporation 5 1章: 自動テストしようと したコードの話 ・何のためのコードなのか?
・どうやって作ろうとしているのか? ・何が問題になったのか?
Copyright© 2018 NTT TechnoCross Corporation 6 ・何のためのコードなのか? → マネージドなオンプレクラウド基盤! ...の初期構築用コード
~詳しい説明は弊社ブースまで~ ・NTTグループ各社のクラウド基盤を設計、構築、 保守してきたノウハウを商品化 ・IaaSだけでなく、PaaSレイヤのサービスも提供 ・最短1営業日で環境払い出し可能
Copyright© 2018 NTT TechnoCross Corporation 7 ・どうやって作ろうとしていたのか? → 神のごとき「精緻」なAnsible遺産を改造する ~経緯~
構築資材、どう作ろうかな... AnsibleのPlaybook、前に社内クラウド 作るとき作ったじゃん。あれ使いなよ。 (あれって、ちゃんと動くのか...?)
Copyright© 2018 NTT TechnoCross Corporation 8 ・何が問題になったのか → その1: 実行環境が無い
理由: • そんなポンポンサーバを買えない • AWSとかGCPでは動かない • いわゆるport_securityにひっかかる • nested kvmできない※ ※: 現在ではGCPで有効にできる
Copyright© 2018 NTT TechnoCross Corporation 9 ・何が問題になったのか → その2: 動かない
• 単純に文法エラーで失敗する • 一度失敗したらなぜか二度と成功しない • 成功してるのにOpenStackが動かない 心を無にしてログを眺めるOpenStackエンジニアのいらすと
Copyright© 2018 NTT TechnoCross Corporation 10 ・何が問題になったのか → その3: 「精緻」すぎて読むのが大変
• yml合計: • 169ファイル • 6,718行 • 175,685文字 • j2合計: • 44ファイル • 22,875行 • 779,416文字 ※コメント含む 心を無にしてコードを眺めるAnsibleエンジニアのいらすと
Copyright© 2018 NTT TechnoCross Corporation 11 • Enterprise Cloud 2.0のベアメタルサーバでは動いたので、
そこで延々と動作確認 • Ansible資材を一から見直し。構造、依存性、べき等性を再設計。 • 構築されたOpenStackの正常性も一から確認。 • 社内クラウドで発生した問題への対処を組込み。 • etc... めげずに頑張った その結果
Copyright© 2018 NTT TechnoCross Corporation 12 ・何が問題になったのか → その4: 自分しかPlaybookを読めなくなった
• 元コードがもはや残っていない。 • 構造や命名規則がかなり変わった。 • AnsibleやJinja2の機能をガッツリ使うことによる半黒魔術化
Copyright© 2018 NTT TechnoCross Corporation 13 オーパーツを再生産するわけにはいかない... オーパーツ化を回避するためにはどうすればいいのか → とりあえず、元Ansibleの解析時に当たった問題を解消しよう
Copyright© 2018 NTT TechnoCross Corporation 14 当たった問題その2: 精緻すぎて読むのが大変 解決策その1: 実行箇所、修正箇所が分かりやすくなるよう、
テスト用の実行スクリプトを作る 当たった問題その3: 動作確認の実行環境が無い 解決策その2: テスト環境を自動で用意してくれて、 テストも実行してくれる仕組みを作る → 常に動く状態を保てるようにする 当たった問題その1: 動かない
Copyright© 2018 NTT TechnoCross Corporation 15 もしかして: CI CIツールを使えば、 •
テスト環境の準備 • Ansible実行 • テストの実行 • Ansible&テスト結果の公開 を自動で実施できるのでは...?
Copyright© 2018 NTT TechnoCross Corporation 16 こういう仕組みで実現できそう MergeRequest契機で Webhook CIツール
GitLab
Copyright© 2018 NTT TechnoCross Corporation 17 こういう仕組みで実現できそう MergeRequest契機で Webhook 必要な資材をclone
CIツール GitLab
Copyright© 2018 NTT TechnoCross Corporation 18 こういう仕組みで実現できそう MergeRequest契機で Webhook 必要な資材をclone
クラウド基盤を操作して テスト環境を作成 CIツール GitLab
Copyright© 2018 NTT TechnoCross Corporation 19 こういう仕組みで実現できそう MergeRequest契機で Webhook 必要な資材をclone
クラウド基盤を操作して テスト環境を作成 構築用Ansible実行 & テスト実行 CIツール GitLab
Copyright© 2018 NTT TechnoCross Corporation 20 こういう仕組みで実現できそう MergeRequest契機で Webhook 必要な資材をclone
クラウド基盤を操作して テスト環境を作成 構築用Ansible実行 & テスト実行 実行結果を通知 CIツール GitLab
Copyright© 2018 NTT TechnoCross Corporation 21 2章: CIのために 解決すべき課題 ・リソース要件
・各種CIツールの問題
Copyright© 2018 NTT TechnoCross Corporation 22 その1: リソースの問題 問題: ・前述の通り、AWSやGCPでは実行できない。
(勝手なIPを使えないので、FloatingIPとかの動作検証ができない) ・ECL2.0 ベアメタルを使えば実行可能だが、 環境構築を自動化できない問題がある。 (悪用されないようFWの設定が必要だが、自動設定できない) ・VMの動作確認のためにsshとかしたいけど、インターネット上に配置すると グローバルIPの確保とかにコストがかかる ・社内に空いてるサーバは転がってない... 1章でも軽く触れたが、以下のような状態だった。
Copyright© 2018 NTT TechnoCross Corporation 23 その1: リソースの問題 要件: •
自由にIPアドレスを名乗って通信できる、自由なNWがあること • サーバ、NWの構成を自動で作成できること • サーバ上に作ったVMなどに、社内から疎通可能であること できればこういう環境が欲しい
Copyright© 2018 NTT TechnoCross Corporation 24 その2: CIツールの問題 • ジョブにすると一瞬でオーパーツ化するので、後々の修正が大変
• Pipelineを使うと、タスクの部品化や条件分岐の実装などが大変 • インストール後に設定を手でポチポチ入れるのが面倒 Jenkinsがいいかな、と考えていたが、以下のような問題があった。 実は似たようなことをするためのJenkinsジョブ群がチーム内に 存在していたのだが、見事にオーパーツ化していた。二の舞は避けたい。
Copyright© 2018 NTT TechnoCross Corporation 25 その2: CIツールの問題 他にも色々考えた結果、以下が実現できるCIツールが欲しいという結論に。 要件:
• CI関連のコード(pipeline, job)は全部Git管理したい • Jenkins pipelineみたいに手続きを1ファイルで管理したい • GitLabのMerge Requestからhookできてほしい • CIの実行結果は一覧できるようにしたい • 認証情報とかはGit管理から外したい • できるだけインストールやセットアップが楽なものがいい • ifやloopなどの柔軟な手続きを簡単に書きたい
Copyright© 2018 NTT TechnoCross Corporation 26 3章: 解決策となる 2つの「Stack」 ・OpenStack
・StackStorm
Copyright© 2018 NTT TechnoCross Corporation 27 その1: リソースの問題 CIを動かすための環境が無い... 自由なNWが欲しい...
そういうことなら、社内クラウドの 裏機能を開放しよう... 裏機能?
Copyright© 2018 NTT TechnoCross Corporation 28 その1: リソースの問題 「自由にIPアドレスを名乗れる」仮想NWを作れるneutronのオプション port_security_enabled=False
自チームで管理している社内クラウドはOpenStack製。 そこには管理者しか使えない特殊機能があった。
Copyright© 2018 NTT TechnoCross Corporation 29 (そもそも)port securityとは ポート(インスタンスとNWを結ぶ口)を通る通信について、 そのポートに登録されていないアドレス(IP,
MAC)の通信をDropする機能 ※雑な理解かもしれない インスタンス 192.168.1.101/aa:bb:cc:dd:~ → OK 192.168.1.102/aa:bb:cc:dd:~ → NG 192.168.1.101/a1:b1:c1:d1:~ → NG ※備考: allowed_address_pairとして登録すればOKにできる ポート作成時のアドレス: 192.168.1.101/aa:bb:cc:dd:~
Copyright© 2018 NTT TechnoCross Corporation 30 port securityを無効にすると どんなアドレスでも通信が通るようになる インスタンス
192.168.1.101/aa:bb:cc:dd:~ → OK 192.168.1.102/aa:bb:cc:dd:~ → OK 192.168.1.101/a1:b1:c1:d1:~ → OK ※備考: セキュリティグループが使えなくなる ポート作成時のアドレス: 192.168.1.101/aa:bb:cc:dd:~
Copyright© 2018 NTT TechnoCross Corporation 31 好きなIPアドレスを使えるようになったので、 • VMがFloatingIPを使って通信できるようになった •
OpenStack APIなどが通る仮想IPを複数ノード間で回せるようになった 要件: • 自由にIPアドレスを名乗って通信できる、自由なNWがあること • サーバ、NWの構成を自動で作成できること • サーバ上に作ったVMなどに、社内から疎通可能であること 問題解決
Copyright© 2018 NTT TechnoCross Corporation 32 他の要件についても解決できた • heatを導入してるのでサーバ、NW構成は自動作製できる •
社内クラウドなので当然社内から疎通できる 要件: • 自由にIPアドレスを名乗って通信できる、自由なNWがあること • サーバ、NWの構成を自動で作成できること • サーバ上に作ったVMなどに、社内から疎通可能であること 要件完全クリア!!!
Copyright© 2018 NTT TechnoCross Corporation 33 余談: 社内クラウドの利用料は(見かけ上)無料なので、 AWSとかを使うよりかなりお金を節約できる (常時3並列でCI環境が動くと仮定して、月十万くらい?)
Copyright© 2018 NTT TechnoCross Corporation 34 • 社内クラウド • ECL2.0
ベアメタル • 普通のベアメタル どれに対してもできる限り同じコードで構築できるよう、資材を再設計。 社内クラウド用構築 コード(master) ECL2.0用コード: +資源の自動作成 +独自のNW設定 ベアメタル用コード: +PXEブート自動化 +NW機器の設定 +独自のNW設定 fork
Copyright© 2018 NTT TechnoCross Corporation 35 その2: CIツールの問題 要件: •
CI関連のコード(pipeline, job)は全部Gitで管理したい • Jenkins pipelineみたいに手続きを1ファイルで管理したい • GitLabのMerge Requestからhookできてほしい • CIの実行結果は一覧できるようにしたい • 認証情報とかはGit管理から外したい • できるだけインストールやセットアップが楽なものがいい • ifやloopなどの柔軟な手続きを簡単に書きたい これくらいだったら「アレ」で解決できそう
Copyright© 2018 NTT TechnoCross Corporation 36
Copyright© 2018 NTT TechnoCross Corporation 37 まがりなりにも「日本StackStormユーザ会ボードメンバ」なので、 StackStormによる実現にチャレンジしてみた。 画像引用: https://stackstorm.com/
Copyright© 2018 NTT TechnoCross Corporation 38 要件: • CI関連のコード(pipeline, job)は全部Gitで管理したい
• Jenkins pipelineみたいに手続きを1ファイルで管理したい • GitLabのMerge Requestからhookできてほしい • CIの実行結果は一覧できるようにしたい • 認証情報とかはGit管理から外したい • できるだけインストールやセットアップが楽なものがいい • ifやloopなどの柔軟な手続きを簡単に書きたい これは簡単。
Copyright© 2018 NTT TechnoCross Corporation 39 StackStormの機能その① Pack Packという単位でAction, Workflow,
RuleをGit管理することができる 1. 全部突っ込んでGitへpush 2. GitリポジトリのURLを指定して1コマンドでインポート
Copyright© 2018 NTT TechnoCross Corporation 40 要件: • CI関連のコード(pipeline, job)は全部Gitで管理したい
• Jenkins pipelineみたいに手続きを1ファイルで管理したい • GitLabのMerge Requestからhookできてほしい • CIの実行結果は一覧できるようにしたい • 認証情報とかはGit管理から外したい • できるだけインストールやセットアップが楽なものがいい • ifやloopなどの柔軟な手続きを簡単に書きたい 余裕。
Copyright© 2018 NTT TechnoCross Corporation 41 StackStormの機能その② Workflow タスク(Action)と手続き(Workflow)が分離されていて、 手続きだけを1ファイルにまとめられる
Copyright© 2018 NTT TechnoCross Corporation 42 要件: • CI関連のコード(pipeline, job)は全部Gitで管理したい
• Jenkins pipelineみたいに手続きを1ファイルで管理したい • GitLabのMerge Requestからhookできてほしい • CIの実行結果は一覧できるようにしたい • 認証情報とかはGit管理から外したい • できるだけインストールやセットアップが楽なものがいい • ifやloopなどの柔軟な手続きを簡単に書きたい これぞst2の本領
Copyright© 2018 NTT TechnoCross Corporation 43 StackStormの機能その③ RuleとWebhook ・ActionやWorkflowの起動条件としてWebhookを使える ・Webhookのpayloadの内容に応じて実行可否、パラメータを設定できる
webhookの endpointを設定 payloadから 起動条件を指定 payloadから パラメータを抽出
Copyright© 2018 NTT TechnoCross Corporation 44 要件: • CI関連のコード(pipeline, job)は全部Gitで管理したい
• Jenkins pipelineみたいに手続きを1ファイルで管理したい • GitLabのMerge Requestからhookできてほしい • CIの実行結果は一覧できるようにしたい • 認証情報とかはGit管理から外したい • できるだけインストールやセットアップが楽なものがいい • ifやloopなどの柔軟な手続きを簡単に書きたい GUIで見れる
Copyright© 2018 NTT TechnoCross Corporation 45 StackStormの機能その④ Web-UI Workflowと実行されたActionの入出力がそこそこ見やすい
Copyright© 2018 NTT TechnoCross Corporation 46 余談: CUIの出力 CUIからはJSONやYAMLで出力できるので、集計するときに使うと便利 json
yml
Copyright© 2018 NTT TechnoCross Corporation 47 要件: • CI関連のコード(pipeline, job)は全部Gitで管理したい
• Jenkins pipelineみたいに手続きを1ファイルで管理したい • GitLabのMerge Requestからhookできてほしい • CIの実行結果は一覧できるようにしたい • 認証情報とかはGit管理から外したい • できるだけインストールやセットアップが楽なものがいい • ifやloopなどの柔軟な手続きを簡単に書きたい できちゃう
Copyright© 2018 NTT TechnoCross Corporation 48 StackStormの機能その⑤ Config 認証情報などをst2サーバのローカルに保存できる 1.
定義
Copyright© 2018 NTT TechnoCross Corporation 49 StackStormの機能その⑤ Config 認証情報などをst2サーバのローカルに保存できる 2.
設定
Copyright© 2018 NTT TechnoCross Corporation 50 StackStormの機能その⑤ Config 認証情報などをst2サーバのローカルに保存できる 3.
参照
Copyright© 2018 NTT TechnoCross Corporation 51 要件: • CI関連のコード(pipeline, job)は全部Gitで管理したい
• Jenkins pipelineみたいに手続きを1ファイルで管理したい • GitLabのMerge Requestからhookできてほしい • CIの実行結果は一覧できるようにしたい • 認証情報とかはGit管理から外したい • できるだけインストールやセットアップが楽なものがいい • ifやloopなどの柔軟な手続きを簡単に書きたい かなり楽に実現できる
Copyright© 2018 NTT TechnoCross Corporation 52 StackStormのインストールとCI設定 All-in-one構成なら1行でst2をインストール可能 あとはPackインストールしたらCIが動くようになる ※Webhookの定義とかも自動で有効になる
Copyright© 2018 NTT TechnoCross Corporation 53 要件: • CI関連のコード(pipeline, job)は全部Gitで管理したい
• Jenkins pipelineみたいに手続きを1ファイルで管理したい • GitLabのMerge Requestからhookできてほしい • CIの実行結果は一覧できるようにしたい • 認証情報とかはGit管理から外したい • できるだけインストールやセットアップが楽なものがいい • ifやloopなどの柔軟な手続きを簡単に書きたい Jenkins Pipelineよりは簡単
Copyright© 2018 NTT TechnoCross Corporation 54 StackStormの機能その⑥ Mistral対応 OpenStack Mistral形式でWorkflowを記述できる
= IFとかLoopを書ける!
Copyright© 2018 NTT TechnoCross Corporation 55 余談: 最近対応したWorkflowフォーマット StackStorm 2.8でOrchestraというフォーマットが利用できるようになった。
• Mistralより実行が高速 • Mistralの機能をフルサポート(予定) • まだドキュメントは全然揃っていない ※ 特に意味は無いですが、この資料を書きながら、 CI用Workflowを全てOrchestraで書き直しました。 非常にキビキビ動いてくれてますが、 loopに対応していないのでコード量は増えました... 引用: https://docs.stackstorm.com/latest/orchestra/index.html
Copyright© 2018 NTT TechnoCross Corporation 56 要件: • CI関連のコード(pipeline, job)は全部Gitで管理したい
• Jenkins pipelineみたいに手続きを1ファイルで管理したい • GitLabのMerge Requestからhookできてほしい • CIの実行結果は一覧できるようにしたい • 認証情報とかはGit管理から外したい • できるだけインストールやセットアップが楽なものがいい • ifやloopなどの柔軟な手続きを簡単に書きたい 完全勝利
Copyright© 2018 NTT TechnoCross Corporation 57 ここまでのまとめ 1章: • 「複雑なコードは整理しても複雑なままになる」
2章: • 「ツールも環境も、対象に合わせて検討しよう」 3章: • 「OpenStackのような自由な基盤を持っておくと便利」 • 「StackStormの機能は特殊な要件のCIにも対応できる」
Copyright© 2018 NTT TechnoCross Corporation 58 4章: 動作イメージ
Copyright© 2018 NTT TechnoCross Corporation 59 動作イメージ① Ansible&テスト実行 MergeRequest契機で Webhook
StackStorm GitLab 社内クラウド
Copyright© 2018 NTT TechnoCross Corporation 60 動作イメージ① Ansible&テスト実行 MergeRequest契機で Webhook
必要な資材をclone StackStorm GitLab 社内クラウド
Copyright© 2018 NTT TechnoCross Corporation 61 動作イメージ① Ansible&テスト実行 MergeRequest契機で Webhook
必要な資材をclone クラウド基盤を操作して テスト環境を作成 (OpenStack Heat) StackStorm GitLab 社内クラウド
Copyright© 2018 NTT TechnoCross Corporation 62 動作イメージ① Ansible&テスト実行 MergeRequest契機で Webhook
必要な資材をclone クラウド基盤を操作して テスト環境を作成 構築用Ansible実行 & テスト実行 StackStorm GitLab 社内クラウド
Copyright© 2018 NTT TechnoCross Corporation 63 動作イメージ① Ansible&テスト実行 MergeRequest契機で Webhook
必要な資材をclone クラウド基盤を操作して テスト環境を作成 構築用Ansible実行 & テスト実行 実行結果を通知 StackStorm GitLab 社内クラウド
Copyright© 2018 NTT TechnoCross Corporation 64 ssh_config: Success http://<host>/<MR-id>/ansible_ssh_config.log init:
Success http://<host>/<MR-id>/ansible_init.log memcashed: Success http://<host>/<MR-id>/ansible_memcashed.log ~略~ Refstack: Success http://<refstack結果のURL> ~略~ テスト結果の出力イメージ Ansibleのdebug出力が膨大なため、 個別にログを管理する方式としている
Copyright© 2018 NTT TechnoCross Corporation 65 動作イメージ② 目視確認 動作イメージ①実行時に ・鍵ファイル
・sshのconfig ・Ansible、テスト資材 が配置される 踏み台越しにテスト環境 へ接続&状況確認可能 社内クラウド
Copyright© 2018 NTT TechnoCross Corporation 66 動作イメージ③ 環境削除 MergeRequest Closeに
対応したWebhook発行 StackStorm GitLab 社内クラウド MergeRequestがCloseされると、 テスト環境も自動で削除される
Copyright© 2018 NTT TechnoCross Corporation 67 動作イメージ③ 環境削除 MergeRequest Closeに
対応したWebhook発行 StackStorm GitLab 社内クラウド 社内クラウドを操作して テスト環境を削除 MergeRequestがCloseされると、 テスト環境も自動で削除される
Copyright© 2018 NTT TechnoCross Corporation 68 5章: 今後の展望
Copyright© 2018 NTT TechnoCross Corporation 69 今後の展望 試験内容: • ベアメタル環境を模擬した、PXEによるOSインストールを
自動テストしたい • NW機器についても、仮想アプライアンスを用いてAnsibleによる 設定投入を自動テストしたい • 各ミドルウェアを本気で潰しにかかるような耐久試験を実現したい 試験環境(CIツールなど): • CI環境全体で社内クラウドのリソース使用量上限を定めて、 試験をpendingする仕組みを作りたい • 社内チャットと連携したい(今までは諸般の事情により難しかった)
Copyright© 2018 NTT TechnoCross Corporation 70 今後の展望 無茶な要件が混ざってますが、 OpenStack+StackStormなら実現は難しくないと思ってます。
Copyright© 2018 NTT TechnoCross Corporation 71 • 従来のCIツールで黒魔術を作っていませんか? • パブリッククラウドの自由度に不満を持っていませんか?
何かアドバイスできるかもしれません。お気軽に相談を!