{"id":9382,"date":"2025-10-13T23:21:24","date_gmt":"2025-10-13T23:21:24","guid":{"rendered":"https:\/\/pokecon.jp\/job\/?p=9382"},"modified":"2025-10-13T23:21:24","modified_gmt":"2025-10-13T23:21:24","slug":"aws-lambda-bedrock-athena-%e3%81%a7-s3-tables-iceberg-%e3%81%ab%e8%87%aa%e7%84%b6%e8%a8%80%e8%aa%9e%e3%81%a7%e3%82%af%e3%82%a8%e3%83%aa%e3%81%99%e3%82%8bmcp%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc","status":"publish","type":"post","link":"https:\/\/pokecon.jp\/job\/9382\/","title":{"rendered":"AWS Lambda + Bedrock + Athena \u3067 S3 Tables (Iceberg) \u306b\u81ea\u7136\u8a00\u8a9e\u3067\u30af\u30a8\u30ea\u3059\u308bMCP\u30b5\u30fc\u30d0\u30fc\u3092\u69cb\u7bc9\u3057\u3066\u307f\u305f"},"content":{"rendered":"\n<\/p>\n<div>\n<h2 id=\"acd5eb30-9f7f-4185-aa5e-bad093fc4c05\" class=\"heading-node\" data-pm-slice=\"1 1 []\">\u306f\u3058\u3081\u306b<\/h2>\n<p>\u5168\u793e\u30c7\u30fc\u30bf\u6280\u8853\u5c40\u30c7\u30fc\u30bf\u30a4\u30f3\u30c6\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u30c1\u30fc\u30e0\u306b\u6240\u5c5e\u3057\u3066\u3044\u308b\u8207\u7530\u9f8d\u4eba\u3067\u3059\u3002<\/p>\n<p class=\"text-node\">Amazon S3 Tables \u3092\u5229\u7528\u3057\u3066 Iceberg \u5f62\u5f0f\u3067\u30c7\u30fc\u30bf\u3092\u7ba1\u7406\u3059\u308b\u3068\u3001Iceberg \u30c6\u30fc\u30d6\u30eb\u306e\u81ea\u52d5\u30b3\u30f3\u30d1\u30af\u30b7\u30e7\u30f3\u3084\u30c6\u30fc\u30d6\u30eb\u5358\u4f4d\u306e\u6a29\u9650\u5236\u5fa1\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002\u3053\u308c\u306b\u3088\u308a\u3001\u5f93\u6765\u306e S3 \u30d0\u30b1\u30c3\u30c8\u904b\u7528\u306b\u6bd4\u3079\u3066\u30af\u30a8\u30ea\u6027\u80fd\u3068\u30c7\u30fc\u30bf\u30ac\u30d0\u30ca\u30f3\u30b9\u306e\u4e21\u7acb\u304c\u5bb9\u6613\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<p class=\"text-node\">\u305d\u3053\u3067\u4eca\u56de\u306f\u3001Claude \u304b\u3089\u81ea\u7136\u8a00\u8a9e\u3067\u8cea\u554f\u3092\u9001\u308b\u3068\u3001\u81ea\u52d5\u3067\u5bfe\u5fdc\u3059\u308b SQL \u30af\u30a8\u30ea\u3092\u751f\u6210\u3057\u3001Athena \u304c\u305d\u306e\u30af\u30a8\u30ea\u3092\u5b9f\u884c\u3057\u3066\u7d50\u679c\u3092 JSON \u3068\u8981\u7d04\u4ed8\u304d\u3067\u8fd4\u3059\u4ed5\u7d44\u307f\u3092\u69cb\u7bc9\u3057\u307e\u3059\u3002<\/p>\n<p class=\"text-node\">Lambda \u95a2\u6570\u306f MCP\uff08Model Context Protocol\uff09\u30b5\u30fc\u30d0\u30fc\u3068\u3057\u3066\u52d5\u4f5c\u3057\u3001Bedrock \u306e Guardrails \u3084\u76e3\u67fb\u30ed\u30b0\u3092\u7d4c\u7531\u3057\u306a\u304c\u3089\u3001Claude\uff08\u30d6\u30e9\u30a6\u30b6\u7248\uff09\u304b\u3089 <code class=\"inline\" spellcheck=\"false\">test_connection<\/code>\u3001<code class=\"inline\" spellcheck=\"false\">text_to_sql<\/code>\u3001<code class=\"inline\" spellcheck=\"false\">execute_query<\/code>\u3001 <code class=\"inline\" spellcheck=\"false\">fetch_query_results<\/code>\u3068\u3044\u3063\u305f\u30c4\u30fc\u30eb\u3092\u547c\u3073\u51fa\u305b\u308b\u3088\u3046\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n<h2 id=\"dd0e00e6-6144-4c49-b9d3-5161714b800b\" class=\"heading-node\">\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3\u3068\u72d9\u3044<\/h2>\n<p class=\"text-node\">\u5177\u4f53\u7684\u306a\u30b7\u30b9\u30c6\u30e0\u306f\u4ee5\u4e0b\u306e\u6d41\u308c\u3092\u60f3\u5b9a\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<ol class=\"list-node\">\n<li>\n<p class=\"text-node\"><strong>Claude \u304b\u3089\u8cea\u554f\u9001\u4fe1<\/strong><\/p>\n<\/li>\n<li>\n<p class=\"text-node\"><strong>SQL \u30af\u30a8\u30ea\u81ea\u52d5\u751f\u6210<\/strong><\/p>\n<\/li>\n<li>\n<p class=\"text-node\"><strong>Athena \u3067\u30af\u30a8\u30ea\u5b9f\u884c<\/strong><\/p>\n<\/li>\n<li>\n<p class=\"text-node\"><strong>\u7d50\u679c\u3068\u8981\u7d04\u3092\u8fd4\u5374<\/strong><\/p>\n<\/li>\n<\/ol>\n<p class=\"text-node\">Lambda \u306f MCP \u30b5\u30fc\u30d0\u30fc\u3068\u3057\u3066\u3001Bedrock \u306e Guardrails \u3084\u76e3\u67fb\u30ed\u30b0\u3092\u7d4c\u7531\u3057\u3064\u3064\u3001\u30d9\u30bf\u66f8\u304d SQL \u3092\u610f\u8b58\u305b\u305a Iceberg \u30c6\u30fc\u30d6\u30eb\u3092\u64cd\u4f5c\u53ef\u80fd\u3067\u3059\u3002\u8cea\u554f\u6587\u30fb\u751f\u6210 SQL\u30fb\u5b9f\u884c\u7d50\u679c\u306f\u3059\u3079\u3066\u76e3\u67fb\u30ed\u30b0\u306b\u6b8b\u308b\u305f\u3081\u3001\u30c7\u30fc\u30bf\u30ac\u30d0\u30ca\u30f3\u30b9\u3084\u6027\u80fd\u6539\u5584\u306b\u6d3b\u7528\u3067\u304d\u307e\u3059\u3002<\/p>\n<p><img fetchpriority=\"high\" decoding=\"async\" class=\"alignnone wp-image-59298\" src=\"https:\/\/developers.cyberagent.co.jp\/blog\/wp-content\/uploads\/2025\/10\/dc833708e6b896d19d7ed04d47719485-300x61.png\" alt=\"s3tables-mcp-architecture\" width=\"1007\" height=\"206\" srcset=\"https:\/\/developers.cyberagent.co.jp\/blog\/wp-content\/uploads\/2025\/10\/dc833708e6b896d19d7ed04d47719485-300x61.png 300w, https:\/\/developers.cyberagent.co.jp\/blog\/wp-content\/uploads\/2025\/10\/dc833708e6b896d19d7ed04d47719485-1024x210.png 1024w, https:\/\/developers.cyberagent.co.jp\/blog\/wp-content\/uploads\/2025\/10\/dc833708e6b896d19d7ed04d47719485-768x157.png 768w, https:\/\/developers.cyberagent.co.jp\/blog\/wp-content\/uploads\/2025\/10\/dc833708e6b896d19d7ed04d47719485-1536x314.png 1536w, https:\/\/developers.cyberagent.co.jp\/blog\/wp-content\/uploads\/2025\/10\/dc833708e6b896d19d7ed04d47719485.png 1642w\" sizes=\"(max-width: 1007px) 100vw, 1007px\"\/><\/p>\n<h2 id=\"00644bff-49b6-4625-8a17-b7a3b9f918eb\" class=\"heading-node\">\u69cb\u7bc9\u306e\u624b\u9806\u306b\u3064\u3044\u3066<\/h2>\n<h3 id=\"b01e0949-73bb-4df8-8534-e19aff693a59\" class=\"heading-node\">\u524d\u63d0\u6761\u4ef6<\/h3>\n<p class=\"text-node\">\u69cb\u7bc9\u306b\u306f\u4ee5\u4e0b\u306e\u524d\u63d0\u6761\u4ef6\u3092\u6e80\u305f\u3057\u3066\u3044\u308b\u3053\u3068\u3092\u60f3\u5b9a\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p class=\"text-node\"><strong>Amazon S3 Tables \/ Iceberg \u30c6\u30fc\u30d6\u30eb<\/strong><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-59305\" src=\"https:\/\/developers.cyberagent.co.jp\/blog\/wp-content\/uploads\/2025\/10\/128a9cf91a80dc7f6bc3d0c6b0dac896-1024x500.jpg\" alt=\"aws_analytics_services_s3tables\" width=\"778\" height=\"380\" srcset=\"https:\/\/developers.cyberagent.co.jp\/blog\/wp-content\/uploads\/2025\/10\/128a9cf91a80dc7f6bc3d0c6b0dac896-1024x500.jpg 1024w, https:\/\/developers.cyberagent.co.jp\/blog\/wp-content\/uploads\/2025\/10\/128a9cf91a80dc7f6bc3d0c6b0dac896-300x147.jpg 300w, https:\/\/developers.cyberagent.co.jp\/blog\/wp-content\/uploads\/2025\/10\/128a9cf91a80dc7f6bc3d0c6b0dac896-768x375.jpg 768w, https:\/\/developers.cyberagent.co.jp\/blog\/wp-content\/uploads\/2025\/10\/128a9cf91a80dc7f6bc3d0c6b0dac896-1536x751.jpg 1536w, https:\/\/developers.cyberagent.co.jp\/blog\/wp-content\/uploads\/2025\/10\/128a9cf91a80dc7f6bc3d0c6b0dac896.jpg 1674w\" sizes=\"auto, (max-width: 778px) 100vw, 778px\"\/><\/p>\n<p>\u51fa\u5178 :<a target=\"_blank\" href=\"https:\/\/docs.aws.amazon.com\/AmazonS3\/latest\/userguide\/s3-tables-integration-overview.html\"> Amazon S3 Tables integration with AWS analytics services overview<\/a><\/p>\n<p class=\"text-node\"><strong>Amazon Athena<\/strong><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul class=\"list-node\">\n<li>\n<p class=\"text-node\">S3 Tables \u306e Iceberg \u30c6\u30fc\u30d6\u30eb\u3092 Athena \u304b\u3089\u30af\u30a8\u30ea\u3067\u304d\u308b\u72b6\u614b\u3067\u3042\u308b\u3053\u3068\u3002<\/p>\n<\/li>\n<li>\n<p class=\"text-node\">Athena \u30ab\u30bf\u30ed\u30b0\uff08\u4f8b: <code class=\"inline\" spellcheck=\"false\">AwsDataCatalog<\/code>\uff09\u3084\u30ef\u30fc\u30af\u30b0\u30eb\u30fc\u30d7\uff08\u4f8b: <code class=\"inline\" spellcheck=\"false\">primary<\/code>\uff09\u304c\u8a2d\u5b9a\u6e08\u307f\u3067\u3042\u308b\u3053\u3068\u3002<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p class=\"text-node\"><strong>AWS \u30a2\u30ab\u30a6\u30f3\u30c8 \/ \u6a29\u9650<\/strong><\/p>\n<h3 id=\"b2354f1d-cefe-49eb-b96d-906267373720\" class=\"heading-node\">IAM \u30ed\u30fc\u30eb\u3092\u6574\u3048\u308b<\/h3>\n<p class=\"text-node\">Lambda \u304c Bedrock \u3068 Athena \u3092\u547c\u3079\u308b\u3088\u3046\u306b\u3001\u5b9f\u884c\u30ed\u30fc\u30eb\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\u307e\u305a\u306f\u4fe1\u983c\u30dd\u30ea\u30b7\u30fc\u4ed8\u304d\u306e\u30ed\u30fc\u30eb\u3092\u4f5c\u6210\u3057\u307e\u3057\u305f\u3002<\/p>\n<pre id=\"06ee5c39-c1db-40f8-8da4-43d6135e48bf\" class=\"block-node\" spellcheck=\"false\" data-language=\"bash\"><code>aws iam create-role     --role-name text2sql-lambda-execution-role     --assume-role-policy-document '{&#13;\n        \"Version\": \"2012-10-17\",&#13;\n        \"Statement\": [&#13;\n            {&#13;\n                \"Effect\": \"Allow\",&#13;\n                \"Principal\": {&#13;\n                    \"Service\": \"lambda.amazonaws.com\"&#13;\n                },&#13;\n                \"Action\": \"sts:AssumeRole\"&#13;\n            }&#13;\n        ]&#13;\n    }'<\/code><\/pre>\n<p class=\"text-node\">\u691c\u8a3c\u3067\u306fAmazonAthena\u3001AmazonS3\u3001AWSGlueServiceRole\u306a\u3069\u30d5\u30eb\u30a2\u30af\u30bb\u30b9\u7cfb\u306e\u30dd\u30ea\u30b7\u30fc\u3092\u307e\u3068\u3081\u3066\u4ed8\u4e0e\u3057\u307e\u3057\u305f\u3002\u672c\u756a\u3067\u306f\u6700\u5c0f\u6a29\u9650\u306b\u524a\u308b\u3053\u3068\u304c\u30d9\u30b9\u30c8\u3067\u3059\u3002<\/p>\n<pre id=\"64b4c2f8-8ea6-4252-883f-15da73fa47db\" class=\"block-node\" spellcheck=\"false\" data-language=\"bash\"><code>aws iam attach-role-policy --role-name text2sql-lambda-execution-role --policy-arn arn:aws:iam::aws:policy\/AmazonAthenaFullAccess&#13;\naws iam attach-role-policy --role-name text2sql-lambda-execution-role --policy-arn arn:aws:iam::aws:policy\/AmazonS3FullAccess&#13;\naws iam attach-role-policy --role-name text2sql-lambda-execution-role --policy-arn arn:aws:iam::aws:policy\/service-role\/AWSGlueServiceRole&#13;\naws iam attach-role-policy --role-name text2sql-lambda-execution-role --policy-arn arn:aws:iam::aws:policy\/service-role\/AWSLambdaBasicExecutionRole<\/code><\/pre>\n<p class=\"text-node\">Bedrock \u3068 Lake Formation \u3078\u306e\u30a2\u30af\u30bb\u30b9\u306f\u30ab\u30b9\u30bf\u30e0\u30dd\u30ea\u30b7\u30fc\u3067\u8a31\u53ef\u3057\u307e\u3057\u305f\u3002<\/p>\n<pre id=\"3fdc02c9-fa9a-4c0b-9bf7-7b9ae762a305\" class=\"block-node\" spellcheck=\"false\" data-language=\"json\"><code>{&#13;\n  \"Version\": \"2012-10-17\",&#13;\n  \"Statement\": [&#13;\n    {&#13;\n      \"Effect\": \"Allow\",&#13;\n      \"Action\": [ \"bedrock:InvokeModel\" ],&#13;\n      \"Resource\": \"arn:aws:bedrock:us-west-2::foundation-model\/anthropic.claude-3-5-sonnet-20240620-v1:0\"&#13;\n    },&#13;\n    {&#13;\n      \"Effect\": \"Allow\",&#13;\n      \"Action\": [ \"lakeformation:GetDataAccess\" ],&#13;\n      \"Resource\": \"*\"&#13;\n    }&#13;\n  ]&#13;\n}<\/code><\/pre>\n<pre id=\"b12f9791-8b61-4706-aace-719f26197d71\" class=\"block-node\" spellcheck=\"false\" data-language=\"bash\"><code>aws iam put-role-policy     --role-name text2sql-lambda-execution-role     --policy-name LambdaBedrock-S3TablesPolicy     --policy-document file:\/\/lambda-custom-policy.json<\/code><\/pre>\n<h3 id=\"bd7656fd-ad6c-41be-a209-937e4df36ff3\" class=\"heading-node\">Lake Formation \u3067 Iceberg \u306e\u6a29\u9650\u3092\u767a\u884c<\/h3>\n<p class=\"text-node\">Iceberg \u30c6\u30fc\u30d6\u30eb\u306f IAM \u3060\u3051\u3067\u306f\u30a2\u30af\u30bb\u30b9\u3067\u304d\u306a\u3044\u306e\u3067\u3001Lake Formation \u3067\u3082 DESCRIBE \/ SELECT \u3092\u4ed8\u4e0e\u3057\u307e\u3059\u3002<\/p>\n<pre id=\"ed2d3a43-a2e6-4fa4-8e7b-425583b83ea2\" class=\"block-node\" spellcheck=\"false\" data-language=\"bash\"><code>aws lakeformation grant-permissions   --principal DataLakePrincipalIdentifier=arn:aws:iam::123456789012:role\/text2sql-lambda-execution-role   --permissions \"DESCRIBE\"   --resource '{\"Database\": {\"CatalogId\": \"123456789012\", \"Name\": \"data_catalog_link\"}}'&#13;\naws lakeformation grant-permissions   --principal DataLakePrincipalIdentifier=arn:aws:iam::123456789012:role\/text2sql-lambda-execution-role   --permissions \"DESCRIBE\"   --resource '{\"Database\": {\"CatalogId\": \"123456789012:s3tablescatalog\/demo-bucket\", \"Name\": \"analytics_namespace\"}}'&#13;\naws lakeformation grant-permissions   --principal DataLakePrincipalIdentifier=arn:aws:iam::123456789012:role\/text2sql-lambda-execution-role   --permissions \"SELECT\" \"DESCRIBE\"   --resource '{\"Table\": {\"CatalogId\": \"123456789012:s3tablescatalog\/demo-bucket\", \"DatabaseName\": \"analytics_namespace\", \"Name\": \"slack_messages\"}}'<\/code><\/pre>\n<h3 id=\"d96d4f16-29b0-4c46-8e86-ea56583fb233\" class=\"heading-node\">\u30c6\u30fc\u30d6\u30eb\u306b\u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u3092\u8ffd\u52a0<\/h3>\n<p class=\"text-node\">\u4eca\u56de\u306e\u4f8b\u3067\u306fSlack\u3067\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u30c7\u30fc\u30bf\u3092\u60f3\u5b9a\u3057\u3066\u3001\u7de0\u5207\u3092 10 \u6708 20 \u65e5\u3068\u3059\u308b\u30e1\u30c3\u30bb\u30fc\u30b8\u3092 1 \u30ec\u30b3\u30fc\u30c9 Iceberg \u30c6\u30fc\u30d6\u30eb\u306b\u5165\u308c\u3066\u304a\u304d\u307e\u3057\u305f\u3002<\/p>\n<pre id=\"1b5d8638-c6e8-42ce-83cf-d5c553bbbf44\" class=\"block-node\" spellcheck=\"false\" data-language=\"sql\"><code>INSERT INTO \"AwsDataCatalog\".\"MCP_DEMO_DB\".\"slack_messages\"&#13;\nVALUES (&#13;\n  'MSG-20251008-001',&#13;\n  '20251008103015999',&#13;\n  'message_posted',&#13;\n  'C1234567890',&#13;\n  'official-announcements',&#13;\n  'U000BOSS001',&#13;\n  '\u5404\u4f4d\u3001S3Tables MCP \u306e\u521d\u56de\u30ea\u30ea\u30fc\u30b9\u306f 10\u670820\u65e5 \u304c\u7de0\u5207\u3067\u3059\u3002\u9045\u5ef6\u53b3\u7981\u3067\u304a\u9858\u3044\u3057\u307e\u3059\u3002',&#13;\n  'T1234567890',&#13;\n  'EVT-20251008-001',&#13;\n  current_timestamp,&#13;\n  date(current_timestamp)&#13;\n);<\/code><\/pre>\n<h3 id=\"f2efb935-cdc3-4874-a0d4-5ddc18e556ad\" class=\"heading-node\">Lambda \u30b3\u30fc\u30c9\u306b\u3064\u3044\u3066<\/h3>\n<p class=\"text-node\"><code class=\"inline\" spellcheck=\"false\">lambda_function.py<\/code> \u3067\u306f\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u3092\u8a18\u8ff0\u3057\u307e\u3057\u305f\u3002\u8a73\u7d30\u306f\u30b3\u30fc\u30c9\u5185\u306b\u8a18\u8f09\u3057\u3066\u3044\u307e\u3059\u3002<code class=\"inline\" spellcheck=\"false\">MCPLambdaHandler<\/code> \u3092\u4f7f\u3046\u306e\u3067\u3001\u5f8c\u3067\u4f9d\u5b58\u30e9\u30a4\u30d6\u30e9\u30ea\u3092 zip \u306b\u307e\u3068\u3081\u3066\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3057\u307e\u3059\u3002<\/p>\n<pre id=\"6c53351f-844a-44cc-b4da-d7cee712d6f1\" class=\"block-node\" spellcheck=\"false\" data-language=\"python\"><code>from __future__ import annotations&#13;\nimport json&#13;\nimport os&#13;\nimport time&#13;\nfrom typing import Any, Dict, List, Optional&#13;\nimport boto3&#13;\n&#13;\n# \u30b0\u30ed\u30fc\u30d0\u30eb\u30af\u30e9\u30a4\u30a2\u30f3\u30c8: \u30a6\u30a9\u30fc\u30e0\u30b9\u30bf\u30fc\u30c8\u6642\u306b\u63a5\u7d9a\u3092\u518d\u5229\u7528\u3059\u308b\u305f\u3081\u306b\u751f\u6210&#13;\nAWS_REGION = os.environ.get(\"AWS_REGION\", \"us-west-2\")&#13;\nbedrock_runtime = boto3.client(\"bedrock-runtime\", region_name=AWS_REGION)&#13;\nathena_client = boto3.client(\"athena\", region_name=AWS_REGION)&#13;\ns3_client = boto3.client(\"s3\", region_name=AWS_REGION)&#13;\n&#13;\n# Lambda\u5909\u6570\u3002\u203b\u672c\u756a\u3067\u306f\u74b0\u5883\u5909\u6570\u306b\u7f6e\u304d\u63db\u3048\u3066\u304f\u3060\u3055\u3044\u3002&#13;\nDEFAULT_DATABASE = os.environ.get(\"DATABASE_NAME\", \"MCP_DEMO_DB\")&#13;\nDEFAULT_TABLE = os.environ.get(\"TABLE_NAME\", \"MCP_DEMO_TABLE\")&#13;\nDEFAULT_CATALOG = os.environ.get(\"ATHENA_CATALOG\", \"AwsDataCatalog\")&#13;\nDEFAULT_WORKGROUP = os.environ.get(\"ATHENA_WORKGROUP\", \"primary\")&#13;\nDEFAULT_OUTPUT_LOCATION = os.environ.get(&#13;\n    \"ATHENA_OUTPUT_LOCATION\", \"s3:\/\/mcp-demo-athena-results\/\"&#13;\n)&#13;\nDEFAULT_BEDROCK_MODEL_ID = os.environ.get(&#13;\n    \"BEDROCK_MODEL_ID\", \"anthropic.claude-3-5-sonnet-20240620-v1:0\"&#13;\n)&#13;\n&#13;\n# MCP \u30cf\u30f3\u30c9\u30e9\u30fc\u306e\u521d\u671f\u5316\u3002&#13;\ntry:&#13;\n    from awslabs.mcp_lambda_handler import MCPLambdaHandler&#13;\nexcept ImportError:&#13;\n    class MCPLambdaHandler:  # type: ignore&#13;\n        def __init__(self, name: str, version: str) -&gt; None:&#13;\n            self.name = name&#13;\n            self.version = version&#13;\n            self.tools: Dict[str, Any] = {}&#13;\n        def tool(self):&#13;\n            def decorator(func):&#13;\n                self.tools[func.__name__] = func&#13;\n                return func&#13;\n            return decorator&#13;\n        def handle_request(self, event: Dict[str, Any], context: Any) -&gt; Dict[str, Any]:&#13;\n            return {&#13;\n                \"statusCode\": 500,&#13;\n                \"body\": json.dumps(&#13;\n                    {\"error\": \"MCP runtime unavailable - deploy inside AWS Lambda.\"}&#13;\n                ),&#13;\n            }&#13;\ndef _get_mcp_handler() -&gt; MCPLambdaHandler:&#13;\n    return MCPLambdaHandler(name=\"bedrock-athena-s3tables\", version=\"1.0.0\")&#13;\nmcp = _get_mcp_handler()&#13;\n&#13;\n# Athena \/ Bedrock \u3067\u4f7f\u3046\u88dc\u52a9\u95a2\u6570&#13;\ndef _normalise_catalog(catalog: Optional[str]) -&gt; str:&#13;\n    return catalog or DEFAULT_CATALOG&#13;\ndef _normalise_database(database: Optional[str]) -&gt; str:&#13;\n    return database or DEFAULT_DATABASE&#13;\ndef _normalise_table(table: Optional[str]) -&gt; str:&#13;\n    return table or DEFAULT_TABLE&#13;\ndef _build_prompt(nl_query: str, catalog: str, database: str, table: str) -&gt; str:&#13;\n    \"\"\"Bedrock Claude \u306b\u6e21\u3059 Text-to-SQL \u30d7\u30ed\u30f3\u30d7\u30c8\u3092\u7d44\u307f\u7acb\u3066\u308b\u3002\"\"\"&#13;\n    return (&#13;\n        \"You are an expert SQL assistant for Amazon Athena. \"&#13;\n        \"Generate only a SQL query (no commentary) that answers the user request.\\n\\n\"&#13;\n        \"Table information:\\n\"&#13;\n        f\"- Catalog: {catalog}\\n\"&#13;\n        f\"- Database: {database}\\n\"&#13;\n        f\"- Table: {table}\\n\"&#13;\n        '- Fully qualified form: \"{catalog}\".\"{database}\".\"{table}\"\\n'&#13;\n        \"Columns include: message_id, message_ts, event_type, channel, channel_name, \"&#13;\n        \"user, text, team_id, event_id, event_time, processed_date.\\n\\n\"&#13;\n        \"Requirements:\\n\"&#13;\n        \"1. Output only valid Athena SQL.\\n\"&#13;\n        \"2. Always use the fully qualified 3-part identifier.\\n\"&#13;\n        \"3. Use DATE\/TIMESTAMP helpers when filtering temporal fields.\\n\\n\"&#13;\n        f\"Natural language request: {nl_query}\\n\\nSQL query:\"&#13;\n    ).format(catalog=catalog, database=database, table=table)&#13;\ndef _invoke_bedrock(prompt: str) -&gt; str:&#13;\n    \"\"\"Bedrock Claude \u3092\u547c\u3073\u51fa\u3057\u3001\u4e0d\u8981\u306a Markdown \u3092\u53d6\u308a\u9664\u3044\u3066 SQL \u3092\u8fd4\u3059\u3002\"\"\"&#13;\n    response = bedrock_runtime.invoke_model(&#13;\n        modelId=DEFAULT_BEDROCK_MODEL_ID,&#13;\n        body=json.dumps(&#13;\n            {&#13;\n                \"anthropic_version\": \"bedrock-2023-05-31\",&#13;\n                \"max_tokens\": 800,&#13;\n                \"temperature\": 0,&#13;\n                \"messages\": [{\"role\": \"user\", \"content\": prompt}],&#13;\n            }&#13;\n        ),&#13;\n    )&#13;\n    body = json.loads(response[\"body\"].read())&#13;\n    text = body[\"content\"][0][\"text\"].strip()&#13;\n    if text.startswith(\"```sql\"):&#13;\n        text = text[6:]&#13;\n    if text.endswith(\"```\"):&#13;\n        text = text[:-3]&#13;\n    return text.strip()&#13;\ndef _start_athena_query(sql: str, catalog: str, database: str) -&gt; str:&#13;\n    \"\"\"Athena \u30af\u30a8\u30ea\u3092\u958b\u59cb\u3057\u3001\u5b9f\u884c ID \u3092\u8fd4\u3059\u3002\"\"\"&#13;\n    execution = athena_client.start_query_execution(&#13;\n        QueryString=sql,&#13;\n        QueryExecutionContext={\"Catalog\": catalog, \"Database\": database},&#13;\n        ResultConfiguration={\"OutputLocation\": DEFAULT_OUTPUT_LOCATION},&#13;\n        WorkGroup=DEFAULT_WORKGROUP,&#13;\n    )&#13;\n    return execution[\"QueryExecutionId\"]&#13;\ndef _wait_for_query(query_execution_id: str, timeout: int = 60) -&gt; str:&#13;\n    \"\"\"Athena \u306e\u30af\u30a8\u30ea\u5b8c\u4e86\u3092\u30dd\u30fc\u30ea\u30f3\u30b0\u3067\u5f85\u3064\u3002\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u6642\u306f\u4f8b\u5916\u3092\u9001\u51fa\u3002\"\"\"&#13;\n    start = time.time()&#13;\n    while time.time() - start  List[Dict[str, Any]]:&#13;\n    \"\"\"Athena \u306e\u7d50\u679c\u30bb\u30c3\u30c8\u3092\u5168\u4ef6\u53d6\u5f97\u3057\u3066\u8fd4\u3059\u3002\"\"\"&#13;\n    columns: List[str] = []&#13;\n    next_token: Optional[str] = None&#13;\n    rows: List[Dict[str, Any]] = []&#13;\n    while True:&#13;\n        params: Dict[str, Any] = {&#13;\n            \"QueryExecutionId\": query_execution_id,&#13;\n            \"MaxResults\": 1000,&#13;\n        }&#13;\n        if next_token:&#13;\n            params[\"NextToken\"] = next_token&#13;\n        response = athena_client.get_query_results(**params)&#13;\n        if not columns:&#13;\n            metadata = response[\"ResultSet\"][\"ResultSetMetadata\"][\"ColumnInfo\"]&#13;\n            columns = [col[\"Label\"] for col in metadata]&#13;\n        result_rows = response[\"ResultSet\"].get(\"Rows\", [])&#13;\n        start_idx = 1 if not next_token else 0  # \u6700\u521d\u306e\u30d0\u30c3\u30c1\u306e\u307f\u30d8\u30c3\u30c0\u3092\u30b9\u30ad\u30c3\u30d7&#13;\n        for row in result_rows[start_idx:]:&#13;\n            data = row.get(\"Data\", [])&#13;\n            rows.append(&#13;\n                {&#13;\n                    columns[i] if i  str:&#13;\n    \"\"\"\u7d50\u679c\u3092\u8981\u7d04\u3059\u308b\u305f\u3081\u306b Bedrock Claude \u3092\u518d\u5229\u7528\u3059\u308b\u3002\"\"\"&#13;\n    if not results:&#13;\n        return \"\u8a72\u5f53\u3059\u308b\u30ec\u30b3\u30fc\u30c9\u306f\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002\"&#13;\n    preview = \"\\n\".join(&#13;\n        f\"\u884c{i+1}: {row.get('text', '')}\" for i, row in enumerate(results[:10])&#13;\n    )&#13;\n    # \u30d7\u30ed\u30f3\u30d7\u30c8\u306b\u3088\u308b\u51fa\u529b\u5236\u5fa1&#13;\n    prompt = (&#13;\n        \"\u4ee5\u4e0b\u306e Athena \u7d50\u679c\u3092\u3082\u3068\u306b\u3001\u30e6\u30fc\u30b6\u30fc\u306e\u8cea\u554f\u306b\u65e5\u672c\u8a9e\u3067\u56de\u7b54\u3057\u3066\u304f\u3060\u3055\u3044\u3002\\n\\n\"&#13;\n        f\"\u30e6\u30fc\u30b6\u30fc\u306e\u8cea\u554f: {nl_query}\\n\\n\"&#13;\n        \"\u7d50\u679c\u30d7\u30ec\u30d3\u30e5\u30fc:\\n\"&#13;\n        f\"{preview}\\n\\n\"&#13;\n        \"\u51fa\u529b\u6761\u4ef6:\\n\"&#13;\n        \"- \u91cd\u8981\u30dd\u30a4\u30f3\u30c8\u3092\u7b87\u6761\u66f8\u304d\u3067\u793a\u3059\\n\"&#13;\n        \"- \u56fa\u6709\u540d\u8a5e\u304c\u3042\u308c\u3070\u6b8b\u3059\\n\"&#13;\n        \"- 200\u6587\u5b57\u4ee5\u5185\"&#13;\n    )&#13;\n    try:&#13;\n        response = bedrock_runtime.invoke_model(&#13;\n            modelId=DEFAULT_BEDROCK_MODEL_ID,&#13;\n            body=json.dumps(&#13;\n                {&#13;\n                    \"anthropic_version\": \"bedrock-2023-05-31\",&#13;\n                    \"max_tokens\": 400,&#13;\n                    \"temperature\": 0.1,&#13;\n                    \"messages\": [{\"role\": \"user\", \"content\": prompt}],&#13;\n                }&#13;\n            ),&#13;\n        )&#13;\n        body = json.loads(response[\"body\"].read())&#13;\n        return body[\"content\"][0][\"text\"].strip()&#13;\n    except Exception:&#13;\n        snippet = json.dumps(results[0], ensure_ascii=False)[:180]&#13;\n        return f\"\u56de\u7b54\u751f\u6210\u306b\u5931\u6557\u3057\u305f\u305f\u3081\u3001\u6700\u521d\u306e\u30ec\u30b3\u30fc\u30c9\u3092\u8fd4\u3057\u307e\u3059: {snippet}\"&#13;\n&#13;\n# MCP \u30c4\u30fc\u30eb\u5b9a\u7fa9&#13;\n@mcp.tool()&#13;\ndef test_connection() -&gt; str:&#13;\n    \"\"\"\u74b0\u5883\u60c5\u5831\u3068\u30af\u30a8\u30ea\u5b9f\u884c\u6642\u306e\u6ce8\u610f\u70b9\u3092\u8fd4\u3059\u3002\"\"\"&#13;\n    return \"\\n\".join(&#13;\n        [&#13;\n            \"Bedrock + Athena MCP Lambda is ready!\",&#13;\n            \"\",&#13;\n            \"Configuration:\",&#13;\n            f\"  - AWS_REGION: {AWS_REGION}\",&#13;\n            f\"  - CATALOG: {DEFAULT_CATALOG}\",&#13;\n            f\"  - DATABASE: {DEFAULT_DATABASE}\",&#13;\n            f\"  - TABLE: {DEFAULT_TABLE}\",&#13;\n            f\"  - WORKGROUP: {DEFAULT_WORKGROUP}\",&#13;\n            f\"  - ATHENA_OUTPUT_LOCATION: {DEFAULT_OUTPUT_LOCATION}\",&#13;\n            f\"  - BEDROCK_MODEL_ID: {DEFAULT_BEDROCK_MODEL_ID}\",&#13;\n            \"\",&#13;\n            \"Query tips:\",&#13;\n            \"  - \u5148\u982d\u3067 `USE CATALOG AwsDataCatalog;` \u3084 `USE MCP_DEMO_DB;` \u3092\u5ba3\u8a00\u3059\u308b\u3068\u5b89\u5168\u3067\u3059\u3002\",&#13;\n            \"  - Iceberg \u30c6\u30fc\u30d6\u30eb\u306f \\\"Catalog\\\".\\\"Database\\\".\\\"Table\\\" \u5f62\u5f0f\u306e\u5f15\u7528\u7b26\u304c\u5fc5\u9808\u3067\u3059\u3002\",&#13;\n            \"  - \u81ea\u7136\u6587\u306f text_to_sql \u3067 SQL \u3092\u78ba\u8a8d\u3057\u3066\u304b\u3089 execute_query \u3092\u5b9f\u884c\u3059\u308b\u3068\u5b89\u5168\u3067\u3059\u3002\",&#13;\n        ]&#13;\n    )&#13;\n@mcp.tool()&#13;\ndef text_to_sql(&#13;\n    natural_language_query: str,&#13;\n    catalog: Optional[str] = None,&#13;\n    database: Optional[str] = None,&#13;\n    table: Optional[str] = None,&#13;\n) -&gt; str:&#13;\n    \"\"\"\u81ea\u7136\u8a00\u8a9e\u3092 Athena \u306e SQL \u306b\u5909\u63db\u3057\u3066 JSON \u3067\u8fd4\u3059\u3002\"\"\"&#13;\n    if not natural_language_query:&#13;\n        raise ValueError(\"natural_language_query is required\")&#13;\n    catalog = _normalise_catalog(catalog)&#13;\n    database = _normalise_database(database)&#13;\n    table = _normalise_table(table)&#13;\n    sql = _invoke_bedrock(_build_prompt(natural_language_query, catalog, database, table))&#13;\n    return json.dumps(&#13;\n        {&#13;\n            \"success\": True,&#13;\n            \"catalog\": catalog,&#13;\n            \"database\": database,&#13;\n            \"table\": table,&#13;\n            \"sql\": sql,&#13;\n        },&#13;\n        indent=2,&#13;\n    )&#13;\n@mcp.tool()&#13;\ndef execute_query(&#13;\n    natural_language_query: Optional[str] = None,&#13;\n    sql_query: Optional[str] = None,&#13;\n    catalog: Optional[str] = None,&#13;\n    database: Optional[str] = None,&#13;\n    table: Optional[str] = None,&#13;\n) -&gt; str:&#13;\n    \"\"\"\u81ea\u7136\u8a00\u8a9e\u307e\u305f\u306f SQL \u3092\u53d7\u3051\u53d6\u308a\u3001Athena \u5b9f\u884c\u304b\u3089\u8981\u7d04\u307e\u3067\u884c\u3046\u3002\"\"\"&#13;\n    if not natural_language_query and not sql_query:&#13;\n        raise ValueError(\"Either natural_language_query or sql_query must be provided\")&#13;\n    catalog = _normalise_catalog(catalog)&#13;\n    database = _normalise_database(database)&#13;\n    table = _normalise_table(table)&#13;\n    sql = sql_query or _invoke_bedrock(&#13;\n        _build_prompt(natural_language_query or \"\", catalog, database, table)&#13;\n    )&#13;\n    execution_id = _start_athena_query(sql, catalog, database)&#13;\n    status = _wait_for_query(execution_id)&#13;\n    if status != \"SUCCEEDED\":&#13;\n        reason = athena_client.get_query_execution(QueryExecutionId=execution_id)[&#13;\n            \"QueryExecution\"&#13;\n        ][\"Status\"].get(\"StateChangeReason\", \"Unknown\")&#13;\n        raise RuntimeError(f\"Athena query failed ({status}): {reason}\")&#13;\n    rows = _collect_athena_rows(execution_id)&#13;\n    summary = _summarise_results(natural_language_query or sql, rows)&#13;\n    return json.dumps(&#13;\n        {&#13;\n            \"success\": True,&#13;\n            \"catalog\": catalog,&#13;\n            \"database\": database,&#13;\n            \"table\": table,&#13;\n            \"sql\": sql,&#13;\n            \"query_execution_id\": execution_id,&#13;\n            \"row_count\": len(rows),&#13;\n            \"rows\": rows,&#13;\n            \"summary\": summary,&#13;\n        },&#13;\n        indent=2,&#13;\n        ensure_ascii=False,&#13;\n    )&#13;\n@mcp.tool()&#13;\ndef fetch_query_results(query_execution_id: str) -&gt; str:&#13;\n    \"\"\"Athena \u306e\u904e\u53bb\u5b9f\u884c\u7d50\u679c\u3092\u518d\u53d6\u5f97\u3057\u3066\u8fd4\u3059\u3002\"\"\"&#13;\n    if not query_execution_id:&#13;\n        raise ValueError(\"query_execution_id is required\")&#13;\n    status = athena_client.get_query_execution(QueryExecutionId=query_execution_id)[&#13;\n        \"QueryExecution\"&#13;\n    ][\"Status\"][\"State\"]&#13;\n    if status != \"SUCCEEDED\":&#13;\n        raise RuntimeError(f\"Query execution {query_execution_id} is not successful: {status}\")&#13;\n    rows = _collect_athena_rows(query_execution_id)&#13;\n    return json.dumps(&#13;\n        {&#13;\n            \"success\": True,&#13;\n            \"row_count\": len(rows),&#13;\n            \"rows\": rows,&#13;\n        },&#13;\n        indent=2,&#13;\n        ensure_ascii=False,&#13;\n    )&#13;\n&#13;\n# Lambda \u30a8\u30f3\u30c8\u30ea\u30dd\u30a4\u30f3\u30c8&#13;\ndef lambda_handler(event: Dict[str, Any], context: Any) -&gt; Dict[str, Any]:&#13;\n    \"\"\"MCP \u306e JSON-RPC \u30ea\u30af\u30a8\u30b9\u30c8\u3092 routing \u3059\u308b\u30a8\u30f3\u30c8\u30ea\u30dd\u30a4\u30f3\u30c8\u3002\"\"\"&#13;\n    if \"requestContext\" in event:&#13;\n        raw_body = event.get(\"body\", \"{}\")&#13;\n        try:&#13;\n            payload = json.loads(raw_body) if isinstance(raw_body, str) else raw_body&#13;\n        except json.JSONDecodeError:&#13;\n            payload = {}&#13;\n    else:&#13;\n        payload = event&#13;\n    if isinstance(payload, dict) and payload.get(\"method\"):&#13;\n        return mcp.handle_request(event, context)&#13;\n    raise ValueError(\"Unsupported request format - MCP JSON-RPC expected\")<\/code><\/pre>\n<h3 id=\"b6540931-832a-4d1c-808a-1714c89f379c\" class=\"heading-node\">\u4f9d\u5b58\u30e9\u30a4\u30d6\u30e9\u30ea\u3092 zip \u306b\u307e\u3068\u3081\u3066\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9<\/h3>\n<p class=\"text-node\"><code class=\"inline\" spellcheck=\"false\">awslabs.mcp_lambda_handler<\/code> \u304c\u5fc5\u8981\u306a\u306e\u3067\u3001<code class=\"inline\" spellcheck=\"false\">python3 -m pip install<\/code> \u3067\u4f9d\u5b58\u3092\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u5c55\u958b\u3057\u3001lambda_function.py\u3068\u5171\u306b\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3057\u307e\u3057\u305f\u3002\u4eca\u56de\u306f\u4f9d\u5b58\u30e9\u30a4\u30d6\u30e9\u30ea\u304c\u8efd\u91cf\u306e\u305f\u3081\u30ec\u30a4\u30e4\u30fc\u306f\u4f7f\u7528\u305b\u305azip\u3067\u307e\u3068\u3081\u3066\u3044\u307e\u3059\u3002<\/p>\n<pre id=\"04c8cb60-dc54-4011-9476-a05a91c8f7c8\" class=\"block-node\" spellcheck=\"false\" data-language=\"bash\"><code>mkdir -p package&#13;\ncp lambda_function.py package\/&#13;\npython3 -m pip install awslabs-mcp-lambda-handler -t package\/&#13;\npython3 -m pip freeze &gt; package\/requirements.txt &#13;\n(cd package &amp;&amp; zip -r ..\/lambda-function-mcp.zip .)<\/code><\/pre>\n<h3 id=\"91e5b080-8bd5-4819-b0fe-762d24af98e0\" class=\"heading-node\">Function URL \u3092\u6709\u52b9\u5316\u3059\u308b<\/h3>\n<p class=\"text-node\">MCP \u304b\u3089\u63a5\u7d9a\u3059\u308b\u305f\u3081\u3001Function URL \u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<br \/>\u4eca\u56de\u306fAPI Key \u8a8d\u8a3c\u3092 Lambda \u5185\u3067\u5b9f\u88c5\u3057\u3066\u3044\u307e\u3059\u304c\u3001\u672c\u756a\u74b0\u5883\u3067\u306f AWS IAM \u8a8d\u8a3c\u3084 API Gateway + Authorizer\uff08Cognito \/ OIDC \u7b49\uff09\u306e\u5229\u7528\u3092\u63a8\u5968\u3057\u307e\u3059\u3002<\/p>\n<h3 id=\"cc7991f9-1495-4276-b746-b255aed18222\" class=\"heading-node\">Function URL \u3092\u4f5c\u6210<\/h3>\n<p class=\"text-node\">\u8a8d\u8a3c\u306a\u3057\u8a2d\u5b9a\uff08<code class=\"inline\" spellcheck=\"false\">--auth-type NONE<\/code>\uff09\u3067\u3059\u304c\u3001Lambda \u5185\u3067 API Key \u8a8d\u8a3c\u3092\u5b9f\u88c5\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<pre id=\"06aff7fe-90a6-421f-b29b-af7d389db018\" class=\"block-node\" spellcheck=\"false\"><code>aws lambda create-function-url-config \\&#13;\n  --function-name bedrock-athena-s3tables \\&#13;\n  --auth-type NONE \\&#13;\n  --cors '{\"AllowOrigins\":[\"*\"],\"AllowMethods\":[\"POST\"],\"AllowHeaders\":[\"content-type\"]}' \\&#13;\n  --region us-west-2&#13;\n<\/code><\/pre>\n<h3 id=\"56001483-1831-4cbd-a616-58e97c9fe4c5\" class=\"heading-node\">\u30d1\u30d6\u30ea\u30c3\u30af\u30a2\u30af\u30bb\u30b9\u6a29\u9650\u3092\u8ffd\u52a0<\/h3>\n<pre id=\"9e6fb2aa-e774-49b6-9b7b-754b6389d974\" class=\"block-node\" spellcheck=\"false\"><code>aws lambda add-permission \\&#13;\n  --function-name bedrock-athena-s3tables \\&#13;\n  --statement-id function-url-public-access \\&#13;\n  --action lambda:InvokeFunctionUrl \\&#13;\n  --principal '*' \\&#13;\n  --function-url-auth-type NONE \\&#13;\n  --region us-west-2<\/code><\/pre>\n<h3 id=\"051da27e-f512-4128-9ab3-eda06ebcbf17\" class=\"heading-node\">API Key \u8a8d\u8a3c\u306e\u5b9f\u88c5\uff08Lambda \u5185\uff09<\/h3>\n<p class=\"text-node\">Lambda \u95a2\u6570\u5185\u3067\u4ee5\u4e0b\u306e\u3088\u3046\u306b API Key \u8a8d\u8a3c\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002<\/p>\n<pre id=\"3695d3aa-4931-4c1b-a257-1ca2e6595c14\" class=\"block-node\" spellcheck=\"false\"><code>def lambda_handler(event: Dict[str, Any], context: Any) -&gt; Dict[str, Any]:&#13;\n    # API Key\u8a8d\u8a3c&#13;\n    query_params = event.get(\"queryStringParameters\", {}) or {}&#13;\n    api_key = query_params.get(\"key\") or query_params.get(\"api_key\")&#13;\n    expected_key = os.environ.get(\"MCP_API_KEY\")&#13;\n&#13;\n    if not expected_key or api_key != expected_key:&#13;\n        return {&#13;\n            \"statusCode\": 401,&#13;\n            \"headers\": {\"Content-Type\": \"application\/json\"},&#13;\n            \"body\": json.dumps({\"error\": \"Invalid or missing API key\"})&#13;\n        }<\/code><\/pre>\n<h3 id=\"b9b0190a-3921-4dd6-9541-23c52b072ada\" class=\"heading-node\">\u74b0\u5883\u5909\u6570\u306b MCP_API_KEY \u3092\u8a2d\u5b9a<\/h3>\n<pre id=\"556de7ec-0d90-47dc-892a-fa35991066f0\" class=\"block-node\" spellcheck=\"false\"><code>aws lambda update-function-configuration \\&#13;\n  --function-name bedrock-athena-s3tables \\&#13;\n  --environment Variables=\"{\"MCP_API_KEY\":\"your-secure-api-key-here\"}\" \\&#13;\n  --region us-west-2<\/code><\/pre>\n<h3 id=\"7ec46db7-29b2-44d9-9fd9-95e3aabb984d\" class=\"heading-node\">\u52d5\u4f5c\u78ba\u8a8d<\/h3>\n<p class=\"text-node\">Function URL \u304c\u767a\u884c\u3055\u308c\u305f\u3089\u3001API Key \u3092\u4ed8\u3051\u3066\u30b9\u30c6\u30fc\u30bf\u30b9 200 \u304c\u8fd4\u308b\u304b\u78ba\u8a8d\u3057\u307e\u3059\u3002<\/p>\n<p class=\"text-node\">API Key \u3042\u308a\uff08200 \u6b63\u5e38\u52d5\u4f5c\uff09:<\/p>\n<pre id=\"e3149e3c-4a2f-4553-bd27-48d8f8ec355e\" class=\"block-node\" spellcheck=\"false\"><code>curl -s -X POST \"https:\/\/xxxx.lambda-url.us-west-2.on.aws\/?api_key=your-secure-api-key-here\" \\&#13;\n  -H \"Content-Type: application\/json\" \\&#13;\n  -d '{\"jsonrpc\":\"2.0\",\"id\":\"health\",\"method\":\"initialize\",\"params\":{}}'<\/code><\/pre>\n<h2 id=\"1ee317b6-7eff-4589-8a94-0e3db705bdbb\" class=\"heading-node\">Claude \u3067\u30c4\u30fc\u30eb\u3092\u8a66\u3059<\/h2>\n<p class=\"text-node\">Claude \u306e UI \u5de6\u4e0b\u306e\u30a2\u30a4\u30b3\u30f3 \u2192 \u8a2d\u5b9a \u2192 \u30b3\u30cd\u30af\u30bf \u2192 \u30ab\u30b9\u30bf\u30e0\u30b3\u30cd\u30af\u30bf\u3092\u8ffd\u52a0 \u3092\u30af\u30ea\u30c3\u30af\u3057\u3001\u4ee5\u4e0b\u3092\u5165\u529b\u3057\u307e\u3059\u3002<\/p>\n<ul class=\"list-node\">\n<li>\n<p class=\"text-node\">\u30b3\u30cd\u30af\u30bf\u540d: <code class=\"inline\" spellcheck=\"false\">s3tables-lambda-mcp<\/code><\/p>\n<\/li>\n<li>\n<p class=\"text-node\">\u30ea\u30e2\u30fc\u30c8 MCP \u30b5\u30fc\u30d0\u30fc URL:<br \/><code class=\"inline\" spellcheck=\"false\">https:\/\/xxxx.lambda-url.us-west-2.on.aws\/?api_key=your-secure-api-key-here<\/code><\/p>\n<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-59337\" src=\"https:\/\/developers.cyberagent.co.jp\/blog\/wp-content\/uploads\/2025\/10\/f4ad0982c1b0851a7bae824d752d0e33-300x35.png\" alt=\"\" width=\"300\" height=\"35\" srcset=\"https:\/\/developers.cyberagent.co.jp\/blog\/wp-content\/uploads\/2025\/10\/f4ad0982c1b0851a7bae824d752d0e33-300x35.png 300w, https:\/\/developers.cyberagent.co.jp\/blog\/wp-content\/uploads\/2025\/10\/f4ad0982c1b0851a7bae824d752d0e33.png 624w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\"\/><\/p>\n<p class=\"text-node\">\u30c1\u30e3\u30c3\u30c8\u306e\u8a2d\u5b9a\u306b <code class=\"inline\" spellcheck=\"false\">s3tables-lambda-mcp<\/code> \u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-59336 size-large\" src=\"https:\/\/developers.cyberagent.co.jp\/blog\/wp-content\/uploads\/2025\/10\/293d5368b8a2124d88f02dd665ebd7e0-1024x555.png\" alt=\"\" width=\"800\" height=\"434\" srcset=\"https:\/\/developers.cyberagent.co.jp\/blog\/wp-content\/uploads\/2025\/10\/293d5368b8a2124d88f02dd665ebd7e0-1024x555.png 1024w, https:\/\/developers.cyberagent.co.jp\/blog\/wp-content\/uploads\/2025\/10\/293d5368b8a2124d88f02dd665ebd7e0-300x163.png 300w, https:\/\/developers.cyberagent.co.jp\/blog\/wp-content\/uploads\/2025\/10\/293d5368b8a2124d88f02dd665ebd7e0-768x416.png 768w, https:\/\/developers.cyberagent.co.jp\/blog\/wp-content\/uploads\/2025\/10\/293d5368b8a2124d88f02dd665ebd7e0-1536x833.png 1536w, https:\/\/developers.cyberagent.co.jp\/blog\/wp-content\/uploads\/2025\/10\/293d5368b8a2124d88f02dd665ebd7e0.png 1590w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\"\/><\/p>\n<p class=\"text-node\">\u300cs3tables\u306b\u95a2\u3059\u308bMCP\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u7de0\u5207\u304c\u3044\u3064\u307e\u3067\u304b\u5206\u304b\u308a\u307e\u3059\u304b\uff1f\u300d\u3068\u5c0b\u306d\u308b\u3068\u3001\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u62fe\u3063\u3066\u521d\u56de\u30ea\u30ea\u30fc\u30b9\u304c 10 \u6708 20 \u65e5\u3060\u3068\u8981\u7d04\u3057\u3066\u304f\u308c\u307e\u3057\u305f\u3002<\/p>\n<h2 id=\"d47de435-28be-4b07-8dc8-97cceae0cd17\" class=\"heading-node\">\u304a\u308f\u308a\u306b<\/h2>\n<p class=\"text-node\">\u3053\u308c\u3067\u3001Claude \u304b\u3089 Athena \u3092\u7d4c\u7531\u3057\u3066 S3 Tables \u306b\u81ea\u7136\u8a00\u8a9e\u3067\u30a2\u30af\u30bb\u30b9\u3067\u304d\u308b\u30b5\u30fc\u30d0\u30fc\u30ec\u30b9 MCP \u74b0\u5883\u304c\u5b8c\u6210\u3057\u307e\u3057\u305f\u3002MCP \u30b5\u30fc\u30d0\u30fc\u3092\u901a\u3058\u3066\u81ea\u7136\u6587\u3067\u30c7\u30fc\u30bf\u306b\u30a2\u30af\u30bb\u30b9\u3067\u304d\u308b\u305f\u3081\u3001\u793e\u5185\u306e\u3061\u3087\u3063\u3068\u3057\u305f\u300c\u7de0\u5207\u3044\u3064\uff1f\u300d\u306e\u3088\u3046\u306a\u554f\u3044\u5408\u308f\u305b\u306b\u3082\u7d20\u65e9\u304f\u5fdc\u7b54\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\u3002<\/p>\n<p class=\"text-node\">\u4eca\u5f8c\u306f\u3001execute_query \u306b\u30af\u30a8\u30ea\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3092\u8ffd\u52a0\u3057\u3066\u5b89\u5168\u6027\u3092\u9ad8\u3081\u305f\u308a\u3001SSO \u3084\u6a29\u9650\u7ba1\u7406\u3092\u5c0e\u5165\u3057\u3066 Lambda \u3084 S3 Tables \u3078\u306e\u30a2\u30af\u30bb\u30b9\u3092\u53b3\u5bc6\u306b\u5236\u5fa1\u3057\u3066\u307f\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002\u4eca\u56de\u69cb\u7bc9\u3057\u305f\u74b0\u5883\u3092\u30d9\u30fc\u30b9\u306b\u3001\u793e\u5185\u5916\u5411\u3051\u306e\u81ea\u7136\u8a00\u8a9e\u691c\u7d22\u3084\u30c7\u30fc\u30bf\u6d3b\u7528\u306e\u53c2\u8003\u3068\u3057\u3066\u5f79\u306b\u7acb\u3066\u308c\u3070\u5e78\u3044\u3067\u3059\u3002<\/p>\n<h2 id=\"2c482725-1a60-499a-8952-cd4cb5b79085\" class=\"heading-node\">\u53c2\u8003<\/h2>\n<p><a target=\"_blank\" href=\"https:\/\/github.com\/awslabs\/mcp\/tree\/8d90be5c403af4829a45d8f03093f830ffed6285\/src\/mcp-lambda-handler\">AWS MCP Lambda Handler GitHub<\/a><\/p>\n<p><a target=\"_blank\" href=\"https:\/\/docs.aws.amazon.com\/ja_jp\/AmazonS3\/latest\/userguide\/s3-tables.html\">Amazon S3 Tables \u3068\u30c6\u30fc\u30d6\u30eb\u30d0\u30b1\u30c3\u30c8\u306e\u4f7f\u7528<\/a><\/p>\n<p>    <!-- .entry-footer --><\/p>\n<div class=\"entryNav\">\n<div class=\"entryNav__box\"><a target=\"_blank\" class=\"entryNav_link entryNav_previous\" style=\"background-image:url(https:\/\/developers.cyberagent.co.jp\/blog\/wp-content\/uploads\/2025\/10\/PXL_20250910_015956500-1024x712.jpeg)\" href=\"https:\/\/developers.cyberagent.co.jp\/blog\/archives\/59263\/\"><\/p>\n<p>DroidKaigi 2025\u306b\u53c2\u52a0\u3057\u307e\u3057\u305f<\/p>\n<p>\u6b21\u306e\u8a18\u4e8b<\/p>\n<p><\/a><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<p><script>(function(d, s, id) {\n          var js, fjs = d.getElementsByTagName(s)[0];\n          if (d.getElementById(id)) return;\n          js = d.createElement(s); js.id = id;\n          js.src = \"\/\/connect.facebook.net\/ja_JP\/sdk.js#xfbml=1&version=v2.8\";\n          fjs.parentNode.insertBefore(js, fjs);\n        }(document, 'script', 'facebook-jssdk'));<\/script><br \/>\n<br \/>\n<br \/><a href=\"https:\/\/developers.cyberagent.co.jp\/blog\/archives\/59292\/\">\u5143\u306e\u8a18\u4e8b\u3092\u78ba\u8a8d\u3059\u308b <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\u306f\u3058\u3081\u306b \u5168\u793e\u30c7\u30fc\u30bf\u6280\u8853\u5c40\u30c7\u30fc\u30bf\u30a4\u30f3\u30c6\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u30c1\u30fc\u30e0\u306b\u6240\u5c5e\u3057\u3066\u3044\u308b\u8207\u7530\u9f8d\u4eba\u3067\u3059\u3002 Amazon S3 Tables \u3092\u5229\u7528\u3057\u3066 Iceberg \u5f62\u5f0f\u3067\u30c7\u30fc\u30bf\u3092\u7ba1\u7406\u3059\u308b\u3068\u3001Iceberg \u30c6\u30fc\u30d6\u30eb\u306e\u81ea\u52d5\u30b3\u30f3\u30d1\u30af\u30b7\u30e7\u30f3\u3084 [&hellip;]","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[4],"tags":[],"class_list":["post-9382","post","type-post","status-publish","format-standard","hentry","category-company-tec"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>AWS Lambda + Bedrock + Athena \u3067 S3 Tables (Iceberg) \u306b\u81ea\u7136\u8a00\u8a9e\u3067\u30af\u30a8\u30ea\u3059\u308bMCP\u30b5\u30fc\u30d0\u30fc\u3092\u69cb\u7bc9\u3057\u3066\u307f\u305f - \u30dd\u30b1\u30b3\u30f3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/developers.cyberagent.co.jp\/blog\/archives\/59292\/\" \/>\n<meta property=\"og:locale\" content=\"ja_JP\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"AWS Lambda + Bedrock + Athena \u3067 S3 Tables (Iceberg) \u306b\u81ea\u7136\u8a00\u8a9e\u3067\u30af\u30a8\u30ea\u3059\u308bMCP\u30b5\u30fc\u30d0\u30fc\u3092\u69cb\u7bc9\u3057\u3066\u307f\u305f - \u30dd\u30b1\u30b3\u30f3\" \/>\n<meta property=\"og:description\" content=\"\u306f\u3058\u3081\u306b \u5168\u793e\u30c7\u30fc\u30bf\u6280\u8853\u5c40\u30c7\u30fc\u30bf\u30a4\u30f3\u30c6\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u30c1\u30fc\u30e0\u306b\u6240\u5c5e\u3057\u3066\u3044\u308b\u8207\u7530\u9f8d\u4eba\u3067\u3059\u3002 Amazon S3 Tables \u3092\u5229\u7528\u3057\u3066 Iceberg \u5f62\u5f0f\u3067\u30c7\u30fc\u30bf\u3092\u7ba1\u7406\u3059\u308b\u3068\u3001Iceberg \u30c6\u30fc\u30d6\u30eb\u306e\u81ea\u52d5\u30b3\u30f3\u30d1\u30af\u30b7\u30e7\u30f3\u3084 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/developers.cyberagent.co.jp\/blog\/archives\/59292\/\" \/>\n<meta property=\"og:site_name\" content=\"\u30dd\u30b1\u30b3\u30f3\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-13T23:21:24+00:00\" \/>\n<meta name=\"author\" content=\"info@pokecon.jp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u57f7\u7b46\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"info@pokecon.jp\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593\" \/>\n\t<meta name=\"twitter:data2\" content=\"9\u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/developers.cyberagent.co.jp\\\/blog\\\/archives\\\/59292\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/9382\\\/\"},\"author\":{\"name\":\"info@pokecon.jp\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\"},\"headline\":\"AWS Lambda + Bedrock + Athena \u3067 S3 Tables (Iceberg) \u306b\u81ea\u7136\u8a00\u8a9e\u3067\u30af\u30a8\u30ea\u3059\u308bMCP\u30b5\u30fc\u30d0\u30fc\u3092\u69cb\u7bc9\u3057\u3066\u307f\u305f\",\"datePublished\":\"2025-10-13T23:21:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/9382\\\/\"},\"wordCount\":151,\"image\":{\"@id\":\"https:\\\/\\\/developers.cyberagent.co.jp\\\/blog\\\/archives\\\/59292\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/developers.cyberagent.co.jp\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/dc833708e6b896d19d7ed04d47719485-300x61.png\",\"articleSection\":[\"\u4f01\u696d\u30c6\u30c3\u30af\"],\"inLanguage\":\"ja\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/9382\\\/\",\"url\":\"https:\\\/\\\/developers.cyberagent.co.jp\\\/blog\\\/archives\\\/59292\\\/\",\"name\":\"AWS Lambda + Bedrock + Athena \u3067 S3 Tables (Iceberg) \u306b\u81ea\u7136\u8a00\u8a9e\u3067\u30af\u30a8\u30ea\u3059\u308bMCP\u30b5\u30fc\u30d0\u30fc\u3092\u69cb\u7bc9\u3057\u3066\u307f\u305f - \u30dd\u30b1\u30b3\u30f3\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/developers.cyberagent.co.jp\\\/blog\\\/archives\\\/59292\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/developers.cyberagent.co.jp\\\/blog\\\/archives\\\/59292\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/developers.cyberagent.co.jp\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/dc833708e6b896d19d7ed04d47719485-300x61.png\",\"datePublished\":\"2025-10-13T23:21:24+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/developers.cyberagent.co.jp\\\/blog\\\/archives\\\/59292\\\/#breadcrumb\"},\"inLanguage\":\"ja\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/developers.cyberagent.co.jp\\\/blog\\\/archives\\\/59292\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\\\/\\\/developers.cyberagent.co.jp\\\/blog\\\/archives\\\/59292\\\/#primaryimage\",\"url\":\"https:\\\/\\\/developers.cyberagent.co.jp\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/dc833708e6b896d19d7ed04d47719485-300x61.png\",\"contentUrl\":\"https:\\\/\\\/developers.cyberagent.co.jp\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/dc833708e6b896d19d7ed04d47719485-300x61.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/developers.cyberagent.co.jp\\\/blog\\\/archives\\\/59292\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u30db\u30fc\u30e0\",\"item\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"AWS Lambda + Bedrock + Athena \u3067 S3 Tables (Iceberg) \u306b\u81ea\u7136\u8a00\u8a9e\u3067\u30af\u30a8\u30ea\u3059\u308bMCP\u30b5\u30fc\u30d0\u30fc\u3092\u69cb\u7bc9\u3057\u3066\u307f\u305f\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#website\",\"url\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/\",\"name\":\"\u30dd\u30b1\u30b3\u30f3\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ja\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\",\"name\":\"info@pokecon.jp\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"caption\":\"info@pokecon.jp\"},\"url\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/author\\\/infopokecon-jp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"AWS Lambda + Bedrock + Athena \u3067 S3 Tables (Iceberg) \u306b\u81ea\u7136\u8a00\u8a9e\u3067\u30af\u30a8\u30ea\u3059\u308bMCP\u30b5\u30fc\u30d0\u30fc\u3092\u69cb\u7bc9\u3057\u3066\u307f\u305f - \u30dd\u30b1\u30b3\u30f3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/developers.cyberagent.co.jp\/blog\/archives\/59292\/","og_locale":"ja_JP","og_type":"article","og_title":"AWS Lambda + Bedrock + Athena \u3067 S3 Tables (Iceberg) \u306b\u81ea\u7136\u8a00\u8a9e\u3067\u30af\u30a8\u30ea\u3059\u308bMCP\u30b5\u30fc\u30d0\u30fc\u3092\u69cb\u7bc9\u3057\u3066\u307f\u305f - \u30dd\u30b1\u30b3\u30f3","og_description":"\u306f\u3058\u3081\u306b \u5168\u793e\u30c7\u30fc\u30bf\u6280\u8853\u5c40\u30c7\u30fc\u30bf\u30a4\u30f3\u30c6\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u30c1\u30fc\u30e0\u306b\u6240\u5c5e\u3057\u3066\u3044\u308b\u8207\u7530\u9f8d\u4eba\u3067\u3059\u3002 Amazon S3 Tables \u3092\u5229\u7528\u3057\u3066 Iceberg \u5f62\u5f0f\u3067\u30c7\u30fc\u30bf\u3092\u7ba1\u7406\u3059\u308b\u3068\u3001Iceberg \u30c6\u30fc\u30d6\u30eb\u306e\u81ea\u52d5\u30b3\u30f3\u30d1\u30af\u30b7\u30e7\u30f3\u3084 [&hellip;]","og_url":"https:\/\/developers.cyberagent.co.jp\/blog\/archives\/59292\/","og_site_name":"\u30dd\u30b1\u30b3\u30f3","article_published_time":"2025-10-13T23:21:24+00:00","author":"info@pokecon.jp","twitter_card":"summary_large_image","twitter_misc":{"\u57f7\u7b46\u8005":"info@pokecon.jp","\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593":"9\u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/developers.cyberagent.co.jp\/blog\/archives\/59292\/#article","isPartOf":{"@id":"https:\/\/pokecon.jp\/job\/9382\/"},"author":{"name":"info@pokecon.jp","@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997"},"headline":"AWS Lambda + Bedrock + Athena \u3067 S3 Tables (Iceberg) \u306b\u81ea\u7136\u8a00\u8a9e\u3067\u30af\u30a8\u30ea\u3059\u308bMCP\u30b5\u30fc\u30d0\u30fc\u3092\u69cb\u7bc9\u3057\u3066\u307f\u305f","datePublished":"2025-10-13T23:21:24+00:00","mainEntityOfPage":{"@id":"https:\/\/pokecon.jp\/job\/9382\/"},"wordCount":151,"image":{"@id":"https:\/\/developers.cyberagent.co.jp\/blog\/archives\/59292\/#primaryimage"},"thumbnailUrl":"https:\/\/developers.cyberagent.co.jp\/blog\/wp-content\/uploads\/2025\/10\/dc833708e6b896d19d7ed04d47719485-300x61.png","articleSection":["\u4f01\u696d\u30c6\u30c3\u30af"],"inLanguage":"ja"},{"@type":"WebPage","@id":"https:\/\/pokecon.jp\/job\/9382\/","url":"https:\/\/developers.cyberagent.co.jp\/blog\/archives\/59292\/","name":"AWS Lambda + Bedrock + Athena \u3067 S3 Tables (Iceberg) \u306b\u81ea\u7136\u8a00\u8a9e\u3067\u30af\u30a8\u30ea\u3059\u308bMCP\u30b5\u30fc\u30d0\u30fc\u3092\u69cb\u7bc9\u3057\u3066\u307f\u305f - \u30dd\u30b1\u30b3\u30f3","isPartOf":{"@id":"https:\/\/pokecon.jp\/job\/#website"},"primaryImageOfPage":{"@id":"https:\/\/developers.cyberagent.co.jp\/blog\/archives\/59292\/#primaryimage"},"image":{"@id":"https:\/\/developers.cyberagent.co.jp\/blog\/archives\/59292\/#primaryimage"},"thumbnailUrl":"https:\/\/developers.cyberagent.co.jp\/blog\/wp-content\/uploads\/2025\/10\/dc833708e6b896d19d7ed04d47719485-300x61.png","datePublished":"2025-10-13T23:21:24+00:00","author":{"@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997"},"breadcrumb":{"@id":"https:\/\/developers.cyberagent.co.jp\/blog\/archives\/59292\/#breadcrumb"},"inLanguage":"ja","potentialAction":[{"@type":"ReadAction","target":["https:\/\/developers.cyberagent.co.jp\/blog\/archives\/59292\/"]}]},{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/developers.cyberagent.co.jp\/blog\/archives\/59292\/#primaryimage","url":"https:\/\/developers.cyberagent.co.jp\/blog\/wp-content\/uploads\/2025\/10\/dc833708e6b896d19d7ed04d47719485-300x61.png","contentUrl":"https:\/\/developers.cyberagent.co.jp\/blog\/wp-content\/uploads\/2025\/10\/dc833708e6b896d19d7ed04d47719485-300x61.png"},{"@type":"BreadcrumbList","@id":"https:\/\/developers.cyberagent.co.jp\/blog\/archives\/59292\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u30db\u30fc\u30e0","item":"https:\/\/pokecon.jp\/job\/"},{"@type":"ListItem","position":2,"name":"AWS Lambda + Bedrock + Athena \u3067 S3 Tables (Iceberg) \u306b\u81ea\u7136\u8a00\u8a9e\u3067\u30af\u30a8\u30ea\u3059\u308bMCP\u30b5\u30fc\u30d0\u30fc\u3092\u69cb\u7bc9\u3057\u3066\u307f\u305f"}]},{"@type":"WebSite","@id":"https:\/\/pokecon.jp\/job\/#website","url":"https:\/\/pokecon.jp\/job\/","name":"\u30dd\u30b1\u30b3\u30f3","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/pokecon.jp\/job\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ja"},{"@type":"Person","@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997","name":"info@pokecon.jp","image":{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","caption":"info@pokecon.jp"},"url":"https:\/\/pokecon.jp\/job\/author\/infopokecon-jp\/"}]}},"_links":{"self":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/9382","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/comments?post=9382"}],"version-history":[{"count":1,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/9382\/revisions"}],"predecessor-version":[{"id":9383,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/9382\/revisions\/9383"}],"wp:attachment":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/media?parent=9382"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/categories?post=9382"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/tags?post=9382"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}