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
AWS構成図から CloudFormationとパラメータシートを 自動生成するシステムを作ってみた
Search
つくぼし
June 16, 2024
Technology
11k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
AWS構成図から CloudFormationとパラメータシートを 自動生成するシステムを作ってみた
つくぼし
June 16, 2024
More Decks by つくぼし
See All by つくぼし
[モダンアプリ勉強会]今更聞けないGit/GitHub入門
tsukuboshi
0
420
世界の中心でApp Runnerを叫ぶ FINAL
tsukuboshi
0
350
CDKで始めるTypeScript開発のススメ
tsukuboshi
1
1.8k
Mastraに入門してみた ~AWS CDKを添えて~
tsukuboshi
0
1.4k
Amazon Bedrock GenUハンズオン座学資料 #2 GenU環境でRAGを体験してみよう
tsukuboshi
0
820
Amazon Bedrock GenUハンズオン座学資料 #1 GenU環境で生成AIを体験してみよう
tsukuboshi
0
1.6k
AWSエンジニアに捧ぐLangChainの歩き方
tsukuboshi
5
2.4k
世界の中心でApp Runnerを叫ぶ ~Aurora DSQLを添えて~
tsukuboshi
0
910
初めてのGPTs ~ネコ派を〇〇派に変える技術~
tsukuboshi
0
1.2k
Other Decks in Technology
See All in Technology
いまさら聞けない「仕様駆動開発入門」 〜AI活用時代の開発プロセスを考える〜
findy_eventslides
2
230
LayerX コーポレートエンジニアリング室におけるサプライチェーンセキュリティへの取り組み / Supply Chain Security at LayerX Corporate Engineering
yuyatakeyama
3
860
2026-06-24_人とAIの責務分離に基づく開発プロセスの提案.pdf
takahiromatsui
0
240
4人目のSREはAgent
tanimuyk
0
270
2026 AI Memory Architecture
nagatsu
0
540
10年間のブログ発信を振り返って見えたWebアプリケーションエンジニアとしての軌跡
stefafafan
0
190
When Platform Engineering Meets GenAI
sucitw
0
200
AIチャットの改善から見えた、良いAI体験とは / What Constitutes a Good AI Experience: Insights from Improving AI Chat
kubode
0
120
組織における AI-DLC 実践
askul
0
140
飲食店もAIで。レジ締めやハンディシステムをつくってる話 / Using AI for restaurant management
vtryo
0
200
秘密度ラベル初心者が第1歩でつまづかないための「設計・運用」ポイント
seafay
PRO
1
500
起点・思考・出力で分解する 〜PM業務の自動化設計〜
kazu_kichi_67
2
1.1k
Featured
See All Featured
ラッコキーワード サービス紹介資料
rakko
1
3.7M
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
490
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
How to Think Like a Performance Engineer
csswizardry
28
2.7k
A Soul's Torment
seathinner
6
3k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
340
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2.1k
Evolving SEO for Evolving Search Engines
ryanjones
0
230
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
The agentic SEO stack - context over prompts
schlessera
0
830
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.5k
Transcript
AWS構成図から CloudFormationとパラメータシートを 自動生成するシステムを作ってみた 1 2024.6.18 Bedrock Claude Night 2
2 自己紹介 ★ ハンドルネーム ◦ つくぼし ★ 所属 ◦ AWS事業本部コンサルティング部
◦ ソリューションアーキテクト ★ 最近ハマっているAWSサービス ◦ AWS Application Composer ★ SNS/ブログ ◦ X(@tsukuboshi0755) ◦ DevelopersIO(つくぼし)
3 はじめに
4 生成AIではメジャーモデルとして挙げられるClaude • 日本語の文章生成能力が高いと評判 • 多種多様なモデルの中でも最上級のパフォーマンス • 画像認識(Vision)にも対応
5 メジャーなモデルであるClaudeは エンジニアの仕事をどこまで奪えるのか?
6 やってみよう! 自己流のAIクラウドエンジニア を作ってみました
7 AIクラウドエンジニアに任せる事 1. 事前にAWS構成図を作成しpngファイルとして与える 2. その構成図に沿ったCloudFormationテンプレートを出力 3. CloudFormationテンプレートに沿ったパラメータシートを出力
8 AIクラウドエンジニアの解説
9 構成図
10 システムプロンプトの生成 • CFnテンプレートの内容が最大 トークン数以上になる場合でも 回答可能にする処理 • 最大トークン数を取得し、その 80%となるトークン数を計算 •
プロンプト内で指定したトークン 数の80%以上になったら回答を 分割するよう指示 def create_system_prompt() -> str: max_token = int(os.environ["MAX_TOKEN"]) eighty_percent_token = int(max_token / 10 * 8) system_prompt = f""" \n回答は以下の条件全てを満たすようにしてください: \n- 必ず回答で出力するCloudFormationテンプレート(yaml形式)の先頭 は"```yaml"、末尾は"```"とする。 \n- 必要に応じて補足を付与したい場合は、回答で出力するCloudFormationテン プレート内に#を付けてコメントとして記載する。 \n- もし回答が{eighty_percent_token}トークンを超えたら、{max_token} トークンに達するまでに一旦回答を分割し、ユーザーが「続き」と入力したら続きの 回答を作成する。 """ logger.info("System Prompt: %s", system_prompt) return system_prompt
11 ユーザープロンプトの生成 • 存在しないリソースタイプを用い てテンプレートが生成されないよ う回答させる処理 • CFn ListTypes APIを用いて、
AWS::から始まるリソースタイプ リストを取得 • プロンプト内で取得したリソース タイプ以外のものを使用しない よう指示 # 一部省略 def generate_yaml(system_prompt: str, tmp_image_path: str) -> Any: while True: response = cfn.list_types( Visibility="PUBLIC", **({"NextToken": next_token} if next_token else {}) ) type_summaries.extend(response["TypeSummaries"]) next_token = response.get("NextToken") if not next_token: break type_list = [ summary["TypeName"] for summary in type_summaries if summary["TypeName"].startswith("AWS::") ] first_generate_text = f""" (中略) \n- 以下の<リソースタイプリスト>に存在しないリソースタイプは、回答で出力 するCloudFormationテンプレートのリソースタイプとして使用してはいけない。 \n\n<リソースタイプリスト> \n{type_list} """
12 YAMLフォーマットと会話履歴によるファイル連結 • Claudeで生成された回答の 内、YAML内容のみを抜き出し て正しく連結する処理 • Claudeが生成した回答から YAMLファイルの箇所のみを抽 出し、改行を入れて連結
• 次のYAML量が最初の80%を超 える場合のみ、Claudeへの質 問・抽出・連結を繰り返す # 一部省略 for yaml_count in range(max_yaml_count): next_res_message = request_bedrock(model_id, messages, next_content_text, system_prompt) next_row_content = next_res_message["content"][0]["text"] logger.info(f"Next Response {yaml_count}: %s", next_row_content) next_yaml_content = format_yaml(next_row_content) yaml_content += "\n" + next_yaml_content next_yaml_length = len(next_yaml_content) if next_yaml_length > eighty_percent_first_yaml_length: messages.append(next_res_message) else: break def format_yaml(row_content: str) -> str: match = re.search(r"```yaml\n(.*?)\n```", row_content, re.DOTALL) if match: response_text = match.group(1) return response_text else: return ""
13 CFnテンプレートとしてのレビューとバリデーション • バリデーション結果が正常とな るまで、テンプレートをClaudeで レビューさせる処理 • CFn ValidateTemplate APIを用
いて、テンプレートにエラーがな いか確認 • エラーがある場合のみエラー メッセージを含めて、Claudeに 繰り返しレビューさせる # 一部省略 def lambda_handler(event: Dict[Any, Any], context: Any) -> Dict[str, Any]: for review_count in range(max_review_count): logger.info(f"Validation Status: {status}") if status == "normally": break else: reviewed_yaml = review_yaml( system_prompt, tmp_image_path, target_yaml, cfn_res ) status, cfn_res = cfn_validate(reviewed_yaml) target_yaml = reviewed_yaml def review_yaml(system_prompt: str, tmp_image_path: str, yaml_content: str, cfn_err: Any) -> Any: first_review_text = f""" \nもしエラーメッセージが何かしら追加で提示されている場合は、エラーを解消 できるように更新したテンプレートを全て出力してください。 \n\n<CloudFormationテンプレート> \n{yaml_content} \n\n<エラーメッセージ> \n{cfn_err} """
14 サンプルCSVを元にしたパラメータシート生成 • 事前に与えたCSVファイルとテ ンプレートを元にパラメータシー トを生成する処理 • CSVファイルには生成したい表 形式のサンプル項目を事前に記 載
• プロンプト内で取得したCSVファ イルの形式を参考にするよう指 示 # 一部省略 def request_bedrock(tmp_template_path: str) -> Any: with open(prompt_path, "rt") as csv_file: complement_prompt = csv_file.read() content_text = f""" \n\nHuman: \n<質問> \n提示されたサンプルパラメータシートの形式を参考にしながら、提示された CloudFormationテンプレートを反映するパラメータシート(CSV形式)を作成してく ださい。 \nパラメータシートには、以下の条件全てを満たすようにしてください: \n- 必要なすべてのリソースとそれらの設定を含める \n- テンプレートに基づきリソース間の依存関係や参照を適切に記載する \n\n<サンプルパラメータシート> ```csv {complement_prompt} ``` \n\n<CloudFormationテンプレート> \n```yaml \n{yaml_content} \n``` """
15 AIクラウドエンジニアの紹介デモ
16 入力する構成図の例
17 生成されたテンプレート(Application Composerより)
18 生成されたパラメータシート
19 最後に
20 Claudeは仕事を代替できるのか?(個人的感想) • 現時点では全てが代替されるという事はなさそう ◦ 個人的には70-80%くらいの完成度ならできそう、一方で90%以上の正確さを求め るのは正直厳しい印象 ◦ 与えられるインプット(構成図)も完璧ではないので、何かとブレは生じがち •
Claudeの特性をアプリ側の処理で上手く補助すると、求めるものにより近 づける事ができる ◦ 動的なプロンプトの生成 ◦ 会話履歴を用いたテンプレートのフォーマットと連結 ◦ エラーを考慮したレビューとバリデーションの繰り返し ◦ サンプルファイルを元にしたパラメータシート生成
21 まとめ AIクラウドエンジニアに仕事を任せて サボれるようになりたい!
22 宣伝 6/28(金)〜7/31(水)で社外イベントやります 生成AI関連のオンライン登壇ももりだくさん!
23