<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>長生村本郷Engineers&#39;Blog</title>
  
  <subtitle>千葉県長生村本郷育ちのエンジニアが書いているブログ</subtitle>
  <link href="https://kenzo0107.github.io/atom.xml" rel="self"/>
  
  <link href="https://kenzo0107.github.io/"/>
  <updated>2026-04-19T15:00:00.000Z</updated>
  <id>https://kenzo0107.github.io/</id>
  
  <author>
    <name>Kenzo Tanaka</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>CodeBuild Docker キャッシュの損益分岐点：S3 vs ローカル</title>
    <link href="https://kenzo0107.github.io/2026/04/19/2026-04-20-codebuild-docker-cache-break-even-analysis/"/>
    <id>https://kenzo0107.github.io/2026/04/19/2026-04-20-codebuild-docker-cache-break-even-analysis/</id>
    <published>2026-04-19T15:00:00.000Z</published>
    <updated>2026-04-19T15:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>AWS CodeBuild の Docker キャッシュは S3 とローカルどちらを選ぶべきか。結論から言うと、<strong>ほとんどの場合ローカルキャッシュが最適</strong>です。本記事では具体的な損益分岐点を示します。</p><span id="more"></span><h2><span id="tldr結論">TL;DR（結論）</span></h2><table><thead><tr><th>条件</th><th>推奨</th><th>理由</th></tr></thead><tbody><tr><td>週2回以上ビルド</td><td><strong>ローカル</strong></td><td>S3 は転送コストが月$5-$30</td></tr><tr><td>ビルドホストが毎回変わる</td><td><strong>S3</strong></td><td>ローカルは無効</td></tr><tr><td>週1回以下のビルド</td><td>どちらでも可</td><td>コスト差は月$1未満</td></tr></tbody></table><h2><span id="2つのキャッシュ方式">2つのキャッシュ方式</span></h2><h3><span id="ローカルキャッシュ">ローカルキャッシュ</span></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">cache &#123;</span><br><span class="line">  type  = &quot;LOCAL&quot;</span><br><span class="line">  modes = [&quot;LOCAL_DOCKER_LAYER_CACHE&quot;]</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul><li><strong>コスト</strong>: 無料</li><li><strong>制約</strong>: 同じビルドホストでのみ有効、privileged モード必須</li><li><strong>用途</strong>: 頻繁にビルドする CI/CD 環境</li></ul><h3><span id="s3-キャッシュ">S3 キャッシュ</span></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">cache &#123;</span><br><span class="line">  type     = &quot;S3&quot;</span><br><span class="line">  location = &quot;my-bucket/cache&quot;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul><li><strong>コスト</strong>: ストレージ $0.023/GB/月 + 転送 $0.09/GB</li><li><strong>利点</strong>: 全ビルドホスト間で共有可能</li><li><strong>用途</strong>: ビルドホストが頻繁に変わる環境</li></ul><h2><span id="料金体系2026年">料金体系（2026年）</span></h2><h3><span id="codebuild">CodeBuild</span></h3><table><thead><tr><th>タイプ</th><th>料金/分</th></tr></thead><tbody><tr><td>arm1.small</td><td>$0.0034</td></tr><tr><td>general1.small</td><td>$0.005</td></tr><tr><td>general1.medium</td><td>$0.01</td></tr></tbody></table><h3><span id="s3-キャッシュ">S3 キャッシュ</span></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">月額コスト = (0.023 × キャッシュGB) + (ビルド回数 × キャッシュGB × 0.09)</span><br></pre></td></tr></table></figure><h2><span id="実際のコスト比較">実際のコスト比較</span></h2><p>典型的なプロジェクト（キャッシュ 1GB、ヒット率 70%）の場合：</p><table><thead><tr><th>ビルド回数/月</th><th>ローカル</th><th>S3 コスト</th><th>差額</th></tr></thead><tbody><tr><td>10回</td><td>$0</td><td>$0.65</td><td>$0.65</td></tr><tr><td>50回</td><td>$0</td><td>$3.18</td><td>$3.18</td></tr><tr><td>100回</td><td>$0</td><td>$6.32</td><td>$6.32</td></tr><tr><td>200回</td><td>$0</td><td>$12.62</td><td>$12.62</td></tr></tbody></table><p><strong>月50回を超えるビルドでは、S3 コストが$3以上になります。</strong></p><h2><span id="docker-レイヤーキャッシュの仕組み">Docker レイヤーキャッシュの仕組み</span></h2><p>Docker イメージは複数のレイヤーで構成され、上位レイヤーが変更されると以降のレイヤーが無効化されます。</p><h3><span id="典型的なレイヤー構成">典型的なレイヤー構成</span></h3><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">FROM</span> node:<span class="number">20</span>-alpine              <span class="comment"># 150MB（変更: 月1回）</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> apk add python3              <span class="comment"># 50MB（変更: 月1回）</span></span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> package*.json ./</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> npm ci                       <span class="comment"># 300MB（変更: 週1回）</span></span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> . .                         <span class="comment"># 20MB（変更: 毎日）</span></span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> npm run build                <span class="comment"># 100MB（変更: 毎日）</span></span></span><br></pre></td></tr></table></figure><h3><span id="キャッシュ効率">キャッシュ効率</span></h3><table><thead><tr><th>変更内容</th><th>キャッシュヒット</th><th>実効キャッシュ</th><th>ビルド短縮</th></tr></thead><tbody><tr><td>コードのみ</td><td>レイヤー 1-3</td><td>500MB (77%)</td><td>3-5分</td></tr><tr><td>依存関係も</td><td>レイヤー 1-2</td><td>200MB (31%)</td><td>2-3分</td></tr><tr><td>ベース更新</td><td>なし</td><td>0MB (0%)</td><td>0分</td></tr></tbody></table><p><strong>平均実効キャッシュ: 600-900MB、ヒット率: 70-75%</strong></p><h2><span id="dockerfile-最適化のポイント">Dockerfile 最適化のポイント</span></h2><h3><span id="悪い例">❌ 悪い例</span></h3><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">COPY</span><span class="language-bash"> . .</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> npm install  <span class="comment"># コード変更のたびに実行される</span></span></span><br></pre></td></tr></table></figure><h3><span id="良い例">✅ 良い例</span></h3><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 依存関係を先にインストール</span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> package*.json ./</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> npm ci --only=production</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># コードは後でコピー</span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> . .</span></span><br></pre></td></tr></table></figure><p><strong>効果:</strong> キャッシュヒット率が 60% → 75% に向上</p><h2><span id="決定フローチャート">決定フローチャート</span></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">ビルドホストは毎回変わる？</span><br><span class="line">├─ Yes → S3 キャッシュ（必須）</span><br><span class="line">└─ No</span><br><span class="line">   └─ ビルド頻度は？</span><br><span class="line">      ├─ 週2回以上 → ローカルキャッシュ（推奨）</span><br><span class="line">      └─ 週1回以下 → どちらでも可</span><br></pre></td></tr></table></figure><h2><span id="実装例">実装例</span></h2><h3><span id="ローカルキャッシュ推奨">ローカルキャッシュ（推奨）</span></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">resource &quot;aws_codebuild_project&quot; &quot;app&quot; &#123;</span><br><span class="line">  name = &quot;my-app&quot;</span><br><span class="line"></span><br><span class="line">  environment &#123;</span><br><span class="line">    compute_type    = &quot;BUILD_GENERAL1_SMALL&quot;</span><br><span class="line">    image          = &quot;aws/codebuild/standard:7.0&quot;</span><br><span class="line">    type           = &quot;LINUX_CONTAINER&quot;</span><br><span class="line">    privileged_mode = true  # 必須</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  cache &#123;</span><br><span class="line">    type  = &quot;LOCAL&quot;</span><br><span class="line">    modes = [&quot;LOCAL_DOCKER_LAYER_CACHE&quot;]</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3><span id="s3-キャッシュ">S3 キャッシュ</span></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">resource &quot;aws_codebuild_project&quot; &quot;app&quot; &#123;</span><br><span class="line">  name = &quot;my-app&quot;</span><br><span class="line"></span><br><span class="line">  environment &#123;</span><br><span class="line">    compute_type = &quot;BUILD_GENERAL1_SMALL&quot;</span><br><span class="line">    image       = &quot;aws/codebuild/standard:7.0&quot;</span><br><span class="line">    type        = &quot;LINUX_CONTAINER&quot;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  cache &#123;</span><br><span class="line">    type     = &quot;S3&quot;</span><br><span class="line">    location = &quot;$&#123;aws_s3_bucket.cache.bucket&#125;/my-app&quot;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">resource &quot;aws_s3_bucket_lifecycle_configuration&quot; &quot;cache&quot; &#123;</span><br><span class="line">  bucket = aws_s3_bucket.cache.id</span><br><span class="line"></span><br><span class="line">  rule &#123;</span><br><span class="line">    id     = &quot;expire-cache&quot;</span><br><span class="line">    status = &quot;Enabled&quot;</span><br><span class="line">    expiration &#123;</span><br><span class="line">      days = 7  # 7日後に自動削除</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2><span id="まとめ">まとめ</span></h2><h3><span id="一般的な推奨">一般的な推奨</span></h3><p><strong>ほとんどの CI/CD 環境ではローカルキャッシュが最適</strong></p><ul><li>転送コストがゼロ</li><li>ネットワーク遅延なし</li><li>月$5-$30 のコスト削減</li></ul><h3><span id="例外的に-s3-を選ぶケース">例外的に S3 を選ぶケース</span></h3><ol><li>ビルドホストが毎回異なる（スポットインスタンスなど）</li><li>VPC 環境で動作する必要がある</li><li>ビルド頻度が非常に低い（月4回以下）</li></ol><h3><span id="チェックリスト">チェックリスト</span></h3><p><strong>Dockerfile を最適化する:</strong></p><ul><li><input disabled type="checkbox"> 変更頻度の低い命令を上に配置</li><li><input disabled type="checkbox"> 依存関係ファイルを先にコピー</li><li><input disabled type="checkbox"> .dockerignore で不要ファイルを除外</li></ul><p><strong>ローカルキャッシュを使う場合:</strong></p><ul><li><input disabled type="checkbox"> <code>privileged_mode = true</code> を設定</li><li><input disabled type="checkbox"> セキュリティ要件を確認</li></ul><p><strong>S3 キャッシュを使う場合:</strong></p><ul><li><input disabled type="checkbox"> ライフサイクルポリシーで7日後に削除</li><li><input disabled type="checkbox"> 動的キャッシュキーを設定（<code>codebuild-hash-files</code>）</li></ul><h2><span id="参考リンク">参考リンク</span></h2><ul><li><a href="https://aws.amazon.com/codebuild/pricing/">AWS CodeBuild Pricing</a></li><li><a href="https://docs.aws.amazon.com/codebuild/latest/userguide/build-caching.html">CodeBuild Build Caching</a></li><li><a href="https://docs.aws.amazon.com/codebuild/latest/userguide/caching-local.html">CodeBuild Local Caching</a></li><li><a href="https://docs.aws.amazon.com/codebuild/latest/userguide/caching-s3.html">CodeBuild S3 Caching</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;AWS CodeBuild の Docker キャッシュは S3 とローカルどちらを選ぶべきか。結論から言うと、&lt;strong&gt;ほとんどの場合ローカルキャッシュが最適&lt;/strong&gt;です。本記事では具体的な損益分岐点を示します。&lt;/p&gt;</summary>
    
    
    
    <category term="AWS" scheme="https://kenzo0107.github.io/categories/AWS/"/>
    
    
    <category term="AWS" scheme="https://kenzo0107.github.io/tags/AWS/"/>
    
    <category term="Docker" scheme="https://kenzo0107.github.io/tags/Docker/"/>
    
    <category term="CodeBuild" scheme="https://kenzo0107.github.io/tags/CodeBuild/"/>
    
    <category term="Cost Optimization" scheme="https://kenzo0107.github.io/tags/Cost-Optimization/"/>
    
  </entry>
  
  <entry>
    <title>ECR 用 VPC Interface Endpoint の損益分岐点分析</title>
    <link href="https://kenzo0107.github.io/2026/04/19/2026-04-20-ecr-vpc-endpoint-break-even-analysis/"/>
    <id>https://kenzo0107.github.io/2026/04/19/2026-04-20-ecr-vpc-endpoint-break-even-analysis/</id>
    <published>2026-04-19T15:00:00.000Z</published>
    <updated>2026-04-19T15:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>Amazon ECR（Elastic Container Registry）へのアクセスに VPC Interface Endpoint を導入すべきか、NAT Gateway 経由でアクセスを続けるべきか。コスト面から損益分岐点を分析し、最適な選択をするためのガイドラインをまとめます。</p><span id="more"></span><h2><span id="概要">概要</span></h2><p>コンテナイメージを ECR から取得する際、以下の2つのアプローチがあります：</p><ol><li><strong>NAT Gateway 経由</strong>: インターネット経由でパブリックエンドポイントにアクセス</li><li><strong>VPC Endpoint 経由</strong>: AWS のプライベートネットワーク内でアクセス</li></ol><p>本記事では、東京リージョン（ap-northeast-1）における料金体系を基に、どちらがコスト効率的かを分析します。</p><h2><span id="料金体系の比較">料金体系の比較</span></h2><h3><span id="nat-gateway-経由のコスト">NAT Gateway 経由のコスト</span></h3><p>東京リージョンにおける NAT Gateway の料金は以下の通りです：</p><table><thead><tr><th>項目</th><th>料金</th></tr></thead><tbody><tr><td>時間単位料金</td><td>$0.062/時間</td></tr><tr><td>データ処理料金</td><td>$0.062/GB</td></tr><tr><td>月間基本料金（730時間）</td><td>$45.26/月</td></tr></tbody></table><p><strong>月間コスト計算式：</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">NAT Gateway コスト = $45.26 + ($0.062 × データ転送量 GB)</span><br></pre></td></tr></table></figure><h3><span id="vpc-interface-endpoint-経由のコスト">VPC Interface Endpoint 経由のコスト</span></h3><p>ECR への完全なプライベートアクセスには、以下の3つのエンドポイントが必要です：</p><table><thead><tr><th>エンドポイント</th><th>タイプ</th><th>時間単位料金</th></tr></thead><tbody><tr><td>com.amazonaws.ap-northeast-1.ecr.api</td><td>Interface</td><td>$0.01/時間</td></tr><tr><td>com.amazonaws.ap-northeast-1.ecr.dkr</td><td>Interface</td><td>$0.01/時間</td></tr><tr><td>com.amazonaws.ap-northeast-1.s3</td><td>Gateway</td><td>無料</td></tr></tbody></table><p><strong>データ処理料金</strong>: $0.01/GB（Interface Endpoint のみ）</p><p><strong>月間コスト計算式（1 AZ あたり）：</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">VPC Endpoint コスト = ($0.01 × 2エンドポイント × 730時間) + ($0.01 × データ転送量 GB)</span><br><span class="line">                   = $14.60 + ($0.01 × データ転送量 GB)</span><br></pre></td></tr></table></figure><p>⚠️ <strong>重要</strong>: S3 Gateway Endpoint を必ず設定してください。ECR のイメージレイヤーは S3 に保存されており、S3 Endpoint がない場合、大部分のデータが NAT Gateway 経由となり、コスト削減効果がほとんど得られません。</p><h2><span id="損益分岐点の計算">損益分岐点の計算</span></h2><h3><span id="1-az-構成の場合">1 AZ 構成の場合</span></h3><p>NAT Gateway コスト = VPC Endpoint コスト として計算します：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$45.26 + ($0.062 × GB) = $14.60 + ($0.01 × GB)</span><br><span class="line">$30.66 = $0.052 × GB</span><br><span class="line">GB = 590GB/月</span><br></pre></td></tr></table></figure><p><strong>損益分岐点: 約590GB/月</strong></p><p>590GB/月を超える場合、VPC Endpoint の方がコスト効率が良くなります。</p><h3><span id="月間コスト比較表">月間コスト比較表</span></h3><table><thead><tr><th>データ転送量/月</th><th>NAT Gateway</th><th>VPC Endpoint</th><th>差額</th><th>推奨</th></tr></thead><tbody><tr><td>100GB</td><td>$51.46</td><td>$15.60</td><td>-</td><td>NAT Gateway</td></tr><tr><td>300GB</td><td>$63.86</td><td>$17.60</td><td>-</td><td>NAT Gateway</td></tr><tr><td>500GB</td><td>$76.26</td><td>$19.60</td><td>-</td><td>NAT Gateway</td></tr><tr><td><strong>590GB</strong></td><td><strong>$81.84</strong></td><td><strong>$20.50</strong></td><td><strong>$0</strong></td><td><strong>損益分岐点</strong></td></tr><tr><td>1TB (1,024GB)</td><td>$108.75</td><td>$24.84</td><td>$83.91</td><td><strong>VPC Endpoint</strong></td></tr><tr><td>2TB (2,048GB)</td><td>$172.24</td><td>$35.08</td><td>$137.16</td><td><strong>VPC Endpoint</strong></td></tr><tr><td>5TB (5,120GB)</td><td>$362.70</td><td>$65.80</td><td>$296.90</td><td><strong>VPC Endpoint</strong></td></tr></tbody></table><h3><span id="マルチ-az-構成の考慮点">マルチ AZ 構成の考慮点</span></h3><p><strong>3 AZ 構成の場合：</strong></p><ul><li>NAT Gateway: 各 AZ に1つずつ必要 → $45.26 × 3 = $135.78/月（基本料金のみ）</li><li>VPC Endpoint: 各 AZ に展開される → $14.60 × 3 = $43.80/月（基本料金のみ）</li></ul><p>マルチ AZ 構成では、基本料金の差がさらに大きくなるため、データ転送量が少なくても VPC Endpoint が有利になる可能性があります。</p><p><strong>3 AZ での損益分岐点：</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">($45.26 × 3) + ($0.062 × GB) = ($14.60 × 3) + ($0.01 × GB)</span><br><span class="line">$135.78 + ($0.062 × GB) = $43.80 + ($0.01 × GB)</span><br><span class="line">$91.98 = $0.052 × GB</span><br><span class="line">GB = 1,769GB/月（約1.77TB）</span><br></pre></td></tr></table></figure><p>⚠️ <strong>注意</strong>: 上記は全 AZ で均等にトラフィックが発生する前提です。実際には、クロス AZ トラフィックコスト（$0.01/GB）も考慮する必要があります。</p><h2><span id="コスト以外のメリット">コスト以外のメリット</span></h2><h3><span id="vpc-endpoint-のメリット">VPC Endpoint のメリット</span></h3><ol><li><p><strong>セキュリティの向上</strong></p><ul><li>インターネットを経由しないため、攻撃対象領域を削減</li><li>VPC 内でのトラフィック制御が可能</li></ul></li><li><p><strong>パフォーマンスの向上</strong></p><ul><li>AWS のプライベートネットワーク経由のため、レイテンシが低い</li><li>NAT Gateway のボトルネックを回避</li></ul></li><li><p><strong>帯域幅の安定性</strong></p><ul><li>インターネット経由のトラフィックに影響されない</li><li>より予測可能なパフォーマンス</li></ul></li><li><p><strong>コンプライアンス要件</strong></p><ul><li>データがパブリックインターネットを経由しないことを要求される環境に対応</li></ul></li></ol><h3><span id="nat-gateway-のメリット">NAT Gateway のメリット</span></h3><ol><li><p><strong>シンプルな構成</strong></p><ul><li>既存の NAT Gateway をそのまま利用可能</li><li>追加のエンドポイント設定が不要</li></ul></li><li><p><strong>少量のトラフィックではコスト効率が良い</strong></p><ul><li>月間590GB未満の場合は NAT Gateway の方が安価</li></ul></li></ol><h2><span id="実装のベストプラクティス">実装のベストプラクティス</span></h2><h3><span id="vpc-endpoint-導入時のチェックリスト">VPC Endpoint 導入時のチェックリスト</span></h3><p>✅ <strong>必須設定：</strong></p><ol><li>ECR API Endpoint（com.amazonaws.ap-northeast-1.ecr.api）を作成</li><li>ECR Docker Endpoint（com.amazonaws.ap-northeast-1.ecr.dkr）を作成</li><li>S3 Gateway Endpoint（com.amazonaws.ap-northeast-1.s3）を作成</li><li>セキュリティグループで HTTPS（443）トラフィックを許可</li><li>プライベート DNS を有効化</li></ol><p>✅ <strong>推奨設定：</strong></p><ul><li>VPC Endpoint Policy で最小権限の原則を適用</li><li>CloudWatch Logs で VPC Endpoint のトラフィックを監視</li><li>複数の AZ に Endpoint を配置して可用性を確保</li></ul><h3><span id="terraform-実装例">Terraform 実装例</span></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br></pre></td><td class="code"><pre><span class="line"># ECR API Endpoint</span><br><span class="line">resource &quot;aws_vpc_endpoint&quot; &quot;ecr_api&quot; &#123;</span><br><span class="line">  vpc_id              = aws_vpc.main.id</span><br><span class="line">  service_name        = &quot;com.amazonaws.ap-northeast-1.ecr.api&quot;</span><br><span class="line">  vpc_endpoint_type   = &quot;Interface&quot;</span><br><span class="line">  subnet_ids          = aws_subnet.private[*].id</span><br><span class="line">  security_group_ids  = [aws_security_group.vpc_endpoint.id]</span><br><span class="line">  private_dns_enabled = true</span><br><span class="line"></span><br><span class="line">  tags = &#123;</span><br><span class="line">    Name = &quot;ecr-api-endpoint&quot;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"># ECR Docker Endpoint</span><br><span class="line">resource &quot;aws_vpc_endpoint&quot; &quot;ecr_dkr&quot; &#123;</span><br><span class="line">  vpc_id              = aws_vpc.main.id</span><br><span class="line">  service_name        = &quot;com.amazonaws.ap-northeast-1.ecr.dkr&quot;</span><br><span class="line">  vpc_endpoint_type   = &quot;Interface&quot;</span><br><span class="line">  subnet_ids          = aws_subnet.private[*].id</span><br><span class="line">  security_group_ids  = [aws_security_group.vpc_endpoint.id]</span><br><span class="line">  private_dns_enabled = true</span><br><span class="line"></span><br><span class="line">  tags = &#123;</span><br><span class="line">    Name = &quot;ecr-dkr-endpoint&quot;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"># S3 Gateway Endpoint</span><br><span class="line">resource &quot;aws_vpc_endpoint&quot; &quot;s3&quot; &#123;</span><br><span class="line">  vpc_id            = aws_vpc.main.id</span><br><span class="line">  service_name      = &quot;com.amazonaws.ap-northeast-1.s3&quot;</span><br><span class="line">  vpc_endpoint_type = &quot;Gateway&quot;</span><br><span class="line">  route_table_ids   = aws_route_table.private[*].id</span><br><span class="line"></span><br><span class="line">  tags = &#123;</span><br><span class="line">    Name = &quot;s3-gateway-endpoint&quot;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"># VPC Endpoint 用セキュリティグループ</span><br><span class="line">resource &quot;aws_security_group&quot; &quot;vpc_endpoint&quot; &#123;</span><br><span class="line">  name        = &quot;vpc-endpoint-sg&quot;</span><br><span class="line">  description = &quot;Security group for VPC endpoints&quot;</span><br><span class="line">  vpc_id      = aws_vpc.main.id</span><br><span class="line"></span><br><span class="line">  ingress &#123;</span><br><span class="line">    from_port   = 443</span><br><span class="line">    to_port     = 443</span><br><span class="line">    protocol    = &quot;tcp&quot;</span><br><span class="line">    cidr_blocks = [aws_vpc.main.cidr_block]</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  egress &#123;</span><br><span class="line">    from_port   = 0</span><br><span class="line">    to_port     = 0</span><br><span class="line">    protocol    = &quot;-1&quot;</span><br><span class="line">    cidr_blocks = [&quot;0.0.0.0/0&quot;]</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  tags = &#123;</span><br><span class="line">    Name = &quot;vpc-endpoint-sg&quot;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2><span id="意思決定フローチャート">意思決定フローチャート</span></h2><pre class="mermaid">graph TD    Start[ECR へのアクセス方法を決定] --> Q1{月間データ転送量は?}    Q1 -->|590GB 未満| Q2{単一 AZ 構成?}    Q1 -->|590GB 以上| R1[VPC Endpoint を推奨]    Q2 -->|Yes| R2[NAT Gateway を推奨]    Q2 -->|No| R3[VPC Endpoint も検討]    Start --> Q3{セキュリティ要件は?}    Q3 -->|インターネット経由を避けたい| R4[VPC Endpoint を推奨]    Start --> Q4{パフォーマンス要件は?}    Q4 -->|低レイテンシ・高帯域幅が必要| R5[VPC Endpoint を推奨]    style R1 fill:#90EE90    style R2 fill:#FFB6C1    style R3 fill:#FFE4B5    style R4 fill:#90EE90    style R5 fill:#90EE90</pre><h2><span id="モニタリングとコスト最適化">モニタリングとコスト最適化</span></h2><h3><span id="cloudwatch-メトリクス">CloudWatch メトリクス</span></h3><h4><span id="vpc-endpoint-の主要メトリクス">VPC Endpoint の主要メトリクス</span></h4><p>VPC Endpoint を導入後、以下のメトリクスを監視してコスト効果を測定します：</p><table><thead><tr><th>メトリクス名</th><th>説明</th><th>単位</th><th>推奨アクション</th></tr></thead><tbody><tr><td><strong>BytesProcessed</strong></td><td>VPC Endpoint で処理されたバイト数</td><td>Bytes</td><td>月次でトレンド分析し、コスト予測に使用</td></tr><tr><td><strong>PacketsProcessed</strong></td><td>処理されたパケット数</td><td>Count</td><td>パフォーマンス監視、異常検知</td></tr><tr><td><strong>ActiveConnections</strong></td><td>アクティブな接続数</td><td>Count</td><td>キャパシティプランニング</td></tr></tbody></table><p><strong>データ転送量の確認コマンド：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># VPC Endpoint のバイト数を確認（ECR API）</span></span><br><span class="line">aws cloudwatch get-metric-statistics \</span><br><span class="line">  --namespace AWS/PrivateLink \</span><br><span class="line">  --metric-name BytesProcessed \</span><br><span class="line">  --dimensions Name=ServiceName,Value=com.amazonaws.ap-northeast-1.ecr.api \</span><br><span class="line">  --start-time 2026-04-01T00:00:00Z \</span><br><span class="line">  --end-time 2026-04-30T23:59:59Z \</span><br><span class="line">  --period 86400 \</span><br><span class="line">  --statistics Sum \</span><br><span class="line">  --region ap-northeast-1</span><br><span class="line"></span><br><span class="line"><span class="comment"># VPC Endpoint のバイト数を確認（ECR Docker）</span></span><br><span class="line">aws cloudwatch get-metric-statistics \</span><br><span class="line">  --namespace AWS/PrivateLink \</span><br><span class="line">  --metric-name BytesProcessed \</span><br><span class="line">  --dimensions Name=ServiceName,Value=com.amazonaws.ap-northeast-1.ecr.dkr \</span><br><span class="line">  --start-time 2026-04-01T00:00:00Z \</span><br><span class="line">  --end-time 2026-04-30T23:59:59Z \</span><br><span class="line">  --period 86400 \</span><br><span class="line">  --statistics Sum \</span><br><span class="line">  --region ap-northeast-1</span><br></pre></td></tr></table></figure><h4><span id="nat-gateway-の主要メトリクス">NAT Gateway の主要メトリクス</span></h4><p>NAT Gateway を使用している場合、以下のメトリクスを監視します：</p><table><thead><tr><th>メトリクス名</th><th>説明</th><th>単位</th><th>推奨アクション</th></tr></thead><tbody><tr><td><strong>BytesInFromDestination</strong></td><td>インターネットから受信したバイト数</td><td>Bytes</td><td>コスト計算、トレンド分析</td></tr><tr><td><strong>BytesInFromSource</strong></td><td>VPC から受信したバイト数</td><td>Bytes</td><td>コスト計算、トレンド分析</td></tr><tr><td><strong>BytesOutToDestination</strong></td><td>インターネットへ送信したバイト数</td><td>Bytes</td><td>ECR プル量の把握</td></tr><tr><td><strong>BytesOutToSource</strong></td><td>VPC へ送信したバイト数</td><td>Bytes</td><td>内部トラフィックの把握</td></tr><tr><td><strong>ActiveConnectionCount</strong></td><td>同時接続数</td><td>Count</td><td>ピーク時の監視</td></tr><tr><td><strong>ConnectionAttemptCount</strong></td><td>接続試行回数</td><td>Count</td><td>接続パターンの分析</td></tr><tr><td><strong>ErrorPortAllocation</strong></td><td>ポート割り当てエラー数</td><td>Count</td><td>キャパシティ不足の早期検知</td></tr><tr><td><strong>PacketsDropCount</strong></td><td>ドロップされたパケット数</td><td>Count</td><td>パフォーマンス問題の検知</td></tr></tbody></table><p><strong>NAT Gateway のデータ転送量確認コマンド：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># NAT Gateway の送信バイト数を確認</span></span><br><span class="line">aws cloudwatch get-metric-statistics \</span><br><span class="line">  --namespace AWS/NATGateway \</span><br><span class="line">  --metric-name BytesOutToDestination \</span><br><span class="line">  --dimensions Name=NatGatewayId,Value=nat-xxxxxxxxxxxxxxxxx \</span><br><span class="line">  --start-time 2026-04-01T00:00:00Z \</span><br><span class="line">  --end-time 2026-04-30T23:59:59Z \</span><br><span class="line">  --period 86400 \</span><br><span class="line">  --statistics Sum \</span><br><span class="line">  --region ap-northeast-1</span><br></pre></td></tr></table></figure><h4><span id="cloudwatch-insights-クエリ例">CloudWatch Insights クエリ例</span></h4><p>VPC Endpoint と NAT Gateway のトラフィックを比較分析するための Insights クエリ：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"># VPC Endpoint の日次データ転送量</span><br><span class="line">fields @timestamp, BytesProcessed</span><br><span class="line">| filter ServiceName = &quot;com.amazonaws.ap-northeast-1.ecr.api&quot;</span><br><span class="line">| stats sum(BytesProcessed) as TotalBytes by bin(1d)</span><br><span class="line">| sort @timestamp desc</span><br></pre></td></tr></table></figure><h4><span id="cloudwatch-alarms-の設定推奨">CloudWatch Alarms の設定推奨</span></h4><p>コスト管理のために以下のアラームを設定することを推奨します：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># VPC Endpoint の月次データ転送量が閾値を超えた場合のアラーム</span></span><br><span class="line">aws cloudwatch put-metric-alarm \</span><br><span class="line">  --alarm-name <span class="string">&quot;ecr-vpc-endpoint-monthly-data-transfer&quot;</span> \</span><br><span class="line">  --alarm-description <span class="string">&quot;VPC Endpoint monthly data transfer exceeds threshold&quot;</span> \</span><br><span class="line">  --metric-name BytesProcessed \</span><br><span class="line">  --namespace AWS/PrivateLink \</span><br><span class="line">  --statistic Sum \</span><br><span class="line">  --period 2592000 \</span><br><span class="line">  --evaluation-periods 1 \</span><br><span class="line">  --threshold 1099511627776 \</span><br><span class="line">  --comparison-operator GreaterThanThreshold \</span><br><span class="line">  --dimensions Name=ServiceName,Value=com.amazonaws.ap-northeast-1.ecr.api \</span><br><span class="line">  --alarm-actions arn:aws:sns:ap-northeast-1:123456789012:cost-alerts \</span><br><span class="line">  --region ap-northeast-1</span><br><span class="line"></span><br><span class="line"><span class="comment"># NAT Gateway のポート割り当てエラー検知</span></span><br><span class="line">aws cloudwatch put-metric-alarm \</span><br><span class="line">  --alarm-name <span class="string">&quot;nat-gateway-port-allocation-errors&quot;</span> \</span><br><span class="line">  --alarm-description <span class="string">&quot;NAT Gateway port allocation errors detected&quot;</span> \</span><br><span class="line">  --metric-name ErrorPortAllocation \</span><br><span class="line">  --namespace AWS/NATGateway \</span><br><span class="line">  --statistic Sum \</span><br><span class="line">  --period 300 \</span><br><span class="line">  --evaluation-periods 2 \</span><br><span class="line">  --threshold 0 \</span><br><span class="line">  --comparison-operator GreaterThanThreshold \</span><br><span class="line">  --dimensions Name=NatGatewayId,Value=nat-xxxxxxxxxxxxxxxxx \</span><br><span class="line">  --alarm-actions arn:aws:sns:ap-northeast-1:123456789012:infrastructure-alerts \</span><br><span class="line">  --region ap-northeast-1</span><br></pre></td></tr></table></figure><h3><span id="cost-explorer-でのコスト追跡">Cost Explorer でのコスト追跡</span></h3><p>AWS Cost Explorer で以下をフィルタリングして、実際のコスト削減効果を確認します：</p><ul><li>サービス: Amazon EC2（VPC Endpoint）</li><li>使用タイプ: 「VpcEndpoint」を含む</li><li>リージョン: ap-northeast-1</li></ul><h2><span id="よくある質問faq">よくある質問（FAQ）</span></h2><p><strong>Q: 既存の NAT Gateway から VPC Endpoint に切り替える際、ダウンタイムは発生しますか？</strong></p><p>A: 適切に実装すれば、ダウンタイムなしで移行可能です。VPC Endpoint を作成し、プライベート DNS を有効化することで、アプリケーション側の変更なしに自動的に VPC Endpoint 経由になります。</p><p><strong>Q: VPC Endpoint を作成しても NAT Gateway が必要ですか？</strong></p><p>A: ECR へのアクセスのみであれば NAT Gateway は不要です。ただし、他のインターネット向けトラフィック（パッケージのダウンロード、外部 API へのアクセスなど）がある場合は、NAT Gateway または代替手段が必要です。</p><p><strong>Q: S3 Gateway Endpoint は本当に無料ですか？</strong></p><p>A: はい、S3 Gateway Endpoint 自体に料金はかかりません。ただし、S3 のデータ転送料金やリクエスト料金は別途発生します。</p><p><strong>Q: マルチリージョン構成の場合は？</strong></p><p>A: VPC Endpoint はリージョン固有のリソースです。複数リージョンで ECR を使用する場合、各リージョンで VPC Endpoint を作成する必要があります。</p><h2><span id="まとめ">まとめ</span></h2><p>ECR 用 VPC Interface Endpoint の損益分岐点は<strong>月間約590GB</strong>です。</p><p><strong>推奨事項：</strong></p><p>✅ <strong>VPC Endpoint を推奨する場合：</strong></p><ul><li>月間 ECR データ転送量が 590GB 以上</li><li>マルチ AZ 構成で高トラフィック</li><li>セキュリティ要件でインターネット経由を避けたい</li><li>低レイテンシ・高パフォーマンスが求められる</li></ul><p>✅ <strong>NAT Gateway を継続する場合：</strong></p><ul><li>月間 ECR データ転送量が 590GB 未満</li><li>単一 AZ 構成で低トラフィック</li><li>シンプルな構成を維持したい</li></ul><p><strong>重要なポイント：</strong></p><ol><li>ECR 用には <strong>3つのエンドポイント</strong>（ecr.api、ecr.dkr、s3）すべてが必要</li><li>S3 Gateway Endpoint を忘れると、コスト削減効果がほとんど得られない</li><li>マルチ AZ 構成では基本料金の差が大きいため、より早く損益分岐点に達する</li></ol><p>コスト最適化は継続的なプロセスです。AWS Cost Explorer や CloudWatch メトリクスを活用して、実際の使用状況を定期的に確認し、最適な構成を維持することが重要です。</p><h2><span id="参考リンク">参考リンク</span></h2><ul><li><a href="https://aws.amazon.com/privatelink/pricing/">AWS PrivateLink Pricing</a></li><li><a href="https://aws.amazon.com/vpc/pricing/">Amazon VPC Pricing</a></li><li><a href="https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-pricing.html">NAT Gateway Pricing Documentation</a></li><li><a href="https://dev.to/hstiwana/nat-gateways-killing-your-container-costs-amazon-ecr-vpc-endpoints-to-the-rescue-21k5">NAT Gateways Killing Your Container Costs?</a></li><li><a href="https://pcg.io/insights/vpc-endpoints-explanation-and-cost-comparison/">VPC Endpoints Cost Comparison Guide</a></li><li><a href="https://cloudburn.io/blog/aws-nat-gateway-pricing">AWS NAT Gateway Pricing Guide</a></li><li><a href="https://docs.aws.amazon.com/AmazonECR/latest/userguide/vpc-endpoints.html">VPC Endpoint for ECR - AWS Documentation</a></li></ul><hr><p><em>この記事は AWS 公式ドキュメントおよび複数のコスト分析記事に基づいて作成されています。料金は 2026年4月時点のものであり、最新の情報については AWS 公式サイトをご確認ください。</em></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;Amazon ECR（Elastic Container Registry）へのアクセスに VPC Interface Endpoint を導入すべきか、NAT Gateway 経由でアクセスを続けるべきか。コスト面から損益分岐点を分析し、最適な選択をするためのガイドラインをまとめます。&lt;/p&gt;</summary>
    
    
    
    <category term="AWS" scheme="https://kenzo0107.github.io/categories/AWS/"/>
    
    
  </entry>
  
  <entry>
    <title>完全無料で常時稼働可能なデータベースサービス徹底比較（2026年版）</title>
    <link href="https://kenzo0107.github.io/2026/04/17/2026-04-18-free-database-services-comparison/"/>
    <id>https://kenzo0107.github.io/2026/04/17/2026-04-18-free-database-services-comparison/</id>
    <published>2026-04-17T15:00:00.000Z</published>
    <updated>2026-04-17T15:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>小規模サービスやプロトタイプ開発において、24時間365日稼働可能で、セキュリティも担保できる完全無料のデータベースサービスを比較検証しました。</p><span id="more"></span><h2><span id="はじめに">はじめに</span></h2><p>個人開発やスタートアップの初期段階では、インフラコストを抑えつつも信頼性の高いデータベースが必要です。本記事では、2026年時点で利用可能な完全無料のデータベースサービスを、公式ドキュメントをもとに徹底比較します。</p><h2><span id="選定基準">選定基準</span></h2><p>本記事では以下の条件を満たすサービスを対象としました：</p><ul><li><strong>24時間365日常時稼働</strong>: スリープや自動停止がない</li><li><strong>セキュリティ</strong>: SSL/TLS、認証機能、アクセス制御が利用可能</li><li><strong>完全無料</strong>: クレジットカード不要、永続的に無料で利用可能</li><li><strong>小規模サービス向け</strong>: プロトタイプや個人開発に十分なスペック</li></ul><h2><span id="サービス詳細比較">サービス詳細比較</span></h2><h3><span id="supabase">Supabase</span></h3><p>PostgreSQLベースのオープンソースFirebase代替サービスです。</p><h4><span id="無料プランスペック">無料プランスペック</span></h4><ul><li><strong>データベース</strong>: 500MB PostgreSQL</li><li><strong>ストレージ</strong>: 1GB</li><li><strong>プロジェクト数</strong>: 2つまで</li><li><strong>月間アクティブユーザー</strong>: 50,000</li><li><strong>Edge Function</strong>: 500,000回/月</li><li><strong>帯域幅</strong>: 5GB/月</li></ul><h4><span id="セキュリティ機能">セキュリティ機能</span></h4><ul><li>SSL/TLS接続</li><li>Row Level Security (RLS)</li><li>認証機能組み込み（Email、OAuth、Magic Link）</li><li>APIキー管理</li></ul><h4><span id="️-重要な制限事項">⚠️ 重要な制限事項</span></h4><ul><li><strong>プロジェクトは7日間非アクティブで自動停止</strong></li><li>バックアップなし</li><li>SLAなし</li></ul><p><strong>参考</strong>: <a href="https://supabase.com/pricing">Supabase Pricing</a></p><h3><span id="turso">Turso</span></h3><p>SQLiteベースのエッジデータベースサービスです。</p><h4><span id="無料プランスペック">無料プランスペック</span></h4><ul><li><strong>ストレージ</strong>: 9GB（旧5GBから増量）</li><li><strong>データベース数</strong>: 500（2025年に大幅増量）</li><li><strong>月間アクティブDB</strong>: 100</li><li><strong>行読み込み</strong>: 5億行/月</li><li><strong>行書き込み</strong>: 1,000万行/月</li></ul><h4><span id="セキュリティ機能">セキュリティ機能</span></h4><ul><li>TLS暗号化</li><li>トークンベース認証</li><li>エッジでの分散実行</li></ul><h4><span id="特徴">特徴</span></h4><ul><li>SQLite互換で軽量</li><li>グローバル分散による低レイテンシ</li><li><strong>常時稼働、自動停止なし</strong></li></ul><p><strong>参考</strong>: <a href="https://turso.tech/pricing">Turso Pricing</a>, <a href="https://turso.tech/blog/unlimited-databases-are-here">Database Freedom Day</a></p><h3><span id="mongodb-atlas">MongoDB Atlas</span></h3><p>NoSQLドキュメント指向データベースサービスです。</p><h4><span id="m0-無料プランスペック">M0 無料プランスペック</span></h4><ul><li><strong>ストレージ</strong>: 512MB</li><li><strong>メモリ</strong>: 32MB ソート用</li><li><strong>接続数</strong>: 最大500</li><li><strong>スループット</strong>: 最大100オペレーション/秒</li><li><strong>プロジェクト毎</strong>: 1クラスターまで</li></ul><h4><span id="セキュリティ機能">セキュリティ機能</span></h4><ul><li>TLS/SSL接続</li><li>IPホワイトリスト</li><li>ユーザー認証・権限管理（RBAC）</li><li>データ暗号化</li></ul><h4><span id="特徴">特徴</span></h4><ul><li><strong>常時稼働、期限なし</strong></li><li>Atlas Search利用可能（制限付き）</li><li>Triggers、Charts利用可能</li><li>自動バックアップなし</li></ul><p><strong>参考</strong>: <a href="https://www.mongodb.com/pricing">MongoDB Pricing</a>, <a href="https://www.mongodb.com/docs/atlas/reference/free-shared-limitations/">Atlas Free Cluster Limits</a></p><h3><span id="firebase-firestore">Firebase Firestore</span></h3><p>GoogleのNoSQLドキュメントデータベースサービスです。</p><h4><span id="無料プランスペック1日あたり">無料プランスペック（1日あたり）</span></h4><ul><li><strong>ストレージ</strong>: 1GB</li><li><strong>ドキュメント読み込み</strong>: 50,000回/日</li><li><strong>ドキュメント書き込み</strong>: 20,000回/日</li><li><strong>ドキュメント削除</strong>: 20,000回/日</li><li><strong>ネットワーク転送</strong>: 10GB/月</li></ul><h4><span id="セキュリティ機能">セキュリティ機能</span></h4><ul><li>セキュリティルール</li><li>Firebase Authentication連携</li><li>SSL/TLS接続</li><li>Googleのセキュリティ基盤</li></ul><h4><span id="特徴">特徴</span></h4><ul><li><strong>常時稼働（Googleインフラ）</strong></li><li>リアルタイム同期</li><li>オフライン対応</li><li>認証機能も無料</li></ul><p><strong>参考</strong>: <a href="https://firebase.google.com/pricing">Firebase Pricing</a>, <a href="https://firebase.google.com/docs/firestore/quotas">Firestore Quotas</a></p><h3><span id="cockroachdb-serverless">CockroachDB Serverless</span></h3><p>PostgreSQL互換の分散SQLデータベースサービスです。</p><h4><span id="無料プランスペック">無料プランスペック</span></h4><ul><li><strong>ストレージ</strong>: 10GB/月（※公式情報に若干のばらつきあり）</li><li><strong>リクエストユニット</strong>: 5,000万RU/月</li><li><strong>SLA</strong>: 99.99%稼働保証</li></ul><h4><span id="セキュリティ機能">セキュリティ機能</span></h4><ul><li>TLS接続必須</li><li>組織・ユーザー管理</li><li>監査ログ</li><li>データ暗号化</li></ul><h4><span id="特徴">特徴</span></h4><ul><li><strong>常時稼働、自動スケール</strong></li><li>PostgreSQL互換</li><li>高可用性</li><li>クレジットカード不要で開始可能</li></ul><p><strong>参考</strong>: <a href="https://www.cockroachlabs.com/pricing/">CockroachDB Pricing</a>, <a href="https://www.cockroachlabs.com/blog/serverless-free/">CockroachDB Serverless: Free. Seriously.</a></p><h2><span id="比較表">比較表</span></h2><table><thead><tr><th>サービス</th><th>タイプ</th><th>ストレージ</th><th>稼働保証</th><th>自動停止</th><th>PostgreSQL互換</th><th>主な制限</th></tr></thead><tbody><tr><td><strong>Turso</strong></td><td>SQLite</td><td>9GB</td><td>○</td><td>なし</td><td>-</td><td>5億行読み込み/月</td></tr><tr><td><strong>CockroachDB</strong></td><td>分散SQL</td><td>10GB</td><td>○ (99.99%)</td><td>なし</td><td>○</td><td>5,000万RU/月</td></tr><tr><td><strong>Firebase</strong></td><td>NoSQL</td><td>1GB</td><td>○</td><td>なし</td><td>-</td><td>5万読み込み/日</td></tr><tr><td><strong>MongoDB Atlas</strong></td><td>NoSQL</td><td>512MB</td><td>○</td><td>なし</td><td>-</td><td>100 ops/秒</td></tr><tr><td><strong>Supabase</strong></td><td>PostgreSQL</td><td>500MB</td><td>△</td><td><strong>7日で停止</strong></td><td>○</td><td>要定期アクセス</td></tr></tbody></table><h2><span id="ユースケース別推奨">ユースケース別推奨</span></h2><h3><span id="個人開発プロトタイプデータ量少">個人開発・プロトタイプ（データ量少）</span></h3><p><strong>おすすめ: Supabase</strong> (⚠️ 定期的なアクセスが必要)</p><ul><li>認証、ストレージ、リアルタイム機能が統合</li><li>PostgreSQLで扱いやすい</li><li>7日間アクティビティがないと停止するため、cron等で定期的なヘルスチェックが必要</li></ul><h3><span id="個人開発プロトタイプ常時稼働重視">個人開発・プロトタイプ（常時稼働重視）</span></h3><p><strong>おすすめ: Turso</strong></p><ul><li>9GBと大容量</li><li>SQLite互換で軽量</li><li>エッジ配信で高速</li><li>完全に常時稼働</li></ul><h3><span id="グローバル展開を見据えた開発">グローバル展開を見据えた開発</span></h3><p><strong>おすすめ: Firebase Firestore</strong></p><ul><li>Googleのグローバルインフラ</li><li>リアルタイム同期</li><li>オフライン対応</li><li>認証機能も統合</li></ul><h3><span id="将来的なスケールを見据えた開発">将来的なスケールを見据えた開発</span></h3><p><strong>おすすめ: CockroachDB Serverless</strong></p><ul><li>99.99%のSLA</li><li>PostgreSQL互換で移行が容易</li><li>分散アーキテクチャで高可用性</li><li>有料プランへの移行がスムーズ</li></ul><h3><span id="nosqlでの開発">NoSQLでの開発</span></h3><p><strong>おすすめ: MongoDB Atlas</strong></p><ul><li>業界標準のNoSQL</li><li>ドキュメント指向で柔軟</li><li>豊富なツール・ドライバ</li><li>常時稼働</li></ul><h2><span id="セキュリティ面での考慮事項">セキュリティ面での考慮事項</span></h2><h3><span id="ssltls接続">SSL/TLS接続</span></h3><p>全サービスで標準サポートされています。</p><h3><span id="アクセス制御">アクセス制御</span></h3><table><thead><tr><th>サービス</th><th>認証方式</th><th>アクセス制御</th></tr></thead><tbody><tr><td>Supabase</td><td>RLS、API Key</td><td>行レベルセキュリティ</td></tr><tr><td>Turso</td><td>トークン</td><td>データベース単位</td></tr><tr><td>MongoDB Atlas</td><td>RBAC</td><td>コレクション単位</td></tr><tr><td>Firebase</td><td>セキュリティルール</td><td>ドキュメント単位</td></tr><tr><td>CockroachDB</td><td>ユーザー管理</td><td>テーブル単位</td></tr></tbody></table><h3><span id="データ暗号化">データ暗号化</span></h3><p>全サービスで転送時の暗号化（TLS）が有効です。保管時の暗号化については、各サービスの公式ドキュメントを確認してください。</p><h2><span id="推奨ランキング小規模サービス向け">推奨ランキング（小規模サービス向け）</span></h2><ol><li><strong>Turso</strong> - 大容量（9GB）、常時稼働、エッジ配信</li><li><strong>CockroachDB</strong> - SLA保証、PostgreSQL互換、高可用性</li><li><strong>Firebase</strong> - Googleインフラ、リアルタイム機能</li><li><strong>MongoDB Atlas</strong> - NoSQL標準、豊富なエコシステム</li><li><strong>Supabase</strong> - 機能豊富だが7日で自動停止に注意</li></ol><h2><span id="まとめ">まとめ</span></h2><p>2026年現在、完全無料で常時稼働可能なデータベースサービスは複数の選択肢があります。</p><p><strong>Turso</strong>は9GBの大容量と常時稼働で個人開発に最適です。<strong>CockroachDB Serverless</strong>は99.99%のSLA保証があり、本番レベルの信頼性が必要な場合に適しています。<strong>Firebase Firestore</strong>はGoogleのインフラを活用でき、リアルタイム機能が必要な場合に最適です。</p><p><strong>Supabase</strong>は機能が豊富ですが、7日間の非アクティブで自動停止するため、常時稼働が必要な場合は定期的なアクセスの仕組みを用意する必要があります。</p><p>プロジェクトの要件に応じて最適なサービスを選択してください。</p><p>以上<br><br>参考になれば幸いです。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;小規模サービスやプロトタイプ開発において、24時間365日稼働可能で、セキュリティも担保できる完全無料のデータベースサービスを比較検証しました。&lt;/p&gt;</summary>
    
    
    
    <category term="Database" scheme="https://kenzo0107.github.io/categories/Database/"/>
    
    
    <category term="Database" scheme="https://kenzo0107.github.io/tags/Database/"/>
    
    <category term="Supabase" scheme="https://kenzo0107.github.io/tags/Supabase/"/>
    
    <category term="Turso" scheme="https://kenzo0107.github.io/tags/Turso/"/>
    
    <category term="MongoDB" scheme="https://kenzo0107.github.io/tags/MongoDB/"/>
    
    <category term="Firebase" scheme="https://kenzo0107.github.io/tags/Firebase/"/>
    
    <category term="CockroachDB" scheme="https://kenzo0107.github.io/tags/CockroachDB/"/>
    
  </entry>
  
  <entry>
    <title>AWS CloudWatch Application Signals の料金体系</title>
    <link href="https://kenzo0107.github.io/2025/12/18/2025-12-19-application-signals-price/"/>
    <id>https://kenzo0107.github.io/2025/12/18/2025-12-19-application-signals-price/</id>
    <published>2025-12-18T15:00:00.000Z</published>
    <updated>2025-12-18T15:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><a href="https://github.com/awslabs/mcp/tree/main/src/aws-pricing-mcp-server">AWS Pricing MCP</a> を利用し取得した価格データから AWS CloudWatch Application Signals の料金体系は以下の通りです。</p><span id="more"></span><h2><span id="application-signalsシグナル料金">Application Signalsシグナル料金</span></h2><p>階層型の従量課金制</p><ul><li>最初の1億シグナル: $1.50 / 100万シグナル</li><li>次の9億シグナル（1億～10億）: $0.75 / 100万シグナル</li><li>10億シグナル超過分: $0.30 / 100万シグナル</li></ul><h2><span id="application-signals-bytesデータ取り込み料金">Application Signals Bytesデータ取り込み料金</span></h2><p>データ量に基づく階層型課金</p><ul><li>最初の10TB: $0.35 / GB</li><li>次の20TB（10TB～30TB）: $0.20 / GB</li><li>30TB超過分: $0.15 / GB</li></ul><h3><span id="料金体系の特徴">料金体系の特徴</span></h3><ol><li>完全従量課金制</li></ol><ul><li>使用した分だけ課金</li><li>最小利用料金なし</li></ul><ol start="2"><li>階層型割引</li></ol><ul><li>使用量が増加するにつれて単価が下がる</li><li>大規模利用時のコスト効率が向上</li></ul><ol start="3"><li>リージョン別料金</li></ol><ul><li>東京リージョン（ap-northeast-1）の価格</li><li>他リージョンでは若干異なる場合あり</li></ul><h2><span id="コスト例月間利用">コスト例（月間利用）</span></h2><table><thead><tr><th>利用規模</th><th>シグナル数</th><th>データ量</th><th>概算月額</th></tr></thead><tbody><tr><td>小規模</td><td>1,000万</td><td>100GB</td><td>$50-70</td></tr><tr><td>中規模</td><td>5,000万</td><td>500GB</td><td>$250-300</td></tr><tr><td>大規模</td><td>2億</td><td>2TB</td><td>$900-1,100</td></tr></tbody></table><h2><span id="関連コスト">関連コスト</span></h2><p>Application Signalsを使用する際の追加的なコスト要因</p><ul><li>CloudWatchメトリクス料金</li><li>X-Rayトレース料金（有効化している場合）</li><li>Lambda、ECS、EKS等の関連サービス料金</li><li>他リージョンへのデータ転送料金</li></ul><p>Application Signalsは比較的新しいサービスで、アプリケーションの可観測性を向上させる強力な機能を提供しますが、利用量に応じてコストが積み上がる点に注意が必要です。</p><p>以上<br><br>参考になれば幸いです。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;a href=&quot;https://github.com/awslabs/mcp/tree/main/src/aws-pricing-mcp-server&quot;&gt;AWS Pricing MCP&lt;/a&gt; を利用し取得した価格データから AWS CloudWatch Application Signals の料金体系は以下の通りです。&lt;/p&gt;</summary>
    
    
    
    <category term="AWS" scheme="https://kenzo0107.github.io/categories/AWS/"/>
    
    
  </entry>
  
  <entry>
    <title>Application Signals MCP に問い合わせしてできること</title>
    <link href="https://kenzo0107.github.io/2025/12/16/2025-12-17-what-application-signals-mcp-can-do/"/>
    <id>https://kenzo0107.github.io/2025/12/16/2025-12-17-what-application-signals-mcp-can-do/</id>
    <published>2025-12-16T15:00:00.000Z</published>
    <updated>2025-12-16T15:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>CloudWatch Application Signals で AIOps 強化が進んでおり期待が高まっております。</p><p>Application Signals MCP でどんなことができるのか <a href="https://aws.amazon.com/jp/blogs/news/enhance-your-aiops-introducing-amazon-cloudwatch-and-application-signals-mcp-servers/">AWS ドキュメント</a> 記載の内容そのままに以下の問い合わせをしました。</p><blockquote><p>What questions can I ask about CloudWatch or Application Signals MCP Servers?</p></blockquote><p>すると以下のような回答を頂いたので備忘録として残しておきます。</p><span id="more"></span><hr><p>⏺ 素晴らしい！AWS Application SignalsのMCPサーバーが利用可能になりました。</p><p>以下のような質問ができます：</p><h2><span id="サービス監査ヘルスチェック関連">🎯 サービス監査・ヘルスチェック関連</span></h2><h3><span id="基本的なサービス監査">基本的なサービス監査</span></h3><ul><li>全サービスの健全性を監査してください</li><li>payment関連サービスの状態を確認してください</li><li>EKSクラスター上のサービスをすべて監査してください</li><li>昨夜のサービス状況を確認してください</li></ul><h3><span id="オペレーション別の詳細分析">オペレーション別の詳細分析</span></h3><ul><li>payment サービスのGETオペレーションのレイテンシーを監査してください</li><li>特定のAPIエンドポイントのパフォーマンスを調査してください</li><li>エラー率の高いオペレーションを特定してください</li></ul><h2><span id="sloservice-level-objective関連">📊 SLO（Service Level Objective）関連</span></h2><h3><span id="slo管理">SLO管理</span></h3><ul><li>設定されているSLOをすべて一覧表示してください</li><li>SLOの違反状況を確認してください</li><li>特定のSLOの詳細設定を教えてください</li><li>payment関連のSLO違反を根本原因分析してください</li></ul><h2><span id="トレースログ分析">🔍 トレース・ログ分析</span></h2><h3><span id="問題調査">問題調査</span></h3><ul><li>特定のサービスでエラーが発生している原因を調査してください</li><li>レイテンシーが高い原因をトレースで分析してください</li><li>依存関係の問題を特定してください</li><li>外れ値ホストを見つけてください</li></ul><h3><span id="ログ検索">ログ検索</span></h3><ul><li>特定の時間帯のエラーログを検索してください</li><li>サービス間の通信エラーを調査してください</li></ul><h2><span id="メトリクスパフォーマンス分析">📈 メトリクス・パフォーマンス分析</span></h2><h3><span id="サービスメトリクス">サービスメトリクス</span></h3><ul><li>特定のサービスのレイテンシーメトリクスを取得してください</li><li>エラー率の推移を確認してください</li><li>過去1週間のパフォーマンス傾向を分析してください</li></ul><h2><span id="障害分析根本原因調査">🚨 障害分析・根本原因調査</span></h2><h3><span id="インシデント対応">インシデント対応</span></h3><ul><li>デプロイ後の新しいエラーを調査してください</li><li>サービス間依存関係の問題を特定してください</li><li>S3への依存関係を監査してください</li><li>Tier1サービスのクォータ使用量を確認してください</li></ul><h2><span id="️-syntheticsカナリア分析">🕸️ Syntheticsカナリア分析</span></h2><h3><span id="カナリア監視">カナリア監視</span></h3><ul><li>[カナリア名]のカナリア障害を分析してください</li><li>カナリアの失敗パターンを調査してください</li></ul><h2><span id="実際の質問例">実際の質問例</span></h2><ul><li><p>サービス全体の健全性チェック<br>  “すべてのサービスの健全性を監査してください”</p></li><li><p>特定サービスの詳細分析<br>  “payment-serviceのGETオペレーションのレイテンシー問題を根本原因分析してください”</p></li><li><p>SLO違反の調査<br>  “昨日からのSLO違反を調査して根本原因を分析してください”</p></li><li><p>パフォーマンス問題の特定<br>  “レスポンスタイムが遅いサービスを特定してエラーログを確認してください”</p></li><li><p>依存関係の問題調査<br>  “S3への接続問題があるサービスを特定してください”</p></li></ul><p>以上<br><br>参考になれば幸いです。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;CloudWatch Application Signals で AIOps 強化が進んでおり期待が高まっております。&lt;/p&gt;
&lt;p&gt;Application Signals MCP でどんなことができるのか &lt;a href=&quot;https://aws.amazon.com/jp/blogs/news/enhance-your-aiops-introducing-amazon-cloudwatch-and-application-signals-mcp-servers/&quot;&gt;AWS ドキュメント&lt;/a&gt; 記載の内容そのままに以下の問い合わせをしました。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What questions can I ask about CloudWatch or Application Signals MCP Servers?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;すると以下のような回答を頂いたので備忘録として残しておきます。&lt;/p&gt;</summary>
    
    
    
    <category term="AWS" scheme="https://kenzo0107.github.io/categories/AWS/"/>
    
    
  </entry>
  
  <entry>
    <title>AWS VPC Lattice Resource Gateway と NLB+VPC Endpoint 構成の比較分析</title>
    <link href="https://kenzo0107.github.io/2025/12/10/2025-12-11-nlb-vpc-endpoint-service-vpc-endpoint-vs-vpc-lattice-resource-gateway/"/>
    <id>https://kenzo0107.github.io/2025/12/10/2025-12-11-nlb-vpc-endpoint-service-vpc-endpoint-vs-vpc-lattice-resource-gateway/</id>
    <published>2025-12-10T15:00:00.000Z</published>
    <updated>2025-12-10T15:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2><span id="概要">概要</span></h2><p>本記事では、AWS VPC Lattice の Resource Gateway と、従来の Network Load Balancer (NLB) + VPC Endpoint Service + VPC Endpoint 構成について、コスト・セキュリティ・パフォーマンスの観点から詳細な比較分析を行います。</p><p><a href="https://awslabs.github.io/mcp/servers/aws-documentation-mcp-server">AWS Documentation MCP</a> を利用し調査した結果です。</p><span id="more"></span><h2><span id="比較する構成">比較する構成</span></h2><h3><span id="構成1-nlb-vpc-endpoint-service-vpc-endpoint">構成1: NLB + VPC Endpoint Service + VPC Endpoint</span></h3><ul><li>Network Load Balancer</li><li>VPC Endpoint Service</li><li>VPC Endpoint</li></ul><h3><span id="構成2-vpc-lattice-resource-gateway">構成2: VPC Lattice Resource Gateway</span></h3><ul><li>VPC Lattice Service</li><li>Resource Gateway</li><li>Resource Configuration</li></ul><h2><span id="コスト比較">コスト比較</span></h2><p>AWS Pricing APIを用いた2025年12月時点の料金調査結果に基づく比較です。</p><h3><span id="nlb-vpc-endpoint-service-vpc-endpoint">NLB + VPC Endpoint Service + VPC Endpoint</span></h3><table><thead><tr><th>コンポーネント</th><th>時間単価</th><th>月額基本料金</th></tr></thead><tbody><tr><td>Network Load Balancer</td><td>$0.0225/時間</td><td>$16.20</td></tr><tr><td>NLB LCU使用量</td><td>$0.006/LCU時間</td><td>使用量による</td></tr><tr><td>VPC Endpoint Service</td><td>$0.05/時間（リモートリージョン毎）</td><td>$36.00</td></tr><tr><td>VPC Endpoint</td><td>$0.01/時間</td><td>$7.20</td></tr><tr><td>データ処理費</td><td>$0.01/GB（1PBまで）</td><td>使用量による</td></tr></tbody></table><p><strong>月額基本料金合計</strong>: 約 <strong>$59.40</strong> + 使用量ベース料金</p><h3><span id="vpc-lattice-resource-gateway">VPC Lattice Resource Gateway</span></h3><table><thead><tr><th>コンポーネント</th><th>時間単価</th><th>月額基本料金</th></tr></thead><tbody><tr><td>VPC Lattice Service</td><td>$0.025/時間</td><td>$18.00</td></tr><tr><td>Resource Gateway</td><td>$0.02/時間（リソース毎）</td><td>$14.40</td></tr><tr><td>データ処理費</td><td>$0.025/GB</td><td>使用量による</td></tr><tr><td>接続・リクエスト</td><td>$0.0000001/時間</td><td>微小</td></tr></tbody></table><p><strong>月額基本料金合計</strong>: 約 <strong>$32.40</strong> + データ処理費</p><h3><span id="コスト分析結果">コスト分析結果</span></h3><ul><li>VPC Lattice の基本料金は約 <strong>45%安い</strong></li><li>データ処理費は VPC Lattice の方が2.5倍高い</li><li>低〜中程度のデータ転送量であれば VPC Lattice が有利</li></ul><h2><span id="セキュリティ比較">セキュリティ比較</span></h2><table><thead><tr><th>セキュリティ項目</th><th>NLB+VPC Endpoint</th><th>VPC Lattice Resource Gateway</th></tr></thead><tbody><tr><td><strong>ネットワーク分離</strong></td><td>✅ 完全なプライベート通信</td><td>✅ 完全なプライベート通信</td></tr><tr><td><strong>IAM統合</strong></td><td>⚠️ 限定的なサポート</td><td>✅ 細かなアクセス制御が可能</td></tr><tr><td><strong>認証・認可</strong></td><td>❌ NLBレベルでは基本的</td><td>✅ サービス・リソースレベル対応</td></tr><tr><td><strong>ネットワークACL</strong></td><td>✅ VPC・サブネットレベル</td><td>✅ Service Network レベル</td></tr><tr><td><strong>セキュリティグループ</strong></td><td>✅ 標準対応</td><td>✅ 標準対応</td></tr><tr><td><strong>監査ログ</strong></td><td>⚠️ CloudTrail, VPC Flow Logs</td><td>✅ CloudTrail + VPC Lattice専用ログ</td></tr><tr><td><strong>暗号化</strong></td><td>✅ TLS終端可能</td><td>✅ TLS終端可能</td></tr></tbody></table><h3><span id="セキュリティ分析結果">セキュリティ分析結果</span></h3><p>VPC Lattice は <strong>IAM統合による細かなアクセス制御</strong> と <strong>統合された監査ログ</strong> でセキュリティ面において優位性があります。</p><h2><span id="パフォーマンス比較">パフォーマンス比較</span></h2><table><thead><tr><th>パフォーマンス項目</th><th>NLB+VPC Endpoint</th><th>VPC Lattice Resource Gateway</th></tr></thead><tbody><tr><td><strong>レイテンシ</strong></td><td>⚠️ 複数ホップ（NLB→Target）</td><td>✅ 直接ルーティングで低レイテンシ</td></tr><tr><td><strong>スループット</strong></td><td>✅ 高い（NLBの実績ある性能）</td><td>✅ 高い（専用設計）</td></tr><tr><td><strong>可用性</strong></td><td>✅ Multi-AZ NLB + Endpoint</td><td>✅ Service Network の自動冗長化</td></tr><tr><td><strong>スケーラビリティ</strong></td><td>✅ NLBの自動スケール</td><td>✅ 自動スケール対応</td></tr><tr><td><strong>ヘルスチェック</strong></td><td>✅ NLBターゲットヘルスチェック</td><td>✅ Resource Configuration ヘルスチェック</td></tr><tr><td><strong>ロードバランシング</strong></td><td>✅ 複数アルゴリズム対応</td><td>⚠️ 基本的なロードバランシング</td></tr></tbody></table><h3><span id="パフォーマンス分析結果">パフォーマンス分析結果</span></h3><ul><li><strong>レイテンシ</strong>: VPC Lattice が優位</li><li><strong>柔軟性</strong>: NLB が多様なロードバランシングオプションで優位</li><li><strong>総合</strong>: 用途により優位性が変わる</li></ul><h2><span id="運用管理比較">運用・管理比較</span></h2><table><thead><tr><th>運用管理項目</th><th>NLB+VPC Endpoint</th><th>VPC Lattice Resource Gateway</th></tr></thead><tbody><tr><td><strong>設定の複雑さ</strong></td><td>❌ 複雑（複数コンポーネント管理）</td><td>✅ シンプル（統合管理）</td></tr><tr><td><strong>監視・メトリクス</strong></td><td>⚠️ 複数サービスの個別監視</td><td>✅ 統合メトリクス</td></tr><tr><td><strong>トラブルシューティング</strong></td><td>❌ 複数ポイントの調査必要</td><td>✅ 一元化されたログとメトリクス</td></tr><tr><td><strong>マルチリージョン対応</strong></td><td>❌ リージョン毎の個別設定</td><td>✅ Service Network での統一管理</td></tr><tr><td><strong>学習コスト</strong></td><td>✅ 既存技術の組み合わせ</td><td>⚠️ 新しいサービスの理解が必要</td></tr></tbody></table><h2><span id="総合比較とメリットデメリット">総合比較とメリット・デメリット</span></h2><h3><span id="nlb-vpc-endpoint-service-vpc-endpoint">NLB + VPC Endpoint Service + VPC Endpoint</span></h3><h4><span id="メリット">メリット</span></h4><ul><li>✅ <strong>成熟した技術</strong>: 長期間の運用実績と安定性</li><li>✅ <strong>既存インフラとの親和性</strong>: VPCベースの既存構成と自然に統合</li><li>✅ <strong>豊富なロードバランシング機能</strong>: 複数のアルゴリズムとヘルスチェックオプション</li><li>✅ <strong>詳細なネットワーク制御</strong>: セキュリティグループ、NACLによる細かな制御</li><li>✅ <strong>豊富なドキュメント</strong>: 多くの事例と解決策が存在</li></ul><h4><span id="デメリット">デメリット</span></h4><ul><li>🤔 <strong>高い初期コスト</strong>: 基本料金が月額約$59.40</li><li>🤔 <strong>複雑な設定・管理</strong>: 複数コンポーネントの個別管理が必要</li><li>🤔 <strong>運用負荷</strong>: 複数サービスの監視・トラブルシューティング</li><li>🤔 <strong>レイテンシ</strong>: 複数ホップによる若干の遅延</li></ul><h3><span id="vpc-lattice-resource-gateway">VPC Lattice Resource Gateway</span></h3><h4><span id="メリット">メリット</span></h4><ul><li>✅ <strong>低い初期コスト</strong>: 基本料金が月額約$32.40（45%安い）</li><li>✅ <strong>シンプルな管理</strong>: 統合されたサービスによる一元管理</li><li>✅ <strong>優れたIAM統合</strong>: サービス・リソースレベルでの細かなアクセス制御</li><li>✅ <strong>統合監視</strong>: 一元化されたメトリクスとログ</li><li>✅ <strong>低レイテンシ</strong>: 直接ルーティングによる高速通信</li><li>✅ <strong>マルチリージョン対応</strong>: Service Network での統一管理</li></ul><h4><span id="デメリット">デメリット</span></h4><ul><li>🤔 <strong>データ処理費</strong>: 高トラフィック時の従量課金（$0.025/GB）</li><li>🤔 <strong>機能制約</strong>: NLBほど柔軟なロードバランシングオプションがない</li></ul><h2><span id="推奨シナリオ">推奨シナリオ</span></h2><h3><span id="vpc-lattice-resource-gateway-を推奨する場合">VPC Lattice Resource Gateway を推奨する場合</span></h3><p>🎯 <strong>以下の条件に当てはまる場合に最適</strong>:</p><ul><li>新規システム構築</li><li>シンプルな管理・運用を重視</li><li>IAMによる細かなアクセス制御が重要</li><li>データ転送量が中程度以下（月数TB程度）</li><li>運用コストを重視</li><li>マルチリージョン展開を予定</li></ul><h3><span id="nlb-vpc-endpoint-を推奨する場合">NLB + VPC Endpoint を推奨する場合</span></h3><p>🎯 <strong>以下の条件に当てはまる場合に最適</strong>:</p><ul><li>既存VPCインフラとの整合性重視</li><li>高度なロードバランシング機能が必要</li><li>運用実績・安定性を最重視</li><li>非常に高いデータ転送量（月数十TB以上）</li><li>既存チームのNLB運用スキルを活用したい</li></ul><h2><span id="実装時の考慮事項">実装時の考慮事項</span></h2><h3><span id="移行戦略">移行戦略</span></h3><ul><li><strong>段階的移行</strong>: 重要度の低いサービスから VPC Lattice へ段階的に移行</li><li><strong>ハイブリッド運用</strong>: 要件に応じて両方式を使い分け</li><li><strong>コスト監視</strong>: データ転送量の実測値に基づく定期的なコスト見直し</li></ul><h3><span id="技術的考慮事項">技術的考慮事項</span></h3><ul><li><strong>モニタリング設計</strong>: VPC Lattice の新しいメトリクスに対応した監視設計</li><li><strong>セキュリティポリシー</strong>: IAMポリシーベースのアクセス制御設計</li><li><strong>ディザスタリカバリ</strong>: Service Network の冗長性設計</li></ul><h2><span id="まとめ">まとめ</span></h2><p>AWS VPC Lattice Resource Gateway は、従来のNLB+VPC Endpoint構成と比較して、<strong>コスト効率性・運用性・セキュリティ機能</strong>において優位性を持つ新しいソリューションです。</p><p>特に <strong>新規システム構築</strong> や <strong>シンプルな運用</strong> を重視する場合には、VPC Lattice の採用を強く推奨します。一方、<strong>既存インフラとの整合性</strong> や <strong>運用実績</strong> を重視する場合には、従来のNLB+VPC Endpoint構成も依然として有効な選択肢です。</p><p>最終的な選択は、システムの要件・制約・チームのスキルレベルを総合的に評価して決定することが重要です。</p><h2><span id="参考">参考</span></h2><h3><span id="aws-公式ドキュメント">AWS 公式ドキュメント</span></h3><ul><li><a href="https://docs.aws.amazon.com/vpc-lattice/latest/ug/what-is-vpc-lattice.html">Amazon VPC Lattice User Guide</a></li><li><a href="https://docs.aws.amazon.com/elasticloadbalancing/latest/network/">Elastic Load Balancing - Network Load Balancer</a></li><li><a href="https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints.html">VPC Endpoints - AWS PrivateLink</a></li><li><a href="https://aws.amazon.com/vpc-lattice/pricing/">AWS Pricing - VPC Lattice</a></li><li><a href="https://aws.amazon.com/elasticloadbalancing/pricing/">AWS Pricing - Elastic Load Balancing</a></li></ul><h3><span id="aws-ブログ技術記事">AWS ブログ・技術記事</span></h3><ul><li><a href="https://aws.amazon.com/blogs/aws/introducing-amazon-vpc-lattice-simplify-networking-for-service-to-service-communication/">Introducing Amazon VPC Lattice – Simplify Networking for Service-to-Service Communication</a></li><li><a href="https://aws.amazon.com/jp/blogs/news/introducing-amazon-vpc-lattice/">Amazon VPC Lattice でマイクロサービス間の通信を簡単に</a></li></ul><h3><span id="価格情報ソース">価格情報ソース</span></h3><ul><li><a href="https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/price-list-api.html">AWS Price List API</a> - 本分析で使用した料金データの取得元</li></ul><hr><p><em>本分析は2025年12月時点のAWS Pricing APIデータに基づいています。料金は変更される可能性があるため、最新情報は公式ドキュメントをご確認ください。</em></p><p>以上<br><br>参考になれば幸いです。</p>]]></content>
    
    
    <summary type="html">&lt;h2 id=&quot;概要&quot;&gt;&lt;a href=&quot;#概要&quot; class=&quot;headerlink&quot; title=&quot;概要&quot;&gt;&lt;/a&gt;概要&lt;/h2&gt;&lt;p&gt;本記事では、AWS VPC Lattice の Resource Gateway と、従来の Network Load Balancer (NLB) + VPC Endpoint Service + VPC Endpoint 構成について、コスト・セキュリティ・パフォーマンスの観点から詳細な比較分析を行います。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://awslabs.github.io/mcp/servers/aws-documentation-mcp-server&quot;&gt;AWS Documentation MCP&lt;/a&gt; を利用し調査した結果です。&lt;/p&gt;</summary>
    
    
    
    <category term="AWS" scheme="https://kenzo0107.github.io/categories/AWS/"/>
    
    
  </entry>
  
  <entry>
    <title>RDS Performance Insights が 2026年6月に EOL、 Database Insights への移行を考える</title>
    <link href="https://kenzo0107.github.io/2025/12/04/2025-12-05-migrate-from-performance-insights-to-database-insights/"/>
    <id>https://kenzo0107.github.io/2025/12/04/2025-12-05-migrate-from-performance-insights-to-database-insights/</id>
    <published>2025-12-04T15:00:00.000Z</published>
    <updated>2025-12-04T15:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2><span id="概要">概要</span></h2><p>Performance Insights は 2026年6月30日にデプリケートされる予定です。</p><a href="https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_PerfInsights.html" class="link-preview" target="_blank"><div class="link-area"><div class="descriptions"><div class="og-title">Monitoring DB load with Performance Insights on Amazon Aurora - Amazon Aurora</div><div class="og-description">Monitor your Amazon Aurora cluster load with Performance Insights to analyze and troubleshoot your database performance.</div></div></div></a><blockquote><p>AWS has announced the end-of-life date for Performance Insights: June 30, 2026.</p></blockquote><p>継続してパフォーマンスインサイト相当の機能を利用するには Performance Insights から CloudWatch Database Insights への移行する必要があります。</p><p>それぞれの機能差やコストについてまとめました。</p><span id="more"></span><h2><span id="モード比較">モード比較</span></h2><table><thead><tr><th>項目</th><th>Performance Insights</th><th>Database Insights Standard</th><th>Database Insights Advanced</th></tr></thead><tbody><tr><td><strong>コスト</strong></td><td>$4.76/月 (2vCPU)</td><td>無料</td><td>$18.25/月 (2vCPU)</td></tr><tr><td><strong>保持期間</strong></td><td>7日〜15ヶ月</td><td>7日</td><td>15ヶ月</td></tr><tr><td><strong>フリート監視</strong></td><td>❌</td><td>✅</td><td>✅</td></tr><tr><td><strong>統合ダッシュボード</strong></td><td>❌</td><td>基本機能</td><td>✅</td></tr></tbody></table><p>Database Insights には Standard と Advanced モードがあります。</p><h2><span id="database-insights-standard-vs-advanced-モード機能比較表">Database Insights Standard VS Advanced モード機能比較表</span></h2><h3><span id="共通機能standard-amp-advanced">共通機能（Standard &amp; Advanced）</span></h3><ul><li>✅ DB Load の次元別分析</li><li>✅ データベースメトリクスのクエリ・グラフ化・アラート（7日間保持）</li><li>✅ SQL テキストなどの機密ディメンションへのアクセス制御</li></ul><h3><span id="advanced-mode-専用機能">Advanced Mode 専用機能</span></h3><table><thead><tr><th>機能カテゴリ</th><th>機能詳細</th><th>対応エンジン</th><th>前提条件</th></tr></thead><tbody><tr><td><strong>監視・分析</strong></td><td>OSプロセス詳細監視</td><td>全エンジン</td><td>Enhanced Monitoring必須</td></tr><tr><td><strong>フリート管理</strong></td><td>フリート全体監視ビューの定義・保存</td><td>全エンジン</td><td>-</td></tr><tr><td><strong>SQL分析</strong></td><td>SQLロック分析（15ヶ月保持）</td><td>Aurora PostgreSQL のみ</td><td>-</td></tr><tr><td><strong>実行プラン</strong></td><td>SQL実行プラン分析（15ヶ月保持）</td><td>Aurora PostgreSQL、RDS Oracle、RDS SQL Server</td><td>-</td></tr><tr><td><strong>クエリ統計</strong></td><td>クエリ別統計の可視化</td><td>全エンジン</td><td>-</td></tr><tr><td><strong>スロークエリ</strong></td><td>スロークエリ分析</td><td>全エンジン</td><td>CloudWatch Logs出力必須</td></tr><tr><td><strong>アプリケーション</strong></td><td>CloudWatch Application Signals連携</td><td>全エンジン</td><td>-</td></tr><tr><td><strong>統合ダッシュボード</strong></td><td>メトリクス・ログ・イベント・アプリ統合</td><td>全エンジン</td><td>ログ出力必須</td></tr><tr><td><strong>自動統合</strong></td><td>Performance Insightsメトリクスの自動インポート</td><td>全エンジン</td><td>-</td></tr><tr><td><strong>イベント監視</strong></td><td>RDSイベントのCloudWatch表示</td><td>全エンジン</td><td>-</td></tr><tr><td><strong>オンデマンド分析</strong></td><td>任意期間のパフォーマンス分析</td><td>Aurora PostgreSQL/MySQL、RDS PostgreSQL/MySQL/MariaDB/Oracle</td><td>-</td></tr></tbody></table><h2><span id="重要な制限事項">重要な制限事項</span></h2><h3><span id="エンジン依存機能">エンジン依存機能</span></h3><ul><li><strong>SQLロック分析</strong>: Aurora PostgreSQL のみ</li><li><strong>実行プラン分析</strong>: Aurora PostgreSQL、RDS Oracle、RDS SQL Server のみ</li><li><strong>オンデマンド分析</strong>: MySQL系、PostgreSQL系、Oracle のみ（SQL Server除く）</li></ul><h3><span id="前提条件">前提条件</span></h3><ol><li><strong>Advanced Mode有効化</strong>: Performance Insights の有効化が必須</li><li><strong>スロークエリ分析</strong>: CloudWatch Logs への出力設定が必要</li><li><strong>統合ダッシュボード</strong>: ログ出力設定が必要（ログ表示のため）</li><li><strong>OSプロセス監視</strong>: Enhanced Monitoring の有効化が必要</li></ol><h3><span id="地域制限">地域制限</span></h3><ul><li>すべてのAWSリージョンでAdvanced Mode機能が利用可能ではない</li></ul><h2><span id="選択指針">選択指針</span></h2><h3><span id="standard-mode-が適している場合">Standard Mode が適している場合</span></h3><ul><li>基本的なDB監視で十分</li><li>コストを抑えたい</li><li>7日間のデータ保持で十分</li></ul><h3><span id="advanced-mode-が必要な場合">Advanced Mode が必要な場合</span></h3><ul><li>フリート全体の一元監視が必要</li><li>長期的なトレンド分析（15ヶ月）が必要</li><li>SQL実行プランやロック分析が必要</li><li>アプリケーションとの統合監視が必要</li></ul><h2><span id="まとめ">まとめ</span></h2><ul><li>Advanced Mode は高機能ですが、エンジン依存や前提条件があります。</li><li>最初は Standard モードで利用し、より詳細なボトルネック調査したい場合は Advanced に切り替えはアリ</li></ul><p>組織の監視要件と対象エンジンを確認した上で適切なモードを選択してください。</p><h2><span id="参考">参考</span></h2><h3><span id="database-insights">Database Insights</span></h3><ul><li><a href="https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Database-Insights.html">CloudWatch Database Insights</a></li><li><a href="https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_DatabaseInsights.html">Monitoring Amazon RDS databases with CloudWatch Database Insights</a></li><li><a href="https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_DatabaseInsights.Considerations.html">Considerations for Database Insights for Amazon RDS</a></li></ul><h3><span id="料金情報">料金情報</span></h3><ul><li><a href="https://aws.amazon.com/cloudwatch/pricing/">Amazon CloudWatch Pricing</a></li><li><a href="https://aws.amazon.com/rds/performance-insights/pricing/">Performance Insights Pricing</a></li></ul><h3><span id="移行比較情報-aws-repost">移行・比較情報 - AWS re:Post</span></h3><ul><li><a href="https://repost.aws/articles/AR6gPnT__dQdq81Md6Q_A1mA/transitioning-from-rds-performance-insights-to-cloudwatch-database-insights">Transitioning from RDS Performance Insights to CloudWatch Database Insights</a></li><li><a href="https://repost.aws/articles/ARelTfHKHvTBC78mc-CNVqmA/performance-insights-to-cloudwatch-database-insights">Performance Insights to CloudWatch Database Insights</a></li></ul><h3><span id="サードパーティ解説">サードパーティ解説</span></h3><ul><li><a href="https://pganalyze.com/blog/aws-performance-insights-deprecation-database-insights-comparison">AWS Performance Insights has been deprecated: What to know about CloudWatch Database Insights - pganalyze</a></li><li><a href="https://www.doit.com/blog/transitioning-from-rds-performance-insights-to-cloudwatch-database-insights/">Transitioning from RDS Performance Insights to CloudWatch Database Insights - DoiT</a></li></ul><h3><span id="技術仕様-パフォーマンス監視">技術仕様 - パフォーマンス監視</span></h3><ul><li><a href="https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_PerfInsights_Counters.html">Performance Insights counter metrics</a></li><li><a href="https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_PerfInsights.Cloudwatch.html">Amazon CloudWatch metrics for Amazon RDS Performance Insights</a></li></ul><h3><span id="enhanced-monitoring">Enhanced Monitoring</span></h3><ul><li><a href="https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Monitoring.OS.html">Enhanced Monitoring for Amazon RDS</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;h2 id=&quot;概要&quot;&gt;&lt;a href=&quot;#概要&quot; class=&quot;headerlink&quot; title=&quot;概要&quot;&gt;&lt;/a&gt;概要&lt;/h2&gt;&lt;p&gt;Performance Insights は 2026年6月30日にデプリケートされる予定です。&lt;/p&gt;
&lt;a href=&quot;https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_PerfInsights.html&quot; class=&quot;link-preview&quot; target=&quot;_blank&quot;&gt;&lt;div class=&quot;link-area&quot;&gt;&lt;div class=&quot;descriptions&quot;&gt;&lt;div class=&quot;og-title&quot;&gt;Monitoring DB load with Performance Insights on Amazon Aurora - Amazon Aurora&lt;/div&gt;&lt;div class=&quot;og-description&quot;&gt;Monitor your Amazon Aurora cluster load with Performance Insights to analyze and troubleshoot your database performance.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/a&gt;

&lt;blockquote&gt;
&lt;p&gt;AWS has announced the end-of-life date for Performance Insights: June 30, 2026.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;継続してパフォーマンスインサイト相当の機能を利用するには Performance Insights から CloudWatch Database Insights への移行する必要があります。&lt;/p&gt;
&lt;p&gt;それぞれの機能差やコストについてまとめました。&lt;/p&gt;</summary>
    
    
    
    <category term="AWS" scheme="https://kenzo0107.github.io/categories/AWS/"/>
    
    
  </entry>
  
  <entry>
    <title>Aurora PostgreSQL db.t4g.medium 相当の Aurora Serverless v2 のキャパシティ設定どのくらい？</title>
    <link href="https://kenzo0107.github.io/2025/11/30/2025-12-01-aws-aurora-rds-cluster-instance-vs-serverless-v2/"/>
    <id>https://kenzo0107.github.io/2025/11/30/2025-12-01-aws-aurora-rds-cluster-instance-vs-serverless-v2/</id>
    <published>2025-11-30T15:00:00.000Z</published>
    <updated>2025-11-30T15:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2><span id="概要">概要</span></h2><p>Aurora Serverless v2 を導入検討する際に Aurora RDS Cluster Instance の最低インスタンスクラスである db.t4g.medium がどの程度のキャパシティに相当するのか調査した内容をまとめます。</p><span id="more"></span><h2><span id="キャパシティ計算">キャパシティ計算</span></h2><h3><span id="dbt4gmedium-スペック">db.t4g.medium スペック</span></h3><ul><li><strong>vCPU</strong>: 2</li><li><strong>メモリ</strong>: 4 GiB</li><li><strong>ACU相当</strong>: 2 ACU 👀✨</li></ul><h2><span id="コスト比較-ap-northeast-1-2025年12月1日現在">コスト比較 （ap-northeast-1、2025年12月1日現在）</span></h2><p>利用料金の安い Aurora PostgreSQL Standard を前提とします。</p><table><thead><tr><th></th><th>USD</th></tr></thead><tbody><tr><td>RI</td><td>710</td></tr><tr><td>Serverless v2 (1年フル稼働)</td><td>2,628</td></tr><tr><td>Serverless v2 (平日夜間・土日祝停止)</td><td>1,176</td></tr></tbody></table><p>RI は安いですが、スケーリングの管理は CloudWatch Alarm などで構成する必要があります。</p><h3><span id="aurora-postgresql-プロビジョンドインスタンス-dbt4gmedium">Aurora PostgreSQL プロビジョンドインスタンス db.t4g.medium</span></h3><ul><li>Aurora Standard: 0.113 USD / hour</li><li>Aurora I/O 最適化: 0.147 USD / hour</li></ul><h4><span id="aurora-standard-を-1年利用した場合">Aurora Standard を 1年利用した場合</span></h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">989.88 USD</span><br><span class="line">= 0.113 USD / hour x 24 hour x 365 days</span><br></pre></td></tr></table></figure><h4><span id="reserved-instance-を利用した場合">Reserved Instance を利用した場合</span></h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">710 USD</span><br></pre></td></tr></table></figure><h3><span id="aurora-postgresql-serverless-v2">Aurora PostgreSQL Serverless v2</span></h3><ul><li>Aurora Standard: 0.15 USD / ACU / hour</li><li>Aurora I/O 最適化: 0.20 USD / ACU / hour</li></ul><h4><span id="aurora-standard-を-1年利用した場合">Aurora Standard を 1年利用した場合</span></h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">2,628 USD</span><br><span class="line">= 2 ACU x 0.15 USD / ACU x 24 hours x 365 days / hour</span><br></pre></td></tr></table></figure><p>以下時間をゼロキャパシティとなる見込みの場合 (3,920 時間/年間)</p><ul><li>平日 23:00 - 07:00</li><li>土日祝</li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">1,176 USD</span><br><span class="line">= 2 ACU x 0.15 USD / ACU / hour x 3,920 hours</span><br></pre></td></tr></table></figure><h2><span id="総評">総評</span></h2><p>Aurora Serverless を利用する際の一番のデメリットは実際のワークロードが読めず、意図せぬコスト増となり得ることが一つ要因としてあるかと思います。<br>その場合は実際のワークロードを想定した検証した上でコストメリットを計算できます。</p><p>スケーリングの管理に対する運用負荷が軽減されるメリットは非常に大きいのでこの点は採用するメリットとしては大きいのではないかと思います。</p><p>いずれにしても検証大事！</p><h2><span id="参考文献">参考文献</span></h2><ul><li><a href="https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.html">Using Aurora Serverless v2 - Amazon Aurora</a></li><li><a href="https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Concepts.DBInstanceClass.Summary.html">Hardware specifications for DB instance classes for Aurora</a></li><li><a href="https://aws.amazon.com/rds/aurora/pricing/">Amazon Aurora Pricing</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;h2 id=&quot;概要&quot;&gt;&lt;a href=&quot;#概要&quot; class=&quot;headerlink&quot; title=&quot;概要&quot;&gt;&lt;/a&gt;概要&lt;/h2&gt;&lt;p&gt;Aurora Serverless v2 を導入検討する際に Aurora RDS Cluster Instance の最低インスタンスクラスである db.t4g.medium がどの程度のキャパシティに相当するのか調査した内容をまとめます。&lt;/p&gt;</summary>
    
    
    
    <category term="AWS" scheme="https://kenzo0107.github.io/categories/AWS/"/>
    
    
  </entry>
  
  <entry>
    <title>NAT Gateway リージョナル vs ゾーナル - コストとIPアドレス管理</title>
    <link href="https://kenzo0107.github.io/2025/11/25/2025-11-26-nat-gateway-regional-vs-zonal/"/>
    <id>https://kenzo0107.github.io/2025/11/25/2025-11-26-nat-gateway-regional-vs-zonal/</id>
    <published>2025-11-25T15:00:00.000Z</published>
    <updated>2025-11-25T15:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>Claude Code + AWS Document MCP で調査した内容をまとめます。</p><h2><span id="概要">概要</span></h2><p>AWS NAT Gatewayには従来の<strong>ゾーナル（Zonal）</strong>モードに加えて、新しく<a href="https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/nat-gateways-regional.html"><strong>リージョナル（Regional）</strong>モード</a>が提供されました。<br><br>本記事では、AWS公式ドキュメントに基づいて両者の特徴、コスト比較、およびIPアドレス管理についてまとめます。</p><span id="more"></span><h2><span id="️-重要な注意事項">⚠️ 重要な注意事項</span></h2><p><del>2025.11.26現在、 <a href="https://github.com/hashicorp/terraform-provider-aws">terraform-provider-aws</a> はリージョナル NAT Gateway をサポートしていません。</del><br>issue: <a href="https://github.com/hashicorp/terraform-provider-aws/issues/45151">https://github.com/hashicorp/terraform-provider-aws/issues/45151</a></p><p><a href="https://github.com/hashicorp/terraform-provider-aws/releases/tag/v6.24.0">v6.24.0</a> でサポートされました🎉</p><h2><span id="リージョナル-nat-gateway-のコスト優位性">リージョナル NAT Gateway のコスト優位性</span></h2><p>基本的な料金体系はリージョナル、ゾーナルと同じ料金構造です。</p><ul><li><strong>時間単位料金</strong>: NAT Gatewayが利用可能な時間ごと</li><li><strong>データ処理料金</strong>: 処理されるデータ量（GB単位）</li></ul><h3><span id="コスト削減のメカニズム">コスト削減のメカニズム</span></h3><p>リージョナル NAT Gateway の方が、クロスAZ転送がない分、コスト削減できる可能性が高いです。</p><ul><li><p>ゾーナル設定の問題</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">AZ-1a: Private Subnet → NAT Gateway (AZ-1b) → Internet</span><br><span class="line">      ↑</span><br><span class="line">   クロスAZデータ転送料金が発生</span><br></pre></td></tr></table></figure></li><li><p>リージョナル設定の利点</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">AZ-1a: Private Subnet → Regional NAT Gateway (自動的にAZ-1aに展開)</span><br><span class="line">AZ-1b: Private Subnet → Regional NAT Gateway (自動的にAZ-1bに展開)</span><br><span class="line">      ↑</span><br><span class="line">   各AZで処理され、クロスAZ転送を削減</span><br></pre></td></tr></table></figure></li></ul><h4><span id="運用コストの削減">運用コストの削減</span></h4><p><strong>ゾーナル設定：</strong></p><ul><li>パブリックサブネットの作成・管理が必要</li><li>各AZ毎のルートテーブル設定</li><li>手動でのAZ拡張作業</li></ul><p><strong>リージョナル設定：</strong></p><ul><li>パブリックサブネット不要</li><li>単一のルートテーブル設定</li><li>自動的なAZ拡張・縮小</li></ul><p>⚠️ <a href="https://registry.terraform.io/modules/terraform-aws-modules/vpc">vpc module</a> を利用している場合、パブリックサブネットを作成しない設定にすると Intenet Gateway が作成されません。<br><br>CloudFront VPC Origin を利用する場合、 Internet Gateway が必要なので注意が必要です。</p><h3><span id="コスト削減が期待できるケース">コスト削減が期待できるケース</span></h3><ol><li><strong>マルチAZ展開が頻繁</strong>な環境</li><li><strong>クロスAZ通信が多い</strong>現在の設定</li><li><strong>複数のゾーナルNAT Gateway</strong>を運用している場合</li><li><strong>運用の自動化</strong>によるオペレーショナルコスト削減を重視する場合</li></ol><h2><span id="ipアドレス管理固定ipの実現方法">IPアドレス管理：固定IPの実現方法</span></h2><p>外部サービス連携する際、外部サービス側でIP許可する為にこちらの出口IPを固定したい、という要件が時にあります。<br><br>リージョナル NAT Gateway でIPを固定する方法が2つあるので注意が必要です。</p><p><img src="https://i.imgur.com/9uwU4WU.png"></p><ul><li>自動: IPが自動で割り当てられ、スケールする毎に変更する可能性があります。</li><li>マニュアル:  Elastic IP を固定で指定します。</li></ul><h3><span id="既存ipアドレスの継承方法">既存IPアドレスの継承方法</span></h3><p>AWS公式ドキュメントでは、既存のゾーナルNAT GatewayからIPアドレスを継承する方法も提供されています：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">既存IPアドレスを再利用する手順:</span><br><span class="line">1. 既存のゾーナルNAT Gatewayを削除してIPアドレスを解放</span><br><span class="line">2. 解放されたIPアドレスを使用してリージョナルNAT Gatewayを作成</span><br><span class="line">3. ルートテーブルをリージョナルNAT Gatewayに更新</span><br><span class="line"></span><br><span class="line">注意: この方法では一時的にトラフィック断絶が発生するため、</span><br><span class="line">      メンテナンスウィンドウでの実施を推奨</span><br></pre></td></tr></table></figure><h2><span id="パフォーマンスと可用性の向上">パフォーマンスと可用性の向上</span></h2><h3><span id="自動高可用性">自動高可用性</span></h3><p><strong>従来のゾーナル：</strong></p><ul><li>各AZで手動設定が必要</li><li>新AZ展開時に手動でNAT Gateway追加</li></ul><p><strong>リージョナル：</strong></p><ul><li>ワークロードを検知して自動的にAZに展開</li><li>最大60分で新しいAZに展開完了</li><li>使用していないAZからは自動撤退</li></ul><h3><span id="スケーラビリティの向上">スケーラビリティの向上</span></h3><table><thead><tr><th>項目</th><th>ゾーナルNAT Gateway</th><th>リージョナルNAT Gateway</th></tr></thead><tbody><tr><td>IPアドレス上限</td><td>8個/Gateway</td><td>32個/AZ</td></tr><tr><td>同時接続数</td><td>55,000/IP</td><td>55,000/IP × 32</td></tr><tr><td>AZ拡張</td><td>手動設定必要</td><td>自動展開</td></tr><tr><td>管理複雑性</td><td>高い</td><td>低い</td></tr></tbody></table><p>今後、リージョナル NAT Gateway の優位性が高まっていきそうです♪</p><h2><span id="移行時の考慮事項">移行時の考慮事項</span></h2><h3><span id="接続のリセット">接続のリセット</span></h3><p><strong>重要な注意点：</strong></p><blockquote><p>AWS公式ドキュメントより：<br>これにより既存の接続がリセットされます。メンテナンスウィンドウ内でこれらの手順を完了することをお勧めします。</p></blockquote><h3><span id="移行戦略">移行戦略</span></h3><h4><span id="戦略a-新しいipアドレスでの移行">戦略A: 新しいIPアドレスでの移行</span></h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">1. 新しいリージョナルNAT Gateway作成</span><br><span class="line">2. ルートテーブル更新</span><br><span class="line">3. 古いゾーナルNAT Gateway削除</span><br><span class="line"></span><br><span class="line">メリット: シンプル</span><br><span class="line">デメリット: IPアドレス変更</span><br></pre></td></tr></table></figure><h4><span id="戦略b-既存ipアドレス保持移行">戦略B: 既存IPアドレス保持移行</span></h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">1. 既存ゾーナルNAT Gateway削除（IP解放）</span><br><span class="line">2. 解放されたIPでリージョナルNAT Gateway作成</span><br><span class="line">3. ルートテーブル更新</span><br><span class="line"></span><br><span class="line">メリット: IPアドレス保持</span><br><span class="line">デメリット: 一時的な通信断絶</span><br></pre></td></tr></table></figure><h2><span id="監視と運用">監視と運用</span></h2><h3><span id="cloudwatchメトリクス">CloudWatchメトリクス</span></h3><p>リージョナルNAT Gatewayでは従来のメトリクスに加えて：</p><ul><li>AZ別のトラフィック分析</li><li>自動拡張イベントの監視</li><li>ポート枯渇の早期検知</li></ul><h2><span id="推奨事項とベストプラクティス">推奨事項とベストプラクティス</span></h2><h3><span id="リージョナルnat-gatewayが推奨されるケース">リージョナルNAT Gatewayが推奨されるケース</span></h3><p>✅ <strong>推奨</strong></p><ul><li>マルチAZ環境での新規構築</li><li>複数のゾーナルNAT Gatewayを運用中</li><li>運用自動化を重視</li><li>クロスAZ通信が多い環境</li></ul><p>❌ <strong>非推奨</strong></p><ul><li>プライベートNAT Gateway機能が必要</li><li>単一AZでの小規模システム</li></ul><h3><span id="ipアドレス管理の選択指針">IPアドレス管理の選択指針</span></h3><table><thead><tr><th>要件</th><th>推奨モード</th><th>理由</th></tr></thead><tbody><tr><td>固定IP必要</td><td>Manual</td><td>特定のElastic IP指定可能</td></tr><tr><td>コスト最優先</td><td>Automatic</td><td>AWS最適化によるコスト削減</td></tr><tr><td>セキュリティ重視</td><td>Manual</td><td>IPアドレス制御による外部アクセス管理</td></tr><tr><td>運用簡素化</td><td>Automatic</td><td>完全自動化による運用レス</td></tr></tbody></table><h2><span id="まとめ">まとめ</span></h2><p>リージョナルNAT Gatewayは、従来のゾーナルNAT Gatewayと比較して：</p><p><strong>コスト面：</strong></p><ul><li>クロスAZデータ転送料金の削減</li><li>運用コストの削減</li><li>複数NAT Gateway統合によるコスト最適化</li></ul><p><strong>運用面：</strong></p><ul><li>自動的な高可用性</li><li>管理の簡素化</li><li>AZ拡張の自動化</li></ul><p><strong>IPアドレス管理：</strong></p><ul><li>Manualモードで固定IP実現可能</li><li>既存IPアドレスの継承も可能</li><li>セキュリティ要件にも対応</li></ul><p>特に、<strong>複数のゾーナルNAT Gatewayを運用している環境</strong>では、リージョナルNAT Gatewayへの移行により大幅なコスト削減と運用効率化が期待できます。</p><p><strong>現在の推奨アプローチ：</strong></p><ul><li><strong>既存Terraformプロジェクト</strong>: ゾーナルNAT Gatewayで継続運用、Terraformサポート開始を待つ</li><li><strong>新規プロジェクト</strong>: AWS CLIでRegional NAT Gateway作成、将来的にTerraform管理に移行</li><li><strong>コスト重視</strong>: 今すぐにでもRegional NAT Gatewayへの移行を検討</li></ul><p>移行を検討する際は、現在の通信パターンと外部システムとの連携要件を十分に分析し、適切なモード（AutomaticまたはManual）を選択することが重要です。</p><h2><span id="参考リンク">参考リンク</span></h2><ul><li><a href="https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html">AWS NAT Gateway Documentation</a></li><li><a href="https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateways-regional.html">Regional NAT Gateway Documentation</a></li><li><a href="https://docs.aws.amazon.com/cli/latest/reference/ec2/create-nat-gateway.html">AWS CLI NAT Gateway Commands</a></li><li><a href="https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/nat_gateway">Terraform AWS Provider - NAT Gateway</a></li></ul><hr><p><em>このドキュメントはAWS公式ドキュメントおよびTerraform Providerの調査に基づいて作成されており、最新の情報については公式ドキュメントを参照してください。TerraformサポートのタイムラインについてはHashiCorpのロードマップをご確認ください。</em></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;Claude Code + AWS Document MCP で調査した内容をまとめます。&lt;/p&gt;
&lt;h2 id=&quot;概要&quot;&gt;&lt;a href=&quot;#概要&quot; class=&quot;headerlink&quot; title=&quot;概要&quot;&gt;&lt;/a&gt;概要&lt;/h2&gt;&lt;p&gt;AWS NAT Gatewayには従来の&lt;strong&gt;ゾーナル（Zonal）&lt;/strong&gt;モードに加えて、新しく&lt;a href=&quot;https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/nat-gateways-regional.html&quot;&gt;&lt;strong&gt;リージョナル（Regional）&lt;/strong&gt;モード&lt;/a&gt;が提供されました。&lt;br/&gt;&lt;br&gt;本記事では、AWS公式ドキュメントに基づいて両者の特徴、コスト比較、およびIPアドレス管理についてまとめます。&lt;/p&gt;</summary>
    
    
    
    <category term="AWS" scheme="https://kenzo0107.github.io/categories/AWS/"/>
    
    
  </entry>
  
  <entry>
    <title>Claude Code + AWS 関連MCP で調査を円滑にする</title>
    <link href="https://kenzo0107.github.io/2025/11/16/2025-11-17-claude-code-aws-mcp/"/>
    <id>https://kenzo0107.github.io/2025/11/16/2025-11-17-claude-code-aws-mcp/</id>
    <published>2025-11-16T15:00:00.000Z</published>
    <updated>2025-11-16T15:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>Claude Code + MCP で自然言語で調査指示できる様になった話です。</p><span id="more"></span><h2><span id="事前準備">事前準備</span></h2><ul><li>uv 導入</li></ul><figure class="highlight console"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -LsSf https://astral.sh/uv/install.sh | sh</span><br></pre></td></tr></table></figure><ul><li>awsume で MFA 付き profile 作成<ul><li>複数の profile も <code>--output-profile claude</code> にすることで一時的なprofile名を claude に統合できる⭐️</li></ul></li></ul><figure class="highlight console"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">awsume dummy --output-profile claude</span><br></pre></td></tr></table></figure><h2><span id="claude-code-aws-mcp-で接続先-aws-アカウント-id-確認">Claude Code + AWS MCP で接続先 AWS アカウント ID 確認</span></h2><figure class="highlight console"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">claude mcp add -s user aws-mcp \</span><br><span class="line">  -e AWS_PROFILE=&quot;claude&quot; \</span><br><span class="line">  -e AWS_REGION=&quot;ap-northeast-1&quot; \</span><br><span class="line">  -e FASTMCP_LOG_LEVEL=&quot;ERROR&quot; \</span><br><span class="line">  -- uvx mcp-proxy-for-aws@latest https://aws-mcp.us-east-1.api.aws/mcp</span><br></pre></td></tr></table></figure><details><summary>例: AWS アカウント ID を教えて</summary><figure class="highlight console"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">⏺ AWS CLI機能を使用してAWSアカウントIDを取得します。</span><br><span class="line"></span><br><span class="line">⏺ aws-mcp - aws___call_aws (MCP)(cli_command: &quot;aws sts get-caller-identity&quot;)</span><br><span class="line">  ⎿  &#123;</span><br><span class="line">       &quot;response&quot;: &#123;</span><br><span class="line">         &quot;status_code&quot;: 200,</span><br><span class="line">     … +14 lines (ctrl+o to expand)</span><br><span class="line"></span><br><span class="line">⏺ AWSアカウント情報を取得しました：</span><br><span class="line"></span><br><span class="line">  AWSアカウントID: 123456789012</span><br><span class="line"></span><br><span class="line">  詳細情報:</span><br><span class="line">  - ユーザーID: ABCDEFGHIJKLMNOPQRSTU:kenzo.tanaka</span><br><span class="line">  - ARN: arn:aws:sts::123456789012:assumed-role/admin/kenzo.tanaka</span><br><span class="line">  - ロール: admin</span><br><span class="line"></span><br><span class="line">  現在は管理者権限のロールでAWSアカウント 123456789012 にアクセスしています。</span><br></pre></td></tr></table></figure></details><h2><span id="claude-code-cloudwatch-logs-mcp-でログ調査">Claude Code + CloudWatch Logs MCP　でログ調査</span></h2><p>2025年10月13日は非推奨となりました。<br><a href="https://pypi.org/project/awslabs.cloudwatch-logs-mcp-server/">https://pypi.org/project/awslabs.cloudwatch-logs-mcp-server/</a></p><p><a href="https://github.com/awslabs/mcp/tree/main/src/cloudwatch-mcp-server">awslabs.cloudwatch-mcp-server</a> への切り替えが推奨されております。</p><figure class="highlight console"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">claude mcp add -s user aws-cwlogs \</span><br><span class="line">  -e AWS_PROFILE=&quot;claude&quot; \</span><br><span class="line">  -e AWS_REGION=&quot;ap-northeast-1&quot; \</span><br><span class="line">  -e FASTMCP_LOG_LEVEL=&quot;ERROR&quot; \</span><br><span class="line">  -- uvx awslabs.cloudwatch-logs-mcp-server@latest</span><br></pre></td></tr></table></figure><details><summary>例: ロググループの一覧を出して</summary><figure class="highlight console"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">claude</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">&gt; </span><span class="language-bash">ロググループの一覧を出して</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">&gt; </span><span class="language-bash">⏺ AWSのCloudWatchロググループの一覧を取得しますね。</span></span><br><span class="line"></span><br><span class="line">⏺ Bash(aws logs describe-log-groups --query &#x27;logGroups[*].[logGroupName,creationTime,storedBytes]&#x27; --outpu</span><br><span class="line">t table)</span><br><span class="line">  ⎿  -----------------------------------------------------------------------------------------</span><br><span class="line">     |                                   DescribeLogGroups                                   |</span><br><span class="line">     +---------------------------------------------------------+----------------+------------+</span><br><span class="line">     … +28 lines (ctrl+o to expand)</span><br><span class="line"></span><br><span class="line">⏺ CloudWatchロググループの一覧を取得しました。以下の情報が表示されています：</span><br><span class="line"></span><br><span class="line">  ロググループ概要</span><br><span class="line"></span><br><span class="line">  | ロググループ名                                                | 作成時刻          | 保存容量(bytes) |</span><br><span class="line">  |--------------------------------------------------------|---------------|-------------|</span><br><span class="line">  | /aws/codebuild/dummy-build-ecrm                    | 1762390572331 | 4,150       |</span><br><span class="line">  | /aws/ecs/autoscaling/dummy-app                     | 1762996301329 | 0           |</span><br><span class="line">  | /aws/ecs/containerinsights/dummy-main/performance | 1756366249199 | 0           |</span><br><span class="line">  | /aws/rds/cluster/dummy-cluster/postgresql         | 1756195223282 | 10,705,811  |</span><br><span class="line">  | RDSOSMetrics                                           | 1756195285485 | 53,837,909  |</span><br><span class="line"></span><br><span class="line">  その他、CodeBuildやECSのアプリケーション固有のロググループも複数存在しています。</span><br><span class="line"></span><br><span class="line">  最も容量が大きいのはRDSOSMetrics（約51MB）で、次に/aws/rds/cluster/dummy-cluster/postgresql（約10MB</span><br><span class="line">）となっています。</span><br></pre></td></tr></table></figure></details><h2><span id="claude-code-cost-explorer-mcp-でコスト調査">Claude Code + Cost Explorer MCP　でコスト調査</span></h2><figure class="highlight console"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">claude mcp add -s user aws-ce \</span><br><span class="line">  -e AWS_PROFILE=&quot;claude&quot; \</span><br><span class="line">  -e AWS_REGION=&quot;ap-northeast-1&quot; \</span><br><span class="line">  -e FASTMCP_LOG_LEVEL=&quot;ERROR&quot; \</span><br><span class="line">  -- uvx awslabs.cost-explorer-mcp-server@latest</span><br></pre></td></tr></table></figure><details><summary>例: aws-ce MCPを使って AWSアカウント 123456789012 の先月の料金は？</summary><figure class="highlight console"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line">claude</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">&gt; </span><span class="language-bash">aws-ce MCPを使って AWSアカウント 123456789012 の先月の料金は？</span></span><br><span class="line"></span><br><span class="line">⏺ AWS アカウント 123456789012 - 2025年10月の料金</span><br><span class="line"></span><br><span class="line">  合計料金: $246.06</span><br><span class="line"></span><br><span class="line">  サービス別内訳（上位項目）</span><br><span class="line"></span><br><span class="line">  | サービス                               | 料金（USD） |</span><br><span class="line">  |------------------------------------|---------|</span><br><span class="line">  | Amazon Relational Database Service |  $87.08 |</span><br><span class="line">  | EC2 - Other                        |  $50.54 |</span><br><span class="line">  | Tax（税金）                            |  $22.36 |</span><br><span class="line">  | Amazon Elastic Load Balancing      |  $18.08 |</span><br><span class="line">  | Amazon Inspector                   |  $16.64 |</span><br><span class="line">  | Amazon CloudWatch                  |  $12.65 |</span><br><span class="line">  | AWS WAF                            |   $9.00 |</span><br><span class="line">  | AWS Key Management Service         |   $8.00 |</span><br><span class="line">  | CodeBuild                          |   $4.06 |</span><br><span class="line">  | Amazon Virtual Private Cloud       |   $3.72 |</span><br><span class="line">  | Amazon Elastic Container Service   |   $3.60 |</span><br><span class="line">  | Amazon GuardDuty                   |   $3.19 |</span><br><span class="line">  | AWS CodePipeline                   |   $2.23 |</span><br><span class="line"></span><br><span class="line">  主要コスト要因</span><br><span class="line"></span><br><span class="line">  1. RDS（$87.08） - 最大のコスト要因</span><br><span class="line">  2. EC2 - Other（$50.54） - EC2関連の追加コスト</span><br><span class="line">  3. ELB（$18.08） - ロードバランサー</span><br><span class="line">  4. セキュリティサービス - Inspector（$16.64）、GuardDuty（$3.19）、Security Hub（$1.28）</span><br><span class="line"></span><br><span class="line">  税金を除いた実際のAWSサービス利用料金は $223.70 でした。</span><br></pre></td></tr></table></figure></details><h2><span id="claude-code-aws-pricing-mcp-で料金確認">Claude Code + AWS Pricing MCP　で料金確認</span></h2><figure class="highlight console"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">claude mcp add -s user aws-price \</span><br><span class="line">  -e AWS_REGION=&quot;ap-northeast-1&quot; \</span><br><span class="line">  -e FASTMCP_LOG_LEVEL=&quot;ERROR&quot; \</span><br><span class="line">  -- uvx awslabs.aws-pricing-mcp-server@latest</span><br></pre></td></tr></table></figure><details><summary>例: aws-price MCP を利用し Aurora Serverless v2 と db.t4g.medium 2台で 1年全額前払いのリザーブドインスタンスだとどちらが安いか損益分岐点を求めてください。</summary><figure class="highlight console"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br></pre></td><td class="code"><pre><span class="line">claude</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">&gt; </span><span class="language-bash">aws-price MCP を利用し Aurora Serverless v2 と db.t4g.medium 2台で 1年全額前払いのリザーブドインスタンスだとどちらが安いか損益分岐点を求めてください。</span></span><br><span class="line"></span><br><span class="line">  前提条件・料金設定</span><br><span class="line"></span><br><span class="line">  Aurora Serverless v2（東京リージョン）</span><br><span class="line"></span><br><span class="line">  - ACU料金: $0.15/時間（2024年11月値下げ後）</span><br><span class="line">  - 最小容量: 0.5 ACU</span><br><span class="line">  - スケール範囲: 0.5〜128 ACU</span><br><span class="line">  - ストレージ: $0.10/GB月（別途課金）</span><br><span class="line"></span><br><span class="line">  Aurora PostgreSQL Reserved Instance - db.t4g.medium（東京リージョン）</span><br><span class="line"></span><br><span class="line">  - スペック: 2 vCPU、4GB RAM</span><br><span class="line">  - On-Demand料金: 約$0.09/時間（東京リージョン推定）</span><br><span class="line">  - Reserved Instance（1年、No Upfront）: 約$0.063/時間（30%割引）</span><br><span class="line">  - Reserved Instance（3年、All Upfront）: 約$0.031/時間（65%割引）</span><br><span class="line">  - 2インスタンス: Writer 1台 + Reader 1台</span><br><span class="line"></span><br><span class="line">  月額コスト比較</span><br><span class="line"></span><br><span class="line">  Aurora Serverless v2 使用量別コスト</span><br><span class="line"></span><br><span class="line">  | 平均ACU   | 月額コスト | 想定リソース使用量      |</span><br><span class="line">  |---------|-------|----------------|</span><br><span class="line">  | 0.5 ACU | $54   | 軽負荷（1GB RAM相当） |</span><br><span class="line">  | 1.0 ACU | $108  | 中負荷（2GB RAM相当） |</span><br><span class="line">  | 1.5 ACU | $162  | 高負荷（3GB RAM相当） |</span><br><span class="line">  | 2.0 ACU | $216  | 高負荷（4GB RAM相当） |</span><br><span class="line">  | 3.0 ACU | $324  | 負荷集中時          |</span><br><span class="line"></span><br><span class="line">  Aurora PostgreSQL Reserved Instance（2台）コスト</span><br><span class="line"></span><br><span class="line">  | 契約タイプ          | 月額コスト | 備考                        |</span><br><span class="line">  |----------------|-------|---------------------------|</span><br><span class="line">  | 1年 No Upfront  | $90.7 | ($0.063 × 2台 × 24h × 30日) |</span><br><span class="line">  | 3年 All Upfront | $44.6 | ($0.031 × 2台 × 24h × 30日) |</span><br><span class="line"></span><br><span class="line">  損益分岐点分析</span><br><span class="line"></span><br><span class="line">  1年契約 Reserved Instance（$90.7/月）との比較</span><br><span class="line"></span><br><span class="line">  損益分岐点: 0.84 ACU/月平均</span><br><span class="line">  - Aurora Serverless v2が有利：平均0.84 ACU未満</span><br><span class="line">  - Reserved Instanceが有利：平均0.84 ACU以上</span><br><span class="line"></span><br><span class="line">  3年契約 Reserved Instance（$44.6/月）との比較</span><br><span class="line"></span><br><span class="line">  損益分岐点: 0.41 ACU/月平均</span><br><span class="line">  - Aurora Serverless v2が有利：平均0.41 ACU未満</span><br><span class="line">  - Reserved Instanceが有利：平均0.41 ACU以上</span><br><span class="line"></span><br><span class="line">  使用パターン別シナリオ</span><br><span class="line"></span><br><span class="line">⏺ シナリオ1: 開発・テスト環境</span><br><span class="line"></span><br><span class="line">  使用パターン: 平日9-18時のみ稼働（40%稼働率）</span><br><span class="line">  - Serverless v2: 0.5 ACU × 0.4 = 平均0.2 ACU → $21.6/月</span><br><span class="line">  - 1年RI: $90.7/月（常時課金）</span><br><span class="line">  - 結果: Serverless v2が約70%安い</span><br><span class="line"></span><br><span class="line">  シナリオ2: 変動負荷本番環境</span><br><span class="line"></span><br><span class="line">  使用パターン: 夜間0.5 ACU、日中1.5 ACU（平均0.8 ACU）</span><br><span class="line">  - Serverless v2: 平均0.8 ACU → $86.4/月</span><br><span class="line">  - 1年RI: $90.7/月</span><br><span class="line">  - 結果: Serverless v2がわずかに安い</span><br><span class="line"></span><br><span class="line">  シナリオ3: 安定負荷本番環境</span><br><span class="line"></span><br><span class="line">  使用パターン: 常時1.2 ACU程度の負荷</span><br><span class="line">  - Serverless v2: 1.2 ACU → $129.6/月</span><br><span class="line">  - 1年RI: $90.7/月</span><br><span class="line">  - 結果: Reserved Instanceが30%安い</span><br><span class="line"></span><br><span class="line">  シナリオ4: 高負荷本番環境</span><br><span class="line"></span><br><span class="line">  使用パターン: 常時2.0 ACU程度の負荷</span><br><span class="line">  - Serverless v2: 2.0 ACU → $216/月</span><br><span class="line">  - 3年RI: $44.6/月</span><br><span class="line">  - 結果: Reserved Instanceが79%安い</span><br><span class="line"></span><br><span class="line">  リソース使用量の目安</span><br><span class="line"></span><br><span class="line">  db.t4g.medium（4GB RAM）との等価性</span><br><span class="line"></span><br><span class="line">  - 1 ACU ≈ 2GB RAM → db.t4g.medium ≈ 2 ACU</span><br><span class="line">  - db.t4g.mediumと同等の処理能力には約2 ACUが必要</span><br><span class="line"></span><br><span class="line">  実際のワークロード対応</span><br><span class="line"></span><br><span class="line">  - 軽負荷: 0.5-1.0 ACU（開発環境、小規模アプリ）</span><br><span class="line">  - 中負荷: 1.0-2.0 ACU（通常のWebアプリケーション）</span><br><span class="line">  - 高負荷: 2.0+ ACU（大規模アプリケーション、分析処理）</span><br><span class="line"></span><br><span class="line">  追加コスト要素</span><br><span class="line"></span><br><span class="line">  Serverless v2の注意点</span><br><span class="line"></span><br><span class="line">  - CPU Credits: T4gインスタンスのCPU Credits（$0.09/vCPU時間）はない</span><br><span class="line">  - I/O Cost: 含まれる（Aurora Standardの場合）</span><br><span class="line">  - スケール遅延: 負荷変動時の数十秒のスケール時間</span><br><span class="line"></span><br><span class="line">  Reserved Instanceの注意点</span><br><span class="line"></span><br><span class="line">  - CPU Credits: $0.09/vCPU時間の追加料金（バースト時）</span><br><span class="line">  - 固定コスト: 使用量に関係なく固定課金</span><br><span class="line">  - 柔軟性: サイズ変更はInstance Family内で可能</span><br><span class="line"></span><br><span class="line">  推奨判断基準</span><br><span class="line"></span><br><span class="line">⏺ Aurora Serverless v2を選ぶべき場合</span><br><span class="line"></span><br><span class="line">  1. 開発・テスト環境（非稼働時間が多い）</span><br><span class="line">  2. 変動負荷（平均0.8 ACU未満）</span><br><span class="line">  3. 予測困難な負荷パターン</span><br><span class="line">  4. 運用開始初期（負荷が見えない段階）</span><br><span class="line">  5. 短期プロジェクト（1年未満）</span><br><span class="line"></span><br><span class="line">  Aurora PostgreSQL Reserved Instanceを選ぶべき場合</span><br><span class="line"></span><br><span class="line">  1. 安定した本番環境（平均1.0 ACU以上）</span><br><span class="line">  2. 予測可能な負荷</span><br><span class="line">  3. 長期運用確定（1年以上）</span><br><span class="line">  4. コスト最適化重視</span><br><span class="line">  5. CPU集約的ワークロード</span><br><span class="line"></span><br><span class="line">  まとめ</span><br><span class="line"></span><br><span class="line">  損益分岐点</span><br><span class="line"></span><br><span class="line">  - 1年RI: 平均0.84 ACU（約1.7GB RAM使用量）</span><br><span class="line">  - 3年RI: 平均0.41 ACU（約0.8GB RAM使用量）</span><br><span class="line"></span><br><span class="line">  実用的な選択指針</span><br><span class="line"></span><br><span class="line">  1. 月間平均メモリ使用量 &lt; 1.5GB → Serverless v2</span><br><span class="line">  2. 月間平均メモリ使用量 &gt; 3GB → Reserved Instance</span><br><span class="line">  3. 1.5-3GBの範囲 → 負荷変動パターンで判断</span><br><span class="line"></span><br><span class="line">  重要な考慮事項</span><br><span class="line"></span><br><span class="line">  - Reserved Instanceは3年契約で最大79%の節約</span><br><span class="line">  - Serverless v2は運用柔軟性で優位</span><br><span class="line">  - 実際のワークロード測定が最も重要な判断材料</span><br><span class="line"></span><br><span class="line">  2024年11月の値下げにより、Aurora Serverless v2の競争力が大幅に向上し、中負荷環境でもReserved</span><br><span class="line">  Instanceと遜色ないコストパフォーマンスを実現しています。</span><br></pre></td></tr></table></figure></details><h2><span id="claude-code-aws-documentation-mcp-でドキュメント参照">Claude Code + AWS Documentation MCP　でドキュメント参照</span></h2><figure class="highlight console"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">claude mcp add -s user aws-docs \</span><br><span class="line">  -e AWS_REGION=&quot;ap-northeast-1&quot; \</span><br><span class="line">  -e FASTMCP_LOG_LEVEL=&quot;ERROR&quot; \</span><br><span class="line">  -- uvx awslabs.aws-documentation-mcp-server@latest</span><br></pre></td></tr></table></figure><details><summary>例: aws-docs MCP を使って CloudFront 署名付きURLで S3 Object を参照させる際のCloudFront の設定を教えて</summary><figure class="highlight console"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br></pre></td><td class="code"><pre><span class="line">claude</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">&gt; </span><span class="language-bash">aws-docs MCP を使って CloudFront 署名付きURLで S3 Object を参照させる際の</span></span><br><span class="line">CloudFront の設定を教えて</span><br><span class="line"></span><br><span class="line">⏺ CloudFrontで署名付きURLを使ってS3オブジェクトを参照させる設定について、AWS</span><br><span class="line">  公式ドキュメントを基にまとめます。</span><br><span class="line"></span><br><span class="line">  CloudFront 署名付きURL + S3 オリジンの設定</span><br><span class="line"></span><br><span class="line">  1. Origin Access Control (OAC) の設定</span><br><span class="line"></span><br><span class="line">  S3バケットポリシーの設定</span><br><span class="line">  &#123;</span><br><span class="line">    &quot;Version&quot;: &quot;2012-10-17&quot;,</span><br><span class="line">    &quot;Statement&quot;: [</span><br><span class="line">      &#123;</span><br><span class="line">        &quot;Sid&quot;: &quot;AllowCloudFrontServicePrincipalReadOnly&quot;,</span><br><span class="line">        &quot;Effect&quot;: &quot;Allow&quot;,</span><br><span class="line">        &quot;Principal&quot;: &#123;</span><br><span class="line">          &quot;Service&quot;: &quot;cloudfront.amazonaws.com&quot;</span><br><span class="line">        &#125;,</span><br><span class="line">        &quot;Action&quot;: &quot;s3:GetObject&quot;,</span><br><span class="line">        &quot;Resource&quot;: &quot;arn:aws:s3:::your-bucket-name/*&quot;,</span><br><span class="line">        &quot;Condition&quot;: &#123;</span><br><span class="line">          &quot;StringEquals&quot;: &#123;</span><br><span class="line">            &quot;AWS:SourceArn&quot;:</span><br><span class="line">  &quot;arn:aws:cloudfront::YOUR-ACCOUNT-ID:distribution/DISTRIBUTION-ID&quot;</span><br><span class="line">          &#125;</span><br><span class="line">        &#125;</span><br><span class="line">      &#125;</span><br><span class="line">    ]</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  2. Trusted Key Groups の設定</span><br><span class="line"></span><br><span class="line">  公開鍵/秘密鍵ペアの作成</span><br><span class="line">  - RSA 2048またはECDSA 256キーをサポート</span><br><span class="line">  - CloudFrontコンソールまたはAPIでキーグループを作成</span><br><span class="line">  - 公開鍵をキーグループに追加</span><br><span class="line"></span><br><span class="line">  3. CloudFront Distribution の設定</span><br><span class="line"></span><br><span class="line">  Cache Behavior の設定</span><br><span class="line">  - 署名が必要なパスパターンを設定</span><br><span class="line">  - Trusted Key Groupを指定</span><br><span class="line">  - Origin Access Controlを有効化</span><br><span class="line"></span><br><span class="line">  重要な設定項目</span><br><span class="line">  - Origin Access Control: &quot;Sign requests (recommended)&quot; を選択</span><br><span class="line">  - Viewer Protocol Policy: HTTPSの使用を推奨</span><br><span class="line">  - Trusted Key Groups: 署名に使用するキーグループを指定</span><br><span class="line"></span><br><span class="line">  4. 署名付きURLの生成</span><br><span class="line"></span><br><span class="line">  Canned Policy と Custom Policy の選択</span><br><span class="line"></span><br><span class="line">  | 機能          | Canned Policy | Custom Policy |</span><br><span class="line">  |-------------|---------------|---------------|</span><br><span class="line">  | 複数ファイルでの再利用 | ✗             | ✓             |</span><br><span class="line">  | アクセス開始時刻の指定 | ✗             | ✓             |</span><br><span class="line">  | IPアドレス制限    | ✗             | ✓             |</span><br><span class="line">  | URL長        | 短い            | 長い（ポリシー含有）    |</span><br><span class="line"></span><br><span class="line">  URLフォーマット例</span><br><span class="line">  https://d1234567890.cloudfront.net/private-content.jpg?Policy=eyJ...&amp;Signa</span><br><span class="line">  ture=abc...&amp;Key-Pair-Id=K1234567890</span><br><span class="line"></span><br><span class="line">  5. セキュリティ考慮事項</span><br><span class="line"></span><br><span class="line">  必須設定</span><br><span class="line">  - S3バケットへの直接アクセスを制限</span><br><span class="line">  - Origin Access Control (OAC) の使用（OAIより推奨）</span><br><span class="line">  - HTTPS通信の強制</span><br><span class="line">  - 適切な有効期限の設定</span><br><span class="line"></span><br><span class="line">  SSE-KMS使用時の追加設定</span><br><span class="line">  KMSキーポリシーにCloudFrontアクセス許可を追加：</span><br><span class="line">  &#123;</span><br><span class="line">    &quot;Sid&quot;: &quot;AllowCloudFrontServicePrincipalSSE-KMS&quot;,</span><br><span class="line">    &quot;Effect&quot;: &quot;Allow&quot;,</span><br><span class="line">    &quot;Principal&quot;: &#123;</span><br><span class="line">      &quot;Service&quot;: [&quot;cloudfront.amazonaws.com&quot;]</span><br><span class="line">    &#125;,</span><br><span class="line">    &quot;Action&quot;: [</span><br><span class="line">      &quot;kms:Decrypt&quot;,</span><br><span class="line">      &quot;kms:Encrypt&quot;,</span><br><span class="line">      &quot;kms:GenerateDataKey*&quot;</span><br><span class="line">    ],</span><br><span class="line">    &quot;Resource&quot;: &quot;*&quot;,</span><br><span class="line">    &quot;Condition&quot;: &#123;</span><br><span class="line">      &quot;StringEquals&quot;: &#123;</span><br><span class="line">        &quot;AWS:SourceArn&quot;:</span><br><span class="line">  &quot;arn:aws:cloudfront::YOUR-ACCOUNT-ID:distribution/DISTRIBUTION-ID&quot;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  6. 実装フロー</span><br><span class="line"></span><br><span class="line">  1. ユーザー認証: アプリケーションでユーザーの権限を確認</span><br><span class="line">  2. 署名付きURL生成: 秘密鍵を使用してURLに署名</span><br><span class="line">  3. URLの提供: 認証済みユーザーに署名付きURLを返却</span><br><span class="line">  4. コンテンツアクセス:q</span><br><span class="line">  CloudFrontが署名を検証し、有効な場合のみS3からコンテンツを配信</span><br><span class="line"></span><br><span class="line">  この設定により、S3オブジェクトへの安全なアクセス制御が実現できます。</span><br></pre></td></tr></table></figure></details><h2><span id="claude-code-aws-terraform-mcp-で実装">Claude Code + AWS Terraform MCP で実装</span></h2><figure class="highlight console"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">claude mcp add -s user aws-terraform-provider \</span><br><span class="line">  -e AWS_REGION=&quot;ap-northeast-1&quot; \</span><br><span class="line">  -e FASTMCP_LOG_LEVEL=&quot;ERROR&quot; \</span><br><span class="line">  -- uvx awslabs.terraform-mcp-server@latest</span><br></pre></td></tr></table></figure><h2><span id="claude-code-aws-diagram-mcp-で簡易的な構成図を書かせる">Claude Code + AWS Diagram MCP で簡易的な構成図を書かせる</span></h2><figure class="highlight console"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">claude mcp add -s user aws-diagram \</span><br><span class="line">  -e AWS_REGION=&quot;ap-northeast-1&quot; \</span><br><span class="line">  -e FASTMCP_LOG_LEVEL=&quot;ERROR&quot; \</span><br><span class="line">  -- uvx awslabs.aws-diagram-mcp-server@latest</span><br></pre></td></tr></table></figure><details><summary>aws-diagram MCP を利用して NAT Gateway でリージョナルとゾーナルの構成図を簡易的に記載して</summary><h2><span id="nat-gatewayの基本アーキテクチャ">NAT Gatewayの基本アーキテクチャ</span></h2><h3><span id="ゾーナルnat-gateway従来型">ゾーナルNAT Gateway（従来型）</span></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐</span><br><span class="line">│   AZ-1a         │    │   AZ-1b         │    │   AZ-1c         │</span><br><span class="line">│ ┌─────────────┐ │    │ ┌─────────────┐ │    │ ┌─────────────┐ │</span><br><span class="line">│ │Public Subnet│ │    │ │Public Subnet│ │    │ │Public Subnet│ │</span><br><span class="line">│ │             │ │    │ │             │ │    │ │             │ │</span><br><span class="line">│ │ NAT Gateway │ │    │ │ NAT Gateway │ │    │ │ NAT Gateway │ │</span><br><span class="line">│ │   (1a)      │ │    │ │   (1b)      │ │    │ │   (1c)      │ │</span><br><span class="line">│ └─────────────┘ │    │ └─────────────┘ │    │ └─────────────┘ │</span><br><span class="line">│ ┌─────────────┐ │    │ ┌─────────────┐ │    │ ┌─────────────┐ │</span><br><span class="line">│ │Private Sub  │ │    │ │Private Sub  │ │    │ │Private Sub  │ │</span><br><span class="line">│ │             │ │    │ │             │ │    │ │             │ │</span><br><span class="line">│ │ Resources   │ │    │ │ Resources   │ │    │ │ Resources   │ │</span><br><span class="line">│ └─────────────┘ │    │ └─────────────┘ │    │ └─────────────┘ │</span><br><span class="line">└─────────────────┘    └─────────────────┘    └─────────────────┘</span><br></pre></td></tr></table></figure><h3><span id="リージョナルnat-gateway新型">リージョナルNAT Gateway（新型）</span></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">┌─────────────────────────────────────────────────────────────────┐</span><br><span class="line">│                        Regional NAT Gateway                     │</span><br><span class="line">│              ┌─────────────────────────────────────────┐        │</span><br><span class="line">│              │         Automatic Expansion             │        │</span><br><span class="line">│              │    ┌──────┐  ┌──────┐  ┌──────┐         │        │</span><br><span class="line">│              │    │ AZ-1a│  │ AZ-1b│  │ AZ-1c│         │        │</span><br><span class="line">│              │    │ NAT  │  │ NAT  │  │ NAT  │         │        │</span><br><span class="line">│              │    └──────┘  └──────┘  └──────┘         │        │</span><br><span class="line">│              └─────────────────────────────────────────┘        │</span><br><span class="line">└─────────────────────────────────────────────────────────────────┘</span><br><span class="line">┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐</span><br><span class="line">│   AZ-1a         │    │   AZ-1b         │    │   AZ-1c         │</span><br><span class="line">│ ┌─────────────┐ │    │ ┌─────────────┐ │    │ ┌─────────────┐ │</span><br><span class="line">│ │Private Sub  │ │    │ │Private Sub  │ │    │ │Private Sub  │ │</span><br><span class="line">│ │             │ │    │ │             │ │    │ │             │ │</span><br><span class="line">│ │ Resources   │ │    │ │ Resources   │ │    │ │ Resources   │ │</span><br><span class="line">│ └─────────────┘ │    │ └─────────────┘ │    │ └─────────────┘ │</span><br><span class="line">└─────────────────┘    └─────────────────┘    └─────────────────┘</span><br></pre></td></tr></table></figure></details><h2><span id="claude-code-aws-cloudwatch-aws-application-signals-mcp-で雑に直近のインシデントを知る">Claude Code + AWS CloudWatch + AWS Application Signals MCP で雑に直近のインシデントを知る</span></h2><figure class="highlight console"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">claude mcp add -s user aws-cw \</span><br><span class="line">  -e AWS_PROFILE=&quot;claude&quot; \</span><br><span class="line">  -e AWS_REGION=&quot;ap-northeast-1&quot; \</span><br><span class="line">  -e FASTMCP_LOG_LEVEL=&quot;ERROR&quot; \</span><br><span class="line">  -- uvx awslabs.cloudwatch-mcp-server@latest</span><br><span class="line"></span><br><span class="line">claude mcp add -s user aws-appsignals \</span><br><span class="line">  -e AWS_PROFILE=&quot;claude&quot; \</span><br><span class="line">  -e AWS_REGION=&quot;ap-northeast-1&quot; \</span><br><span class="line">  -e FASTMCP_LOG_LEVEL=&quot;ERROR&quot; \</span><br><span class="line">  -- uvx awslabs.cloudwatch-appsignals-mcp-server@latest</span><br></pre></td></tr></table></figure><details><summary>aws-appsignals MCP を利用し、直近のインシデントがあるか調べてください。</summary><figure class="highlight console"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line">AWS Application Signalsの調査により、以下の状況が確認されました：</span><br><span class="line"></span><br><span class="line">🚨 検出された問題</span><br><span class="line"></span><br><span class="line">dummy-backend サービスで高レイテンシを検出</span><br><span class="line"></span><br><span class="line">1. GET /health エンドポイント</span><br><span class="line">  - 現在のレイテンシ: 55.82ms（p99）</span><br><span class="line">  - 正常ベースライン: 1.58ms</span><br><span class="line">  - 重要度: HIGH</span><br><span class="line">  - 問題: 通常の35倍以上のレイテンシ</span><br><span class="line">2. InternalOperation</span><br><span class="line">  - 現在のレイテンシ: 843.38ms（p99）</span><br><span class="line">  - 正常ベースライン: 281.20ms</span><br><span class="line">  - 重要度: HIGH</span><br><span class="line">  - 問題: 通常の3倍のレイテンシ</span><br><span class="line"></span><br><span class="line">📊 監視状況</span><br><span class="line"></span><br><span class="line">- 監視対象サービス: 8つ</span><br><span class="line">- SLO設定: 現在未設定</span><br><span class="line">- 期間: 過去24時間</span><br><span class="line"></span><br><span class="line">💡 推奨アクション</span><br><span class="line"></span><br><span class="line">1. 即座の対応</span><br><span class="line">  - dummy-backendサービスのパフォーマンス調査</span><br><span class="line">  - ヘルスチェックエンドポイントの応答遅延原因特定</span><br><span class="line">2. 中期的対応</span><br><span class="line">  - SLOの設定を検討（現在未設定）</span><br><span class="line">  - アプリケーションログの詳細分析</span><br><span class="line"></span><br><span class="line">現在進行中のインシデントとして、ステージング環境のバックエンドサービスでレイテンシ問題が発生していることが確認されました。</span><br></pre></td></tr></table></figure></details><br><p>適宜追加していきます。</p><p>以上<br><br>参考になれば幸いです。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;Claude Code + MCP で自然言語で調査指示できる様になった話です。&lt;/p&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>AWS Glue Iceberg テーブル v3 スペックの最適化</title>
    <link href="https://kenzo0107.github.io/2025/10/27/2025-10-28-aws-glue-iceberg-v3-optimization/"/>
    <id>https://kenzo0107.github.io/2025/10/27/2025-10-28-aws-glue-iceberg-v3-optimization/</id>
    <published>2025-10-27T15:00:00.000Z</published>
    <updated>2025-10-27T15:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>AWS Glue Iceberg テーブルは 2025.10.28 時点で format-version=2 までサポートしていますが、format-version=3 はサポートしていません。</p><p>とはいえ、Iceberg format-version=3 としてデータを保存し利用はできます。</p><p>Athena でクエリ実行できない等の問題こそありますが、format-version=3 として利用はでき、<a href="https://iceberg.apache.org/spec/?h=3+version+table+spe#version-3-extended-types-and-capabilities">テーブル v3 スペックの恩恵</a> を受けることができます。</p><p>AWS Glue テーブルを Iceberg v3 format で管理し、 Databricks 等の SaaS でデータを参照するような運用をしている場合には大きなパフォーマンスの向上が見込めます。</p><p>ですが、 AWS Glue テーブルの最適化機能は format-version=3 の場合、エラーとなります。</p><p>その為、Glue Job で Spark SQL 等でテーブル最適化を実施する必要があります。</p><p>以下実施例です。</p><span id="more"></span><h2><span id="glue-job-python-スクリプト例">Glue Job Python スクリプト例</span></h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pyspark.context <span class="keyword">import</span> SparkContext</span><br><span class="line"><span class="keyword">from</span> awsglue.context <span class="keyword">import</span> GlueContext</span><br><span class="line"><span class="keyword">from</span> datetime <span class="keyword">import</span> datetime</span><br><span class="line"></span><br><span class="line">sc = SparkContext()</span><br><span class="line">glueContext = GlueContext(sc)</span><br><span class="line">spark = glueContext.spark_session</span><br><span class="line"></span><br><span class="line">database = <span class="string">&#x27;example&#x27;</span></span><br><span class="line">table = <span class="string">&#x27;dummy&#x27;</span></span><br><span class="line"></span><br><span class="line">table_full = <span class="string">f&#x27;glue_catalog.`<span class="subst">&#123;database&#125;</span>`.`<span class="subst">&#123;table&#125;</span>`&#x27;</span></span><br><span class="line"></span><br><span class="line">target_file_size_bytes = <span class="number">268435456</span> <span class="comment"># 256MB</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Rewrite Data Files（コンパクション）</span></span><br><span class="line">spark.sql(<span class="string">f&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    CALL glue_catalog.system.rewrite_data_files(</span></span><br><span class="line"><span class="string">        table =&gt; &#x27;<span class="subst">&#123;table_full&#125;</span>&#x27;,</span></span><br><span class="line"><span class="string">        options =&gt; map(&#x27;target-file-size-bytes&#x27;,&#x27;<span class="subst">&#123;target_file_size_bytes&#125;</span>&#x27;)</span></span><br><span class="line"><span class="string">    )</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># expire_snapshots（古いスナップショットを削除、最後の3つは保持）</span></span><br><span class="line">older_than = datetime.now().isoformat()</span><br><span class="line">spark.sql(<span class="string">f&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    CALL glue_catalog.system.expire_snapshots(</span></span><br><span class="line"><span class="string">        table =&gt; &#x27;<span class="subst">&#123;table_full&#125;</span>&#x27;,</span></span><br><span class="line"><span class="string">        older_than =&gt; timestamp&#x27;<span class="subst">&#123;older_than&#125;</span>&#x27;,</span></span><br><span class="line"><span class="string">        retain_last =&gt; <span class="subst">&#123;snapshot_retain&#125;</span></span></span><br><span class="line"><span class="string">    )</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># remove_orphan_files（不要ファイル削除）</span></span><br><span class="line">spark.sql(<span class="string">f&quot;CALL glue_catalog.system.remove_orphan_files(table =&gt; &#x27;<span class="subst">&#123;table_full&#125;</span>&#x27;)&quot;</span>)</span><br></pre></td></tr></table></figure><p>Glue マネージメント最適化機能と同等の以下を Glue Job Python スクリプトで実施しています。</p><ul><li>Compaction</li><li>Snapshot retention</li><li>Orphan file deletion</li></ul><h2><span id="glue-job-設定">Glue Job 設定</span></h2><p>Iceberg テーブル v3 スペックを利用するには iceberg-spark の 1.10.0 以上のバージョンである必要があります。</p><ol><li><a href="https://repo1.maven.org/maven2/org/apache/iceberg/iceberg-spark-3.5_2.12/1.10.0/iceberg-spark-3.5_2.12-1.10.0.jar">iceberg-spark-runtime-3.5_2.12-1.10.0.jar</a> を S3 にアップロードします。</li><li>Job parameters に <code>--extra-jars</code> でアップロードされたファイルの S3 URI を指定</li><li>Job parameters の Spark Conf の設定に <code>--conf spark.jars.packages=org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.10.0</code> を追加<ul><li>Spark Conf の設定をスクリプト中に記載している場合はそちらに追加してください。</li></ul></li><li>Job parameters <code>--user-jars-first</code> を <code>true</code> を追加</li></ol><p>参考: <a href="https://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/apache-iceberg-on-aws/iceberg-glue.html#glue-custom-integration">カスタム Iceberg バージョンの使用</a></p><p>以上で Glue Job で Iceberg テーブル v3 スペックが利用できます。</p><h2><span id="最適化されているかの確認">最適化されているかの確認</span></h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Rewrite Data Files（コンパクション）</span></span><br><span class="line">df_rewrite_data_files = spark.sql(<span class="string">f&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    CALL glue_catalog.system.rewrite_data_files(</span></span><br><span class="line"><span class="string">        table =&gt; &#x27;<span class="subst">&#123;table_full&#125;</span>&#x27;,</span></span><br><span class="line"><span class="string">        options =&gt; map(&#x27;target-file-size-bytes&#x27;,&#x27;<span class="subst">&#123;target_file_size_bytes&#125;</span>&#x27;)</span></span><br><span class="line"><span class="string">    )</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span>)</span><br><span class="line">df_rewrite_data_files.show(truncate=<span class="literal">False</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># expire_snapshots（古いスナップショットを削除、最後の3つは保持）</span></span><br><span class="line">older_than = datetime.now().isoformat()</span><br><span class="line">df_expire_snapshots = spark.sql(<span class="string">f&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    CALL glue_catalog.system.expire_snapshots(</span></span><br><span class="line"><span class="string">        table =&gt; &#x27;<span class="subst">&#123;table_full&#125;</span>&#x27;,</span></span><br><span class="line"><span class="string">        older_than =&gt; timestamp&#x27;<span class="subst">&#123;older_than&#125;</span>&#x27;,</span></span><br><span class="line"><span class="string">        retain_last =&gt; <span class="subst">&#123;snapshot_retain&#125;</span></span></span><br><span class="line"><span class="string">    )</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span>)</span><br><span class="line">df_expire_snapshots.show(truncate=<span class="literal">False</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># remove_orphan_files（不要ファイル削除）</span></span><br><span class="line">df_remove_orphan_files = spark.sql(<span class="string">f&quot;CALL glue_catalog.system.remove_orphan_files(table =&gt; &#x27;<span class="subst">&#123;table_full&#125;</span>&#x27;)&quot;</span>)</span><br><span class="line">df_remove_orphan_files.show(truncate=<span class="literal">False</span>)</span><br></pre></td></tr></table></figure><p>各最適化実行 Spark SQL の戻り値が DataFrame なので、その中身を表示することでどのファイルが削除されたかなどがわかります。</p><h3><span id="metadata-が保存されている-s3-object-から確認してみる">metadata が保存されている S3 Object から確認してみる</span></h3><p>S3 に保存されているテーブルのメタデータ (<code>&lt;table&gt;/metadata/*.metadata.json</code>) から確認できます。</p><p>Iceberg は内部で metadata ディレクトリに JSON ファイルを置きます。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">metadata/</span><br><span class="line">  00000-...-metadata.json</span><br><span class="line">  00001-...-metadata.json</span><br><span class="line">  00002-...-metadata.json</span><br></pre></td></tr></table></figure><ul><li>Iceberg はテーブル操作（INSERT, DELETE, COMPACT など）毎に新しい metadata.json を作成する</li><li>番号が大きいほど最新</li></ul><p>この metadata.json がテーブルのその時々の情報を記載しているのでそちらを参考にすることで最適化されているかがわかります。</p><h3><span id="compaction-コンパクション-が実施されているかの確認">Compaction　（コンパクション） が実施されているかの確認</span></h3><p>以下に metadata.json の例を記載しています。</p><details><summary>metadata.json</summary><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line">  &quot;snapshots&quot;: [</span><br><span class="line">    &#123;</span><br><span class="line">      &quot;sequence-number&quot;: 10,</span><br><span class="line">      &quot;snapshot-id&quot;: 3823535076387391090,</span><br><span class="line">      &quot;timestamp-ms&quot;: 1761614061870,</span><br><span class="line">      &quot;summary&quot;: &#123;</span><br><span class="line">        &quot;operation&quot;: &quot;append&quot;,</span><br><span class="line">        &quot;spark.app.id&quot;: &quot;spark-application-1761613983390&quot;,</span><br><span class="line">        &quot;added-data-files&quot;: &quot;20&quot;,</span><br><span class="line">        &quot;added-records&quot;: &quot;208126&quot;,</span><br><span class="line">        &quot;added-files-size&quot;: &quot;29693801&quot;,</span><br><span class="line">        &quot;changed-partition-count&quot;: &quot;1&quot;,</span><br><span class="line">        &quot;total-records&quot;: &quot;208126&quot;,</span><br><span class="line">        &quot;total-files-size&quot;: &quot;29693801&quot;,</span><br><span class="line">        &quot;total-data-files&quot;: &quot;20&quot;,</span><br><span class="line">        &quot;total-delete-files&quot;: &quot;0&quot;,</span><br><span class="line">        &quot;total-position-deletes&quot;: &quot;0&quot;,</span><br><span class="line">        &quot;total-equality-deletes&quot;: &quot;0&quot;,</span><br><span class="line">        &quot;engine-version&quot;: &quot;3.5.4-amzn-0&quot;,</span><br><span class="line">        &quot;app-id&quot;: &quot;spark-application-1761613983390&quot;,</span><br><span class="line">        &quot;engine-name&quot;: &quot;spark&quot;,</span><br><span class="line">        &quot;iceberg-version&quot;: &quot;Apache Iceberg 1.10.0 (commit 2114bf631e49af532d66e2ce148ee49dd1dd1f1f)&quot;</span><br><span class="line">      &#125;,</span><br><span class="line">      &quot;manifest-list&quot;: &quot;s3://bucket/example/table/metadata/snap-3823535076387391090-1-3fc712b9-127d-448c-85b4-34726177a6f6.avro&quot;,</span><br><span class="line">      &quot;schema-id&quot;: 0,</span><br><span class="line">      &quot;first-row-id&quot;: 1873029,</span><br><span class="line">      &quot;added-rows&quot;: 208126</span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      &quot;sequence-number&quot;: 11,</span><br><span class="line">      &quot;snapshot-id&quot;: 4745314978435154844,</span><br><span class="line">      &quot;parent-snapshot-id&quot;: 3823535076387391090,</span><br><span class="line">      &quot;timestamp-ms&quot;: 1761614075392,</span><br><span class="line">      &quot;summary&quot;: &#123;</span><br><span class="line">        &quot;operation&quot;: &quot;replace&quot;,</span><br><span class="line">        &quot;added-data-files&quot;: &quot;1&quot;,</span><br><span class="line">        &quot;deleted-data-files&quot;: &quot;20&quot;,</span><br><span class="line">        &quot;added-records&quot;: &quot;208126&quot;,</span><br><span class="line">        &quot;deleted-records&quot;: &quot;208126&quot;,</span><br><span class="line">        &quot;added-files-size&quot;: &quot;28252807&quot;,</span><br><span class="line">        &quot;removed-files-size&quot;: &quot;29693801&quot;,</span><br><span class="line">        &quot;changed-partition-count&quot;: &quot;1&quot;,</span><br><span class="line">        &quot;total-records&quot;: &quot;208126&quot;,</span><br><span class="line">        &quot;total-files-size&quot;: &quot;28252807&quot;,</span><br><span class="line">        &quot;total-data-files&quot;: &quot;1&quot;,</span><br><span class="line">        &quot;total-delete-files&quot;: &quot;0&quot;,</span><br><span class="line">        &quot;total-position-deletes&quot;: &quot;0&quot;,</span><br><span class="line">        &quot;total-equality-deletes&quot;: &quot;0&quot;,</span><br><span class="line">        &quot;engine-version&quot;: &quot;3.5.4-amzn-0&quot;,</span><br><span class="line">        &quot;app-id&quot;: &quot;spark-application-1761613983390&quot;,</span><br><span class="line">        &quot;engine-name&quot;: &quot;spark&quot;,</span><br><span class="line">        &quot;iceberg-version&quot;: &quot;Apache Iceberg 1.10.0 (commit 2114bf631e49af532d66e2ce148ee49dd1dd1f1f)&quot;</span><br><span class="line">      &#125;,</span><br><span class="line">      &quot;manifest-list&quot;: &quot;s3://bucket/example/table/metadata/snap-4745314978435154844-1-58626d07-e3ea-4638-a263-cea54a49101f.avro&quot;,</span><br><span class="line">      &quot;schema-id&quot;: 0,</span><br><span class="line">      &quot;first-row-id&quot;: 2081155,</span><br><span class="line">      &quot;added-rows&quot;: 208126</span><br><span class="line">    &#125;</span><br><span class="line">  ],</span><br></pre></td></tr></table></figure></details><p><code>sequence-number</code> が大きいほど最新です。</p><p>コンパクション後は <code>operation</code> が <code>replace</code> or <code>rewrite</code> となります。</p><ul><li><code>total-data-files</code> が 20 → 1 となっておりファイル数が削減されている</li><li><code>total-files-size</code> が 29693801 → 28252807 となっており、ほぼ同じ</li><li><code>deleted-data-files</code> (削除したデータファイル) が 20</li><li><code>removed-files-size</code> (削除したファイルサイズ) が 29693801 で sequence-number=10 の管理ファイルサイズと同じ</li></ul><p>以上から総ファイルサイズはほぼ変わらず、以前のデータがまるまる削除され、新たに 1 つのファイルを生成していることがわかります。<br>問題なくコンパクションできているようです。</p><p>※ Databricks では <code>DESCRIBE HISTORY</code> クエリがサポートされており、テーブルへの操作履歴を確認できるのでそちらから確認も可能です。</p><p>以上<br><br>参考になれば幸いです。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;AWS Glue Iceberg テーブルは 2025.10.28 時点で format-version=2 までサポートしていますが、format-version=3 はサポートしていません。&lt;/p&gt;
&lt;p&gt;とはいえ、Iceberg format-version=3 としてデータを保存し利用はできます。&lt;/p&gt;
&lt;p&gt;Athena でクエリ実行できない等の問題こそありますが、format-version=3 として利用はでき、&lt;a href=&quot;https://iceberg.apache.org/spec/?h=3+version+table+spe#version-3-extended-types-and-capabilities&quot;&gt;テーブル v3 スペックの恩恵&lt;/a&gt; を受けることができます。&lt;/p&gt;
&lt;p&gt;AWS Glue テーブルを Iceberg v3 format で管理し、 Databricks 等の SaaS でデータを参照するような運用をしている場合には大きなパフォーマンスの向上が見込めます。&lt;/p&gt;
&lt;p&gt;ですが、 AWS Glue テーブルの最適化機能は format-version=3 の場合、エラーとなります。&lt;/p&gt;
&lt;p&gt;その為、Glue Job で Spark SQL 等でテーブル最適化を実施する必要があります。&lt;/p&gt;
&lt;p&gt;以下実施例です。&lt;/p&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>parquet 解析ツール on macOS</title>
    <link href="https://kenzo0107.github.io/2025/10/02/2025-10-03-parquet-cli-on-macos/"/>
    <id>https://kenzo0107.github.io/2025/10/02/2025-10-03-parquet-cli-on-macos/</id>
    <published>2025-10-02T15:00:00.000Z</published>
    <updated>2025-10-02T15:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>iceberg テーブルの圧縮形式は snappy や gzip 等が選択できますが、<br>zstd が圧縮・伸縮効率がよくコストパフォーマンスに優れています。</p><p>ですが、<br>圧縮形式 zstd の parquet は s3 select 未サポート (2024.10.05 時点) なので、<br>parquet を解析したい場合、macOS ローカルにダウンロードし、解析するなりが必要です。</p><p>現時点 2025.10.03 では、 Iceberg format-versoin=3 では、 Athena からクエリ実行することもできません。</p><p><a href="https://formulae.brew.sh/formula/parquet-cli">parquet-cli</a> を利用しデータの内容を確認する必要があったので備忘録として残します。</p><h2><span id="parquet-cli-導入-amp-簡易的な使い方">parquet-cli 導入 &amp; 簡易的な使い方</span></h2><figure class="highlight console"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">brew install parquet-cli</span><br><span class="line"></span><br><span class="line">// スキーマ情報確認</span><br><span class="line">parquet schema xxx.parquet</span><br><span class="line"></span><br><span class="line">// 全データ表示</span><br><span class="line">parquet cat xxx.parquet</span><br><span class="line"></span><br><span class="line">// 最初の数件を表示</span><br><span class="line">parquet head -n 10 xxx.parquet</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;iceberg テーブルの圧縮形式は snappy や gzip 等が選択できますが、&lt;br&gt;zstd が圧縮・伸縮効率がよくコストパフォーマンスに優れています。&lt;/p&gt;
&lt;p&gt;ですが、&lt;br&gt;圧縮形式 zstd の parquet は s3 select 未サポート (2</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>Kafka への流入量の試算</title>
    <link href="https://kenzo0107.github.io/2025/07/16/2025-07-17-aws-aurora-cdc-calculator/"/>
    <id>https://kenzo0107.github.io/2025/07/16/2025-07-17-aws-aurora-cdc-calculator/</id>
    <published>2025-07-16T15:00:00.000Z</published>
    <updated>2025-07-16T15:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>AWS RDS の CDC を Kafka でストリーミングし Iceberg テーブルへ配信し分析基盤を構築しました。<br>その際に RDS のメトリクスから Kafka への流入量を試算するスクリプトを作成しましたので公開します。</p><p>SaaS への見積もりで流入量が必要だったので、スクリプトで試算した数値と合わせてスクリプトも提出した所、概ね問題ないことを確認いただけました。</p><span id="more"></span><p>流入量・流出量はコスト見積もりの要でしたが、試算方法がわからず苦戦していたので一助になればと思います。</p><h2><span id="背景">背景</span></h2><p>CDC（Change Data Capture）は、データベースの変更をリアルタイムでキャプチャして他のシステムに配信する技術です。<br><br>AWS MSK, Confluent などの SaaS 等、 CDC サービスを利用する際、適切な容量計画が重要になります。</p><p>しかし、Aurora の WriteThroughput メトリクスがそのまま CDC スループットになるわけではありません。<br><br>エンジン固有のオーバーヘッドを考慮した正確な推定が必要です。</p><h2><span id="ツール概要">ツール概要</span></h2><p>本ツールは、Aurora MySQL / PostgreSQL クラスターの CDC スループットを CloudWatch メトリクスから算出するシェルスクリプトを Claude Code と壁打ちしながら作成しました。</p><h3><span id="主な特徴">主な特徴</span></h3><ul><li><strong>エンジン別最適化</strong>: MySQL と PostgreSQL それぞれに特化した係数を使用</li><li><strong>インタラクティブ操作</strong>: 複数クラスターから対象を選択可能</li><li><strong>包括的メトリクス</strong>: WriteThroughput、WriteIOPS、ログ使用量を総合的に分析</li><li><strong>容量計画対応</strong>: ピーク値と平均値の両方を提供</li></ul><h2><span id="技術仕様">技術仕様</span></h2><h3><span id="aurora-mysql-分析-aurora-mysqlsh">Aurora MySQL 分析 (aurora-mysql.sh)</span></h3><p><a href="https://gist.github.com/kenzo0107/610df8182f47476e263bc080d164e840">https://gist.github.com/kenzo0107/610df8182f47476e263bc080d164e840</a></p><p><strong>主要メトリクス:</strong></p><ul><li>WriteThroughput（クラスター・インスタンスレベル）</li><li>WriteIOPS（クラスター・インスタンスレベル）</li><li>BinLogDiskUsage（MySQL固有）</li></ul><p><strong>CDC 計算式:</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">CDC throughput = WriteThroughput × 0.576</span><br></pre></td></tr></table></figure><p>MySQL の binlog フォーマットとレプリケーションオーバーヘッドを考慮した係数です。</p><p>0.576 という係数は複数の Aurora MySQL で <code>実際のCDCスループット / WriteThroughputメトリクス</code> から求められた値です。<br><br>今後 Engine バージョンが変更された際にはまた異なる可能性はあります。</p><h3><span id="aurora-postgresql-分析-aurora-postgresqlsh">Aurora PostgreSQL 分析 (aurora-postgresql.sh)</span></h3><p><a href="https://gist.github.com/kenzo0107/1cb26379891ee8b14773609367d5c81e">https://gist.github.com/kenzo0107/1cb26379891ee8b14773609367d5c81e</a></p><p><strong>主要メトリクス:</strong></p><ul><li>WriteThroughput（クラスター・インスタンスレベル）</li><li>WriteIOPS（クラスター・インスタンスレベル）</li><li>TransactionLogsDiskUsage（WAL使用量）</li></ul><p><strong>CDC 計算式:</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">CDC throughput = WriteThroughput × 0.8</span><br></pre></td></tr></table></figure><p>PostgreSQL の WAL（Write-Ahead Log）オーバーヘッドを考慮した係数です。<br><br>こちらの係数も同様の試算方法です。</p><h2><span id="使用方法">使用方法</span></h2><h3><span id="実行例">実行例</span></h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Aurora MySQL クラスターの分析</span></span><br><span class="line">./aurora-mysql.sh</span><br><span class="line"></span><br><span class="line"><span class="comment"># Aurora PostgreSQL クラスターの分析</span></span><br><span class="line">./aurora-postgresql.sh</span><br></pre></td></tr></table></figure><h3><span id="出力例">出力例</span></h3><figure class="highlight console"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">=== Aurora MySQL CDC Analysis ===</span><br><span class="line"></span><br><span class="line">Cluster: production-mysql-cluster</span><br><span class="line">Writer Instance: production-mysql-cluster-writer</span><br><span class="line"></span><br><span class="line">=== Metrics Summary (Past 7 days) ===</span><br><span class="line"></span><br><span class="line">Cluster WriteThroughput:</span><br><span class="line">  Maximum: 24,584,000 bytes/sec</span><br><span class="line">  Average: 32,674 bytes/sec</span><br><span class="line"></span><br><span class="line">Writer Instance WriteThroughput:</span><br><span class="line">  Maximum: 24,584,000 bytes/sec</span><br><span class="line">  Average: 65,348 bytes/sec</span><br><span class="line"></span><br><span class="line">BinLog Disk Usage (Max): 2,147,483,648 bytes</span><br><span class="line"></span><br><span class="line">=== CDC Throughput Estimates ===</span><br><span class="line"></span><br><span class="line">Based on Cluster WriteThroughput:</span><br><span class="line">  Peak CDC    : 14,160,505 bytes/sec (113.284 Mbps)</span><br><span class="line">  Average CDC : 18,818 bytes/sec (0.151 Mbps)</span><br><span class="line"></span><br><span class="line">Based on Writer Instance WriteThroughput:</span><br><span class="line">  Peak CDC    : 14,160,505 bytes/sec (113.284 Mbps)</span><br><span class="line">  Average CDC : 37,637 bytes/sec (0.301 Mbps)</span><br></pre></td></tr></table></figure><h2><span id="実装のポイント">実装のポイント</span></h2><h3><span id="エンジン固有の最適化">エンジン固有の最適化</span></h3><p><strong>MySQL (係数: 0.576)</strong></p><ul><li>binlog のバイナリフォーマット</li><li>レプリケーション時の圧縮効果</li><li>イベントヘッダーのオーバーヘッド</li></ul><p><strong>PostgreSQL (係数: 0.8)</strong></p><ul><li>WAL の物理ログ構造</li><li>論理レプリケーション時の変換コスト</li><li>チェックサム・メタデータのオーバーヘッド</li></ul><h2><span id="容量計画への活用">容量計画への活用</span></h2><h3><span id="1-confluent-cloud-の設定指針">1. Confluent Cloud の設定指針</span></h3><p><strong>スループット設定:</strong></p><ul><li><strong>最大値</strong>: ピーク CDC × 1.2〜1.5（安全マージン）</li><li><strong>平均値</strong>: CDC パフォーマンス監視のベースライン</li></ul><p><strong>パーティション数:</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Required partitions = Peak CDC throughput / 10 MB/s per partition</span><br></pre></td></tr></table></figure><h3><span id="2-postgresql-固有の設定">2. PostgreSQL 固有の設定</span></h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- 論理レプリケーション有効化</span></span><br><span class="line"><span class="keyword">ALTER</span> <span class="keyword">SYSTEM</span> <span class="keyword">SET</span> rds.logical_replication <span class="operator">=</span> <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- WAL キャッシュサイズ調整</span></span><br><span class="line"><span class="keyword">ALTER</span> <span class="keyword">SYSTEM</span> <span class="keyword">SET</span> rds.logical_wal_cache <span class="operator">=</span> <span class="string">&#x27;64MB&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 設定反映</span></span><br><span class="line"><span class="keyword">SELECT</span> pg_reload_conf();</span><br></pre></td></tr></table></figure><h2><span id="まとめ">まとめ</span></h2><p>AWS Aurora の CloudWatch Metrics から CDC スループット推定が可能になりました。<br><br>エンジン固有の係数を使用することで、ストリーミングサービス流入量の容量計画がより正確に実施できます。</p><p><strong>主な利点:</strong></p><ul><li><strong>正確性</strong>: 実測値に基づく係数による高精度な推定</li><li><strong>効率性</strong>: CloudWatch API を活用した自動化</li><li><strong>実用性</strong>: 容量計画に直接活用できる形式での出力</li></ul><p>このツールを活用することで、CDC パイプラインの安定運用と適切なリソース配分を実現できます。</p><p>以上<br><br>参考になれば幸いです。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;AWS RDS の CDC を Kafka でストリーミングし Iceberg テーブルへ配信し分析基盤を構築しました。&lt;br&gt;その際に RDS のメトリクスから Kafka への流入量を試算するスクリプトを作成しましたので公開します。&lt;/p&gt;
&lt;p&gt;SaaS への見積もりで流入量が必要だったので、スクリプトで試算した数値と合わせてスクリプトも提出した所、概ね問題ないことを確認いただけました。&lt;/p&gt;</summary>
    
    
    
    <category term="AWS" scheme="https://kenzo0107.github.io/categories/AWS/"/>
    
    
    <category term="MySQL" scheme="https://kenzo0107.github.io/tags/MySQL/"/>
    
    <category term="AWS" scheme="https://kenzo0107.github.io/tags/AWS/"/>
    
    <category term="Aurora" scheme="https://kenzo0107.github.io/tags/Aurora/"/>
    
    <category term="CDC" scheme="https://kenzo0107.github.io/tags/CDC/"/>
    
    <category term="CloudWatch" scheme="https://kenzo0107.github.io/tags/CloudWatch/"/>
    
    <category term="PostgreSQL" scheme="https://kenzo0107.github.io/tags/PostgreSQL/"/>
    
  </entry>
  
  <entry>
    <title>awsume と peco を使ってスイッチロールを簡単に</title>
    <link href="https://kenzo0107.github.io/2025/07/03/2025-07-04-awsume-switch-role/"/>
    <id>https://kenzo0107.github.io/2025/07/03/2025-07-04-awsume-switch-role/</id>
    <published>2025-07-03T15:00:00.000Z</published>
    <updated>2025-07-03T15:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>AWS で複数のアカウントを管理している際、プロファイルの切り替えが面倒になることがあります。<br>今回は <code>awsume</code> と <code>peco</code> を組み合わせたインタラクティブな AWS プロファイル選択スクリプトを紹介します。</p><span id="more"></span><h2><span id="概要">概要</span></h2><script src="//gist.github.com/https://gist.github.com/kenzo0107/c647d400501a1e63c96df5389cf5dbe6.js"></script><p>このスクリプトは以下の機能を提供します：</p><ul><li><code>awsume -l</code> でプロファイル一覧を取得</li><li><code>peco</code> でインタラクティブに選択</li><li>選択されたプロファイルで <code>awsume</code> を実行してスイッチロール</li></ul><h2><span id="前提条件">前提条件</span></h2><p>以下のツールがインストールされている必要があります：</p><ul><li><code>awsume</code>: AWS プロファイル管理ツール</li><li><code>peco</code>: コマンドライン選択ツール</li><li><code>~/.aws/credentials</code> にプロファイルが設定済み</li></ul><h2><span id="インストール">インストール</span></h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># awsume のインストール (例: pip経由)</span></span><br><span class="line">pip install awsume</span><br><span class="line"></span><br><span class="line"><span class="comment"># peco のインストール (例: Homebrew経由)</span></span><br><span class="line">brew install peco</span><br></pre></td></tr></table></figure><h2><span id="スクリプトの実装">スクリプトの実装</span></h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># awsume-switcher.sh</span></span><br><span class="line"><span class="comment"># AWS プロファイル切り替えスクリプト</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 必要なコマンドの存在チェック</span></span><br><span class="line"><span class="built_in">command</span> -v awsume &gt;/dev/null 2&gt;&amp;1 || &#123; <span class="built_in">echo</span> <span class="string">&quot;awsume is not installed&quot;</span>; <span class="built_in">exit</span> 1; &#125;</span><br><span class="line"><span class="built_in">command</span> -v peco &gt;/dev/null 2&gt;&amp;1 || &#123; <span class="built_in">echo</span> <span class="string">&quot;peco is not installed&quot;</span>; <span class="built_in">exit</span> 1; &#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># プロファイル一覧を取得してフィルタリング</span></span><br><span class="line">PROFILE=$(awsume -l 2&gt;/dev/null | \</span><br><span class="line">  grep -v <span class="string">&quot;^default$&quot;</span> | \</span><br><span class="line">  grep -v <span class="string">&quot;^==================================AWS&quot;</span> | \</span><br><span class="line">  grep -v <span class="string">&quot;PROFILE&quot;</span> | \</span><br><span class="line">  grep -v <span class="string">&quot;^$&quot;</span> | \</span><br><span class="line">  grep -v <span class="string">&quot;^----&quot;</span> | \</span><br><span class="line">  peco)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 選択がキャンセルされた場合</span></span><br><span class="line"><span class="keyword">if</span> [ -z <span class="string">&quot;<span class="variable">$PROFILE</span>&quot;</span> ]; <span class="keyword">then</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;プロファイル選択がキャンセルされました&quot;</span></span><br><span class="line">  <span class="built_in">exit</span> 0</span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 選択されたプロファイルで awsume を実行</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;プロファイル &#x27;<span class="variable">$PROFILE</span>&#x27; に切り替えます...&quot;</span></span><br><span class="line">awsume <span class="string">&quot;<span class="variable">$PROFILE</span>&quot;</span></span><br></pre></td></tr></table></figure><h2><span id="使用方法">使用方法</span></h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># スクリプトを実行</span></span><br><span class="line">./awsume-switcher.sh</span><br></pre></td></tr></table></figure><p>実行すると、設定されているプロファイルの一覧が表示され、矢印キーで選択、Enterで確定できます。</p><h2><span id="機能の詳細">機能の詳細</span></h2><h3><span id="フィルタリング機能">フィルタリング機能</span></h3><p>以下の項目は自動的にリストから除外されます：</p><ul><li><code>default</code> プロファイル</li><li>ヘッダー行（<code>==================================AWS</code> など）</li><li><code>PROFILE</code> 文字列を含む行</li><li>空行</li><li>ダッシュ行（<code>----</code> など）</li></ul><h3><span id="エラーハンドリング">エラーハンドリング</span></h3><ul><li>必要なコマンドの存在チェック</li><li>プロファイルが見つからない場合の処理</li><li>選択がキャンセルされた場合の処理</li><li>警告メッセージの抑制</li></ul><h2><span id="スクリプトの流れ">スクリプトの流れ</span></h2><ol><li><code>awsume</code> と <code>peco</code> の存在確認</li><li><code>awsume -l</code> でプロファイル一覧取得</li><li>不要な行をフィルタリング</li><li><code>peco</code> で選択画面表示</li><li>選択されたプロファイルで <code>awsume</code> 実行</li></ol><h2><span id="注意事項">注意事項</span></h2><ul><li>プロファイル選択をキャンセルした場合は正常終了</li><li>エラー発生時は適切なメッセージを表示して終了</li></ul><h2><span id="まとめ">まとめ</span></h2><p>このスクリプトを使うことで、複数の AWS アカウントを効率的に管理できるようになります。特に多くのプロファイルを持つ環境では、視覚的に選択できる <code>peco</code> の威力を実感できるはずです。</p><p>日常的に awsume を使用している方は、ぜひ試してみてください。</p><p>自分は <code>alias a=&quot;$HOME/awsume-switcher.sh&quot;</code> のようにして使ってます。</p><p>以上<br>参考になれば幸いです。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;AWS で複数のアカウントを管理している際、プロファイルの切り替えが面倒になることがあります。&lt;br&gt;今回は &lt;code&gt;awsume&lt;/code&gt; と &lt;code&gt;peco&lt;/code&gt; を組み合わせたインタラクティブな AWS プロファイル選択スクリプトを紹介します。&lt;/p&gt;</summary>
    
    
    
    <category term="AWS" scheme="https://kenzo0107.github.io/categories/AWS/"/>
    
    
    <category term="AWS" scheme="https://kenzo0107.github.io/tags/AWS/"/>
    
    <category term="awsume" scheme="https://kenzo0107.github.io/tags/awsume/"/>
    
    <category term="peco" scheme="https://kenzo0107.github.io/tags/peco/"/>
    
    <category term="shell" scheme="https://kenzo0107.github.io/tags/shell/"/>
    
    <category term="cli" scheme="https://kenzo0107.github.io/tags/cli/"/>
    
  </entry>
  
  <entry>
    <title>Confluent Cloud の料金比較：SaaS版 vs AWS Marketplace版</title>
    <link href="https://kenzo0107.github.io/2025/07/02/2025-07-03-confluent-pricing-saas-vs-aws-marketplace/"/>
    <id>https://kenzo0107.github.io/2025/07/02/2025-07-03-confluent-pricing-saas-vs-aws-marketplace/</id>
    <published>2025-07-02T15:00:00.000Z</published>
    <updated>2025-07-02T15:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>Confluent Cloud の料金体系について、SaaS版と AWS Marketplace版の比較を調べてみました。</p><p>※ 本記事は Claude Code で調べ得た内容を Obsidian にまとめさせブログ化してもらいました。初の試み💓</p><span id="more"></span><h2><span id="料金比較の結論">💰 料金比較の結論</span></h2><p><strong>Confluent CloudとAWS Marketplace版の料金は同じです。</strong></p><p>AWS Marketplace版のConfluent Cloudの価格設定は、Confluent直販の価格設定と同じです。つまり、どちらを選んでも基本的な料金体系に違いはありません。</p><h2><span id="料金体系の詳細">料金体系の詳細</span></h2><h3><span id="共通の料金構造">🧮 共通の料金構造</span></h3><p>両方とも以下の要素で課金されます：</p><ol><li><strong>Kafka クラスター</strong>: eCKUs（Elastic Confluent Units for Kafka）による時間料金、ネットワーキング（GB単位）、ストレージ（GB-時間単位）</li><li><strong>Connect</strong>: コネクタの使用はスループット（GB単位）とタスクベース価格（タスク/時間単位）で課金</li><li><strong>Stream Processing</strong>: Apache FlinkによるCFUs（分単位）で課金</li><li><strong>Stream Governance</strong>: 環境単位（時間単位）で課金</li></ol><h3><span id="主な違い">主な違い</span></h3><p><strong>支払い方法と統合面</strong>：</p><ul><li><strong>SaaS版</strong>: Confluent直接支払い</li><li><strong>AWS Marketplace版</strong>: AWS Marketplaceを通じて直接課金され、既存のAWSコミットを活用でき、事務手続きを省略できます</li></ul><p><strong>特典</strong>：</p><ul><li>AWS Marketplace版では$1,000の無料クレジット（$400即座、$600はプロモコード経由）が提供されます</li><li>AWS Marketplace経由のすべてのConfluent Cloudサインアップには、追加費用なしでConfluent Cloud Engineersによるホワイトグローブオンボーディング、アーキテクチャレビュー、オンデマンドトレーニングが含まれます</li></ul><h2><span id="推奨">推奨</span></h2><p>料金面では差がないため、以下の要因で選択することをお勧めします：</p><ol><li><strong>AWS環境に統合したい場合</strong> → AWS Marketplace版</li><li><strong>既存のAWS契約やコミットを活用したい場合</strong> → AWS Marketplace版</li><li><strong>統一された請求を希望する場合</strong> → AWS Marketplace版</li><li><strong>初期の無料クレジットを活用したい場合</strong> → AWS Marketplace版</li></ol><p>料金以外の面では、AWS Marketplace版の方がAWS環境との統合や請求の簡素化において有利と言えるでしょう。</p><h2><span id="️-privatelink-を利用する場合-enterprise-プランを選択する必要がある">⚠️ PrivateLink を利用する場合、 Enterprise プランを選択する必要がある</span></h2><p>秘匿性の高いデータを扱うことが想定されるのでインターネットには出ない内部通信をするとなると PrivateLink の設定が必要になってくるかと思います。<br>その場合、 Confluent で Enterprise / Dedicated プランを選択する必要があり、そのコストも加味しておく必要があるのでご注意ください。</p><p>以上<br>参考になれば幸いです。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;Confluent Cloud の料金体系について、SaaS版と AWS Marketplace版の比較を調べてみました。&lt;/p&gt;
&lt;p&gt;※ 本記事は Claude Code で調べ得た内容を Obsidian にまとめさせブログ化してもらいました。初の試み💓&lt;/p&gt;</summary>
    
    
    
    <category term="AWS" scheme="https://kenzo0107.github.io/categories/AWS/"/>
    
    
    <category term="AWS" scheme="https://kenzo0107.github.io/tags/AWS/"/>
    
    <category term="Confluent" scheme="https://kenzo0107.github.io/tags/Confluent/"/>
    
    <category term="Kafka" scheme="https://kenzo0107.github.io/tags/Kafka/"/>
    
  </entry>
  
  <entry>
    <title>Python tox を利用し複数の構文チェックツール管理</title>
    <link href="https://kenzo0107.github.io/2025/06/04/2025-06-05-python-tox/"/>
    <id>https://kenzo0107.github.io/2025/06/04/2025-06-05-python-tox/</id>
    <published>2025-06-04T15:00:00.000Z</published>
    <updated>2025-06-04T15:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>Python の構文チェックツールが乱立しており、それぞれ用途が異なり、設定が大変だったところを <a href="https://tox.wiki/">tox</a> というツールでまとめてみました。</p><span id="more"></span><h2><span id="利用する構文チェックツール">利用する構文チェックツール</span></h2><ul><li><p>requirements-dev.txt</p>  <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">pytest==6.2.5</span><br><span class="line">tox==4.26.0</span><br><span class="line">black==25.1.0</span><br><span class="line">bandit==1.8.3</span><br><span class="line">flake8==7.2.0</span><br><span class="line">mypy==1.16.0</span><br><span class="line">isort==6.0.1</span><br></pre></td></tr></table></figure><table><thead><tr><th>tool</th><th>explain</th></tr></thead><tbody><tr><td><a href="https://docs.pytest.org/">pytest</a></td><td>Python の テスト実行ツール。テスト関数を自動で見つけて実行します。</td></tr><tr><td><a href="https://tox.wiki/">tox</a></td><td>複数の環境でテストやチェックを自動化するツール。CI/CDや複数Pythonバージョン対応に使います。</td></tr><tr><td><a href="https://github.com/psf/black">black</a></td><td>コード整形ツール（自動フォーマッター）。PEP8に準拠したスタイルに自動で直します。</td></tr><tr><td><a href="https://bandit.readthedocs.io/en/latest/">bandit</a></td><td>Pythonコードの セキュリティチェックツール。危険なコードパターンを検出します。</td></tr><tr><td><a href="https://flake8.pycqa.org/">flake8</a></td><td>Pythonコードの 文法・スタイルチェックツール。PEP8違反などを報告します。</td></tr><tr><td><a href="https://mypy-lang.org/">mypy</a></td><td>Pythonコードの 型チェックツール。型ヒント（type hint）が正しく使われているか確認します。</td></tr><tr><td><a href="https://pycqa.github.io/isort/">isort</a></td><td>import文を自動で整理・ソートするツール。blackと一緒によく使われます。</td></tr></tbody></table></li></ul><h2><span id="toxini-設定例">tox.ini 設定例</span></h2><p>除外ディレクトリについて CDK プロジェクトを考慮している tox.ini の設定です。<br>流用十分可能です。</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[tox]</span></span><br><span class="line"><span class="comment"># setup.py がなくとも動作する様にする為、指定している</span></span><br><span class="line"><span class="attr">skipsdist</span> = <span class="literal">True</span></span><br><span class="line"></span><br><span class="line"><span class="section">[testenv]</span></span><br><span class="line"><span class="comment"># <span class="doctag">NOTE:</span> 環境にインストールするライブラリを指定する</span></span><br><span class="line"><span class="comment">#   `-r` と `requirements.txt` の間にスペースを入れるとエラーになる</span></span><br><span class="line"><span class="comment"># <span class="doctag">NOTE:</span> 各環境で利用ツールの version 差異が出ない様、</span></span><br><span class="line"><span class="comment">#   requirements-dev.txt で開発・テスト用のモジュールをバージョン管理する</span></span><br><span class="line"><span class="attr">deps</span> =</span><br><span class="line">    -rrequirements.txt</span><br><span class="line">    -rrequirements-dev.txt</span><br><span class="line"><span class="attr">commands</span> = pytest -rsfp</span><br><span class="line"></span><br><span class="line"><span class="section">[testenv:lint]</span></span><br><span class="line"><span class="attr">deps</span> = -rrequirements-dev.txt</span><br><span class="line"><span class="attr">commands</span> =</span><br><span class="line">    black . --check --skip-string-normalization</span><br><span class="line">    bandit --quiet --exclude ./.tox,./.venv,./.pytest_cache --recursive .</span><br><span class="line">    flake8 .</span><br><span class="line">    mypy --ignore-missing-imports .</span><br><span class="line">    isort . --profile black --check --diff --skip-glob .venv,./.tox,./.pytest_cache</span><br><span class="line"></span><br><span class="line"><span class="comment"># lint 指摘事項の自動修正. black, isoft のみ対応</span></span><br><span class="line"><span class="section">[testenv:lint_auto_fix]</span></span><br><span class="line"><span class="attr">deps</span> = -rrequirements-dev.txt</span><br><span class="line"><span class="attr">commands</span> =</span><br><span class="line">    black . --skip-string-normalization</span><br><span class="line">    isort . --profile black --diff --skip-glob .venv,./.tox,./.pytest_cache</span><br><span class="line"></span><br><span class="line"><span class="section">[flake8]</span></span><br><span class="line"><span class="attr">deps</span> = -rrequirements-dev.txt</span><br><span class="line"></span><br><span class="line"><span class="comment"># 1行当たりの最大文字数 (default: 80)</span></span><br><span class="line"><span class="comment"># 119: GitHub のコードレビューが表示できる長さ</span></span><br><span class="line"><span class="attr">max-line-length</span> = <span class="number">119</span></span><br><span class="line"></span><br><span class="line"><span class="attr">exclude</span> =</span><br><span class="line">    .git</span><br><span class="line">    __pychache__</span><br><span class="line">    .tox</span><br><span class="line">    .mypy_cache</span><br><span class="line">    .venv</span><br><span class="line">    .pytest_cache</span><br><span class="line">    cdk.out</span><br></pre></td></tr></table></figure><h2><span id="利用方法">利用方法</span></h2><h3><span id="テスト実行方法">テスト実行方法</span></h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tox</span><br></pre></td></tr></table></figure><h3><span id="構文チェック実行">構文チェック実行</span></h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tox -e lint</span><br></pre></td></tr></table></figure><h3><span id="構文自動修正">構文自動修正</span></h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tox -e lint_auto_fix</span><br></pre></td></tr></table></figure><h3><span id="github-actions-設定">GitHub Actions 設定</span></h3><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">CDK</span> <span class="string">Unit</span> <span class="string">Test</span></span><br><span class="line"></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">pull_request:</span></span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">    <span class="attr">branches:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">main</span></span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">test:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">timeout-minutes:</span> <span class="number">5</span></span><br><span class="line"></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683</span> <span class="comment"># v4.2.2</span></span><br><span class="line"></span><br><span class="line">      <span class="comment"># Python バージョン取得</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Pick</span> <span class="string">python</span> <span class="string">version</span></span><br><span class="line">        <span class="attr">id:</span> <span class="string">python</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;version=$(awk &#x27;$1 ~ /^python/&#123;print $2&#125;&#x27; .tool-versions)&quot;</span> <span class="string">&gt;&gt;</span> <span class="string">$GITHUB_OUTPUT</span></span><br><span class="line"></span><br><span class="line">      <span class="comment"># Python セットアップ</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Set</span> <span class="string">up</span> <span class="string">Python</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/setup-python@7f4fc3e22c37d6ff65e88745f38bd3157c663f7c</span> <span class="comment"># v4.9.1</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">python-version:</span> <span class="string">$&#123;&#123;</span> <span class="string">steps.python.outputs.version</span> <span class="string">&#125;&#125;</span></span><br><span class="line"></span><br><span class="line">      <span class="comment"># 必要ツールの導入</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Install</span> <span class="string">dependencies</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">pip</span> <span class="string">install</span> <span class="string">-r</span> <span class="string">requirements-dev.txt</span></span><br><span class="line"></span><br><span class="line">      <span class="comment"># 構文チェック実行</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Run</span> <span class="string">linter</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">tox</span> <span class="string">-e</span> <span class="string">lint</span></span><br><span class="line"></span><br><span class="line">      <span class="comment"># テスト実行</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Run</span> <span class="string">tests</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">tox</span></span><br></pre></td></tr></table></figure><h2><span id="実装例">実装例</span></h2><p>Raspberry PI の設定で利用しました。</p><p><a href="https://github.com/kenzo0107/raspi-talk/commits/main/tox.ini">https://github.com/kenzo0107/raspi-talk/commits/main/tox.ini</a></p><p>以上<br>参考になれば幸いです。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;Python の構文チェックツールが乱立しており、それぞれ用途が異なり、設定が大変だったところを &lt;a href=&quot;https://tox.wiki/&quot;&gt;tox&lt;/a&gt; というツールでまとめてみました。&lt;/p&gt;</summary>
    
    
    
    <category term="Python" scheme="https://kenzo0107.github.io/categories/Python/"/>
    
    
  </entry>
  
  <entry>
    <title>データ分析観点から見た AWS ECS コンテナロギング</title>
    <link href="https://kenzo0107.github.io/2025/04/21/2025-04-22-ecs-container-logging/"/>
    <id>https://kenzo0107.github.io/2025/04/21/2025-04-22-ecs-container-logging/</id>
    <published>2025-04-21T15:00:00.000Z</published>
    <updated>2025-04-21T15:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>AWS ECS コンテナロギングをデータ分析観点からどの様な構成だと分析に都合が良いかの観点を記載します。</p><p>基本ログは追加のみで更新や削除はされない性質があるので、その点を考慮して登録されることを意識したアーキテクチャが望ましいです。</p><h2><span id="ecs-コンテナロギングの構成">ECS コンテナロギングの構成</span></h2><h3><span id="ecs-cloudwatch-logs">ECS → CloudWatch Logs</span></h3><p>デフォルトではこのような構成がよく見受けられます。</p><span id="more"></span><pre class="mermaid">graph LRECS-->cw_logs[CloudWatch Logs]</pre><ul><li>Pros:<ul><li>リアルタイムでデータ分析が可能</li><li>簡易的に設定できる</li></ul></li><li>Cons:<ul><li>CloudWatch Logs へのログ出力コストが掛かる</li><li>他データとの統合的な分析は一手間かかる</li></ul></li></ul><h4><span id="他データとの統合的な分析は一手間かかる">他データとの統合的な分析は一手間かかる ?</span></h4><p>CloudWatch Logs Insight もあり、ログのみを分析対象とする場合であれば特に問題ないですが、<br>他データと照合したい場合は統合的な管理が必要です。</p><p>例: 特定の時刻で ALB のログと付き合わせて、どの URI にアクセスされたかを集計したい場合</p><p><a href="https://docs.aws.amazon.com/ja_jp/athena/latest/ug/connectors-cloudwatch.html">Amazon Athena CloudWatch コネクタ</a> で<br>Athena から CloudWatch に接続可能ですが、Lambda を介するので Lambda の一度に返せるレスポンスの制限があり、レスポンスで返せないデータは一度 S3 に退避 (spill) したりすることで完全なレスポンスを返すまでに時間を要し、パフォーマンスが悪くなります。</p><h4><span id="cloudwatch-のサブスクリプションフィルターで-lambda-でデータ変換し-s3-保管">CloudWatch のサブスクリプションフィルターで Lambda でデータ変換し S3 保管</span></h4><pre class="mermaid">graph LRcw_logs[CloudWatch Logs]--Lambda-->S3</pre><p>こちらも処理量がお多い場合に Lambda のリソース制限でエラーハンドリングをする必要が出る可能性もあり、あまり利用を推奨しづらい構成です。</p><h3><span id="ecs-kinesis-firehose-s3">ECS → Kinesis Firehose → S3</span></h3><pre class="mermaid">graph LRECS-->kinesisfirehose[Kinesis Firehose]--parquet-->S3</pre><p>Kinesis Firehose 経由で S3 にデータを蓄積し、Athena から参照する構成です。</p><ul><li>Pros:<ul><li>S3転送時に失敗した場合にバックアップが取れる</li><li>大量リクエストがある場合、 CloudWatch Logs への put object する料金より安くすることができる</li><li>Athena で統合して分析可能</li></ul></li><li>Cons:<ul><li>Kinesis Firehose でデータをバッファリング (一定条件で溜め込む) するとリアルタイム性が損なわれる<ul><li>ある程度コストを抑えるには、最大 15 分のバッファリングが可能なので、まとめて S3 にデータを送信ができる</li></ul></li><li>設定に一手間</li></ul></li></ul><p>障害等で緊急のログ調査が必要な時にリアルタイム性が損なわれた状態では運用に懸念があります。<br>新規の開発時に検証でログが直ちに閲覧できないストレスは想像に難くありません。<br>データ分析の観点で言えば、Athena で統合でき、親和性が高いですが、実運用の観点では問題がある様に見えます。</p><h3><span id="ecs-kinesis-firehose-cloudwatch-logs-ハイブリッド">ECS → Kinesis Firehose / CloudWatch Logs ハイブリッド</span></h3><pre class="mermaid">graph LRECS-->kinesisfirehose[Kinesis Firehose]--parquet-->S3ECS-->cw_logs[CloudWatch Logs]</pre><p>ハイブリッドにすることで実運用を鑑みてリアルタイム性を担保しつつもデータ分析を Athena で統合的にデータ分析できる状態ができます。</p><ul><li>Pros:<ul><li>データ分析用のログとリアルタイムのログを担保できる</li></ul></li><li>Cons:<ul><li>CloudWatch Logs へのログ出力コストが掛かる</li><li>設定に一手間</li></ul></li></ul><p>リクエストの規模にもよりますが、データ分析をする、と言う背景を持った上でのアーキテクチャを鑑みるとこの辺りが落とし所かなと思います。</p><h2><span id="時折見る辛い構成">時折見る辛い構成</span></h2><pre class="mermaid">graph LRECS--ログ-->RDS</pre><p>ログデータを DB に溜め込んでいるのを時折見ます。<br>そのデータを元にリアルタイムにアクセスランキングを出したり、ということをやろうとしたのかな？と背景を想像したりしますが、<br>悪手である場合が多い印象です。</p><p>データ肥大化に対策した上で溜め込んでいるのであれば、まだ良いですが、<br>そうでなければ、いずれ肥大化してパフォーマンスを落としていくのが目に見えている為です。</p><p>RDS から何億レコードを一括で取ろうものなら DB リソースを消費しアプリケーション DB であれば、ユーザ影響を及ぼすことは想像に難くないです。</p><p>データ分析の観点からやって欲しくない構成です。</p><p>ログは一旦ログストレージ (例: S3)に流し、アプリケーションで利用するデータは別途担保する、というのが望ましいです。</p><h2><span id="総評">総評</span></h2><p>AWS ECS コンテナのロギングでの運用してみてほどよかったハイブリッド形式を紹介させていただきました。</p><p>ECS ではサイドカーで fluentbit を起動し、ログをルーティングしました。</p><p>参考: <a href="https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/firelens-using-fluentbit.html">https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/firelens-using-fluentbit.html</a></p><p>以上<br>参考になれば幸いです。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;AWS ECS コンテナロギングをデータ分析観点からどの様な構成だと分析に都合が良いかの観点を記載します。&lt;/p&gt;
&lt;p&gt;基本ログは追加のみで更新や削除はされない性質があるので、その点を考慮して登録されることを意識したアーキテクチャが望ましいです。&lt;/p&gt;
&lt;h2 id=&quot;ECS-コンテナロギングの構成&quot;&gt;&lt;a href=&quot;#ECS-コンテナロギングの構成&quot; class=&quot;headerlink&quot; title=&quot;ECS コンテナロギングの構成&quot;&gt;&lt;/a&gt;ECS コンテナロギングの構成&lt;/h2&gt;&lt;h3 id=&quot;ECS-→-CloudWatch-Logs&quot;&gt;&lt;a href=&quot;#ECS-→-CloudWatch-Logs&quot; class=&quot;headerlink&quot; title=&quot;ECS → CloudWatch Logs&quot;&gt;&lt;/a&gt;ECS → CloudWatch Logs&lt;/h3&gt;&lt;p&gt;デフォルトではこのような構成がよく見受けられます。&lt;/p&gt;</summary>
    
    
    
    <category term="AWS" scheme="https://kenzo0107.github.io/categories/AWS/"/>
    
    
  </entry>
  
  <entry>
    <title>Datadog 子組織の削除方法</title>
    <link href="https://kenzo0107.github.io/2025/01/14/2025-01-15-how-to-delete-datadog-child-org/"/>
    <id>https://kenzo0107.github.io/2025/01/14/2025-01-15-how-to-delete-datadog-child-org/</id>
    <published>2025-01-14T15:00:00.000Z</published>
    <updated>2025-01-14T15:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>備忘録として<br>Datadog の子組織の削除方法をまとめます。</p><h2><span id="手順">手順</span></h2><h3><span id="1-監視や-api-key-application-key-を削除">1. 監視や API Key, Application Key を削除</span></h3><ul><li>監視が残っていると削除できない場合があります。</li><li>API Key を削除することで API Key を利用した Datadog Agent からのデータ収集ができなくなり、意図しないコストの発生を抑える意図があります。</li></ul><h3><span id="2-サポートに連絡">2. サポートに連絡</span></h3><ul><li>子組織を削除する API は存在せず、ドキュメントに記載のある通り、 Datadog サポートに連絡して削除する必要があります。</li><li><a href="https://docs.datadoghq.com/ja/account_management/#%E7%B5%84%E7%B9%94%E3%81%AE%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%92%E7%84%A1%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B">https://docs.datadoghq.com/ja/account_management/#%E7%B5%84%E7%B9%94%E3%81%AE%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%92%E7%84%A1%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B</a></li><li>子組織削除 API が存在しない為、 terraform-provider-datadog でも子組織を管理するリソースを削除しても子組織自体は残ってしまいます。</li></ul><p>サポートの状況次第ですが、おおよそ 1週間程度で削除していただけました。</p><p>以上です。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;備忘録として&lt;br&gt;Datadog の子組織の削除方法をまとめます。&lt;/p&gt;
&lt;h2&gt;&lt;span id=&quot;手順&quot;&gt;手順&lt;/span&gt;&lt;/h2&gt;&lt;h3&gt;&lt;span id=&quot;1-監視や-api-key-application-key-を削除&quot;&gt;1. 監視や API Key, A</summary>
      
    
    
    
    <category term="Datadog" scheme="https://kenzo0107.github.io/categories/Datadog/"/>
    
    
  </entry>
  
  <entry>
    <title>RDS のテーブルデータを分析用テーブルにレプリケートする方法一覧</title>
    <link href="https://kenzo0107.github.io/2024/12/18/2024-12-19-rds-replicate-to-glue-iceberg-table/"/>
    <id>https://kenzo0107.github.io/2024/12/18/2024-12-19-rds-replicate-to-glue-iceberg-table/</id>
    <published>2024-12-18T15:00:00.000Z</published>
    <updated>2024-12-18T15:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<div class="toc"><div class="toc-content"><h3 class="menu-label"><span id="toc">ToC</span></h3><!-- toc --><ul><li><a href="#%E6%A6%82%E8%A6%81">概要</a></li><li><a href="#%E5%89%8D%E6%8F%90">前提</a></li><li><a href="#rdsgluejobiceberg-%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB">RDS→GlueJob→Iceberg テーブル</a></li><li><a href="#rds-zero-etl-%E7%B5%B1%E5%90%88-redshift">RDS Zero-ETL 統合 →Redshift</a></li><li><a href="#rdsdmss3gluejobiceberg-%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB">RDS→DMS→S3→GlueJob→Iceberg テーブル</a></li><li><a href="#rdsdebeziummsks3gluejobiceberg-%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB">RDS→debezium→MSK→S3→GlueJob→Iceberg テーブル</a></li><li><a href="#rdsdebeziummskdatafirehoseiceberg-%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB">RDS→debezium→MSK→DataFirehose→Iceberg テーブル</a></li><li><a href="#rdsdebeziummskiceberg%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB">RDS→debezium→MSK→Icebergテーブル</a></li><li><a href="#rdsdata-firehoseiceberg-%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB-preview-%E7%89%88">RDS→Data Firehose→Iceberg テーブル (preview 版)</a></li><li><a href="#rds-%E3%82%92%E5%85%B1%E6%9C%89%E3%81%97%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%B3">RDS を共有しクローン</a></li><li><a href="#%E7%B7%8F%E8%A9%95">総評</a></li></ul><!-- tocstop --></div></div><hr><h2><span id="概要">概要</span></h2><p>RDS のテーブルデータを分析用テーブルにレプリケートする方法が多数あったのでその一覧をまとめます。</p><p>RDS をユーザ影響を極力低くすべく、分析用テーブルへレプリケートして、分析する方法が多々あったので私見ですが Pros/Cons をまとめます。</p><h2><span id="前提">前提</span></h2><ul><li>アプリケーション DB を配置する AWS アカウントとデータ基盤を構築する AWS アカウントは分けます</li><li>Glue テーブルは iceberg 形式を採用します</li></ul><span id="more"></span><h2><span id="rdsgluejobiceberg-テーブル">RDS→GlueJob→Iceberg テーブル</span></h2><pre class="mermaid">graph LRsubgraph AWS Account-a  RDSendRDS--SELECT-->GlueJobsubgraph AWS Account data-platform  GlueJob-->Icebergテーブルend</pre><p>Glue Job から Glue Connection 経由で RDS に接続し、クエリを実行し、抽出したデータを Iceberg テーブルへレプリケートします。</p><ul><li>Pros:<ul><li>コスト安</li></ul></li><li>Cons:<ul><li>レコード削除に対応できない<ul><li>論理削除であれば対応はできるが、物理削除されると検知できない</li><li>全データをエクスポートし直す、もしくは、削除されたレコードを特定する様、RDS 側と Iceberg テーブルで突き合わせる方法はあるが、リソース逼迫させてしまう恐れがある</li></ul></li><li>テーブル毎にデータ取得時の識別子 (PK 相当) となるカラムを決定する必要がある<ul><li>PK がない場合、別途指定する必要がある。</li><li>例えば更新されるレコードがある場合、 updated_at をキーにし、差分抽出するような処理が必要になる</li></ul></li><li>リアルタイム性を追求すると実行コストが嵩む</li></ul></li></ul><p>運用コストが高く、大規模な DB 環境には向かない。</p><h2><span id="rds-zero-etl-統合-redshift">RDS Zero-ETL 統合 →Redshift</span></h2><pre class="mermaid">graph LRsubgraph AWS Account-a  RDSendRDS--Zero-ETL-->Redshiftsubgraph AWS Account data-platform  Redshiftend</pre><p>参考: <a href="https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/zero-etl.html">Amazon Redshift との Amazon RDS ゼロ ETL 統合での作業</a></p><p>RDS の Zero-ETL 統合により完全マネージドで Redshift へレプリケートします。<br>他の手法と異なり、 Iceberg テーブルでなく Redshift がインターフェースになります。</p><ul><li>Pros:<ul><li>完全マネージドなサービスでスクリプト不要</li><li>Redshift は dbt との相性が良い</li></ul></li><li>Cons:<ul><li>Redshift コスト高<ul><li>Serverless でレプリケート間隔を広げることでコストを抑えることはできそうだが、リアルタイム性は損なわれる</li></ul></li><li>Aurora 以外はサポート外 (2024.12.19 時点)</li></ul></li></ul><h2><span id="rdsdmss3gluejobiceberg-テーブル">RDS→DMS→S3→GlueJob→Iceberg テーブル</span></h2><pre class="mermaid">graph LRsubgraph AWS Account-a  RDS--CDC-->DMSendDMS-->S3subgraph AWS Account data-platform  S3--GlueJob-->Icebergテーブルend</pre><p>参考: <a href="https://aws.amazon.com/jp/blogs/big-data/modernize-your-legacy-databases-with-aws-data-lakes-part-2-build-a-data-lake-using-aws-dms-data-on-apache-iceberg/">Modernize your legacy databases with AWS data lakes, Part 2: Build a data lake using AWS DMS data on Apache Iceberg</a></p><ul><li>Pros:<ul><li>Redshift よりは安く済みそう</li></ul></li><li>Cons:<ul><li>DMS 運用コストが高い（AWS SA 様より頂いた意見）<ul><li>バージョン毎の仕様差による障害発生</li><li>比較的バージョンアップが多い</li><li>バージョンアップ時にレプリケートを停止し、再度テーブル作り直す必要があるなど手間が多い</li></ul></li><li>Glue Job によるデータ処理（更新・追加・削除）が煩雑化する</li><li>テーブルのスキーマ変更に Glue Job で対応する必要がある</li></ul></li></ul><p>DMS 採用企業はある</p><ul><li><a href="https://techlife.cookpad.com/entry/2024/10/16/101605">クックパッド - DMS を利用した継続的なデータ変更検知</a></li></ul><h2><span id="rdsdebeziummsks3gluejobiceberg-テーブル">RDS→debezium→MSK→S3→GlueJob→Iceberg テーブル</span></h2><pre class="mermaid">graph LRsubgraph AWS Account-a  RDS--CDC-->debezium  debezium-->MSKendMSK--Parquet-->S3subgraph AWS Account data-platform  S3--GlueJob-->Icebergテーブルend</pre><p>参考: <a href="https://aws.amazon.com/jp/blogs/big-data/synchronize-data-lakes-with-cdc-based-upsert-using-open-table-format-aws-glue-and-amazon-msk/">Synchronize data lakes with CDC-based UPSERT using open table format, AWS Glue, and Amazon MSK</a></p><p>MSK で CDC データを Parquet で S3 に保存し、 Glue Job で Iceberg テーブルに変換します。</p><ul><li>Pros:<ul><li>RDS Zero-ETL サポート外の <code>MariaDB</code> にも対応できる</li></ul></li><li>Cons:<ul><li>debezium, MSK 等の学習コストが高い（個人の感想）</li><li>Glue Job によるデータ処理（更新・追加・削除）が煩雑化する</li><li>テーブルのスキーマ変更に Glue Job で対応する必要がある</li></ul></li></ul><h2><span id="rdsdebeziummskdatafirehoseiceberg-テーブル">RDS→debezium→MSK→DataFirehose→Iceberg テーブル</span></h2><pre class="mermaid">graph LRsubgraph AWS Account-a    RDSendRDS-->msk_connector[MSK Connector]-->msk_cluster[MSK Cluster]-->Lambda--レコード変換-->Icebergsubgraph AWS Account data-platform    msk_connector[MSK Connector]    msk_cluster[MSK Cluster]    Iceberg    subgraph Data Firehose        Lambda    endend</pre><ul><li>Pros:<ul><li>RDS Zero-ETL サポート外の <code>MariaDB</code> にも対応できる</li><li>Data Firehose 側でバッファ調整やエラーハンドリングできる</li></ul></li><li>Cons:<ul><li>debezium, MSK 等の学習コストが高い（個人の感想）</li><li>テーブルのデータ・スキーマ変更に Lambda で対応する必要がある</li><li>テーブル数分 Data Firehose を作成する必要がある<ul><li>リクエスト量による課金なのでコスト的な問題はないが、管理が煩雑になる</li></ul></li><li>事前に Iceberg テーブルを作成しておく必要がある</li></ul></li></ul><h2><span id="rdsdebeziummskicebergテーブル">RDS→debezium→MSK→Icebergテーブル</span></h2><pre class="mermaid">graph LRsubgraph AWS Account-a    RDSendRDS-->msk_connector[MSK Connector]-->msk_cluster[MSK Cluster]-->msk_connector_sink_iceberg[MSK Connector Sink Iceberg]-->Icebergsubgraph AWS Account data-platform    msk_connector[MSK Connector]    msk_connector_sink_iceberg[MSK Connector Sink Iceberg]    msk_cluster[MSK Cluster]    Icebergend</pre><ul><li>Pros:<ul><li>Data Firehose 管理が不要<ul><li>「RDS→debezium→MSK→DataFirehose→Iceberg テーブル」のテーブル数分 Data Firehose を作る問題を解決</li><li>どの程度のリクエスト量かや取りこぼしをハンドリグすることはできない → ad hoc snapshot があるので問題なさそうではある</li></ul></li><li>テーブルを事前に作成する必要がなく、自動作成が可能</li></ul></li><li>Cons:<ul><li>Iceberg Sink Connector 設定の学習コストが高い</li></ul></li></ul><h2><span id="rdsdata-firehoseiceberg-テーブル-preview-版">RDS→Data Firehose→Iceberg テーブル (preview 版)</span></h2><pre class="mermaid">graph LRsubgraph AWS Account-A    RDS-->NLB    NLB-->VPCエンドポイントサービスendVPCエンドポイントサービス--CDCログ-->VPCエンドポイントsubgraph AWS Account data-platform    VPCエンドポイント-->data_firehose[Data Firehose]    data_firehose[Data Firehose]-->Icebergend</pre><p>参考: <a href="https://aws.amazon.com/jp/blogs/news/replicate-changes-from-databases-to-apache-iceberg-tables-using-amazon-data-firehose/">Amazon Data Firehose を使用して、データベースから Apache Iceberg テーブルに変更をレプリケート (プレビュー)</a></p><ul><li>Pros:<ul><li>運用・構築コスト安</li><li>インターフェースを S3 上の Iceberg テーブルに統合できる</li></ul></li><li>Cons:<ul><li>2024 年 12 月 19 日時点では、テーブルを <code>.*</code> で指定すると多数テーブルがある場合、内部エラーとなり実運用に向かない<ul><li>問い合わせ中 → 想定しないバグだったとのこと。ワイルドカード <code>*</code> でなく、すべてのテーブルを指定することを推奨されました。</li></ul></li><li>PrivateLink の構築が必要</li></ul></li></ul><h2><span id="rds-を共有しクローン">RDS を共有しクローン</span></h2><pre class="mermaid">graph LRaccount_a[RDS]--共有-->data_platform[RDS]subgraph AWS Account-A    account_a[RDS]endsubgraph AWS data-platform    data_platform[RDS]--クローン-->cloned[RDS]end</pre><p>RDS を共有し、その共有された RDS をクローン作成します。<br>クローン実施された時点の最新のデータをクローンされた RDS で参照することができます。<br>リアルタイム性を求めるには難しい構成です。</p><ul><li>Pros:<ul><li>簡易に最新データのスナップショットが参照できる</li></ul></li><li>Cons:<ul><li>定常的にリアルタイムにデータが参照できない</li><li>起動に少なくとも 10 分程度かかる</li></ul></li></ul><h2><span id="総評">総評</span></h2><p>RDS→Data Firehose→Iceberg (preview 版) が運用・構築コスト安で大変期待しています。</p><p>様々手法がある中で CDC を利用した Iceberg テーブルへの統合はデファクトになっていく流れにあるかと推察します。</p><p>今後がより楽しみです。</p><p>以上<br>参考になれば幸いです。</p>]]></content>
    
    
    <summary type="html">&lt;div class=&quot;toc&quot;&gt;
&lt;div class=&quot;toc-content&quot;&gt;
&lt;h3 class=&quot;menu-label&quot;&gt;ToC&lt;/h3&gt;

&lt;!-- toc --&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%A6%82%E8%A6%81&quot;&gt;概要&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%89%8D%E6%8F%90&quot;&gt;前提&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#rdsgluejobiceberg-%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB&quot;&gt;RDS→GlueJob→Iceberg テーブル&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#rds-zero-etl-%E7%B5%B1%E5%90%88-redshift&quot;&gt;RDS Zero-ETL 統合 →Redshift&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#rdsdmss3gluejobiceberg-%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB&quot;&gt;RDS→DMS→S3→GlueJob→Iceberg テーブル&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#rdsdebeziummsks3gluejobiceberg-%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB&quot;&gt;RDS→debezium→MSK→S3→GlueJob→Iceberg テーブル&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#rdsdebeziummskdatafirehoseiceberg-%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB&quot;&gt;RDS→debezium→MSK→DataFirehose→Iceberg テーブル&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#rdsdebeziummskiceberg%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB&quot;&gt;RDS→debezium→MSK→Icebergテーブル&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#rdsdata-firehoseiceberg-%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB-preview-%E7%89%88&quot;&gt;RDS→Data Firehose→Iceberg テーブル (preview 版)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#rds-%E3%82%92%E5%85%B1%E6%9C%89%E3%81%97%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%B3&quot;&gt;RDS を共有しクローン&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E7%B7%8F%E8%A9%95&quot;&gt;総評&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- tocstop --&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id=&quot;概要&quot;&gt;&lt;a href=&quot;#概要&quot; class=&quot;headerlink&quot; title=&quot;概要&quot;&gt;&lt;/a&gt;概要&lt;/h2&gt;&lt;p&gt;RDS のテーブルデータを分析用テーブルにレプリケートする方法が多数あったのでその一覧をまとめます。&lt;/p&gt;
&lt;p&gt;RDS をユーザ影響を極力低くすべく、分析用テーブルへレプリケートして、分析する方法が多々あったので私見ですが Pros/Cons をまとめます。&lt;/p&gt;
&lt;h2 id=&quot;前提&quot;&gt;&lt;a href=&quot;#前提&quot; class=&quot;headerlink&quot; title=&quot;前提&quot;&gt;&lt;/a&gt;前提&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;アプリケーション DB を配置する AWS アカウントとデータ基盤を構築する AWS アカウントは分けます&lt;/li&gt;
&lt;li&gt;Glue テーブルは iceberg 形式を採用します&lt;/li&gt;
&lt;/ul&gt;</summary>
    
    
    
    <category term="AWS" scheme="https://kenzo0107.github.io/categories/AWS/"/>
    
    
  </entry>
  
  <entry>
    <title>Glue Job Bookmark 機能でなく sampleQuery を使って DB データをエクスポートしてみた</title>
    <link href="https://kenzo0107.github.io/2024/10/17/2024-10-18-glue-job-bookmark/"/>
    <id>https://kenzo0107.github.io/2024/10/17/2024-10-18-glue-job-bookmark/</id>
    <published>2024-10-17T15:00:00.000Z</published>
    <updated>2024-10-17T15:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<div class="toc"><div class="toc-content"><h3 class="menu-label"><span id="toc">ToC</span></h3><!-- toc --><ul><li><a href="#%E6%A6%82%E8%A6%81">概要</a></li><li><a href="#glue-job-bookmark-%E6%A9%9F%E8%83%BD%E3%81%A8%E3%81%AF">Glue Job Bookmark 機能とは？</a></li><li><a href="#glue-job-bookmark-%E3%81%AE%E5%95%8F%E9%A1%8C%E7%82%B9">Glue Job Bookmark の問題点</a><ul><li><a href="#%E4%BE%8B-%E4%B8%8D%E6%95%B4%E5%90%88%E3%81%8C%E8%B5%B7%E3%81%93%E3%82%8B%E4%BE%8B">例: 不整合が起こる例</a></li></ul></li><li><a href="#%E5%95%8F%E9%A1%8C%E7%82%B9%E3%81%B8%E3%81%AE%E5%AF%BE%E5%BF%9C%E7%AD%96">問題点への対応策</a></li><li><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></li></ul><!-- tocstop --></div></div><hr><h2><span id="概要">概要</span></h2><p>Glue Job で DB データを取得していた際に Glue Job Bookmark を利用していた際に問題があったので、その際の対応を備忘録として残しておきます。</p><h2><span id="glue-job-bookmark-機能とは">Glue Job Bookmark 機能とは？</span></h2><p>Glue Job で DB やログ情報を取り込みしている場合、どこまで取り込んだかを記録する <a href="https://docs.aws.amazon.com/ja_jp/glue/latest/dg/monitor-continuations.html">Bookmark 機能</a> があります。</p><p>DB データを毎回全てダンプするよりも差分のみ抽出（増分エクスポート: Incremental Export）でき、データの取り込み量も抑えられ、Glue Job の実行時間が短縮されます。</p><p>Glue Job は実行時間に対して従量課金されるのでコストも抑制できるメリットがあります。</p><span id="more"></span><h2><span id="glue-job-bookmark-の問題点">Glue Job Bookmark の問題点</span></h2><p>Glue Job の Bookmark は <code>job.commit()</code> された際に更新されます。</p><p>取り込み処理中に一部のテーブルでエラーが発生し処理が中断された場合、エクスポート処理が成功したテーブルはデータ自体は更新されますが、Bookmark は更新されず、不整合が発生します。</p><h3><span id="例-不整合が起こる例">例: 不整合が起こる例</span></h3><ul><li>table1 処理成功 → データ自体は更新される</li><li>table2 処理成功 → データ自体は更新される</li><li>table3 処理失敗 → データ自体は更新されない<br>→ Bookmark は更新されない。</li></ul><p>全ての処理で transaction を貼ることが対策ではありますが、実行コストが高い場合に、取り込めた分は取り込めた分だけ更新してもらった方が再実行コストが低くて良いです。</p><h2><span id="問題点への対応策">問題点への対応策</span></h2><p><code>glue context</code> の <code>create_data_frame.from_catalog</code> を利用して抽出する際は　<code>additional_options[&#39;sampleQuery&#39;]</code> を利用し、増分を抽出する、自前 Bookmark 機能で対応しました。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> is_table_exists:</span><br><span class="line">   <span class="comment"># テーブルが既に存在する場合</span></span><br><span class="line"></span><br><span class="line">   <span class="comment"># Glue Data Catalog テーブルの bookmark key に設定したカラムの最大値取得</span></span><br><span class="line">   df = self.glueContext.create_data_frame.from_catalog(database=dest_database, table_name=dest_table)</span><br><span class="line">   max_value = df.agg(&#123;bookmark_key: <span class="string">&quot;max&quot;</span>&#125;).collect()[<span class="number">0</span>][<span class="number">0</span>]</span><br><span class="line"></span><br><span class="line">   <span class="comment"># sampleQuery を利用し増分のみ取得</span></span><br><span class="line">   datasource = self.glueContext.create_dynamic_frame.from_catalog(</span><br><span class="line">      ...</span><br><span class="line">      additional_options=&#123;</span><br><span class="line">            <span class="string">&#x27;sampleQuery&#x27;</span>: <span class="string">f&quot;SELECT * FROM <span class="subst">&#123;source_database&#125;</span>.<span class="subst">&#123;source_table&#125;</span> WHERE <span class="subst">&#123;bookmark_key&#125;</span> &gt; <span class="subst">&#123;max_value&#125;</span> AND&quot;</span>,</span><br><span class="line">            ...</span><br><span class="line">      &#125;</span><br><span class="line">   )</span><br></pre></td></tr></table></figure><p>これにより Bookmark 機能を利用せずとも差分抽出をできるように対策しました。</p><p>ちなみにクエリの最後に <code>AND</code> があるのは、<code>enablePartitioningForSampleQuery: true</code> にし、JDBC テーブルから並列で読み込む設定をしている為です。</p><h2><span id="まとめ">まとめ</span></h2><ul><li>sampleQuery の方が Bookmark 機能より増分エクスポートはしやすい印象<ul><li>DB 負荷を抑えながら取り込むこともできるメリットもある</li></ul></li><li>Glue Job Bookmark は更新 API 等はなく、Glue Job の実行成功でのみ更新されるので、失敗した場合は全てを失敗と見なすしかなさそう<ul><li>ハンドリングしづらい</li></ul></li></ul><p>以上<br>参考になれば何よりです。</p>]]></content>
    
    
    <summary type="html">&lt;div class=&quot;toc&quot;&gt;
&lt;div class=&quot;toc-content&quot;&gt;
&lt;h3 class=&quot;menu-label&quot;&gt;ToC&lt;/h3&gt;

&lt;!-- toc --&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%A6%82%E8%A6%81&quot;&gt;概要&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#glue-job-bookmark-%E6%A9%9F%E8%83%BD%E3%81%A8%E3%81%AF&quot;&gt;Glue Job Bookmark 機能とは？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#glue-job-bookmark-%E3%81%AE%E5%95%8F%E9%A1%8C%E7%82%B9&quot;&gt;Glue Job Bookmark の問題点&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E4%BE%8B-%E4%B8%8D%E6%95%B4%E5%90%88%E3%81%8C%E8%B5%B7%E3%81%93%E3%82%8B%E4%BE%8B&quot;&gt;例: 不整合が起こる例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%95%8F%E9%A1%8C%E7%82%B9%E3%81%B8%E3%81%AE%E5%AF%BE%E5%BF%9C%E7%AD%96&quot;&gt;問題点への対応策&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E3%81%BE%E3%81%A8%E3%82%81&quot;&gt;まとめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- tocstop --&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id=&quot;概要&quot;&gt;&lt;a href=&quot;#概要&quot; class=&quot;headerlink&quot; title=&quot;概要&quot;&gt;&lt;/a&gt;概要&lt;/h2&gt;&lt;p&gt;Glue Job で DB データを取得していた際に Glue Job Bookmark を利用していた際に問題があったので、その際の対応を備忘録として残しておきます。&lt;/p&gt;
&lt;h2 id=&quot;Glue-Job-Bookmark-機能とは？&quot;&gt;&lt;a href=&quot;#Glue-Job-Bookmark-機能とは？&quot; class=&quot;headerlink&quot; title=&quot;Glue Job Bookmark 機能とは？&quot;&gt;&lt;/a&gt;Glue Job Bookmark 機能とは？&lt;/h2&gt;&lt;p&gt;Glue Job で DB やログ情報を取り込みしている場合、どこまで取り込んだかを記録する &lt;a href=&quot;https://docs.aws.amazon.com/ja_jp/glue/latest/dg/monitor-continuations.html&quot;&gt;Bookmark 機能&lt;/a&gt; があります。&lt;/p&gt;
&lt;p&gt;DB データを毎回全てダンプするよりも差分のみ抽出（増分エクスポート: Incremental Export）でき、データの取り込み量も抑えられ、Glue Job の実行時間が短縮されます。&lt;/p&gt;
&lt;p&gt;Glue Job は実行時間に対して従量課金されるのでコストも抑制できるメリットがあります。&lt;/p&gt;</summary>
    
    
    
    <category term="AWS" scheme="https://kenzo0107.github.io/categories/AWS/"/>
    
    
  </entry>
  
</feed>
