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
360
世界の中心でApp Runnerを叫ぶ FINAL
tsukuboshi
0
330
CDKで始めるTypeScript開発のススメ
tsukuboshi
1
1.8k
Mastraに入門してみた ~AWS CDKを添えて~
tsukuboshi
0
1.4k
Amazon Bedrock GenUハンズオン座学資料 #2 GenU環境でRAGを体験してみよう
tsukuboshi
0
810
Amazon Bedrock GenUハンズオン座学資料 #1 GenU環境で生成AIを体験してみよう
tsukuboshi
0
1.5k
AWSエンジニアに捧ぐLangChainの歩き方
tsukuboshi
5
2.3k
世界の中心でApp Runnerを叫ぶ ~Aurora DSQLを添えて~
tsukuboshi
0
900
初めてのGPTs ~ネコ派を〇〇派に変える技術~
tsukuboshi
0
1.1k
Other Decks in Technology
See All in Technology
実装は速くなった、レビューはどうする? ― 自身のレビューをAIで再現させるサーヴァントエンジニアリングのすゝめ / Implementation got faster. So what about reviews? — An invitation to Servant Engineering: Recreating your own code reviews with AI
nrslib
8
4.6k
AmazonRoute 53ではじめてのドメイン取得!HTTPS化までの道のりを整理してみた
usanchuu
3
130
生成 AI × MCP で切り拓く次世代 SRE!自律型運用への挑戦と開発者体験の進化
_awache
0
190
LLMと共に進化するプロセスを目指して
ymatsuwitter
12
3.9k
10倍の生産性を実現するAI駆動並列エージェントのすべて
kumaiu
4
1.3k
FDE という解 ― 暗黙知と明示知をつなぐ、伴走型エンジニアリング ―
otanet
0
130
Kubernetesにおける学習基盤とLLMOpsの概要
ry
1
230
「速く作る」から「正しく作る」へ ─ 生成AI時代の開発フロー改革の ロードマップと実行 ─
starfish719
0
9.7k
Claude Code×Terraform IaC テンプレート駆動開発
itouhi
1
490
爆速でマルチプロダクトを立ち上げる時 事業・CTO目線で大事にしたい事
miyatakoji
0
100
「エンジニア進化論」2028年の開発完全自動化、エンジニアはどう進化するか
cyberagentdevelopers
PRO
4
4.3k
ポケモンの型をTypeScriptの型システムで表現してみた
subroh0508
0
370
Featured
See All Featured
Navigating Team Friction
lara
192
16k
My Coaching Mixtape
mlcsv
0
140
Automating Front-end Workflow
addyosmani
1370
210k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
200
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Technical Leadership for Architectural Decision Making
baasie
3
400
How to train your dragon (web standard)
notwaldorf
97
6.7k
The Spectacular Lies of Maps
axbom
PRO
1
800
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.4k
Making Projects Easy
brettharned
120
6.7k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.4k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
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