はじめに
AWS CDKを使ってCloudFrontとS3でSPAをホスティングする際、Origin Access Control (OAC)の実装でハマった経験を共有します。特に興味深いのは、Gemini CLI では解決困難だった問題が、Claude で即座に解決したという点です。同じ問題で困っている方、そしてAI間の知識差について興味がある方の参考になれば幸いです。
LLMのバージョンは以下です。(2025/08/20現在)
-
Gemini: gemini-2.5-flash
geminiCLIを使用してproの制限が来て自動で切り替わったバージョンです。proであればこのトラブルには直面していなかったかもしれないです。 -
Claude: Claude Sonnet 4
ブラウザのチャットです。
問題の発生
プロジェクト構成
ビンゴアプリの開発で、以下のようなAWS CDK TypeScriptプロジェクトを作成していました:
project-root/
├── infra/
│ ├── package.json (CDK v2.211.0)
│ ├── cdk.json
│ └── lib/
│ └── infra-stack.ts
├── lambda/
└── frontend/
エラー内容
以下のコードでTypeScriptコンパイルエラーが発生:
const oac = new cloudfront.CfnOriginAccessControl(this, 'OAC', {
originAccessControlConfig: {
name: 'OAC for Frontend Bucket',
originAccessControlOriginType: 's3',
signingBehavior: 'always',
signingProtocol: 'sigv4',
},
});
const distribution = new cloudfront.Distribution(this, 'CloudFrontDistribution', {
defaultBehavior: {
origin: new origins.S3BucketOrigin(frontendBucket, {
originAccessControlId: oac.attrId, // ← ここでエラー
}),
// ...
},
});
エラーメッセージ:
Property 'originAccessControlId' does not exist on type '...'
Gemini CLI での挑戦と限界
最初のアプローチ
Gemini CLIに相談したところ、以下のような対応を提案されました:
-
パッケージのアップデート提案
npm update aws-cdk-lib constructs
-
型定義ファイルの問題疑い
-
@types/node
のバージョン確認 -
tsconfig.json
の設定見直し
-
-
CDKバージョンの互換性調査
- 古いCDKバージョンでの実装方法の提案
Geminiの限界に到達
数回のやり取りを経て、Geminiから以下の回答が:
「この問題は複雑で、環境固有の要因が多く関わっている可能性があります。**専門家へのヒアリングをお願いします。**AWS CDKの専門知識を持つエンジニアにご相談いただくことをお勧めします。」
この時点で、技術的な問題解決においてAIにも限界があることを実感しました。
Claude での即座解決
問題の的確な分析
Claudeに同じ問題を相談したところ、最初のレスポンスで核心を突いた回答が得られました:
-
根本原因の特定
-
originAccessControlId
プロパティが存在しないこと - 手動OAC作成が不要であることを指摘
-
-
正しい実装方法の提示
// ❌ 間違った方法(手動OAC作成) const oac = new cloudfront.CfnOriginAccessControl(this, 'OAC', {...}); // ✅ 正しい方法(CDK推奨) origin: origins.S3BucketOrigin.withOriginAccessControl(frontendBucket),
-
なぜこの問題が起こるかの説明
- CDKドキュメントの古い例と新しい例の混在
- OAI → OAC移行期の混乱
最終的な解決コード
export class InfraStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// S3バケット
const frontendBucket = new s3.Bucket(this, 'FrontendBucket', {
blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL,
removalPolicy: cdk.RemovalPolicy.DESTROY,
autoDeleteObjects: true,
});
// CloudFront(OACは自動作成される)
const distribution = new cloudfront.Distribution(this, 'CloudFrontDistribution', {
defaultBehavior: {
origin: origins.S3BucketOrigin.withOriginAccessControl(frontendBucket),
viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
responseHeadersPolicy: cloudfront.ResponseHeadersPolicy.SECURITY_HEADERS,
},
defaultRootObject: 'index.html',
errorResponses: [
{
httpStatus: 403,
responseHttpStatus: 200,
responsePagePath: '/index.html',
},
{
httpStatus: 404,
responseHttpStatus: 200,
responsePagePath: '/index.html',
},
],
});
}
}
技術的解説
OAC(Origin Access Control)とは
Origin Access Control は、CloudFrontからS3バケットへの安全なアクセスを制御する仕組みです:
- OAI(Origin Access Identity)の後継
- より強力なセキュリティ機能
- AWS推奨の最新方式
CDK v2でのOAC実装パターン
❌ 避けるべきパターン
// 手動でOAC作成(不要な複雑性)
const oac = new cloudfront.CfnOriginAccessControl(this, 'OAC', {
originAccessControlConfig: {
name: 'OAC for Frontend Bucket',
originAccessControlOriginType: 's3',
signingBehavior: 'always',
signingProtocol: 'sigv4',
},
});
// 存在しないプロパティを使用
origin: new origins.S3BucketOrigin(frontendBucket, {
originAccessControlId: oac.attrId, // ← このプロパティは存在しない
}),
✅ 推奨パターン
// CDKが自動でOACを作成・設定
origin: origins.S3BucketOrigin.withOriginAccessControl(frontendBucket),
なぜこの混乱が起こるのか
-
ドキュメントの世代混在
- 古いOAI実装例
- 新しいOAC実装例
- 移行期の実装例
-
CDKの抽象化レベル
- 低レベルAPI(
CfnXxx
) - 高レベルAPI(
withOriginAccessControl
)
- 低レベルAPI(
-
急速な進化
- AWSサービスの頻繁なアップデート
- CDKライブラリの進化
AI間の知識格差について
観察された違い
項目 | Gemini CLI | Claude |
---|---|---|
問題特定 | 環境・バージョン問題として認識 | API使用方法の問題として認識 |
解決アプローチ | 環境修正中心 | 正しい実装方法の提示 |
専門知識 | 一般的なトラブルシューティング | CDK固有のベストプラクティス |
結果 | 解決に至らず | 即座に解決 |
学んだ教訓
技術面
-
CDKの正しいパターンを学ぶ
- 公式ドキュメントの最新版を参照
- コミュニティの実装例を複数確認
- 高レベルAPIを優先的に使用
-
エラーメッセージを正確に読む
- プロパティが存在しない → API設計の確認
- 型エラー → 実装方法の見直し
-
AWS進化への対応
- 定期的な知識アップデート
- 非推奨機能の把握
AI活用面
-
複数AIの並行活用
- それぞれに得意分野がある
- セカンドオピニオンの重要性
-
問題の切り分け
- 環境問題 vs 実装問題
- 一般的問題 vs 特殊問題
-
AI の限界認識
- 万能ではない
- 専門分野での知識差は存在する
まとめ
今回の経験を通して、以下のことが明らかになりました:
-
同じAIでも専門知識に差がある
- 特定分野での深い知識
- 問題解決アプローチの違い
-
AWS CDKの複雑性
- 進化の速さが混乱を生む
- 正しいパターンの重要性
-
継続的学習の必要性
- 技術者もAIも常にアップデートが必要
- 複数の情報源の活用
技術的な問題に直面した際は、一つの回答で諦めず、複数の視点からアプローチすることが重要だと実感しました。そして何より、AIの得意分野を理解して適切に使い分けることで、開発効率を大幅に向上させることができます。
同じような問題で困っている方の参考になれば幸いです。
参考資料
- AWS CDK Developer Guide - CloudFront
- AWS CloudFront - Origin Access Control
- CDK Examples - CloudFront with S3
環境情報
- AWS CDK: v2.211.0
- Node.js: v18+
- TypeScript: v5.9.2
- OS: Ubuntu (WSL2)