<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on 図解 わかりやすいAWS</title><link>https://cloud-aws.net/post/</link><description>Recent content in Posts on 図解 わかりやすいAWS</description><generator>Hugo -- gohugo.io</generator><language>ja</language><lastBuildDate>Thu, 09 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://cloud-aws.net/post/index.xml" rel="self" type="application/rss+xml"/><item><title>Claude Managed Agents — Anthropicが提供するフルマネージドAIエージェント基盤</title><link>https://cloud-aws.net/post/claude-managed-agents/</link><pubDate>Thu, 09 Apr 2026 00:00:00 +0000</pubDate><guid>https://cloud-aws.net/post/claude-managed-agents/</guid><description>&lt;h2 id="何を解決するサービスか"&gt;何を解決するサービスか
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;一言で:&lt;/strong&gt; 「本番AIエージェントに必要なインフラを全部Anthropicがホストしてくれるサービス」&lt;/p&gt;
&lt;p&gt;エージェントを本番運用するには、サンドボックス実行環境・状態管理・クレデンシャル管理・スコープ付き権限・エンドツーエンドのトレーシングなど、数ヶ月分のインフラ構築が必要になる。Managed Agentsはこれを丸ごと引き受けて、ユーザーは「エージェントのロジック」だけに集中できるようにする。&lt;/p&gt;
&lt;p&gt;2026年4月8日にパブリックベータとして発表された。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="具体的な利用イメージ"&gt;具体的な利用イメージ
&lt;/h2&gt;&lt;h3 id="例-セキュリティアラート分析エージェント"&gt;例: セキュリティアラート分析エージェント
&lt;/h3&gt;&lt;p&gt;GuardDutyが不審なAPI呼び出しを検知した。このアラートを受けて自動で調査し、レポートを出すエージェントを作りたいとする。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;自前で構築する場合（従来）:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Lambda or ECSでエージェントの実行環境を作る&lt;/li&gt;
&lt;li&gt;Claude APIを呼ぶエージェントループを自前実装（リトライ、タイムアウト、コンテキスト管理…）&lt;/li&gt;
&lt;li&gt;エージェントがaws cliやpythonスクリプトを実行するためのサンドボックスを構築&lt;/li&gt;
&lt;li&gt;AWSクレデンシャルの安全な受け渡し機構を実装&lt;/li&gt;
&lt;li&gt;エージェントの実行ログ・トレーシングを仕込む&lt;/li&gt;
&lt;li&gt;途中で落ちた場合の復旧処理を書く&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;→ &lt;strong&gt;数ヶ月のインフラ構築&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Managed Agentsを使う場合:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. エージェントを定義（1回だけ）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;beta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Security Analyst&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;claude-sonnet-4-6&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;あなたはAWSセキュリティアナリストです。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; アラートを受け取ったら以下の手順で調査してください:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; 1. CloudTrailログを分析し、不審なAPI呼び出しの詳細を特定
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; 2. 関連するIAMユーザー/ロールのアクティビティを確認
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; 3. 影響範囲を評価
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; 4. 調査結果をMarkdownレポートとしてまとめる&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;agent_toolset_20260401&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="c1"&gt;# bash, ファイル操作等&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;custom&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;send_slack&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# Slack通知（自前実行）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Slackチャンネルにメッセージを送信&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;input_schema&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. 実行環境を定義（aws cli入り）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;environment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;beta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environments&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;security-env&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;cloud&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;networking&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;unrestricted&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. アラートが来たらセッションを起動&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;beta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sessions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;environment_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 4. アラート内容を渡す → あとはエージェントが自律的に調査&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;beta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sessions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;user.message&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;以下のGuardDutyアラートを調査してください:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;alert_json&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;エージェントはコンテナ内でaws cliを実行し、CloudTrailを検索し、Pythonでログを集計し、Markdownレポートを生成する。すべてAnthropicのインフラ上で動く。コンテナが落ちてもセッションログから自動復旧する。&lt;/p&gt;
&lt;p&gt;→ &lt;strong&gt;数日でデプロイ可能&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="自前構築との比較"&gt;自前構築との比較
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;観点&lt;/th&gt;
 &lt;th&gt;自前構築&lt;/th&gt;
 &lt;th&gt;Managed Agents&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;エージェントループ&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;自分でリトライ・分岐・エラー処理を実装&lt;/td&gt;
 &lt;td&gt;Anthropicが提供。ツール呼び出しの判断はClaude任せ&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;実行環境&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;EC2/ECS/Lambdaを構築・運用&lt;/td&gt;
 &lt;td&gt;APIで定義するだけ。コンテナはオンデマンド起動&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;クレデンシャル&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Secrets Managerから取得する仕組みを実装&lt;/td&gt;
 &lt;td&gt;Vault-proxiedで自動管理。サンドボックスに漏れない&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;障害回復&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;自前でチェックポイント・リトライ実装&lt;/td&gt;
 &lt;td&gt;セッションログから自動復旧&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;監視&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;CloudWatch等を自前で仕込む&lt;/td&gt;
 &lt;td&gt;Claude Consoleで全ツール呼び出し・判断を確認可能&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;スケーリング&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Auto Scaling設定&lt;/td&gt;
 &lt;td&gt;自動。同時セッション数に応じてスケール&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;要するに、&lt;strong&gt;EC2で自分でサーバーを立てるか、Fargateに任せるか&lt;/strong&gt;の違いに近い。エージェントのロジック（システムプロンプト + ツール定義）だけ書けば、あとはAnthropicが全部やってくれる。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="アーキテクチャ--脳と手の分離"&gt;アーキテクチャ — 「脳と手の分離」
&lt;/h2&gt;&lt;p&gt;Anthropicのエンジニアリングブログで詳述されている設計思想で、ここが技術的に一番面白い部分。&lt;/p&gt;
&lt;h3 id="3コンポーネント分離"&gt;3コンポーネント分離
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;コンポーネント&lt;/th&gt;
 &lt;th&gt;役割&lt;/th&gt;
 &lt;th&gt;AWSで例えると&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Brain（脳）&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Claude + ハーネス（エージェントループ）&lt;/td&gt;
 &lt;td&gt;コントロールプレーン&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Hands（手）&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;サンドボックスコンテナ（コード実行・ファイル操作）&lt;/td&gt;
 &lt;td&gt;データプレーン（ワーカーノード）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Session（セッション）&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;永続的なappend-onlyイベントログ&lt;/td&gt;
 &lt;td&gt;CloudWatch Logsのようなイミュータブルログ&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;核心は、&lt;strong&gt;ハーネスがコンテナの中で動かない&lt;/strong&gt;こと。ハーネスは実行環境を &lt;code&gt;execute(name, input) → string&lt;/code&gt; という統一インターフェースでツールとして呼ぶ。つまりコンテナはCattle（使い捨て）であってPet（手塩にかけるサーバー）ではない。&lt;/p&gt;
&lt;h3 id="コンテナのオンデマンドプロビジョニング"&gt;コンテナのオンデマンドプロビジョニング
&lt;/h3&gt;&lt;p&gt;コンテナはセッション開始時に事前起動するのではなく、&lt;code&gt;provision({resources})&lt;/code&gt; 呼び出しで必要になった時点で初期化される。これにより、推論（Brain側）はコンテナの起動を待たずに開始できる。&lt;/p&gt;
&lt;p&gt;実測値:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;p50で約60%のTTFT（最初のトークンまでの時間）改善&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;p95で90%以上の改善&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="障害回復"&gt;障害回復
&lt;/h3&gt;&lt;p&gt;EC2のAuto Recoveryと似た発想で、ステートをインスタンス外（セッションログ）に持っているから、どのコンポーネントが死んでも復旧できる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;コンテナ障害&lt;/strong&gt; → ハーネスがエラーをキャッチしてClaudeにリトライ判断させる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ハーネス障害&lt;/strong&gt; → 新しいステートレスなハーネスが &lt;code&gt;wake(sessionId)&lt;/code&gt; でセッションログから復旧&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;相互依存なし&lt;/strong&gt; → 各コンポーネントが独立して落ちても連鎖障害にならない&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="セキュリティ--クレデンシャルがサンドボックスに渡らない"&gt;セキュリティ — クレデンシャルがサンドボックスに渡らない
&lt;/h3&gt;&lt;p&gt;2つのパターンで実現している:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Resource-bundled auth&lt;/strong&gt; — リポジトリトークンはGitリモートの初期化時にセットアップ。Claudeは &lt;code&gt;push&lt;/code&gt;/&lt;code&gt;pull&lt;/code&gt; を叩くだけでトークンを直接扱わない&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vault-proxied&lt;/strong&gt; — OAuthトークンは外部Vaultに保管。プロキシ経由でサーバーサイドがクレデンシャルを取得&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;IAMロールをEC2に割り当てるのと同じ考え方で、実行環境にクレデンシャルを置かず、インフラ側が仲介する。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="4つの核心概念"&gt;4つの核心概念
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;概念&lt;/th&gt;
 &lt;th&gt;説明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Agent&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;モデル + システムプロンプト + ツール + MCPサーバー + スキル。一度定義してIDで使い回す&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Environment&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;コンテナテンプレート。パッケージ（Python, Node, Go等）・ネットワークアクセスルール・マウントファイル&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Session&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;AgentとEnvironmentを組み合わせた実行インスタンス。タスク遂行の単位&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Events&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;アプリとエージェント間のメッセージ（ユーザーターン、ツール結果、ステータス更新）。SSEでストリーム&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="ビルトインツール"&gt;ビルトインツール
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;agent_toolset_20260401&lt;/code&gt; を指定すると全ツールが有効になる。個別にON/OFFも可能。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;ツール&lt;/th&gt;
 &lt;th&gt;名前&lt;/th&gt;
 &lt;th&gt;内容&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Bash&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;bash&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;シェルコマンド実行&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Read&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;read&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;ファイル読み取り&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Write&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;write&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;ファイル書き込み&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Edit&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;edit&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;文字列置換編集&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Glob&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;glob&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;ファイルパターンマッチング&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Grep&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;grep&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;正規表現テキスト検索&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Web fetch&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;web_fetch&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;URL内容取得&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Web search&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;web_search&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Web検索&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;カスタムツール&lt;/strong&gt;も定義可能。JSONスキーマでインターフェースを定義し、実行はアプリ側が担当して結果をイベントで返す。MCPサーバーの接続にも対応（Streamable HTTP推奨）。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="apiの使い方python-sdk"&gt;APIの使い方（Python SDK）
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;anthropic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Anthropic&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Anthropic&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. Agent定義&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;beta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Coding Assistant&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;claude-sonnet-4-6&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;You are a helpful coding assistant.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;agent_toolset_20260401&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. Environment定義&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;environment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;beta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environments&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;quickstart-env&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;cloud&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;networking&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;unrestricted&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. Session開始&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;beta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sessions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;environment_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 4. メッセージ送信 + SSEストリーム&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;beta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sessions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;beta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sessions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;user.message&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Fibonacci計算スクリプトを作って&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;agent.message&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;agent.tool_use&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;[Using tool: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;session.status_idle&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;Agent finished.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;CLIツール（&lt;code&gt;ant&lt;/code&gt;）も提供されており、YAML定義でエージェントを作成できる:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ant beta:agents create &lt;span class="s"&gt;&amp;lt;&amp;lt;&amp;#39;YAML&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;name: Coding Assistant
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;model: claude-sonnet-4-6
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;tools:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; - type: agent_toolset_20260401
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; configs:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; - name: web_fetch
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; enabled: false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;YAML&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ベータヘッダー &lt;code&gt;managed-agents-2026-04-01&lt;/code&gt; が必須（SDKは自動付与）。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="料金体系"&gt;料金体系
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;項目&lt;/th&gt;
 &lt;th&gt;料金&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;トークン使用量&lt;/td&gt;
 &lt;td&gt;通常のAPI料金&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;セッション実行時間&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;$0.08/セッション時間&lt;/strong&gt;（アクティブ時間のみ。待機中は課金なし）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Web検索&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;$10/1,000検索&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="anthropicの3つのエージェント提供形態の比較"&gt;Anthropicの3つのエージェント提供形態の比較
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th&gt;Messages API&lt;/th&gt;
 &lt;th&gt;Agent SDK&lt;/th&gt;
 &lt;th&gt;Managed Agents&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;何か&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;直接モデル呼び出し&lt;/td&gt;
 &lt;td&gt;自前でエージェントループを組むフレームワーク&lt;/td&gt;
 &lt;td&gt;フルマネージドエージェントハーネス&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;向いている用途&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;カスタムループ、細かい制御&lt;/td&gt;
 &lt;td&gt;自社インフラで動かしたい場合&lt;/td&gt;
 &lt;td&gt;長時間実行、非同期タスク&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;インフラ管理&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;全部自前&lt;/td&gt;
 &lt;td&gt;全部自前&lt;/td&gt;
 &lt;td&gt;Anthropicが全部やる&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;AWSで例えると&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;EC2（自分で全部組む）&lt;/td&gt;
 &lt;td&gt;ECS（コンテナオーケストレーション自前）&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Lambda/Fargate（インフラ抽象化）&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="早期採用企業"&gt;早期採用企業
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;企業&lt;/th&gt;
 &lt;th&gt;活用方法&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Notion&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;ワークスペース内でタスク委譲。エンジニアはコード、ナレッジワーカーはWebサイト・プレゼンを並列生成&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Rakuten&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;製品・営業・マーケ・経理・HRのエージェントをSlack/Teams連携で展開。1エージェントあたり1週間でデプロイ&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Asana&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;AI Teammates（プロジェクト内で人間と協働するエージェント）を構築&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Sentry&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;デバッグエージェント + パッチ作成エージェントを連携。バグ検知→PRまでの期間を大幅短縮&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Vibecode&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;AI-nativeアプリデプロイのインフラ。セットアップ時間10倍短縮&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="research-preview機能アクセス申請が必要"&gt;Research Preview機能（アクセス申請が必要）
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multi-agent&lt;/strong&gt; — エージェントが別のエージェントをスポーンする&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Outcomes&lt;/strong&gt; — 自己評価して目標達成度を測定・反復する&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memory&lt;/strong&gt; — セッション間で記憶を保持する&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="参考リンク"&gt;参考リンク
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://platform.claude.com/docs/en/managed-agents/overview" target="_blank" rel="noopener"
 &gt;公式ドキュメント: Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://claude.com/blog/claude-managed-agents" target="_blank" rel="noopener"
 &gt;公式ブログ: Claude Managed Agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.anthropic.com/engineering/managed-agents" target="_blank" rel="noopener"
 &gt;エンジニアリングブログ: Scaling Managed Agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://thenewstack.io/with-claude-managed-agents-anthropic-wants-to-run-your-ai-agents-for-you/" target="_blank" rel="noopener"
 &gt;The New Stack: 解説記事&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://siliconangle.com/2026/04/08/anthropic-launches-claude-managed-agents-speed-ai-agent-development/" target="_blank" rel="noopener"
 &gt;SiliconANGLE: ローンチ記事&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>AWS SAP サービス別ノート — ユースケースと判断軸で整理する</title><link>https://cloud-aws.net/post/sap-service-notes/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://cloud-aws.net/post/sap-service-notes/</guid><description>&lt;p&gt;この記事は、&lt;a class="link" href="https://cloud-aws.net/post/sap-exam-notes/" &gt;AWS SAP合格記 — Slack DMで作るサービス別ノート勉強法&lt;/a&gt; で紹介した「サービス別ノート」を、ユースケースと判断軸ベースで再構成したものです。&lt;/p&gt;
&lt;p&gt;SAP試験では「似たサービスの中から最適なものを選ぶ」判断力が問われます。各テーマを &lt;strong&gt;「なぜ複数の選択肢があるのか → どう違うのか → どの条件でどれを選ぶか」&lt;/strong&gt; の流れで整理しています。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;注&lt;/strong&gt;: 一部の情報は学習時点（2022〜2023年）のものです。最新情報と異なる可能性がある箇所には注記を入れています。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;目次&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a class="link" href="#1-%e3%83%aa%e3%82%a2%e3%83%ab%e3%82%bf%e3%82%a4%e3%83%a0%e3%83%87%e3%83%bc%e3%82%bf%e5%87%a6%e7%90%86" &gt;リアルタイムデータ処理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="#2-%e8%aa%8d%e8%a8%bc%e8%aa%8d%e5%8f%af%e3%83%91%e3%82%bf%e3%83%bc%e3%83%b3" &gt;認証・認可パターン&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="#3-%e3%82%b3%e3%83%b3%e3%83%86%e3%83%b3%e3%83%84%e9%85%8d%e4%bf%a1%e3%81%a8%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b9%e5%88%b6%e5%be%a1" &gt;コンテンツ配信とアクセス制御&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="#4-%e3%83%87%e3%83%bc%e3%82%bf%e3%83%99%e3%83%bc%e3%82%b9%e9%81%b8%e6%8a%9e" &gt;データベース選択&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="#5-%e3%83%8d%e3%83%83%e3%83%88%e3%83%af%e3%83%bc%e3%82%af%e8%a8%ad%e8%a8%88" &gt;ネットワーク設計&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="#6-%e3%82%bb%e3%82%ad%e3%83%a5%e3%83%aa%e3%83%86%e3%82%a3" &gt;セキュリティ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="#7-%e9%81%8b%e7%94%a8%e7%ae%a1%e7%90%86" &gt;運用管理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="#8-%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e3%83%ac%e3%82%b9--api%e8%a8%ad%e8%a8%88" &gt;サーバーレス / API設計&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="#9-%e3%83%87%e3%83%bc%e3%82%bf%e7%a7%bb%e8%a1%8cetl" &gt;データ移行・ETL&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="1-リアルタイムデータ処理"&gt;1. リアルタイムデータ処理
&lt;/h2&gt;&lt;h3 id="なぜ複数の選択肢があるのか"&gt;なぜ複数の選択肢があるのか
&lt;/h3&gt;&lt;p&gt;AWSには「データを受け取って後続に渡す」仕組みが複数ある。Kinesis Data Streams、SQS、Amazon MQの3つが代表的だ。これらは一見似ているが、&lt;strong&gt;解こうとしている課題が違う&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kinesis Data Streams&lt;/strong&gt; = ストリーミング処理。大量のデータを連続的に受け取り、リアルタイムで処理する&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SQS&lt;/strong&gt; = メッセージキューイング。コンポーネント間の非同期連携。処理の確実な実行が目的&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Amazon MQ&lt;/strong&gt; = 既存のActiveMQ互換サービス。オンプレからの移行用&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- TODO: 図を追加 — Kinesis/SQS/MQの使い分けフロー図 --&gt;
&lt;h3 id="kinesis-data-streams-vs-sqs--判断軸"&gt;Kinesis Data Streams vs SQS — 判断軸
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;判断軸&lt;/th&gt;
 &lt;th&gt;Kinesis Data Streams&lt;/th&gt;
 &lt;th&gt;SQS&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;データの性質&lt;/td&gt;
 &lt;td&gt;連続的なストリーム（ログ、クリックストリーム等）&lt;/td&gt;
 &lt;td&gt;個別のメッセージ（ジョブ、通知等）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;複数コンシューマー&lt;/td&gt;
 &lt;td&gt;同じデータを複数アプリで同時に読める&lt;/td&gt;
 &lt;td&gt;1つのメッセージは1つのコンシューマーが処理&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;順序性&lt;/td&gt;
 &lt;td&gt;シャード内で順序保証&lt;/td&gt;
 &lt;td&gt;標準キューは順序保証なし（FIFOキューは保証あり）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;データ保持&lt;/td&gt;
 &lt;td&gt;デフォルト24時間、最大365日間&lt;/td&gt;
 &lt;td&gt;最大14日間&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;レイテンシ要件&lt;/td&gt;
 &lt;td&gt;リアルタイム（200ms以下も可能）&lt;/td&gt;
 &lt;td&gt;準リアルタイム&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;スケーリング&lt;/td&gt;
 &lt;td&gt;シャード数で手動管理&lt;/td&gt;
 &lt;td&gt;自動スケール&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;選択の指針:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;関連する複数のレコードを同じ処理系に回したい → &lt;strong&gt;Kinesis&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;複数のアプリケーションが同じストリームを同時に使う → &lt;strong&gt;Kinesis&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;レコードを数時間後に同じ順序で使う → &lt;strong&gt;Kinesis&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;メッセージレベルの確認/失敗を個別に追跡する → &lt;strong&gt;SQS&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;遅延のある個別のジョブをスケジュールする → &lt;strong&gt;SQS&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;負荷の一時的な上昇をバッファしたい → &lt;strong&gt;SQS&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="kinesis-data-streams-の詳細"&gt;Kinesis Data Streams の詳細
&lt;/h3&gt;&lt;h4 id="概念"&gt;概念
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;シャード&lt;/strong&gt;: スループットの単位。1シャードは1MB/秒のデータ入力、2MB/秒のデータ出力をサポート
&lt;ul&gt;
&lt;li&gt;1秒あたり最大1,000件のPUTレコードをサポート&lt;/li&gt;
&lt;li&gt;読み取りは1秒あたり最大5件のトランザクション（GetRecordsは1回で最大10MB/10,000レコード）&lt;/li&gt;
&lt;li&gt;データ保持期間: デフォルト24時間、最大365日間まで延長可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;レコード&lt;/strong&gt;: データの単位。シーケンス番号、パーティションキー、データBLOB（最大1MB）で構成&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;パーティションキー&lt;/strong&gt;: レコードを異なるシャードにルーティングするためのキー&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;シーケンス番号&lt;/strong&gt;: 各レコードの一意識別子。シャード間では増加しない&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;参考リンク&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.aws.amazon.com/ja_jp/streams/latest/dev/key-concepts.html" target="_blank" rel="noopener"
 &gt;Kinesis Data Streams の主要なコンセプト&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;
&lt;h4 id="データの書き込み"&gt;データの書き込み
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PutRecord / PutRecords&lt;/strong&gt;: 同期処理でデータを追加&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kinesis Producer Library (KPL)&lt;/strong&gt;: 非同期処理の高度な設定が可能なライブラリ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kinesis Agent&lt;/strong&gt;: Linux環境にインストールするJavaアプリケーション。データ収集とストリームへの送信を自動化&lt;/li&gt;
&lt;li&gt;容量制限超過時は &lt;code&gt;ProvisionedThroughputExceeded&lt;/code&gt; 例外で拒否される&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="データの読み取り"&gt;データの読み取り
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kinesis Client Library (KCL)&lt;/strong&gt;: データコンシューマー。ボリュームの変化への適応、負荷分散、耐障害性に対応
&lt;ul&gt;
&lt;li&gt;DynamoDBテーブルを自動作成し、リシャーディングイベントやシーケンス番号チェックポイントを追跡&lt;/li&gt;
&lt;li&gt;EC2オートスケーリンググループ上で実行すれば、処理能力を自動スケール可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kinesis Connector Library&lt;/strong&gt;: DynamoDB、Redshift、S3、Elasticsearch等への統合コネクタ（KCLとは別物）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kinesis Storm Spout&lt;/strong&gt;: Apache Storm との統合ライブラリ&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ApproximateArrivalTimestamp&lt;/code&gt;: レコードがKinesisに正常に受信・保存された時刻&lt;/li&gt;
&lt;li&gt;容量制限超過時は &lt;code&gt;ProvisionedThroughputExceeded&lt;/code&gt; 例外で読み取り拒否&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="拡張ファンアウトenhanced-fan-out"&gt;拡張ファンアウト（Enhanced fan-out）
&lt;/h4&gt;&lt;p&gt;コンシューマーとシャード間に論理的な2MB/秒のスループットパイプを提供するオプション機能。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;使うべきケース:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;複数コンシューマーがKinesisの性能制限を超えてしまう場合&lt;/li&gt;
&lt;li&gt;200ms以下のデータ提供速度を求める場合&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;利用手順:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;コンシューマーをKinesis Data Streamsサービスに登録する&lt;/li&gt;
&lt;li&gt;KCL 2.xを使用している場合、登録は自動&lt;/li&gt;
&lt;li&gt;登録されたコンシューマーはそれぞれ独自の拡張ファンアウトスループットを持つ&lt;/li&gt;
&lt;li&gt;HTTP/2 SubscribeToShard API でデータを取得する&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="リシャーディング"&gt;リシャーディング
&lt;/h4&gt;&lt;p&gt;シャードの分割・結合によりデータストリームをスケールするプロセス。一度に実行できるリシャーディングオペレーションは1つだけ。&lt;/p&gt;
&lt;h4 id="セキュリティ"&gt;セキュリティ
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;HTTPS（SSLエンドポイント）経由でデータを安全に格納・取得&lt;/li&gt;
&lt;li&gt;AWS KMSマスターキー（CMK）によるサーバー側暗号化&lt;/li&gt;
&lt;li&gt;クライアント側暗号化も可能（独自の暗号化ライブラリを使用）&lt;/li&gt;
&lt;li&gt;VPCエンドポイントでプライベートアクセス&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="sqs-のポイント"&gt;SQS のポイント
&lt;/h3&gt;&lt;h4 id="デッドレターキューdlq"&gt;デッドレターキュー（DLQ）
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;キュー処理が失敗した場合にPushされるキュー&lt;/li&gt;
&lt;li&gt;未使用の元メッセージとエラーメッセージがセットでプッシュされる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DLQが推奨されないケース&lt;/strong&gt;: キューの順序性を維持する必要がある場合、無制限にリトライ処理をする場合&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="amazon-mq"&gt;Amazon MQ
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;ActiveMQに互換性のあるマネージドサービス（Pub/Sub型キューイング）&lt;/li&gt;
&lt;li&gt;EC2としてVPC内に起動し、ActiveMQのGUIが使える&lt;/li&gt;
&lt;li&gt;機能的にはSQS/SNSと同じだが、&lt;strong&gt;既存のActiveMQからの移行用&lt;/strong&gt;として提供されている&lt;/li&gt;
&lt;li&gt;AWSとしては、新規構築にはSQSを推奨している&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;: キューイングシステムの比較（MQ/Kafka）— &lt;a class="link" href="https://qiita.com/mura16/items/0ea2914156b1614201aa" target="_blank" rel="noopener"
 &gt;https://qiita.com/mura16/items/0ea2914156b1614201aa&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="2-認証認可パターン"&gt;2. 認証・認可パターン
&lt;/h2&gt;&lt;h3 id="なぜ複数の選択肢があるのか-1"&gt;なぜ複数の選択肢があるのか
&lt;/h3&gt;&lt;p&gt;AWSリソースへのアクセス制御には、「誰が」「どこから」「何の認証情報で」アクセスするかによって最適な方式が変わる。STSの5つのAPIは、それぞれ異なる認証シナリオに対応している。&lt;/p&gt;
&lt;!-- TODO: 図を追加 — STS認証フロー（5つのAPIの使い分け決定木） --&gt;
&lt;h3 id="sts--一時的なセキュリティ認証情報の5つのapi"&gt;STS — 一時的なセキュリティ認証情報の5つのAPI
&lt;/h3&gt;&lt;p&gt;ユーザーIDをAWSの外で管理している場合、IAMユーザーを作成する代わりにIdP（Identity Provider）を利用する。IAMはOpenID Connect（OIDC）またはSAML 2.0と互換性のあるIdPをサポートする。&lt;/p&gt;
&lt;p&gt;STSが返す一時的認証情報は以下の3つのセット:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アクセスキー（アクセスキーID + シークレットアクセスキー）&lt;/li&gt;
&lt;li&gt;セキュリティトークン&lt;/li&gt;
&lt;li&gt;有効期限&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;API&lt;/th&gt;
 &lt;th&gt;ユースケース&lt;/th&gt;
 &lt;th&gt;認証を要求する側&lt;/th&gt;
 &lt;th&gt;返ってくる認証情報&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;GetSessionToken&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;信頼されてない環境のユーザー向け一時認証&lt;/td&gt;
 &lt;td&gt;IAM User&lt;/td&gt;
 &lt;td&gt;IAM User&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;GetFederationToken&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;カスタムIDブローカー経由のフェデレーション&lt;/td&gt;
 &lt;td&gt;Federated User&lt;/td&gt;
 &lt;td&gt;IAM User&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;AssumeRole&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;クロスアカウント委任、カスタムIDブローカー経由&lt;/td&gt;
 &lt;td&gt;IAM User&lt;/td&gt;
 &lt;td&gt;IAM Role&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;AssumeRoleWithWebIdentity&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;OIDC互換IdP経由のフェデレーション&lt;/td&gt;
 &lt;td&gt;Federated User&lt;/td&gt;
 &lt;td&gt;IAM Role&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;AssumeRoleWithSAML&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;SAML 2.0 IdP経由のフェデレーション&lt;/td&gt;
 &lt;td&gt;Federated User&lt;/td&gt;
 &lt;td&gt;IAM Role&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;選択の指針:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IAMユーザーが一時的に権限を得たい（MFA付き等）→ &lt;strong&gt;GetSessionToken&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;外部ユーザーにIAMユーザー相当のアクセスを与えたい → &lt;strong&gt;GetFederationToken&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;別のAWSアカウントのリソースにアクセスしたい → &lt;strong&gt;AssumeRole&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;GoogleやFacebookログインでAWSリソースにアクセスしたい → &lt;strong&gt;AssumeRoleWithWebIdentity&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;社内のActive Directory（SAML）でAWSにログインしたい → &lt;strong&gt;AssumeRoleWithSAML&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;参考リンク&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/fkooo/items/a6d71407b2bed42332cc" target="_blank" rel="noopener"
 &gt;https://qiita.com/fkooo/items/a6d71407b2bed42332cc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://dev.classmethod.jp/articles/getfederetiontoken-assumerole-getsessiontoken/#toc-1" target="_blank" rel="noopener"
 &gt;https://dev.classmethod.jp/articles/getfederetiontoken-assumerole-getsessiontoken/#toc-1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.serverworks.co.jp/summary-of-getting-security-credentials-from-sts" target="_blank" rel="noopener"
 &gt;https://blog.serverworks.co.jp/summary-of-getting-security-credentials-from-sts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;
&lt;h3 id="モバイルアプリの認証--cognito-vs-sts直接呼び出し"&gt;モバイルアプリの認証 — Cognito vs STS直接呼び出し
&lt;/h3&gt;&lt;p&gt;モバイルアプリからAWSリソースにアクセスするパターンは主に2つ:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;パターン1: Amazon Cognito（推奨）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ユーザープール + IDプールを使い、外部IdP認証またはCognito自体での認証・認可を実装&lt;/li&gt;
&lt;li&gt;Cognitoが裏でSTSを呼んでくれるので、アプリ側の実装がシンプルになる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;パターン2: AssumeRoleWithWebIdentity API 直接呼び出し&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SDKで外部IdPからの認証情報を取得し、それを使ってAWSからIAM Roleを引き受ける&lt;/li&gt;
&lt;li&gt;より細かい制御が必要な場合向き&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="api-gateway-の認証--lambda-オーソライザー"&gt;API Gateway の認証 — Lambda オーソライザー
&lt;/h3&gt;&lt;p&gt;API Gatewayへのアクセスを制御するためにLambda関数を使う機能。OAuthやSAMLなどのベアラートークン認可や、カスタム認証スキームを実装できる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2種類のオーソライザー:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;トークンベース（TOKEN オーソライザー）&lt;/strong&gt;: JWT や OAuth トークンなどのベアラートークンで発信者IDを受け取る&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;リクエストパラメータベース（REQUEST オーソライザー）&lt;/strong&gt;: ヘッダー、クエリ文字列、stageVariables、$context変数の組み合わせで発信者IDを受け取る&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="3-コンテンツ配信とアクセス制御"&gt;3. コンテンツ配信とアクセス制御
&lt;/h2&gt;&lt;h3 id="なぜ複数の選択肢があるのか-2"&gt;なぜ複数の選択肢があるのか
&lt;/h3&gt;&lt;p&gt;S3に置いたコンテンツを制限付きで配信したい場合、「S3の署名付きURL」と「CloudFront + 署名付きURL」の2つの方法がある。さらにCloudFront側では「署名付きURL」と「署名付きCookie」の選択肢もある。配信の規模、速度要件、アクセス制御の粒度によって使い分ける。&lt;/p&gt;
&lt;h3 id="s3署名付きurl-vs-cloudfront署名付きurl"&gt;S3署名付きURL vs CloudFront署名付きURL
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;共通点:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;URLを共有すれば誰でもアクセスできる&lt;/li&gt;
&lt;li&gt;有効期限を設定できる&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;判断軸&lt;/th&gt;
 &lt;th&gt;S3署名付きURL&lt;/th&gt;
 &lt;th&gt;CloudFront署名付きURL&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;URLの形式&lt;/td&gt;
 &lt;td&gt;S3のURL&lt;/td&gt;
 &lt;td&gt;カスタムドメインを設定可能&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;キャッシュ&lt;/td&gt;
 &lt;td&gt;なし&lt;/td&gt;
 &lt;td&gt;エッジロケーションでキャッシュ&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ユースケース&lt;/td&gt;
 &lt;td&gt;期間限定の単発ファイル配信&lt;/td&gt;
 &lt;td&gt;大量リクエスト、グローバルアクセス&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;S3を隠す&lt;/td&gt;
 &lt;td&gt;できない&lt;/td&gt;
 &lt;td&gt;可能（自分のドメインにできる）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;選択の指針:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;少量・一時的なファイル共有 → &lt;strong&gt;S3署名付きURL&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;大量リクエスト、高速配信が必要 → &lt;strong&gt;CloudFront署名付きURL&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;S3のURLを外部に見せたくない → &lt;strong&gt;CloudFront署名付きURL&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;グローバルなアクセスが見込まれる → &lt;strong&gt;CloudFront署名付きURL&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="署名付きurl-vs-署名付きcookie"&gt;署名付きURL vs 署名付きCookie
&lt;/h3&gt;&lt;p&gt;非公開のS3バケットに対して、特定のクライアントにアクセス許可を与える手法。署名は秘密鍵（クライアント側）と公開鍵（サーバー側）で認証と改ざん検知を行い、有効期限を設定できる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;署名付きURL&lt;/strong&gt;: 個別のファイルへのアクセス制御。ユーザーがコンテンツにアクセスできる日時やIPアドレスを制御可能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;署名付きCookie&lt;/strong&gt;: 複数のファイルへのアクセスを一括制御。サイト全体へのアクセス権を管理したい場合&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;: &lt;a class="link" href="http://developers.goalist.co.jp/entry/2017/05/11/191628" target="_blank" rel="noopener"
 &gt;http://developers.goalist.co.jp/entry/2017/05/11/191628&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="s3オリジンへのアクセス制御--oacorigin-access-control"&gt;S3オリジンへのアクセス制御 — OAC（Origin Access Control）
&lt;/h3&gt;&lt;p&gt;CloudFront経由でS3にアクセスさせる際、S3バケットを非公開にしたまま CloudFrontからのアクセスだけを許可する仕組み。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;⚠️ 2024年時点の更新&lt;/strong&gt;: 従来のOAI（Origin Access Identity）は&lt;strong&gt;非推奨&lt;/strong&gt;となり、&lt;strong&gt;OAC（Origin Access Control）が推奨&lt;/strong&gt;されています。OACはIAMロールベースの制御、短期間の認証情報ローテーション、SSE-KMS暗号化オブジェクトのサポート、全HTTPメソッド（GET/PUT/POST/PATCH/DELETE/OPTIONS/HEAD）のサポートなど、OAIより多くの機能を提供します。&lt;/p&gt;
&lt;p&gt;参考: &lt;a class="link" href="https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html" target="_blank" rel="noopener"
 &gt;Restrict access to an Amazon S3 origin&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="地理的なアクセス制限"&gt;地理的なアクセス制限
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CloudFrontの地理制限機能&lt;/strong&gt;: 国単位でホワイトリスト/ブラックリストを設定可能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;国より詳細なレベル&lt;/strong&gt;（都市、IP単位等）で制限する場合は、サードパーティの位置情報サービスが必要&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="キャッシュの最適化"&gt;キャッシュの最適化
&lt;/h3&gt;&lt;p&gt;CloudFrontのキャッシュ制御は、Min TTL/Max TTL/Default TTLとオリジンのヘッダー値を組み合わせて決まる。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;: &lt;a class="link" href="https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/Expiration.html" target="_blank" rel="noopener"
 &gt;CloudFront がコンテンツをキャッシュする期間の管理&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;TTLを0にした場合の動作:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;リクエストの都度Originに更新有無を確認する&lt;/li&gt;
&lt;li&gt;更新がなければ304が返り、キャッシュしたコンテンツを利用する&lt;/li&gt;
&lt;li&gt;完全にキャッシュ無効にはならず、Originの負荷軽減効果がある&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;クエリ文字列に対するキャッシュ設定:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クエリ文字列でコンテンツが変わらない場合 → Originに転送せず、クエリ文字列に関係なくキャッシュ&lt;/li&gt;
&lt;li&gt;すべてのクエリ文字列パラメータでキャッシュ → クエリが違うと別リクエスト扱い（ヒット率は下がる）&lt;/li&gt;
&lt;li&gt;指定したクエリ文字列のみキャッシュ → 上記2つのハイブリッド&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;: &lt;a class="link" href="https://qiita.com/tmiki/items/be36303e514ce4d012f8" target="_blank" rel="noopener"
 &gt;https://qiita.com/tmiki/items/be36303e514ce4d012f8&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="originのプロトコル設定"&gt;Originのプロトコル設定
&lt;/h3&gt;&lt;p&gt;HTTP、HTTPS、Match Viewer（クライアントのプロトコルに合わせる）の3つから設定可能。&lt;/p&gt;
&lt;h3 id="lambdaedge"&gt;Lambda@Edge
&lt;/h3&gt;&lt;p&gt;CloudFrontの拡張機能。エッジロケーションでLambda関数を実行できる。4つのイベントをトリガーにできる:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Viewer Request&lt;/strong&gt; — クライアント → CloudFront&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Origin Request&lt;/strong&gt; — CloudFront → Origin&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Origin Response&lt;/strong&gt; — CloudFront ← Origin&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Viewer Response&lt;/strong&gt; — クライアント ← CloudFront&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- TODO: 図を追加 — Lambda@Edgeの4つのトリガーポイント --&gt;
&lt;hr&gt;
&lt;h2 id="4-データベース選択"&gt;4. データベース選択
&lt;/h2&gt;&lt;h3 id="dynamodb"&gt;DynamoDB
&lt;/h3&gt;&lt;h4 id="基本特性"&gt;基本特性
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;リージョン内の3つのAZで同期的にレプリケートされ、高可用性・耐久性を提供&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;デフォルトは結果整合性&lt;/strong&gt;（最新の書き込みを反映していない可能性がある）&lt;/li&gt;
&lt;li&gt;強い整合性読み込み（strongly consistent read）も利用可能&lt;/li&gt;
&lt;li&gt;スループットを指定し、それを超えると「スループット超過エラー」になる
&lt;ul&gt;
&lt;li&gt;→ SQSにキューイングしてバッファとすることで防止可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="キー設計--dynamodbの最重要ポイント"&gt;キー設計 — DynamoDBの最重要ポイント
&lt;/h4&gt;&lt;!-- TODO: 図を追加 — パーティションキーとソートキーの関係図 --&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;プライマリキー&lt;/strong&gt;: データを一意に識別。&lt;code&gt;パーティションキー&lt;/code&gt;単体、または&lt;code&gt;パーティションキー + ソートキー&lt;/code&gt;の複合キー&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;パーティションキー&lt;/strong&gt;: データのカテゴライズ。このキーのハッシュ値で保存先パーティションが決まる
&lt;ul&gt;
&lt;li&gt;例: 個人情報テーブルで郵便番号をパーティションキーにすると、同じ郵便番号のデータは同じパーティションに保存される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ソートキー&lt;/strong&gt;: パーティション内でのデータの並び順を決める
&lt;ul&gt;
&lt;li&gt;パーティションキーでカテゴライズし、ソートキーでソートする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GSI（Global Secondary Index）&lt;/strong&gt;: 元テーブルとは別のパーティションキー+ソートキーでテーブルを再構成&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LSI（Local Secondary Index）&lt;/strong&gt;: パーティションキーはそのまま、ソートキーだけ変える&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;: &lt;a class="link" href="https://qiita.com/shibataka000/items/e3f3792201d6fcc397fd" target="_blank" rel="noopener"
 &gt;https://qiita.com/shibataka000/items/e3f3792201d6fcc397fd&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h4 id="fgacfine-grained-access-control"&gt;FGAC（Fine Grained Access Control）
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;IAMではテーブル単位のアクセス制御しかできない&lt;/li&gt;
&lt;li&gt;FGACを使えばレコード単位、キー単位での細かいアクセス制御が可能&lt;/li&gt;
&lt;li&gt;モバイルアプリから直接DynamoDBにアクセスする構成で有用&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="キャパシティユニット計算"&gt;キャパシティユニット計算
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;RCU（読み込みキャパシティユニット）:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1RCU = 最大4KBの項目について、1秒あたり1回の強い整合性読み込み、または2回の結果整合性読み込み&lt;/li&gt;
&lt;li&gt;4KBを超える項目は追加のRCUを消費する（8KB → 2RCU（強い整合性）or 1RCU（結果整合性））&lt;/li&gt;
&lt;li&gt;例: 10RCUのテーブル → 4KB項目を1秒に10回（強い整合性）or 20回（結果整合性）読み込み可能&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;WCU（書き込みキャパシティユニット）:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1WCU = 最大1KBの項目について、1秒あたり1回の書き込み&lt;/li&gt;
&lt;li&gt;書き込みサイズは1KBの倍数に切り上げ（500バイト → 1KB扱い）&lt;/li&gt;
&lt;li&gt;例: 30WCUのテーブル → 1KB項目を1秒に30回書き込み可能&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="キャパシティモード"&gt;キャパシティモード
&lt;/h4&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;モード&lt;/th&gt;
 &lt;th&gt;特徴&lt;/th&gt;
 &lt;th&gt;パーティション設計&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;プロビジョニング（手動）&lt;/td&gt;
 &lt;td&gt;自分でRCU/WCUを設定&lt;/td&gt;
 &lt;td&gt;必要&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Auto Scaling&lt;/td&gt;
 &lt;td&gt;負荷に応じて自動調整&lt;/td&gt;
 &lt;td&gt;必要&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;オンデマンド&lt;/td&gt;
 &lt;td&gt;完全自動、使った分だけ課金&lt;/td&gt;
 &lt;td&gt;不要&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;キャパシティの15%以上を利用する設計なら、プロビジョニングの方がコスト効率が良い。&lt;/p&gt;
&lt;h4 id="dynamodb-streams"&gt;DynamoDB Streams
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;DynamoDBへの項目の追加・変更・削除をイベントとして検出する機能&lt;/li&gt;
&lt;li&gt;24時間以内の変更の時系列順序を保持&lt;/li&gt;
&lt;li&gt;テーブル単位で有効化&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="dynamodbトランザクション"&gt;DynamoDBトランザクション
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;複数テーブルへの同時読み取り・書き込みの一貫性を提供&lt;/li&gt;
&lt;li&gt;同時に10件のテーブル操作を1つのトランザクションにまとめられる&lt;/li&gt;
&lt;li&gt;トランザクション内での同じアイテムに複数操作はできない&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;グローバルテーブルは非同期のためサポートされない&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;: &lt;a class="link" href="https://qiita.com/blackcat5016/items/c2af7d3d55093134bac3" target="_blank" rel="noopener"
 &gt;https://qiita.com/blackcat5016/items/c2af7d3d55093134bac3&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h4 id="cross-region-replication"&gt;Cross-Region Replication
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;ユースケース: 災害対策（DR）、リージョン移行&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="rds-proxy"&gt;RDS Proxy
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;アプリケーションとRDSの間に配置されるプロキシ。データベースへのコネクションプールを効率的に管理する&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;フェールオーバー時間を最大66%短縮&lt;/strong&gt;（Aurora/RDS）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LambdaからRDSに接続する場合は必須級&lt;/strong&gt; — Lambdaの同時実行でコネクションが乱立するのを防ぐ&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="redshift--concurrency-scaling同時実行スケーリング"&gt;Redshift — Concurrency Scaling（同時実行スケーリング）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;エンドポイントを変更せずに、自動で新しいクラスターを追加する機能&lt;/li&gt;
&lt;li&gt;メインクラスタのクエリ同時実行数を超過すると、スケーリングクラスタにルーティング&lt;/li&gt;
&lt;li&gt;スケーリングクラスタは&lt;strong&gt;読み取り専用&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;: &lt;a class="link" href="https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/concurrency-scaling.html" target="_blank" rel="noopener"
 &gt;Amazon Redshift Concurrency Scaling&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="5-ネットワーク設計"&gt;5. ネットワーク設計
&lt;/h2&gt;&lt;h3 id="global-accelerator"&gt;Global Accelerator
&lt;/h3&gt;&lt;p&gt;AWSのグローバルネットワークを使い、ユーザーに最も近いエッジロケーションからAWSリソースへのトラフィックを最適化するサービス。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;オリジンに利用できるサービス:&lt;/strong&gt; NLB、ALB、EC2、EIP&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;標準ルーティング vs カスタムルーティング:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;標準ルーティング&lt;/strong&gt;: 基本的にこちらを利用。AWSが最適なエンドポイントへ自動ルーティング&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;カスタムルーティング&lt;/strong&gt;: 特定のEC2に特定のクライアントを紐づけたい場合（ゲームサーバー等）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="direct-connect"&gt;Direct Connect
&lt;/h3&gt;&lt;p&gt;オンプレミスとAWSを専用線で接続するサービス。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;構築に必要な設定:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VGW（Virtual Private Gateway）の設定とルート伝搬の有効化&lt;/li&gt;
&lt;li&gt;オンプレと通信するサブネットのルートテーブルにオンプレ宛のルートを登録&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;: &lt;a class="link" href="https://dev.classmethod.jp/articles/whitepaper-translate-jpn-vpc-connectivity-options-01/" target="_blank" rel="noopener"
 &gt;https://dev.classmethod.jp/articles/whitepaper-translate-jpn-vpc-connectivity-options-01/&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="transit-gateway-network-manager"&gt;Transit Gateway Network Manager
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Transit Gateway、VPC、VPNのトポロジを可視化して管理するサービス&lt;/li&gt;
&lt;li&gt;主な機能は可視化とモニタリング&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;: &lt;a class="link" href="https://dev.classmethod.jp/articles/transit-gateway-network-manager-vpn/" target="_blank" rel="noopener"
 &gt;https://dev.classmethod.jp/articles/transit-gateway-network-manager-vpn/&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="ec2-プレイスメントグループ"&gt;EC2 プレイスメントグループ
&lt;/h3&gt;&lt;p&gt;EC2が起動する物理サーバーの配置を指定する設定。3つの戦略がある。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;戦略&lt;/th&gt;
 &lt;th&gt;用途&lt;/th&gt;
 &lt;th&gt;特徴&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;クラスター&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;インスタンス間の低レイテンシ通信&lt;/td&gt;
 &lt;td&gt;同一ラックに集約&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;パーティション&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Hadoop/Kafka等のクラスタ&lt;/td&gt;
 &lt;td&gt;低レイテンシ+クラスタ間分散&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;分散&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;耐障害性の向上&lt;/td&gt;
 &lt;td&gt;物理ラックを分散&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;既存インスタンスをプレイスメントグループに追加する場合:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インスタンスを一度停止&lt;/li&gt;
&lt;li&gt;AWS CLIで移動&lt;/li&gt;
&lt;li&gt;インスタンスタイプを統一し、グループ全体を再起動&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;: &lt;a class="link" href="https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/placement-groups.html#change-instance-placement-group" target="_blank" rel="noopener"
 &gt;プレイスメントグループ&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="ec2-インスタンスの選択"&gt;EC2 インスタンスの選択
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;主なインスタンスタイプと用途:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;T3&lt;/strong&gt;: バースト可能な汎用タイプ。一時的なCPUスパイクがある中程度の負荷向け&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;G2&lt;/strong&gt;: 高度なグラフィック処理。低レイテンシネットワーキング付きGPUサーバー&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;G4&lt;/strong&gt;: 最もコスト効率の高いGPUインスタンス。ML推論やグラフィクス向け&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ec2-ネットワーク"&gt;EC2 ネットワーク
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;拡張ネットワーキング:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;高帯域幅、低レイテンシーを実現する機能&lt;/li&gt;
&lt;li&gt;OSへのモジュールインストールとAWS CLIでの有効化が必要（一部OS/タイプでは最初から有効化済み）&lt;/li&gt;
&lt;li&gt;100Gbpsネットワーク対応: C5, M5, R5, P3, T3など多数のインスタンスタイプ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;IPv6対応:&lt;/strong&gt; T3は未対応、T4は対応&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;インスタンスストア:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EBSより高IOPS、高スループット、低遅延&lt;/li&gt;
&lt;li&gt;I3, F1, C5d, M6gdなど &lt;code&gt;d&lt;/code&gt; がつくタイプで利用可能&lt;/li&gt;
&lt;li&gt;スナップショットは取得不可。再起動ではデータ維持、停止で消失&lt;/li&gt;
&lt;li&gt;起動後にマウントが必要&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ec2-autoscaling-メトリクス"&gt;EC2 AutoScaling メトリクス
&lt;/h3&gt;&lt;p&gt;トリガーとして使えるメトリクス:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU/Memory&lt;/li&gt;
&lt;li&gt;SQSのキュー長&lt;/li&gt;
&lt;li&gt;ネットワークのIN/OUTトラフィック&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="elb"&gt;ELB
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;トラフィック急増時のメトリクス:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;メトリクス名&lt;/th&gt;
 &lt;th&gt;説明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;SurgeQueueLength&lt;/td&gt;
 &lt;td&gt;ALBで保留中のリクエスト数&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SpilloverCount&lt;/td&gt;
 &lt;td&gt;サージキューが満杯で破棄されたリクエスト数&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;クライアント証明書を使う場合:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ALBではHTTPSの終端でクライアント証明書を扱えないため、&lt;strong&gt;NLBのTCPリスナー（443）&lt;/strong&gt; でEC2に直接TLSを終端させる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;スティッキーセッション:&lt;/strong&gt; Cookie名は &lt;code&gt;AWSELB&lt;/code&gt;（CLBでも同じ）&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://dev.classmethod.jp/articles/nlb-meets-proxy-protocol-v2/" target="_blank" rel="noopener"
 &gt;NLBとProxy Protocol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://stay-ko.be/aws/solutionarchitect-pro-amazon-s3-data-protection/" target="_blank" rel="noopener"
 &gt;S3暗号化&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;
&lt;h3 id="byoip自組織のグローバルip持ち込み"&gt;BYOIP（自組織のグローバルIP持ち込み）
&lt;/h3&gt;&lt;p&gt;自組織が所有するグローバルIPアドレスをAWSに持ち込む手順:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. ROAオブジェクトの作成&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ROA（Route Origination Authorization）: IPアドレスレンジとASNの対応を証明するデータ&lt;/li&gt;
&lt;li&gt;RPKIで発行したリソース証明書で署名&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2. RDAP用X509証明書の作成&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RDAP（Registration Data Access Protocol）: WHOISの後継プロトコル（HTTPS + JSON応答）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;3. 署名付き認可メッセージの作成&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1|aws|account|cidr|YYYYMMDD|SHA256|RSAPSS
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;4. AWSへのプロビジョニング&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws ec2 provision-byoip-cidr --cidr address-range --cidr-authorization-context &lt;span class="nv"&gt;Message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$text_message&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;,Signature&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$signed_message&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;: &lt;a class="link" href="http://jpopf.net/opf-jp/opm16/jpopm16-08.pdf" target="_blank" rel="noopener"
 &gt;http://jpopf.net/opf-jp/opm16/jpopm16-08.pdf&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="rd-gateway-server"&gt;RD Gateway Server
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;インターネットからRDP接続する際に、HTTPS/443でプロキシするための機能&lt;/li&gt;
&lt;li&gt;接続先と同じLAN内に配置し、証明書をインストールして利用&lt;/li&gt;
&lt;li&gt;クライアント側はRDP接続でRD Gateway経由を選択し、サーバー名とクライアント証明書を指定&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;: &lt;a class="link" href="https://blog.pfs.nifcloud.com/20191711_RD_Gateway_RemoteDesktopConnection" target="_blank" rel="noopener"
 &gt;https://blog.pfs.nifcloud.com/20191711_RD_Gateway_RemoteDesktopConnection&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="6-セキュリティ"&gt;6. セキュリティ
&lt;/h2&gt;&lt;h3 id="aws-shield--standard-vs-advanced"&gt;AWS Shield — Standard vs Advanced
&lt;/h3&gt;&lt;p&gt;DDoS保護サービス。無料のStandardと有料のAdvancedで保護レベルが大きく異なる。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;機能&lt;/th&gt;
 &lt;th&gt;Standard（無料）&lt;/th&gt;
 &lt;th&gt;Advanced（有料）&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;対象レイヤー&lt;/td&gt;
 &lt;td&gt;L3/L4&lt;/td&gt;
 &lt;td&gt;L3/L4 + &lt;strong&gt;L7&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;検出&lt;/td&gt;
 &lt;td&gt;悪意あるトラフィック自動検出&lt;/td&gt;
 &lt;td&gt;より大規模な攻撃にも対応&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;緩和&lt;/td&gt;
 &lt;td&gt;自動緩和&lt;/td&gt;
 &lt;td&gt;高度なルーティング技術による緩和&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;可視化&lt;/td&gt;
 &lt;td&gt;なし&lt;/td&gt;
 &lt;td&gt;AWSサービス連携で可視化・通知&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;攻撃履歴&lt;/td&gt;
 &lt;td&gt;参照不可&lt;/td&gt;
 &lt;td&gt;レポート・通知が可能&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;費用保護&lt;/td&gt;
 &lt;td&gt;なし&lt;/td&gt;
 &lt;td&gt;DDoS起因の請求増額に対する払い戻し&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;サポート&lt;/td&gt;
 &lt;td&gt;なし&lt;/td&gt;
 &lt;td&gt;24/365の専門サポート&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Shield StandardでL7 DDoSを検知するには:&lt;/strong&gt; AWS WAFを同時利用すれば可能。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/ddos-overview.html" target="_blank" rel="noopener"
 &gt;AWS Shield&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://media.amazonwebservices.com/jp/DDoS%20White%20Paper_Revised.pdf" target="_blank" rel="noopener"
 &gt;DDoS対策ホワイトペーパー&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;
&lt;h3 id="cloudhsm-vs-kms--暗号化キーの管理"&gt;CloudHSM vs KMS — 暗号化キーの管理
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;判断軸&lt;/th&gt;
 &lt;th&gt;CloudHSM&lt;/th&gt;
 &lt;th&gt;KMS&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;ハードウェア&lt;/td&gt;
 &lt;td&gt;専用（顧客ごとに独立）&lt;/td&gt;
 &lt;td&gt;共用&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;コンプライアンス&lt;/td&gt;
 &lt;td&gt;FIPS 140-2 レベル3&lt;/td&gt;
 &lt;td&gt;FIPS 140-2 レベル2&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;コスト&lt;/td&gt;
 &lt;td&gt;高い&lt;/td&gt;
 &lt;td&gt;安い&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;用途&lt;/td&gt;
 &lt;td&gt;規制要件が厳しいケース&lt;/td&gt;
 &lt;td&gt;一般的な暗号化&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;選択の指針:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;FIPS 140-2 レベル3が必要 → &lt;strong&gt;CloudHSM&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;専用ハードウェアによるキー管理が要件 → &lt;strong&gt;CloudHSM&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;コスト効率を重視、一般的な暗号化 → &lt;strong&gt;KMS&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="cloudhsmによるssltlsオフロード"&gt;CloudHSMによるSSL/TLSオフロード
&lt;/h4&gt;&lt;p&gt;CloudHSMでHTTPS（SSL/TLS）の暗号化処理を実行できる。ハンドシェイクの流れ:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;クライアントがサーバーにHelloメッセージを送信&lt;/li&gt;
&lt;li&gt;サーバーがHelloメッセージと証明書を返す&lt;/li&gt;
&lt;li&gt;クライアントが証明書を検証し、プリマスターシークレットをサーバーの公開鍵で暗号化して送信&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;サーバーがプリマスターシークレットをHSMに送り、HSMの秘密鍵で復号&lt;/strong&gt;（ここがHSMの役割）&lt;/li&gt;
&lt;li&gt;両者がプリマスターシークレットからマスターシークレットを計算&lt;/li&gt;
&lt;li&gt;以降の通信はマスターシークレットで暗号化&lt;/li&gt;
&lt;/ol&gt;

 &lt;blockquote&gt;
 &lt;p&gt;ログを保存するために、S3 + SSE-S3による暗号化が利用可能（暗号化キーの管理はAWS側）&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="aws-organizations--マルチアカウント管理"&gt;AWS Organizations — マルチアカウント管理
&lt;/h3&gt;&lt;p&gt;複数のAWSアカウントのセキュリティと請求をまとめて管理するサービス。&lt;/p&gt;
&lt;h4 id="scpservice-control-policy"&gt;SCP（Service Control Policy）
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OU（Organizational Unit）&lt;/strong&gt; でAWSアカウントをグループ化。OUは階層的に定義可能&lt;/li&gt;
&lt;li&gt;OUに&lt;strong&gt;SCP&lt;/strong&gt;を割り当て、許可/拒否するAWSサービスを制御&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;継承&lt;/strong&gt;: 上位OUのSCPは下位のOU/アカウントに継承される&lt;/li&gt;
&lt;li&gt;記法はIAMポリシーと同じ（暗黙のDeny &amp;lt; 明示Allow &amp;lt; 明示Deny）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ただし、サービスにアタッチされたIAMロールには影響しない&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;: &lt;a class="link" href="https://dev.classmethod.jp/articles/organizations-scp-inheritance/" target="_blank" rel="noopener"
 &gt;https://dev.classmethod.jp/articles/organizations-scp-inheritance/&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h4 id="2つの機能セット"&gt;2つの機能セット
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;すべての機能&lt;/strong&gt;（推奨）: 一括請求 + SCP + 組織全体のAWSサービス管理 + アカウント作成・招待&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一括請求機能のみ&lt;/strong&gt;: 請求とアカウント作成・招待のみ&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="その他のポイント"&gt;その他のポイント
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;アカウント作成時&lt;/strong&gt;: OrganizationAccountAccessRole（Admin権限）が子アカウントに自動作成される&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CloudTrail&lt;/strong&gt;: マスターアカウントのCloudTrailを有効化すると全メンバーアカウントのログ取得可能。単一S3バケットに集約可能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;リザーブドインスタンス共有&lt;/strong&gt;: Organizations内で共有可能。共有しない設定はマスターアカウントからのみ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;子アカウント削除&lt;/strong&gt;: スタンドアロン動作に必要な設定が事前に必要（支払い権限を持つIAMユーザーで設定変更）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="aws-control-tower"&gt;AWS Control Tower
&lt;/h3&gt;&lt;p&gt;Organizationsの上に構築されたガバナンスサービス。主な機能:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ログ集約&lt;/li&gt;
&lt;li&gt;コントロール適用（コンフォーマンスパック）&lt;/li&gt;
&lt;li&gt;通知&lt;/li&gt;
&lt;li&gt;ID一元管理&lt;/li&gt;
&lt;li&gt;AWSアカウントの作成・プロビジョニング&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="amazon-inspector"&gt;Amazon Inspector
&lt;/h3&gt;&lt;p&gt;AWSリソースに対するセキュリティ評価サービス。「もしAの攻撃を受けたら問題ないか」という観点でテスト。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ルールパッケージ:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ネットワークの到達可能性&lt;/strong&gt;: インターネット、VPCピアリング、VPN経由でEC2にアクセス可能かどうか&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ホスト評価&lt;/strong&gt;: EC2自体の脆弱性や問題のある設定をチェック&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;⚠️ 2024年時点の更新&lt;/strong&gt;: Inspector v2ではエージェントレス脆弱性スキャンがGA（一般提供）となりました。ハイブリッドスキャンモード（SSMエージェント + エージェントレスの自動切り替え）が新規顧客のデフォルトです。Inspector Classicは2026年にサポート終了予定です。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="7-運用管理"&gt;7. 運用管理
&lt;/h2&gt;&lt;h3 id="systems-manager--統合運用管理プラットフォーム"&gt;Systems Manager — 統合運用管理プラットフォーム
&lt;/h3&gt;&lt;p&gt;Systems Managerは多数の機能を持つが、大きく4つのカテゴリに分かれる。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://d1.awsstatic.com/webinars/jp/pdf/services/20200212_AWSBlackBelt_SystemsManager_0214.pdf" target="_blank" rel="noopener"
 &gt;Systems Manager Black Belt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.serverworks.co.jp/tech/2020/04/16/systems_manager_yattemiyou/" target="_blank" rel="noopener"
 &gt;https://blog.serverworks.co.jp/tech/2020/04/16/systems_manager_yattemiyou/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;
&lt;h4 id="運用管理"&gt;運用管理
&lt;/h4&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;機能&lt;/th&gt;
 &lt;th&gt;説明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;エクスプローラー&lt;/td&gt;
 &lt;td&gt;運用アイテム情報のダッシュボード&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;OpsCenter&lt;/td&gt;
 &lt;td&gt;対応が必要なイベント（運用アイテム）の管理&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;CloudWatchダッシュボード&lt;/td&gt;
 &lt;td&gt;CloudWatch用のカスタムダッシュボード&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Trusted Advisor / PHD&lt;/td&gt;
 &lt;td&gt;Trusted AdvisorとPersonal Health Dashboardの統合ビュー&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="アプリケーション管理"&gt;アプリケーション管理
&lt;/h4&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;機能&lt;/th&gt;
 &lt;th&gt;説明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;リソースグループ&lt;/td&gt;
 &lt;td&gt;タグによるサーバー群のグループ管理&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;AppConfig&lt;/td&gt;
 &lt;td&gt;アプリケーション設定（機能フラグ等）の管理&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;パラメータストア&lt;/td&gt;
 &lt;td&gt;設定パラメータの集中管理用データストア。アプリやコンテナからSDK/APIで取得可能&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="変更管理"&gt;変更管理
&lt;/h4&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;機能&lt;/th&gt;
 &lt;th&gt;説明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;オートメーション&lt;/td&gt;
 &lt;td&gt;AWS環境全体に対する自動化処理の実行&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Change Calendar&lt;/td&gt;
 &lt;td&gt;実行可否を制御するカレンダー&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;メンテナンスウィンドウ&lt;/td&gt;
 &lt;td&gt;自動化処理のスケジュールと順序の管理&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="ノード管理"&gt;ノード管理
&lt;/h4&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;機能&lt;/th&gt;
 &lt;th&gt;説明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;コンプライアンス&lt;/td&gt;
 &lt;td&gt;コンプライアンスの適合状態ダッシュボード&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;インベントリ&lt;/td&gt;
 &lt;td&gt;サーバー構成情報のインベントリ閲覧&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ハイブリッドアクティベーション&lt;/td&gt;
 &lt;td&gt;オンプレミスサーバーをSSM管理下に入れる&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;セッションマネージャー&lt;/td&gt;
 &lt;td&gt;SSM経由のリモートアクセス&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Run Command&lt;/td&gt;
 &lt;td&gt;サーバー群でのコマンド実行&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ステートマネージャー&lt;/td&gt;
 &lt;td&gt;指定した状態の維持&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;パッチマネージャー&lt;/td&gt;
 &lt;td&gt;パッチグループ/パッチベースラインに基づく自動パッチ適用&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ディストリビューター&lt;/td&gt;
 &lt;td&gt;パッケージのインストール&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="共有リソース--ドキュメント"&gt;共有リソース — ドキュメント
&lt;/h4&gt;&lt;p&gt;管理対象インスタンスへの操作を定義したテンプレート。インスタンスの起動/停止/作成/削除やOS内コマンドの実行を事前定義し、オートメーション等で利用する。&lt;/p&gt;
&lt;h4 id="有料機能"&gt;有料機能
&lt;/h4&gt;&lt;p&gt;OpsCenter、AppConfig、パラメータストア、オンプレミスインスタンス管理、ディストリビューター、オートメーション&lt;/p&gt;
&lt;h3 id="cloudformation"&gt;CloudFormation
&lt;/h3&gt;&lt;h4 id="deletionpolicy--スタック削除時のリソース挙動"&gt;DeletionPolicy — スタック削除時のリソース挙動
&lt;/h4&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;ポリシー&lt;/th&gt;
 &lt;th&gt;説明&lt;/th&gt;
 &lt;th&gt;対象リソース&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Snapshot&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;スナップショットを作成してから削除&lt;/td&gt;
 &lt;td&gt;EC2::Volume等&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Retain&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;リソースを削除せず保持&lt;/td&gt;
 &lt;td&gt;すべてのリソースタイプ&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Delete&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;リソースとコンテンツを削除（デフォルト）&lt;/td&gt;
 &lt;td&gt;すべてのリソースタイプ&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="creationpolicy"&gt;CreationPolicy
&lt;/h4&gt;&lt;p&gt;EC2インスタンスのプロビジョニング時に、ソフトウェアインストールやブートストラップ処理の完了を待ってからスタック作成を続行させる設定。CreationPolicyを指定しないと、インスタンスが起動しただけで（initスクリプト完了前に）スタック作成が続行される。&lt;/p&gt;
&lt;h4 id="ヘルパースクリプト"&gt;ヘルパースクリプト
&lt;/h4&gt;&lt;p&gt;CloudFormationでのEC2作成時に使う拡張ツール:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cfn&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;init&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;EC2へのパッケージインストール&lt;/span&gt;&lt;span class="err"&gt;、ファイル作成&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cfn&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;インストール結果（&lt;/span&gt;&lt;span class="n"&gt;OK&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;NG&lt;/span&gt;&lt;span class="err"&gt;）を他のスタックに連携&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cfn&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;metadata&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;メタデータの取得&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cfn&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;hup&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;メタデータの更新を検知し次の処理に連携&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="cloudformationでのlambda関数デプロイ"&gt;CloudFormationでのLambda関数デプロイ
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AWS::Lambda::Function&lt;/code&gt; でLambdaのデプロイパッケージを参照&lt;/li&gt;
&lt;li&gt;すべてのランタイムに対して S3 内のオブジェクトの場所を指定可能&lt;/li&gt;
&lt;li&gt;依存関係がない場合は、テンプレートに直接Lambda関数コードを記載可能&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="8-サーバーレス--api設計"&gt;8. サーバーレス / API設計
&lt;/h2&gt;&lt;h3 id="api-gateway-vs-appsync--いつどちらを使うか"&gt;API Gateway vs AppSync — いつどちらを使うか
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;判断軸&lt;/th&gt;
 &lt;th&gt;API Gateway&lt;/th&gt;
 &lt;th&gt;AppSync&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;プロトコル&lt;/td&gt;
 &lt;td&gt;REST / WebSocket&lt;/td&gt;
 &lt;td&gt;GraphQL&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;データ取得&lt;/td&gt;
 &lt;td&gt;エンドポイントごとに固定レスポンス&lt;/td&gt;
 &lt;td&gt;クライアントが必要なフィールドを選択&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;リアルタイム&lt;/td&gt;
 &lt;td&gt;WebSocket APIで実現&lt;/td&gt;
 &lt;td&gt;サブスクリプションで組み込み&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;バックエンド&lt;/td&gt;
 &lt;td&gt;Lambda, HTTP, AWS Service&lt;/td&gt;
 &lt;td&gt;DynamoDB, Lambda, Aurora等&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="api-gateway-の詳細"&gt;API Gateway の詳細
&lt;/h3&gt;&lt;h4 id="メトリクス"&gt;メトリクス
&lt;/h4&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;メトリクス&lt;/th&gt;
 &lt;th&gt;説明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;4XXError&lt;/td&gt;
 &lt;td&gt;クライアント側エラーの数&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;5XXError&lt;/td&gt;
 &lt;td&gt;サーバー側エラーの数&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;CacheHitCount&lt;/td&gt;
 &lt;td&gt;APIキャッシュから配信されたリクエスト数&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;CacheMissCount&lt;/td&gt;
 &lt;td&gt;バックエンドから提供されたリクエスト数&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Count&lt;/td&gt;
 &lt;td&gt;APIリクエストの合計数&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;IntegrationLatency&lt;/td&gt;
 &lt;td&gt;API GW → バックエンド → レスポンス受信の時間&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Latency&lt;/td&gt;
 &lt;td&gt;クライアント → API GW → クライアントの全体時間&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="lambda統合時の504エラー"&gt;Lambda統合時の504エラー
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;API Gatewayはバックエンド処理を含め&lt;strong&gt;29秒でタイムアウト&lt;/strong&gt;し504を返す&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;INTEGRATION_FAILURE&lt;/strong&gt;: 統合失敗（デフォルトでDEFAULT_5XX）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;INTEGRATION_TIMEOUT&lt;/strong&gt;: 統合タイムアウト。Lambdaの処理が29秒以上かかった場合
&lt;ul&gt;
&lt;li&gt;普段は正常で、たまに発生する場合はタイムアウトを疑う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="appsync--graphql"&gt;AppSync / GraphQL
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;GraphQLとは:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RESTの課題を解決するためにFacebookが開発したオープンソースのクエリ言語&lt;/li&gt;
&lt;li&gt;RESTがアーキテクチャスタイルであるのに対し、GraphQLは標準化された言語・型付け・仕様を持つ&lt;/li&gt;
&lt;li&gt;クライアント側から取得したいデータだけを選択して取得できる（RESTではバックエンド改修かクライアント側加工が必要だった）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;AppSyncの概要:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;サーバーレスでGraphQLのバックエンドを実装できるサービス（GraphQL版のAPI Gateway的な位置づけ）&lt;/li&gt;
&lt;li&gt;手順: ①スキーマ定義 → ②リゾルバー作成（VTLでスキーマとデータソースのマッピング） → ③エンドポイント生成&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.webprofessional.jp/rest-2-0-graphql/" target="_blank" rel="noopener"
 &gt;https://www.webprofessional.jp/rest-2-0-graphql/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://dev.classmethod.jp/articles/relay-re-introduction-2019-appsync/" target="_blank" rel="noopener"
 &gt;https://dev.classmethod.jp/articles/relay-re-introduction-2019-appsync/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;
&lt;h3 id="amazon-connect"&gt;Amazon Connect
&lt;/h3&gt;&lt;p&gt;クラウドベースのコンタクトセンターサービス。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Contact Lens:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;通話内容を機械学習で分析する機能&lt;/li&gt;
&lt;li&gt;文字起こし、感情分析、キーワードアラート通知に対応&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;UpdateContactAttributes API:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;連絡先の属性（発信者名、電話の理由、サービス品質等）をプログラム的に追加・更新できるAPI&lt;/li&gt;
&lt;li&gt;従来は対応フロー内でのみ設定可能だったが、このAPIで通話中・通話後にCRM等からも更新可能に&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;: &lt;a class="link" href="https://aws.amazon.com/jp/about-aws/whats-new/2018/08/amazon-connect-adds-new-contact-api-to-set-contact-attributes/" target="_blank" rel="noopener"
 &gt;https://aws.amazon.com/jp/about-aws/whats-new/2018/08/amazon-connect-adds-new-contact-api-to-set-contact-attributes/&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="9-データ移行etl"&gt;9. データ移行・ETL
&lt;/h2&gt;&lt;h3 id="なぜ複数の選択肢があるのか-3"&gt;なぜ複数の選択肢があるのか
&lt;/h3&gt;&lt;p&gt;データの移動・変換には「何を」「どこからどこへ」「どう加工するか」によって最適なサービスが異なる。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;サービス&lt;/th&gt;
 &lt;th&gt;主な用途&lt;/th&gt;
 &lt;th&gt;特徴&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;DataSync&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;データ転送（移動そのもの）&lt;/td&gt;
 &lt;td&gt;オンプレ↔AWS間のファイル転送&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Glue&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;ETL（抽出・変換・ロード）&lt;/td&gt;
 &lt;td&gt;サーバーレスETL、データカタログ&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Data Pipeline&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;ETLワークフロー&lt;/td&gt;
 &lt;td&gt;マネージドETL ※新規利用停止&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="aws-datasync"&gt;AWS DataSync
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;オンプレ ↔ AWS間のデータ転送サービス&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;転送先&lt;/strong&gt;: S3、EFS&lt;/li&gt;
&lt;li&gt;オンプレ側のサーバーにエージェントを導入して利用&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;: &lt;a class="link" href="https://docs.aws.amazon.com/ja_jp/datasync/latest/userguide/what-is-datasync.html" target="_blank" rel="noopener"
 &gt;AWS DataSync とは&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="aws-glue"&gt;AWS Glue
&lt;/h3&gt;&lt;p&gt;S3、RDS、Redshift等のAWSサービス間のデータ連携を仲介するサーバーレスETLサービス。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;主要コンポーネント:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;コンポーネント&lt;/th&gt;
 &lt;th&gt;説明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;データカタログ&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;永続的なメタデータストア。テーブル定義、ジョブ定義、制御情報を保持&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;クローラ&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;S3、DynamoDB、RDS、Redshift等をクロールしてデータカタログにメタデータテーブルを作成&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;ジョブ&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;ETL処理のビジネスロジック。Apache SparkとPython Shellの2タイプ&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;ETL処理の流れ:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;データソース（CSVファイル等）をクロールし、データカタログにメタデータを作成&lt;/li&gt;
&lt;li&gt;データカタログの情報からコンソールでジョブを定義&lt;/li&gt;
&lt;li&gt;スケジューラーでジョブの実行タイミングを設定&lt;/li&gt;
&lt;li&gt;ジョブを実行し、抽出・変換・書き込みを実施&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="aws-data-pipeline"&gt;AWS Data Pipeline
&lt;/h3&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;⚠️ 2024年7月に新規顧客へのアクセスが停止&lt;/strong&gt;されました。既存顧客は引き続き利用可能ですが、新規構築にはGlueやStep Functionsの利用が推奨されます。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;マネージドETLサービス&lt;/li&gt;
&lt;li&gt;AWS内のデータソースからデータを抽出し、任意の処理を行い、別のデータソースに保存する&lt;/li&gt;
&lt;li&gt;例: S3 → Redshift、RDS → S3&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="付録-その他のサービス"&gt;付録: その他のサービス
&lt;/h2&gt;&lt;h3 id="amazon-managed-blockchain"&gt;Amazon Managed Blockchain
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Hyperledger FabricやEthereumを使って、スケーラブルなブロックチェーンネットワークを作成・管理するフルマネージドサービス&lt;/li&gt;
&lt;li&gt;ネットワーク参加には&lt;strong&gt;提案→投票→招待&lt;/strong&gt;のプロセスが必要（投票ルールに基づく）&lt;/li&gt;
&lt;li&gt;IAMロールやSTSでの直接参加はできない。必ずネットワーク内の提案・投票プロセスを経る&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>散歩しながらAWSインフラを整理した話</title><link>https://cloud-aws.net/post/ai-infra-walk/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://cloud-aws.net/post/ai-infra-walk/</guid><description>&lt;p&gt;日曜の夕方、散歩に出た。&lt;/p&gt;
&lt;p&gt;特に目的もなく近所を歩いていたのだが、ふと「そういえばAWSアカウント、放置気味だったな」と思い出して、iPhoneに話しかけた。&lt;/p&gt;
&lt;p&gt;「AWSのリソース、今どんなのがあるか調べてみて。削除とか絶対しないように」&lt;/p&gt;
&lt;p&gt;少し補足すると、自分は趣味で音声AIアシスタントを作っている。自宅のMac miniにFastAPI + Claude CLIを載せたもので、iPhoneのブラウザから音声で話しかけると、バックエンドが動いて結果を返してくれる。名前はJ.A.R.V.I.S.。そう、あの映画のやつだ。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;で、散歩しながらこんなやりとりが続いた。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;J.A.R.V.I.S.&lt;/strong&gt;: 確認しました。Elastic Beanstalkの残骸が残っています。S3バケットとアプリ定義、全部2019年のもので完全に使われていません&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;自分&lt;/strong&gt;: 消して&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;J.A.R.V.I.S.&lt;/strong&gt;: 削除完了です&lt;/p&gt;

 &lt;/blockquote&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;自分&lt;/strong&gt;: Terraform stateがローカルなんだけど、S3に移したい&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;J.A.R.V.I.S.&lt;/strong&gt;: バケットのセキュリティ設定を先に確認しますね。パブリックアクセスブロック全オン、暗号化あり、バージョニング有効。問題ないので移行します&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;自分&lt;/strong&gt;: やって&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;J.A.R.V.I.S.&lt;/strong&gt;: 移行完了しました&lt;/p&gt;

 &lt;/blockquote&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;自分&lt;/strong&gt;: セキュリティの状況もチェックできない？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;J.A.R.V.I.S.&lt;/strong&gt;: セキュリティグループが2つ、0.0.0.0/0でポートを開けたまま残っています。どちらも未アタッチです。あとCloudTrailが2019年10月から停止中、GuardDutyは未有効化です&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;自分&lt;/strong&gt;: セキュリティグループは消して。CloudTrailとGuardDutyのコストってどれくらい？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;J.A.R.V.I.S.&lt;/strong&gt;: このアカウント規模ならどちらもほぼタダです。CloudTrailは最初の1証跡が無料、GuardDutyは月1〜2ドル程度かと&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;自分&lt;/strong&gt;: 両方有効にして&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;J.A.R.V.I.S.&lt;/strong&gt;: 完了です&lt;/p&gt;

 &lt;/blockquote&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;自分&lt;/strong&gt;: 夜間のスケジュールでセキュリティとコストのチェックも入れといて&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;J.A.R.V.I.S.&lt;/strong&gt;: 毎晩2時に登録しました&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;気づいたら、散歩1回分で7つの作業が終わっていた。リソース棚卸し、不要リソース削除、Terraform stateのS3移行、セキュリティグループの掃除、CloudTrailとGuardDutyの有効化、夜間チェックの自動化。ターミナルは一度も開いていない。&lt;/p&gt;
&lt;p&gt;普通にやったら1〜2時間はかかる作業だと思う。それが散歩中の会話で終わった。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;ここまでの作業を終えて、まだ散歩の途中だった。&lt;/p&gt;
&lt;p&gt;「これ、すごいことが起きてないか？」と思った。この感覚を誰かに伝えたくなって、そのまま歩きながら話しかけた。&lt;/p&gt;
&lt;p&gt;「今日の体験をブログにして」&lt;/p&gt;
&lt;p&gt;ちなみにこのアプリ自体、自分で一からコードを書いたわけではない。インフラエンジニアの自分がやりたいことを日本語で伝えて、AIがコードを書いた。そのAIに今、ブログを書かせている。&lt;/p&gt;
&lt;p&gt;お気づきかもしれないが、この記事自体も同じ散歩の中で生まれたものだ。&lt;/p&gt;</description></item><item><title>CloudFrontの署名付きURLの仕組み</title><link>https://cloud-aws.net/post/cloudfront-signed-url/</link><pubDate>Thu, 15 Jun 2023 00:00:00 +0000</pubDate><guid>https://cloud-aws.net/post/cloudfront-signed-url/</guid><description>&lt;h2 id="なぜ署名付きurlが必要なのか"&gt;なぜ「署名付きURL」が必要なのか
&lt;/h2&gt;&lt;p&gt;S3に置いた動画や資料を、&lt;strong&gt;お金を払ったユーザーだけに見せたい&lt;/strong&gt;。よくある要件だ。&lt;/p&gt;
&lt;p&gt;S3バケットを非公開にすればいい？ それだとCloudFront経由でも配信できなくなる。CloudFrontを公開すれば誰でもアクセスできてしまう。つまり「CDNで高速配信したいが、見せる相手は制限したい」という矛盾が生まれる。&lt;/p&gt;
&lt;p&gt;署名付きURLは、この矛盾を**「URLそのものに入場券を埋め込む」**というアプローチで解決する。&lt;/p&gt;
&lt;h2 id="身近なたとえ-映画の前売り券"&gt;身近なたとえ: 映画の前売り券
&lt;/h2&gt;&lt;p&gt;映画館で例えると、こういうことだ:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;映画館（CloudFront）は誰でも入れる場所にある&lt;/li&gt;
&lt;li&gt;だが上映室のドアには鍵がかかっている（S3は非公開）&lt;/li&gt;
&lt;li&gt;前売り券（署名付きURL）を持っている人だけが入れる&lt;/li&gt;
&lt;li&gt;前売り券には「3/7の19時の回まで有効」と書いてある（有効期限）&lt;/li&gt;
&lt;li&gt;前売り券にはスタッフだけが読める偽造防止マーク（デジタル署名）がある&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ポイントは、&lt;strong&gt;映画館側は「誰がチケットを買ったか」を知らなくていい&lt;/strong&gt;こと。チケットが本物かどうかだけ確認すれば済む。これが署名付きURLの設計思想だ。&lt;/p&gt;
&lt;h2 id="s3の署名付きurlとの違い"&gt;S3の署名付きURLとの違い
&lt;/h2&gt;&lt;p&gt;「署名付きURL」はS3にもある。混同しやすいので整理する。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;共通する本質:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;どちらも「URLに一時的なアクセス権を埋め込む」仕組み&lt;/li&gt;
&lt;li&gt;有効期限がある&lt;/li&gt;
&lt;li&gt;秘密情報（鍵）を使って署名する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;CloudFront版ならではの特徴:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th&gt;S3署名付きURL&lt;/th&gt;
 &lt;th&gt;CloudFront署名付きURL&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;署名者&lt;/td&gt;
 &lt;td&gt;IAMユーザーのアクセスキー&lt;/td&gt;
 &lt;td&gt;RSA秘密鍵（自分で管理）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;配信元&lt;/td&gt;
 &lt;td&gt;S3のエンドポイント直接&lt;/td&gt;
 &lt;td&gt;CloudFrontエッジ（CDN）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;速度&lt;/td&gt;
 &lt;td&gt;リージョンに依存&lt;/td&gt;
 &lt;td&gt;エッジから配信（高速）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;制御&lt;/td&gt;
 &lt;td&gt;URL・期限のみ&lt;/td&gt;
 &lt;td&gt;URL・期限・IP制限・カスタムポリシー&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;つまりCloudFront版は「CDN配信 + きめ細かいアクセス制御」を両立させたもの。S3版の上位互換と考えていい。&lt;/p&gt;
&lt;h2 id="全体像-3つのフェーズ"&gt;全体像: 3つのフェーズ
&lt;/h2&gt;&lt;p&gt;署名付きURLの仕組みは、大きく3つのフェーズに分かれる。&lt;/p&gt;
&lt;p&gt;&lt;img alt="CloudFront署名付きURLの全体フロー" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://cloud-aws.net/post/cloudfront-signed-url/cloudfront-sigurl-flow.svg"&gt;&lt;/p&gt;
&lt;h3 id="フェーズ1-鍵の準備事前に一度だけ"&gt;フェーズ1: 鍵の準備（事前に一度だけ）
&lt;/h3&gt;&lt;p&gt;公開鍵暗号を使う。映画館のたとえでいう「偽造防止マークの仕組みを作る」段階。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;管理者がRSA鍵ペアを生成&lt;/strong&gt;する（秘密鍵 + 公開鍵）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;秘密鍵&lt;/strong&gt;は自分で安全に保管する（チケットに署名するための印鑑）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;公開鍵&lt;/strong&gt;はCloudFrontに渡す（偽造防止マークを検証するための情報）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;なぜRSAか？ 署名する場所（アプリサーバー）と検証する場所（CloudFront）が別だから。秘密鍵を渡さずに検証できる公開鍵暗号が必要になる。&lt;/p&gt;
&lt;h3 id="フェーズ2-urlの発行リクエストのたびに"&gt;フェーズ2: URLの発行（リクエストのたびに）
&lt;/h3&gt;&lt;p&gt;ユーザーがコンテンツにアクセスしたいとき、アプリケーションサーバーが署名付きURLを生成する。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;ポリシーを作る&lt;/strong&gt; — 「このURLに、この期限まで、このIPからアクセスOK」というJSON&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ポリシーをハッシュ化&lt;/strong&gt; — SHA-1でダイジェストを作る&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;秘密鍵で署名&lt;/strong&gt; — ダイジェストをRSAで暗号化（=デジタル署名）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;URLに全部くっつける&lt;/strong&gt; — 元のURL + 署名 + キーID + 期限 = 署名付きURL&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;できあがったURLはこんな形になる:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://d1234.cloudfront.net/video.mp4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ?Expires=1686873600
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;amp;Signature=ABCxyz...（Base64エンコードされた署名）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;amp;Key-Pair-Id=KPID1234
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="フェーズ3-アクセスと検証ユーザーがurlを使うとき"&gt;フェーズ3: アクセスと検証（ユーザーがURLを使うとき）
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;ユーザーが署名付きURLにアクセスする&lt;/li&gt;
&lt;li&gt;CloudFrontがURLのパラメータを読む&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Key-Pair-Id&lt;/code&gt; から対応する公開鍵を取得&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;公開鍵で署名を検証&lt;/strong&gt;（改ざんされていないか確認）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ポリシーの条件を確認&lt;/strong&gt;（有効期限内か、IPは合っているか）&lt;/li&gt;
&lt;li&gt;すべてOKなら → S3からコンテンツを取得して配信&lt;/li&gt;
&lt;li&gt;NGなら → &lt;strong&gt;403 Forbidden&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;CloudFrontは署名の正当性だけを確認する。ユーザーが誰かは知らないし、知る必要がない。映画館がチケットの偽造防止マークだけ確認するのと同じだ。&lt;/p&gt;
&lt;h2 id="設計のポイント"&gt;設計のポイント
&lt;/h2&gt;&lt;p&gt;この仕組みの設計で巧みなのは、&lt;strong&gt;責務の分離&lt;/strong&gt;にある:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;アプリケーション&lt;/strong&gt;が「誰にアクセスさせるか」を判断する（認証・認可）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CloudFront&lt;/strong&gt;は「このURLが本物か」だけ判断する（署名検証）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CloudFrontはユーザー管理を一切しない。だからどんな認証基盤とも組み合わせられる。Cognito、Auth0、自前の認証、なんでもいい。「誰に署名付きURLを渡すか」はアプリ側の責任だ。&lt;/p&gt;</description></item><item><title>IAM IDプロバイダー</title><link>https://cloud-aws.net/post/iam-id-provider/</link><pubDate>Thu, 15 Jun 2023 00:00:00 +0000</pubDate><guid>https://cloud-aws.net/post/iam-id-provider/</guid><description>&lt;h2 id="1-何を実現するためのサービスか"&gt;1. 何を実現するためのサービスか？
&lt;/h2&gt;&lt;p&gt;AWS IAM IDプロバイダーは、GoogleやFacebookみたいな外部のIDプロバイダーを使って、AWSリソースにアクセスするための認証情報を管理するためのものだよ。これによって、セキュリティを保ちつつ、ログインプロセスを簡単にできるんだ。&lt;/p&gt;
&lt;h2 id="2-類似するサービスとの違い比較"&gt;2. 類似するサービスとの違い・比較
&lt;/h2&gt;&lt;p&gt;AWSには他にも認証サービスがあるけど、IAM IDプロバイダーは特に外部の認証情報を使ってAWSリソースにアクセスする点で便利。たとえば、AWS Cognitoはアプリのユーザー管理に特化しているし、AWS STSは一時的なアクセス許可を管理するためのものだよ。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;サービス名&lt;/th&gt;
 &lt;th&gt;主な用途&lt;/th&gt;
 &lt;th&gt;特徴&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;IAM IDプロバイダー&lt;/td&gt;
 &lt;td&gt;外部IDプロバイダーを使用したAWSリソースへのアクセス管理&lt;/td&gt;
 &lt;td&gt;- 外部の認証情報を使用してAWSリソースにアクセス&lt;br&gt;- OIDCやSAMLをサポート&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;AWS Cognito&lt;/td&gt;
 &lt;td&gt;アプリケーションのユーザー認証とユーザー管理&lt;/td&gt;
 &lt;td&gt;- ユーザープールを通じてアプリ固有のユーザー認証を提供&lt;br&gt;- ソーシャルログインやユーザー管理機能が豊富&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;AWS STS&lt;/td&gt;
 &lt;td&gt;一時的なセキュリティ認証情報の提供&lt;/td&gt;
 &lt;td&gt;- 一時的なアクセスキーとセッショントークンを提供&lt;br&gt;- フェデレーションユーザーやアプリケーションに一時的なアクセス権を与える&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;この表から、各サービスがどのような目的で使われ、どんな特徴があるかがわかるね。IAM IDプロバイダーは、特に企業が既存の認証システムをAWSに統合する際に役立つサービスだよ。&lt;/p&gt;
&lt;h2 id="3-利用方法"&gt;3. 利用方法
&lt;/h2&gt;&lt;p&gt;まずはAWSの管理コンソールから「IAMダッシュボード」に行って、「IDプロバイダー」を選んで、「新しいプロバイダーを追加」をクリックするんだ。ここで「OpenID Connect」か「SAML」を選んで、必要な情報を入力するよ。&lt;/p&gt;
&lt;h2 id="4-料金の例"&gt;4. 料金の例
&lt;/h2&gt;&lt;p&gt;このサービス自体には追加料金はかからないけど、IDプロバイダーを通じてアクセスされるAWSサービスの利用によって料金が発生することがあるよ。&lt;/p&gt;
&lt;h2 id="5-利用手順"&gt;5. 利用手順
&lt;/h2&gt;&lt;h3 id="1-idプロバイダーの設定"&gt;1. IDプロバイダーの設定:
&lt;/h3&gt;&lt;p&gt;AWS管理コンソールで「IAMダッシュボード」を開いて、「IDプロバイダー」を選ぶ。
「新しいプロバイダーを追加」をクリックして、必要な情報を入力。&lt;/p&gt;
&lt;h3 id="2-iamロールの作成"&gt;2. IAMロールの作成:
&lt;/h3&gt;&lt;p&gt;「ロール」セクションに移動して、「新しいロールを作成」。
トラストポリシーでIDプロバイダーを指定して、フェデレーションユーザーがこのロールを使えるように設定。
必要なアクセス権限を持つポリシーをロールに割り当てる。&lt;/p&gt;
&lt;h3 id="3-ポリシーの割り当て"&gt;3. ポリシーの割り当て:
&lt;/h3&gt;&lt;p&gt;ロールに適切なポリシーを割り当てて、フェデレーションユーザーが必要なAWSリソースにアクセスできるようにする。
これで、外部IDプロバイダーを使ってAWSリソースにアクセスする準備が整うよ。これを使えば、会社が既存の認証システムを活用して、AWSで安全にアクセス管理を行えるようになるんだ。&lt;/p&gt;</description></item><item><title>AWS SAP合格記 — Slack DMで作るサービス別ノート勉強法</title><link>https://cloud-aws.net/post/sap-exam-notes/</link><pubDate>Sun, 15 Jan 2023 00:00:00 +0000</pubDate><guid>https://cloud-aws.net/post/sap-exam-notes/</guid><description>&lt;h2 id="はじめに--sap試験は知っているでは受からない"&gt;はじめに — SAP試験は「知っている」では受からない
&lt;/h2&gt;&lt;p&gt;AWS ソリューションアーキテクト プロフェッショナル（SAP）は、AWSの資格試験の中でも最難関の一つだ。試験範囲が広いだけでなく、&lt;strong&gt;「どのサービスをどの条件で選ぶか」という判断力&lt;/strong&gt;を問われる。似たようなサービスの使い分け、複数のアーキテクチャパターンの中から最適解を選ぶ力が必要になる。&lt;/p&gt;
&lt;p&gt;受験時点でのAWS実務経験は約1.5年。仕事をしながらの学習で、まとまった時間の確保が難しかった。平日の通勤時間や昼休みなど、隙間時間を使った勉強がメインという制約があった。&lt;/p&gt;
&lt;p&gt;そんな中で編み出したのが「サービス別ノート勉強法」だ。結論として、この方法は合格に効いた。それ以上に、試験後も実務で参照できる「自分だけのリファレンス」が手元に残ったのが大きな副産物だった。&lt;/p&gt;
&lt;h2 id="勉強法の核心--問題軸ではなくサービス軸で整理する"&gt;勉強法の核心 — 問題軸ではなくサービス軸で整理する
&lt;/h2&gt;&lt;p&gt;使った教材は &lt;a class="link" href="https://www.udemy.com/course/aws-53225/" target="_blank" rel="noopener"
 &gt;Udemyの模擬試験問題集&lt;/a&gt;。これをひたすら解く。ここまではよくある勉強法だと思う。&lt;/p&gt;
&lt;p&gt;ポイントはその先にある。&lt;strong&gt;正解・不正解を問わず、自分が理解できていない・覚えていない箇所をサービス別に整理・まとめていく&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;なぜ「問題別」ではなく「サービス別」なのか。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;問題別のまとめ&lt;/strong&gt; は、「この問題の答えはC」という暗記になりやすい。問題の文言が変わると対応できない&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;サービス別のまとめ&lt;/strong&gt; は、そのサービスの仕様・ユースケース・制約を体系的に理解することになる。問題のバリエーションに強い&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;たとえば、Kinesis Data Streamsの問題を間違えたら、その問題の解説だけでなく「Kinesis Data Streams」というノートにシャードの仕様、SQSとの使い分け、拡張ファンアウトの条件など、関連する知識をどんどん追記していく。&lt;/p&gt;
&lt;p&gt;こうすると、同じサービスに関する問題を何度か間違えるうちに、ノートが充実していく。5回目くらいには「ああ、またKinesisか」と、そのサービスの全体像が頭に入っている状態になる。&lt;/p&gt;
&lt;h2 id="具体的なやり方--slack-dmをクロスデバイスメモ帳として使う"&gt;具体的なやり方 — Slack DMをクロスデバイスメモ帳として使う
&lt;/h2&gt;&lt;p&gt;ノートの記録先には &lt;strong&gt;Slackの自分宛DM&lt;/strong&gt; を使った。&lt;/p&gt;
&lt;p&gt;なぜSlackか:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;デスク（PC）でも移動中（スマホ）でも書ける・読める&lt;/strong&gt; — クロスデバイスで同期される&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;検索が効く&lt;/strong&gt; — 「Kinesis」で検索すれば関連メモがすぐ出てくる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;書くハードルが低い&lt;/strong&gt; — きちんとしたドキュメントではなく、メモ書きでいい。箇条書きでポイポイ放り込める&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;通知がこない&lt;/strong&gt; — 自分宛DMなので誰にも邪魔されないし、邪魔もしない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;やり方はシンプルだ:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Udemyの模擬試験を解く&lt;/li&gt;
&lt;li&gt;解説を読みながら、理解が浅い箇所を見つける&lt;/li&gt;
&lt;li&gt;Slack DMに「# サービス名」でメッセージを送り、仕様やユースケースをまとめる&lt;/li&gt;
&lt;li&gt;同じサービスについて新しい知見があれば、既存のメッセージにスレッドで追記する&lt;/li&gt;
&lt;li&gt;隙間時間にスマホで読み返す&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;とくに4が重要だ。スレッドで追記していくことで、1つのサービスに関する知識が1箇所に集約される。あとから読み返すときに「このサービスのことはここを見ればいい」という状態になる。&lt;/p&gt;
&lt;h2 id="振り返り--この方法で得られたもの"&gt;振り返り — この方法で得られたもの
&lt;/h2&gt;&lt;p&gt;この勉強法で得られたのは、単なる合格以上のものだった。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;体系的な理解&lt;/strong&gt;: サービスごとに整理することで、「このサービスは何のために存在し、どんな課題を解決するのか」という設計意図が見えるようになった。たとえばSQSとKinesisの違いは、暗記ではなく「メッセージング vs ストリーミング」という設計思想の違いとして理解できた。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;判断力&lt;/strong&gt;: 似たサービスの使い分けの軸が整理された。「リアルタイム性が要件ならKinesis、順序を問わない非同期処理ならSQS」「S3直接アクセスでいいのか、CloudFront経由にすべきか」のような判断基準が自分の言葉で語れるようになった。SAP試験はまさにこの判断力を問う試験なので、相性が良かったと思う。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;試験後も使えるリファレンス&lt;/strong&gt;: 実務でAWSのアーキテクチャを検討するとき、自分が作ったノートを参照することがある。公式ドキュメントより「自分がつまずいたポイント」が凝縮されているので、効率がいい。&lt;/p&gt;
&lt;h2 id="サービス別ノートの全文"&gt;サービス別ノートの全文
&lt;/h2&gt;&lt;p&gt;学習中にまとめたサービス別ノートの内容を、ユースケースと判断軸ベースで再構成した記事を公開しています。「どのサービスをどの条件で選ぶか」を整理したノートとして、試験対策や実務のリファレンスに使えるはずです。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a class="link" href="https://cloud-aws.net/post/sap-service-notes/" &gt;AWS SAP サービス別ノート — ユースケースと判断軸で整理する&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>VyOSによるAWS VPN接続</title><link>https://cloud-aws.net/post/site-to-site-vpn-vyos/</link><pubDate>Sun, 20 Nov 2022 00:00:00 +0000</pubDate><guid>https://cloud-aws.net/post/site-to-site-vpn-vyos/</guid><description>&lt;h2 id="0-overview"&gt;0. Overview
&lt;/h2&gt;&lt;h3 id="white-paper"&gt;White Paper
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://docs.aws.amazon.com/ja_jp/whitepapers/latest/aws-vpc-connectivity-options/aws-managed-vpn.html" target="_blank" rel="noopener"
 &gt;https://docs.aws.amazon.com/ja_jp/whitepapers/latest/aws-vpc-connectivity-options/aws-managed-vpn.html&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="diagram"&gt;Diagram
&lt;/h3&gt;&lt;p&gt;&lt;img alt="image" class="gallery-image" data-flex-basis="721px" data-flex-grow="300" height="541" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://cloud-aws.net/post/site-to-site-vpn-vyos/overview.png" srcset="https://cloud-aws.net/post/site-to-site-vpn-vyos/overview_hu_884952d4271e4488.png 800w, https://cloud-aws.net/post/site-to-site-vpn-vyos/overview_hu_9ae7feaf0973aae6.png 1600w, https://cloud-aws.net/post/site-to-site-vpn-vyos/overview.png 1626w" width="1626"&gt;&lt;/p&gt;
&lt;h3 id="vyos-version"&gt;VyOS Version
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vyos@vyos:~$ show version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Version: VyOS 1.4-rolling-202211190627
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Release train: current
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Built by: autobuild@vyos.net
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Built on: Sat 19 Nov 2022 06:27 UTC
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Build UUID: 687dfd47-11ca-4c0c-8045-944ed60279be
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Build commit ID: cd6f8ab1040139
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Architecture: x86_64
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Boot via: installed image
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;System type: KVM guest
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hardware vendor: innotek GmbH
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hardware model: VirtualBox
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hardware S/N: 0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hardware UUID: 91d658fc-16f6-074b-b5a6-59f4f5c3c14b
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright: VyOS maintainers and contributors
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="1-vyos-initial-settings"&gt;1. VyOS initial Settings
&lt;/h2&gt;&lt;h3 id="virtual-box"&gt;Virtual Box
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Enable LAN3 as Host Only Adaptor&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="vyos-config"&gt;VyOS Config
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;//After boot
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ install image //各種設定の後、CDを取り出し再起動。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;//SSH Settings
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set interfaces ethernet eth2 address &amp;#39;169.254.153.1/16&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set interfaces ethernet eth2 description &amp;#39;HOST-Only&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set service ssh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set system time-zone &amp;#39;Asia/Tokyo&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2-connect-to-internet"&gt;2. Connect to Internet
&lt;/h2&gt;&lt;h3 id="virtual-box-1"&gt;Virtual Box
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Enable LAN1 as NAT&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="vyos-config-1"&gt;VyOS Config
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;//ADD
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set interfaces ethernet eth0 address &amp;#39;dhcp&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;//Routing Table
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vyos@vyos:~$ show ip route
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;~~
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;S&amp;gt;* 0.0.0.0/0 [210/0] via 10.0.2.2, eth0, 00:00:11
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C&amp;gt;* 10.0.2.0/24 is directly connected, eth0, 00:00:13
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C&amp;gt;* 169.254.0.0/16 is directly connected, eth2, 00:07:14
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;//Ping
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vyos@vyos:~$ ping 8.8.8.8
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PING 8.8.8.8 (8.8.8.8): 56 data bytes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;64 bytes from 8.8.8.8: icmp_seq=0 ttl=56 time=27.054 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;64 bytes from 8.8.8.8: icmp_seq=1 ttl=56 time=17.119 ms
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="3-configure-of-ipsec"&gt;3. Configure of IPSEC
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;VyOS 1.4から諸々設定が変更となっているため注意！&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="configration-for-vyos-ipsec-1"&gt;Configration for VyOS IPSec-1
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;## ESP &amp;amp; IKE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set vpn ipsec esp-group AWS lifetime &amp;#39;3600&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set vpn ipsec esp-group AWS mode &amp;#39;tunnel&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set vpn ipsec esp-group AWS pfs &amp;#39;enable&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set vpn ipsec esp-group AWS proposal 1 encryption &amp;#39;aes128&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set vpn ipsec esp-group AWS proposal 1 hash &amp;#39;sha1&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set vpn ipsec ike-group AWS dead-peer-detection action &amp;#39;restart&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set vpn ipsec ike-group AWS dead-peer-detection interval &amp;#39;15&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set vpn ipsec ike-group AWS dead-peer-detection timeout &amp;#39;30&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set vpn ipsec ike-group AWS lifetime &amp;#39;28800&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set vpn ipsec ike-group AWS proposal 1 dh-group &amp;#39;2&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set vpn ipsec ike-group AWS proposal 1 encryption &amp;#39;aes128&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set vpn ipsec ike-group AWS proposal 1 hash &amp;#39;sha1&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;## vti
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set interfaces vti vti0 address &amp;#39;169.254.244.110/30&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set interfaces vti vti0 description &amp;#39;VPC tunnel 1&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set interfaces vti vti0 mtu &amp;#39;1436&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;## IPSec
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set vpn ipsec site-to-site peer AWS authentication mode &amp;#39;pre-shared-secret&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set vpn ipsec site-to-site peer AWS authentication pre-shared-secret &amp;#39;YOUR_PRE_SHARED_SECRET&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set vpn ipsec site-to-site peer AWS description &amp;#39;VPC tunnel 1&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set vpn ipsec site-to-site peer AWS ike-group &amp;#39;AWS&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set vpn ipsec site-to-site peer AWS local-address &amp;#39;10.0.2.15&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set vpn ipsec site-to-site peer AWS remote-address &amp;#39;xx.xx.xx.xx&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set vpn ipsec site-to-site peer AWS vti bind &amp;#39;vti0&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set vpn ipsec site-to-site peer AWS vti esp-group &amp;#39;AWS&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;### for NAT-T
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set vpn ipsec site-to-site peer AWS authentication local-id &amp;#39;yy.yy.yy.yy&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set vpn ipsec site-to-site peer AWS authentication remote-id &amp;#39;xx.xx.xx.xx&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;//BGP Config
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set protocols bgp system-as &amp;#39;65000&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set protocols bgp neighbor 169.254.244.109 address-family ipv4-unicast soft-reconfiguration inbound
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set protocols bgp neighbor 169.254.244.109 remote-as &amp;#39;64512&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set protocols bgp neighbor 169.254.244.109 timers holdtime &amp;#39;30&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set protocols bgp neighbor 169.254.244.109 timers keepalive &amp;#39;10&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set protocols bgp address-family ipv4-unicast network 10.0.2.0/24
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;bgp soft reconfigreationの設定がVyOS1.2より変更となっているため注意
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://note.com/tech_share/n/nb2cd20a433fd" target="_blank" rel="noopener"
 &gt;VyOS1.2.x系の設定で死ぬほどハマった話&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set protocols bgp 65000 neighbor 169.254.233.169 address-family ipv4-unicast soft-reconfiguration inbound
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# この事前設定により、ソフトウェアは、アップデートがインバウンド ポリシーによって受け入れられるかどうかに関係なく、受信したすべてのアップデートを変更せずに保存します。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# アップデートの保存は大量のメモリを要するため、可能な限り回避する必要があります。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;VyOSでのNATトラバーサル設定
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://changineer.info/network/vyatta/vyatta_ipsec_nat.html" target="_blank" rel="noopener"
 &gt;https://changineer.info/network/vyatta/vyatta_ipsec_nat.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;
&lt;h2 id="4-aws-setting"&gt;4. AWS Setting
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;ルートテーブルでルート伝搬（VGWが受信したルートをルートテーブルに反映させる）を有効化&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="image" class="gallery-image" data-flex-basis="1097px" data-flex-grow="457" height="304" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://cloud-aws.net/post/site-to-site-vpn-vyos/routing.png" srcset="https://cloud-aws.net/post/site-to-site-vpn-vyos/routing_hu_1e102a5fbe457837.png 800w, https://cloud-aws.net/post/site-to-site-vpn-vyos/routing.png 1390w" width="1390"&gt;&lt;/p&gt;
&lt;h2 id="5-確認"&gt;5. 確認
&lt;/h2&gt;&lt;h3 id="aws--vyos"&gt;AWS =&amp;gt; VyOS
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;:~/environment/ans-exam (master) $ ping 10.0.2.15
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PING 10.0.2.15 (10.0.2.15) 56(84) bytes of data.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;64 bytes from 10.0.2.15: icmp_seq=1 ttl=64 time=19.6 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;64 bytes from 10.0.2.15: icmp_seq=2 ttl=64 time=18.2 ms
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="vyos--aws"&gt;VyOS =&amp;gt; AWS
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vyos@vyos:~$ ping 10.99.31.172 source-address 10.0.2.15
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PING 10.99.31.172 (10.99.31.172) from 10.0.2.15 : 56(84) bytes of data.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;64 bytes from 10.99.31.172: icmp_seq=1 ttl=254 time=16.3 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;64 bytes from 10.99.31.172: icmp_seq=2 ttl=254 time=30.0 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;64 bytes from 10.99.31.172: icmp_seq=3 ttl=254 time=24.4 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;64 bytes from 10.99.31.172: icmp_seq=4 ttl=254 time=18.3 ms
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item></channel></rss>