{"id":2422,"date":"2025-03-24T08:47:27","date_gmt":"2025-03-23T23:47:27","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=2422"},"modified":"2025-03-24T08:47:51","modified_gmt":"2025-03-23T23:47:51","slug":"%e3%80%90%e4%bf%9d%e5%ad%98%e7%89%88%e3%80%91boto3%e3%81%a7dynamodb%e3%82%92%e4%bd%bf%e3%81%84%e9%81%94%e6%88%90%ef%bc%81%e5%ae%9f%e8%b7%b5%e7%9a%84%e3%81%aa%e5%ae%9f%e8%a3%85%e6%96%b9%e6%b3%95","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=2422","title":{"rendered":"\u3010\u4fdd\u5b58\u7248\u3011boto3\u3067DynamoDB\u3092\u4f7f\u3044\u9054\u6210\uff01\u5b9f\u8df5\u7684\u306a\u5b9f\u88c5\u65b9\u6cd5\u30685\u3064\u306e\u91cd\u8981\u306a\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9"},"content":{"rendered":"\n<div class=\"toc\"><br \/>\n<b>Warning<\/b>:  Undefined array key \"is_admin\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>116<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_category_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>121<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>128<\/b><br \/>\n    <div id=\"toc_container\" class=\"sgb-toc--bullets js-smooth-scroll\" data-dialog-title=\"\u76ee\u6b21\">\n      <p class=\"toc_title\">\u76ee\u6b21 <\/p>\n      <ul class=\"toc_list\">  <li class=\"first\">    <a href=\"#i-0\">boto3\u3068DynamoDB\u306e\u57fa\u672c\u6982\u5ff5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">boto3\u306eDynamoDB\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3068\u30ea\u30bd\u30fc\u30b9\u306e\u9055\u3044\u3092\u7406\u89e3\u3059\u308b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-4\">DynamoDB\u306e\u30ad\u30fc\u6982\u5ff5\u3068\u8a2d\u8a08\u539f\u5247\u3092\u62bc\u3055\u3048\u308b<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-8\">boto3\u3067\u306eDynamoDB\u64cd\u4f5c\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-9\">\u30c6\u30fc\u30d6\u30eb\u306e\u4f5c\u6210\u3068\u524a\u9664\u3092\u78ba\u5b9f\u306b\u884c\u3046\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-10\">\u9805\u76ee\u306e\u8ffd\u52a0\u3068\u66f4\u65b0\u3092\u52b9\u7387\u7684\u306b\u5b9f\u88c5\u3059\u308b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-13\">\u8907\u96d1\u306a\u66f8\u304d\u8fbc\u307f\u3068\u691c\u7d22\u3092\u6700\u9069\u5316\u3059\u308b<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-16\">\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3068\u30c7\u30d0\u30c3\u30b0\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-17\">\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5\u3092\u7406\u89e3\u3059\u308b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-20\">\u30c7\u30d0\u30c3\u30b0\u3068\u30ed\u30b0\u51fa\u529b\u306e\u52b9\u679c\u7684\u306a\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-23\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u624b\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-24\">\u30d0\u30c3\u30c1\u51e6\u7406\u306b\u3088\u308b\u51e6\u7406\u901f\u5ea6\u306e\u5411\u4e0a\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-27\">\u4e26\u5217\u51e6\u7406\u306e\u5b9f\u88c5\u3068\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\u306e\u91cd\u8981\u30dd\u30a4\u30f3\u30c8<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-31\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3068\u904b\u7528\u7ba1\u7406\u306e\u91cd\u8981\u30dd\u30a4\u30f3\u30c8<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-32\">IAM\u30dd\u30ea\u30b7\u30fc\u306e\u9069\u5207\u306a\u8a2d\u5b9a\u65b9\u6cd5\u3092\u7406\u89e3\u3059\u308b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-35\">\u6697\u53f7\u5316\u3068\u30a2\u30af\u30bb\u30b9\u5236\u5fa1\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>      <\/li>    <\/ul>  <\/li><\/ul>\n      <a href=\"#\" class=\"sgb-toc-button js-toc-button\" rel=\"nofollow\" data-open-dialog=\"true\"><i class=\"fa fa-list\"><\/i><span class=\"sgb-toc-button__text\">\u76ee\u6b21\u3078<\/span><\/a>\n    <\/div><\/div><h2 class=\"wp-block-heading\" id=\"i-0\">boto3\u3068DynamoDB\u306e\u57fa\u672c\u6982\u5ff5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">boto3\u306eDynamoDB\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3068\u30ea\u30bd\u30fc\u30b9\u306e\u9055\u3044\u3092\u7406\u89e3\u3059\u308b<\/h3>\n\n\n\n<p>boto3\u3067\u306f\u3001DynamoDB\u3092\u64cd\u4f5c\u3059\u308b\u65b9\u6cd5\u3068\u3057\u3066\u300c\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u300d\u3068\u300c\u30ea\u30bd\u30fc\u30b9\u300d\u3068\u3044\u30462\u3064\u306e\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u304c\u63d0\u4f9b\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u305d\u308c\u305e\u308c\u306e\u7279\u5fb4\u3092\u7406\u89e3\u3059\u308b\u3053\u3068\u3067\u3001\u9069\u5207\u306a\u4f7f\u3044\u5206\u3051\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-2\">\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9<\/h4>\n\n\n\n<p>\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u306f\u3001DynamoDB API\u3078\u306e\u4f4e\u30ec\u30d9\u30eb\u306a\u30a2\u30af\u30bb\u30b9\u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import boto3\n\n# \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u306e\u4f5c\u6210\ndynamodb_client = boto3.client('dynamodb')\n\n# \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3092\u4f7f\u7528\u3057\u305f\u30c6\u30fc\u30d6\u30eb\u4f5c\u6210\u306e\u4f8b\nresponse = dynamodb_client.create_table(\n    TableName='Users',\n    KeySchema=[\n        {\n            'AttributeName': 'user_id',\n            'KeyType': 'HASH'  # \u30d1\u30fc\u30c6\u30a3\u30b7\u30e7\u30f3\u30ad\u30fc\n        }\n    ],\n    AttributeDefinitions=[\n        {\n            'AttributeName': 'user_id',\n            'AttributeType': 'S'  # \u6587\u5b57\u5217\u578b\n        }\n    ],\n    BillingMode='PAY_PER_REQUEST'  # \u30aa\u30f3\u30c7\u30de\u30f3\u30c9\u8ab2\u91d1\u30e2\u30fc\u30c9\n)<\/pre>\n\n\n\n<p>\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u7279\u5fb4\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u3088\u308a\u8a73\u7d30\u306a\u5236\u5fa1\u304c\u53ef\u80fd<\/li>\n\n\n\n<li>\u5fdc\u7b54\u306b\u306f\u751f\u306eAWS API\u30ec\u30b9\u30dd\u30f3\u30b9\u304c\u542b\u307e\u308c\u308b<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u304c\u82e5\u5e72\u512a\u308c\u3066\u3044\u308b<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-3\">\u30ea\u30bd\u30fc\u30b9\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9<\/h4>\n\n\n\n<p>\u30ea\u30bd\u30fc\u30b9\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u306f\u3001\u3088\u308a\u76f4\u611f\u7684\u306a\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u6307\u5411\u306eAPI\u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30ea\u30bd\u30fc\u30b9\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u306e\u4f5c\u6210\ndynamodb = boto3.resource('dynamodb')\n\n# \u30ea\u30bd\u30fc\u30b9\u3092\u4f7f\u7528\u3057\u305f\u30c6\u30fc\u30d6\u30eb\u64cd\u4f5c\u306e\u4f8b\ntable = dynamodb.Table('Users')\n\n# \u30a2\u30a4\u30c6\u30e0\u306e\u8ffd\u52a0\ntable.put_item(\n    Item={\n        'user_id': '001',\n        'username': 'test_user',\n        'email': 'test@example.com'\n    }\n)<\/pre>\n\n\n\n<p>\u30ea\u30bd\u30fc\u30b9\u306e\u7279\u5fb4\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u3088\u308a\u76f4\u611f\u7684\u306aPython\u30e9\u30a4\u30af\u306a\u64cd\u4f5c\u304c\u53ef\u80fd<\/li>\n\n\n\n<li>\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u6307\u5411\u7684\u306a\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9<\/li>\n\n\n\n<li>\u9ad8\u30ec\u30d9\u30eb\u306a\u62bd\u8c61\u5316\u306b\u3088\u308a\u3001\u30b3\u30fc\u30c9\u304c\u30b7\u30f3\u30d7\u30eb\u306b\u306a\u308b<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-4\">DynamoDB\u306e\u30ad\u30fc\u6982\u5ff5\u3068\u8a2d\u8a08\u539f\u5247\u3092\u62bc\u3055\u3048\u308b<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-5\">1. \u30ad\u30fc\u8a2d\u8a08\u306e\u57fa\u672c<\/h4>\n\n\n\n<p>DynamoDB\u3067\u306f\u3001\u4ee5\u4e0b\u306e2\u7a2e\u985e\u306e\u30ad\u30fc\u3092\u4f7f\u7528\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d1\u30fc\u30c6\u30a3\u30b7\u30e7\u30f3\u30ad\u30fc\uff08\u5fc5\u9808\uff09\uff1a<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u306e\u5206\u6563\u914d\u7f6e\u3092\u6c7a\u5b9a\u3059\u308b<\/li>\n\n\n\n<li>\u4e00\u610f\u3067\u3042\u308b\u5fc5\u8981\u304c\u3042\u308b\uff08\u30bd\u30fc\u30c8\u30ad\u30fc\u3068\u7d44\u307f\u5408\u308f\u305b\u308b\u5834\u5408\u3092\u9664\u304f\uff09<\/li>\n\n\n\n<li>\u30bd\u30fc\u30c8\u30ad\u30fc\uff08\u30aa\u30d7\u30b7\u30e7\u30f3\uff09\uff1a<\/li>\n\n\n\n<li>\u30d1\u30fc\u30c6\u30a3\u30b7\u30e7\u30f3\u30ad\u30fc\u5185\u3067\u306e\u30c7\u30fc\u30bf\u306e\u4e26\u3073\u9806\u3092\u6c7a\u5b9a\u3059\u308b<\/li>\n\n\n\n<li>\u540c\u3058\u30d1\u30fc\u30c6\u30a3\u30b7\u30e7\u30f3\u30ad\u30fc\u3092\u6301\u3064\u9805\u76ee\u3092\u52b9\u7387\u7684\u306b\u691c\u7d22\u3067\u304d\u308b<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u8907\u5408\u30ad\u30fc\uff08\u30d1\u30fc\u30c6\u30a3\u30b7\u30e7\u30f3\u30ad\u30fc + \u30bd\u30fc\u30c8\u30ad\u30fc\uff09\u3092\u4f7f\u7528\u3057\u305f\u30c6\u30fc\u30d6\u30eb\u4f5c\u6210\ntable = dynamodb.create_table(\n    TableName='Orders',\n    KeySchema=[\n        {\n            'AttributeName': 'customer_id',  # \u30d1\u30fc\u30c6\u30a3\u30b7\u30e7\u30f3\u30ad\u30fc\n            'KeyType': 'HASH'\n        },\n        {\n            'AttributeName': 'order_date',   # \u30bd\u30fc\u30c8\u30ad\u30fc\n            'KeyType': 'RANGE'\n        }\n    ],\n    AttributeDefinitions=[\n        {\n            'AttributeName': 'customer_id',\n            'AttributeType': 'S'\n        },\n        {\n            'AttributeName': 'order_date',\n            'AttributeType': 'S'\n        }\n    ],\n    BillingMode='PAY_PER_REQUEST'\n)<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-6\">2. \u30c7\u30fc\u30bf\u30e2\u30c7\u30ea\u30f3\u30b0\u306e\u539f\u5247<\/h4>\n\n\n\n<p>DynamoDB\u306e\u52b9\u679c\u7684\u306a\u5229\u7528\u306e\u305f\u3081\u306b\u3001\u4ee5\u4e0b\u306e\u8a2d\u8a08\u539f\u5247\u3092\u7406\u89e3\u3059\u308b\u3053\u3068\u304c\u91cd\u8981\u3067\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u975e\u6b63\u898f\u5316\u3092\u6050\u308c\u306a\u3044<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>JOIN\u304c\u306a\u3044\u305f\u3081\u3001\u5fc5\u8981\u306a\u30c7\u30fc\u30bf\u306f1\u3064\u306e\u30c6\u30fc\u30d6\u30eb\u306b\u307e\u3068\u3081\u308b<\/li>\n\n\n\n<li>\u8aad\u307f\u53d6\u308a\u52b9\u7387\u3092\u512a\u5148\u3059\u308b<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30a2\u30af\u30bb\u30b9\u30d1\u30bf\u30fc\u30f3\u3092\u57fa\u306b\u8a2d\u8a08<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30af\u30a8\u30ea\u306e\u8981\u4ef6\u3092\u5148\u306b\u6c7a\u3081\u308b<\/li>\n\n\n\n<li>\u3088\u304f\u4f7f\u7528\u3055\u308c\u308b\u691c\u7d22\u30d1\u30bf\u30fc\u30f3\u3092\u57fa\u306b\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u4f5c\u6210<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5358\u4e00\u30c6\u30fc\u30d6\u30eb\u8a2d\u8a08\u306e\u8003\u616e<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8907\u6570\u306e\u30a8\u30f3\u30c6\u30a3\u30c6\u30a3\u30bf\u30a4\u30d7\u30921\u3064\u306e\u30c6\u30fc\u30d6\u30eb\u306b\u683c\u7d0d<\/li>\n\n\n\n<li>\u30aa\u30fc\u30d0\u30fc\u30d8\u30c3\u30c9\u3092\u6e1b\u3089\u3057\u3001\u30ec\u30a4\u30c6\u30f3\u30b7\u30fc\u3092\u6539\u5584<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u5358\u4e00\u30c6\u30fc\u30d6\u30eb\u8a2d\u8a08\u306e\u4f8b\ntable.put_item(\n    Item={\n        'PK': 'USER#001',          # \u30d1\u30fc\u30c6\u30a3\u30b7\u30e7\u30f3\u30ad\u30fc\n        'SK': 'PROFILE#BASIC',     # \u30bd\u30fc\u30c8\u30ad\u30fc\n        'entity_type': 'user',\n        'username': 'test_user',\n        'email': 'test@example.com',\n        'created_at': '2024-01-28'\n    }\n)\n\ntable.put_item(\n    Item={\n        'PK': 'USER#001',          # \u540c\u3058\u30e6\u30fc\u30b6\u30fc\u306b\u95a2\u9023\u3059\u308b\u6ce8\u6587\n        'SK': 'ORDER#2024-01-28',  # \u6ce8\u6587\u65e5\u3067\u30bd\u30fc\u30c8\n        'entity_type': 'order',\n        'order_id': 'ORD123',\n        'amount': 1500,\n        'status': 'completed'\n    }\n)<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-7\">3. \u30c7\u30fc\u30bf\u578b\u3068\u5c5e\u6027<\/h4>\n\n\n\n<p>DynamoDB\u3067\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u308b\u4e3b\u8981\u306a\u30c7\u30fc\u30bf\u578b\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b9\u30ab\u30e9\u30fc\u578b\uff1a\u6587\u5b57\u5217\uff08S\uff09\u3001\u6570\u5024\uff08N\uff09\u3001\u30d0\u30a4\u30ca\u30ea\uff08B\uff09\u3001\u30d6\u30fc\u30eb\uff08BOOL\uff09<\/li>\n\n\n\n<li>\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u578b\uff1a\u30ea\u30b9\u30c8\uff08L\uff09\u3001\u30de\u30c3\u30d7\uff08M\uff09<\/li>\n\n\n\n<li>\u30bb\u30c3\u30c8\u578b\uff1a\u6587\u5b57\u5217\u30bb\u30c3\u30c8\uff08SS\uff09\u3001\u6570\u5024\u30bb\u30c3\u30c8\uff08NS\uff09\u3001\u30d0\u30a4\u30ca\u30ea\u30bb\u30c3\u30c8\uff08BS\uff09<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u69d8\u3005\u306a\u30c7\u30fc\u30bf\u578b\u3092\u4f7f\u7528\u3057\u305f\u4f8b\ntable.put_item(\n    Item={\n        'product_id': 'PROD001',            # \u6587\u5b57\u5217\u578b\n        'price': Decimal('1999.99'),        # \u6570\u5024\u578b\n        'is_available': True,               # \u30d6\u30fc\u30eb\u578b\n        'tags': {'SS': ['electronics',      # \u6587\u5b57\u5217\u30bb\u30c3\u30c8\n                       'smartphone']},\n        'specs': {                          # \u30de\u30c3\u30d7\u578b\n            'color': 'black',\n            'weight': '180g',\n            'dimensions': {\n                'height': '150mm',\n                'width': '75mm',\n                'depth': '8mm'\n            }\n        },\n        'review_scores': [4.5, 4.8, 4.2]    # \u30ea\u30b9\u30c8\u578b\n    }\n)<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u57fa\u672c\u6982\u5ff5\u3092\u7406\u89e3\u3059\u308b\u3053\u3068\u3067\u3001boto3\u3092\u4f7f\u7528\u3057\u305fDynamoDB\u306e\u52b9\u679c\u7684\u306a\u5b9f\u88c5\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u6982\u5ff5\u3092\u57fa\u306b\u5177\u4f53\u7684\u306a\u5b9f\u88c5\u65b9\u6cd5\u3092\u898b\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-8\">boto3\u3067\u306eDynamoDB\u64cd\u4f5c\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-9\">\u30c6\u30fc\u30d6\u30eb\u306e\u4f5c\u6210\u3068\u524a\u9664\u3092\u78ba\u5b9f\u306b\u884c\u3046\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u30c6\u30fc\u30d6\u30eb\u306e\u4f5c\u6210\u3068\u524a\u9664\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30c7\u30d7\u30ed\u30a4\u3084\u30c6\u30b9\u30c8\u74b0\u5883\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3067\u91cd\u8981\u306a\u64cd\u4f5c\u3067\u3059\u3002\u4ee5\u4e0b\u306b\u3001\u78ba\u5b9f\u306a\u5b9f\u88c5\u65b9\u6cd5\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import boto3\nfrom botocore.exceptions import ClientError\nimport time\n\ndef create_table_safely(table_name):\n    \"\"\"\n    \u30c6\u30fc\u30d6\u30eb\u3092\u5b89\u5168\u306b\u4f5c\u6210\u3057\u3001\u5229\u7528\u53ef\u80fd\u306b\u306a\u308b\u307e\u3067\u5f85\u6a5f\u3059\u308b\u95a2\u6570\n\n    Args:\n        table_name (str): \u4f5c\u6210\u3059\u308b\u30c6\u30fc\u30d6\u30eb\u306e\u540d\u524d\n    Returns:\n        boto3.resource.Table: \u4f5c\u6210\u3055\u308c\u305f\u30c6\u30fc\u30d6\u30eb\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\n    \"\"\"\n    dynamodb = boto3.resource('dynamodb')\n\n    try:\n        # \u30c6\u30fc\u30d6\u30eb\u304c\u65e2\u306b\u5b58\u5728\u3059\u308b\u304b\u78ba\u8a8d\n        existing_table = dynamodb.Table(table_name)\n        existing_table.load()\n        print(f\"\u30c6\u30fc\u30d6\u30eb {table_name} \u306f\u65e2\u306b\u5b58\u5728\u3057\u307e\u3059\")\n        return existing_table\n\n    except ClientError as e:\n        if e.response['Error']['Code'] == 'ResourceNotFoundException':\n            # \u30c6\u30fc\u30d6\u30eb\u304c\u5b58\u5728\u3057\u306a\u3044\u5834\u5408\u306f\u65b0\u898f\u4f5c\u6210\n            table = dynamodb.create_table(\n                TableName=table_name,\n                KeySchema=[\n                    {\n                        'AttributeName': 'id',\n                        'KeyType': 'HASH'\n                    },\n                    {\n                        'AttributeName': 'created_at',\n                        'KeyType': 'RANGE'\n                    }\n                ],\n                AttributeDefinitions=[\n                    {\n                        'AttributeName': 'id',\n                        'AttributeType': 'S'\n                    },\n                    {\n                        'AttributeName': 'created_at',\n                        'AttributeType': 'S'\n                    }\n                ],\n                BillingMode='PAY_PER_REQUEST'\n            )\n\n            # \u30c6\u30fc\u30d6\u30eb\u304c\u5229\u7528\u53ef\u80fd\u306b\u306a\u308b\u307e\u3067\u5f85\u6a5f\n            table.meta.client.get_waiter('table_exists').wait(\n                TableName=table_name,\n                WaiterConfig={'Delay': 5, 'MaxAttempts': 24}\n            )\n            print(f\"\u30c6\u30fc\u30d6\u30eb {table_name} \u304c\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f\")\n            return table\n\n        raise  # \u305d\u306e\u4ed6\u306e\u30a8\u30e9\u30fc\u306f\u518draise\n\ndef delete_table_safely(table_name):\n    \"\"\"\n    \u30c6\u30fc\u30d6\u30eb\u3092\u5b89\u5168\u306b\u524a\u9664\u3057\u3001\u5b8c\u5168\u306b\u524a\u9664\u3055\u308c\u308b\u307e\u3067\u5f85\u6a5f\u3059\u308b\u95a2\u6570\n\n    Args:\n        table_name (str): \u524a\u9664\u3059\u308b\u30c6\u30fc\u30d6\u30eb\u306e\u540d\u524d\n    \"\"\"\n    dynamodb = boto3.resource('dynamodb')\n    table = dynamodb.Table(table_name)\n\n    try:\n        table.delete()\n        table.meta.client.get_waiter('table_not_exists').wait(\n            TableName=table_name,\n            WaiterConfig={'Delay': 5, 'MaxAttempts': 24}\n        )\n        print(f\"\u30c6\u30fc\u30d6\u30eb {table_name} \u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f\")\n\n    except ClientError as e:\n        if e.response['Error']['Code'] == 'ResourceNotFoundException':\n            print(f\"\u30c6\u30fc\u30d6\u30eb {table_name} \u306f\u65e2\u306b\u5b58\u5728\u3057\u307e\u305b\u3093\")\n        else:\n            raise<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">\u9805\u76ee\u306e\u8ffd\u52a0\u3068\u66f4\u65b0\u3092\u52b9\u7387\u7684\u306b\u5b9f\u88c5\u3059\u308b<\/h3>\n\n\n\n<p>DynamoDB\u3078\u306e\u30c7\u30fc\u30bf\u64cd\u4f5c\u3067\u306f\u3001\u5358\u4e00\u9805\u76ee\u306e\u64cd\u4f5c\u304b\u3089\u4e00\u62ec\u64cd\u4f5c\u307e\u3067\u3001\u69d8\u3005\u306a\u30b7\u30ca\u30ea\u30aa\u306b\u5bfe\u5fdc\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-11\">1. \u5358\u4e00\u9805\u76ee\u306e\u64cd\u4f5c<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">def crud_operations_example():\n    \"\"\"\u57fa\u672c\u7684\u306aCRUD\u64cd\u4f5c\u306e\u4f8b\"\"\"\n    dynamodb = boto3.resource('dynamodb')\n    table = dynamodb.Table('Users')\n\n    # Create: \u9805\u76ee\u306e\u8ffd\u52a0\n    table.put_item(\n        Item={\n            'id': 'user123',\n            'created_at': '2024-01-28T10:00:00Z',\n            'username': 'test_user',\n            'email': 'test@example.com',\n            'status': 'active'\n        },\n        # \u65e2\u5b58\u9805\u76ee\u306e\u4e0a\u66f8\u304d\u3092\u9632\u3050\u6761\u4ef6\u5f0f\n        ConditionExpression='attribute_not_exists(id)'\n    )\n\n    # Read: \u9805\u76ee\u306e\u53d6\u5f97\n    response = table.get_item(\n        Key={\n            'id': 'user123',\n            'created_at': '2024-01-28T10:00:00Z'\n        }\n    )\n    user = response.get('Item')\n\n    # Update: \u9805\u76ee\u306e\u66f4\u65b0\n    table.update_item(\n        Key={\n            'id': 'user123',\n            'created_at': '2024-01-28T10:00:00Z'\n        },\n        UpdateExpression='SET #status = :new_status, updated_at = :time',\n        ExpressionAttributeNames={\n            '#status': 'status'  # \u4e88\u7d04\u8a9e\u3092\u907f\u3051\u308b\u305f\u3081\n        },\n        ExpressionAttributeValues={\n            ':new_status': 'inactive',\n            ':time': '2024-01-28T11:00:00Z'\n        },\n        ReturnValues='ALL_NEW'  # \u66f4\u65b0\u5f8c\u306e\u9805\u76ee\u3092\u8fd4\u3059\n    )\n\n    # Delete: \u9805\u76ee\u306e\u524a\u9664\n    table.delete_item(\n        Key={\n            'id': 'user123',\n            'created_at': '2024-01-28T10:00:00Z'\n        }\n    )<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-12\">2. \u30d0\u30c3\u30c1\u64cd\u4f5c\u3068\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3<\/h4>\n\n\n\n<p>\u8907\u6570\u306e\u9805\u76ee\u3092\u52b9\u7387\u7684\u306b\u64cd\u4f5c\u3059\u308b\u65b9\u6cd5\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">def batch_operations_example():\n    \"\"\"\u30d0\u30c3\u30c1\u64cd\u4f5c\u306e\u4f8b\"\"\"\n    dynamodb = boto3.resource('dynamodb')\n    table = dynamodb.Table('Users')\n\n    # \u30d0\u30c3\u30c1\u66f8\u304d\u8fbc\u307f\n    with table.batch_writer() as batch:\n        for i in range(10):\n            batch.put_item(\n                Item={\n                    'id': f'user{i}',\n                    'created_at': f'2024-01-28T10:{i:02d}:00Z',\n                    'username': f'test_user_{i}',\n                    'email': f'test{i}@example.com'\n                }\n            )\n\n    # \u30d0\u30c3\u30c1\u53d6\u5f97\n    response = dynamodb.batch_get_item(\n        RequestItems={\n            'Users': {\n                'Keys': [\n                    {\n                        'id': f'user{i}',\n                        'created_at': f'2024-01-28T10:{i:02d}:00Z'\n                    }\n                    for i in range(3)  # \u6700\u521d\u306e3\u4ef6\u3092\u53d6\u5f97\n                ]\n            }\n        }\n    )<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-13\">\u8907\u96d1\u306a\u66f8\u304d\u8fbc\u307f\u3068\u691c\u7d22\u3092\u6700\u9069\u5316\u3059\u308b<\/h3>\n\n\n\n<p>\u3088\u308a\u9ad8\u5ea6\u306a\u64cd\u4f5c\u3068\u6700\u9069\u5316\u30c6\u30af\u30cb\u30c3\u30af\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-14\">1. \u6761\u4ef6\u4ed8\u304d\u66f4\u65b0<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">def conditional_update_example():\n    \"\"\"\u6761\u4ef6\u4ed8\u304d\u66f4\u65b0\u306e\u4f8b\"\"\"\n    dynamodb = boto3.resource('dynamodb')\n    table = dynamodb.Table('Users')\n\n    try:\n        # \u30dd\u30a4\u30f3\u30c8\u304c1000\u672a\u6e80\u306e\u5834\u5408\u306e\u307f\u66f4\u65b0\n        response = table.update_item(\n            Key={\n                'id': 'user123',\n                'created_at': '2024-01-28T10:00:00Z'\n            },\n            UpdateExpression='SET points = points + :points',\n            ConditionExpression='points &lt; :max_points',\n            ExpressionAttributeValues={\n                ':points': 100,\n                ':max_points': 1000\n            },\n            ReturnValues='UPDATED_NEW'\n        )\n        print(\"\u66f4\u65b0\u6210\u529f:\", response['Attributes'])\n\n    except ClientError as e:\n        if e.response['Error']['Code'] == 'ConditionalCheckFailedException':\n            print(\"\u6761\u4ef6\u3092\u6e80\u305f\u3055\u306a\u3044\u305f\u3081\u66f4\u65b0\u3092\u30b9\u30ad\u30c3\u30d7\")\n        else:\n            raise<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-15\">2. \u9ad8\u5ea6\u306a\u30af\u30a8\u30ea\u3068\u691c\u7d22<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">def advanced_query_example():\n    \"\"\"\u9ad8\u5ea6\u306a\u30af\u30a8\u30ea\u306e\u4f8b\"\"\"\n    dynamodb = boto3.resource('dynamodb')\n    table = dynamodb.Table('Users')\n\n    # \u7279\u5b9a\u306e\u671f\u9593\u306e\u30a2\u30af\u30c6\u30a3\u30d6\u30e6\u30fc\u30b6\u30fc\u3092\u691c\u7d22\n    response = table.query(\n        KeyConditionExpression='id = :user_id AND created_at BETWEEN :start AND :end',\n        FilterExpression='#status = :status',\n        ExpressionAttributeNames={\n            '#status': 'status'\n        },\n        ExpressionAttributeValues={\n            ':user_id': 'user123',\n            ':start': '2024-01-01T00:00:00Z',\n            ':end': '2024-01-31T23:59:59Z',\n            ':status': 'active'\n        }\n    )\n\n    # \u30da\u30fc\u30b8\u30cd\u30fc\u30b7\u30e7\u30f3\u51e6\u7406\n    while 'LastEvaluatedKey' in response:\n        response = table.query(\n            KeyConditionExpression='id = :user_id AND created_at BETWEEN :start AND :end',\n            FilterExpression='#status = :status',\n            ExpressionAttributeNames={\n                '#status': 'status'\n            },\n            ExpressionAttributeValues={\n                ':user_id': 'user123',\n                ':start': '2024-01-01T00:00:00Z',\n                ':end': '2024-01-31T23:59:59Z',\n                ':status': 'active'\n            },\n            ExclusiveStartKey=response['LastEvaluatedKey']\n        )<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u4f8b\u306f\u3001\u5b9f\u969b\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u958b\u767a\u3067\u5fc5\u8981\u3068\u306a\u308b\u4e3b\u8981\u306a\u64cd\u4f5c\u3092\u30ab\u30d0\u30fc\u3057\u3066\u3044\u307e\u3059\u3002\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3084\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306b\u3064\u3044\u3066\u306f\u3001\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u8a73\u3057\u304f\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-16\">\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3068\u30c7\u30d0\u30c3\u30b0\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5\u3092\u7406\u89e3\u3059\u308b<\/h3>\n\n\n\n<p>DynamoDB\u3092\u4f7f\u7528\u3059\u308b\u969b\u306b\u906d\u9047\u3059\u308b\u53ef\u80fd\u6027\u306e\u9ad8\u3044\u30a8\u30e9\u30fc\u3068\u305d\u306e\u9069\u5207\u306a\u5bfe\u51e6\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-18\">1. \u4e3b\u8981\u306a\u30a8\u30e9\u30fc\u30bf\u30a4\u30d7\u3068\u305d\u306e\u5bfe\u51e6\u6cd5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import boto3\nfrom botocore.exceptions import ClientError\nimport logging\nfrom decimal import Decimal\nimport time\n\n# \u30ed\u30ac\u30fc\u306e\u8a2d\u5b9a\nlogger = logging.getLogger(__name__)\nlogger.setLevel(logging.INFO)\n\ndef handle_common_errors(func):\n    \"\"\"\n    \u4e00\u822c\u7684\u306aDynamoDB\u30a8\u30e9\u30fc\u3092\u51e6\u7406\u3059\u308b\u30c7\u30b3\u30ec\u30fc\u30bf\n\n    Args:\n        func: \u30c7\u30b3\u30ec\u30fc\u30c8\u5bfe\u8c61\u306e\u95a2\u6570\n    Returns:\n        wrapper: \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u6a5f\u80fd\u3092\u8ffd\u52a0\u3057\u305f\u95a2\u6570\n    \"\"\"\n    def wrapper(*args, **kwargs):\n        max_retries = 3\n        retry_count = 0\n\n        while retry_count &lt; max_retries:\n            try:\n                return func(*args, **kwargs)\n\n            except ClientError as e:\n                error_code = e.response['Error']['Code']\n                error_message = e.response['Error']['Message']\n\n                if error_code == 'ProvisionedThroughputExceededException':\n                    # \u30b9\u30ed\u30c3\u30c8\u30ea\u30f3\u30b0\u30a8\u30e9\u30fc\u306e\u5834\u5408\u306f\u6307\u6570\u30d0\u30c3\u30af\u30aa\u30d5\u3067\u518d\u8a66\u884c\n                    retry_count += 1\n                    if retry_count &lt; max_retries:\n                        sleep_time = (2 ** retry_count) * 0.1\n                        logger.warning(f\"\u30b9\u30ed\u30c3\u30c8\u30ea\u30f3\u30b0\u767a\u751f\u3002{sleep_time}\u79d2\u5f8c\u306b\u518d\u8a66\u884c ({retry_count}\/{max_retries})\")\n                        time.sleep(sleep_time)\n                        continue\n\n                elif error_code == 'ConditionalCheckFailedException':\n                    logger.error(\"\u6761\u4ef6\u30c1\u30a7\u30c3\u30af\u306b\u5931\u6557\u3057\u307e\u3057\u305f\")\n                    raise ValueError(\"\u6761\u4ef6\u30c1\u30a7\u30c3\u30af\u306b\u5931\u6557\u3057\u307e\u3057\u305f\") from e\n\n                elif error_code == 'ResourceNotFoundException':\n                    logger.error(\"\u6307\u5b9a\u3055\u308c\u305f\u30ea\u30bd\u30fc\u30b9\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\")\n                    raise ValueError(\"\u30c6\u30fc\u30d6\u30eb\u307e\u305f\u306f\u9805\u76ee\u304c\u5b58\u5728\u3057\u307e\u305b\u3093\") from e\n\n                elif error_code == 'ValidationException':\n                    logger.error(f\"\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30a8\u30e9\u30fc: {error_message}\")\n                    raise ValueError(f\"\u5165\u529b\u5024\u304c\u4e0d\u6b63\u3067\u3059: {error_message}\") from e\n\n                else:\n                    logger.error(f\"\u4e88\u671f\u305b\u306c\u30a8\u30e9\u30fc\uff08{error_code}\uff09: {error_message}\")\n                    raise\n\n            except Exception as e:\n                logger.error(f\"\u4e88\u671f\u305b\u306c\u30a8\u30e9\u30fc: {str(e)}\")\n                raise\n\n        raise Exception(f\"\u6700\u5927\u518d\u8a66\u884c\u56de\u6570\uff08{max_retries}\u56de\uff09\u3092\u8d85\u3048\u307e\u3057\u305f\")\n\n    return wrapper\n\n# \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u5b9f\u88c5\u4f8b\nclass DynamoDBOperations:\n    def __init__(self, table_name):\n        self.dynamodb = boto3.resource('dynamodb')\n        self.table = self.dynamodb.Table(table_name)\n\n    @handle_common_errors\n    def safe_put_item(self, item):\n        \"\"\"\n        \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u6a5f\u80fd\u4ed8\u304d\u306eput_item\u64cd\u4f5c\n\n        Args:\n            item (dict): \u8ffd\u52a0\u3059\u308b\u9805\u76ee\u306e\u30c7\u30fc\u30bf\n        Returns:\n            dict: DynamoDB\u306e\u30ec\u30b9\u30dd\u30f3\u30b9\n        \"\"\"\n        return self.table.put_item(Item=item)\n\n    @handle_common_errors\n    def safe_update_item(self, key, update_expression, expression_values):\n        \"\"\"\n        \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u6a5f\u80fd\u4ed8\u304d\u306eupdate_item\u64cd\u4f5c\n\n        Args:\n            key (dict): \u66f4\u65b0\u3059\u308b\u9805\u76ee\u306e\u30ad\u30fc\n            update_expression (str): \u66f4\u65b0\u5f0f\n            expression_values (dict): \u66f4\u65b0\u5f0f\u3067\u4f7f\u7528\u3059\u308b\u5024\n        Returns:\n            dict: DynamoDB\u306e\u30ec\u30b9\u30dd\u30f3\u30b9\n        \"\"\"\n        return self.table.update_item(\n            Key=key,\n            UpdateExpression=update_expression,\n            ExpressionAttributeValues=expression_values,\n            ReturnValues='UPDATED_NEW'\n        )<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-19\">2. \u30c7\u30fc\u30bf\u578b\u306b\u95a2\u3059\u308b\u30a8\u30e9\u30fc\u306e\u9632\u6b62<\/h4>\n\n\n\n<p>DynamoDB\u3067\u306f\u3001\u7279\u306b\u6570\u5024\u578b\u306e\u53d6\u308a\u6271\u3044\u306b\u6ce8\u610f\u304c\u5fc5\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from decimal import Decimal\nimport json\n\nclass DecimalEncoder(json.JSONEncoder):\n    \"\"\"JSON\u5909\u63db\u6642\u306bDecimal\u578b\u3092\u51e6\u7406\u3059\u308b\u305f\u3081\u306e\u30a8\u30f3\u30b3\u30fc\u30c0\u30fc\"\"\"\n    def default(self, obj):\n        if isinstance(obj, Decimal):\n            return str(obj)\n        return super(DecimalEncoder, self).default(obj)\n\ndef handle_decimal_data():\n    \"\"\"Decimal\u578b\u30c7\u30fc\u30bf\u306e\u6b63\u3057\u3044\u53d6\u308a\u6271\u3044\u4f8b\"\"\"\n    # \u6b63\u3057\u3044\u5b9f\u88c5\n    item = {\n        'id': 'product1',\n        'price': Decimal('19.99'),  # \u6587\u5b57\u5217\u304b\u3089Decimal\u3092\u751f\u6210\n        'quantity': Decimal(10)     # \u6574\u6570\u304b\u3089Decimal\u3092\u751f\u6210\n    }\n\n    # JSON\u3068\u306e\u76f8\u4e92\u5909\u63db\n    json_str = json.dumps(item, cls=DecimalEncoder)\n    print(f\"JSON\u6587\u5b57\u5217: {json_str}\")\n\n    # JSON\u6587\u5b57\u5217\u304b\u3089\u306e\u5fa9\u5143\u6642\u306fDecimal\u306b\u5909\u63db\n    loaded_item = json.loads(\n        json_str,\n        parse_float=Decimal  # \u6d6e\u52d5\u5c0f\u6570\u70b9\u6570\u3092Decimal\u3068\u3057\u3066\u89e3\u91c8\n    )\n    print(f\"\u5fa9\u5143\u3055\u308c\u305f\u30c7\u30fc\u30bf: {loaded_item}\")<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-20\">\u30c7\u30d0\u30c3\u30b0\u3068\u30ed\u30b0\u51fa\u529b\u306e\u52b9\u679c\u7684\u306a\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u52b9\u679c\u7684\u306a\u30c7\u30d0\u30c3\u30b0\u3068\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u306e\u305f\u3081\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-21\">1. \u69cb\u9020\u5316\u30ed\u30b0\u306e\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import logging\nimport json\nfrom datetime import datetime\n\nclass DynamoDBLogger:\n    \"\"\"DynamoDB\u64cd\u4f5c\u306e\u30ed\u30b0\u51fa\u529b\u3092\u884c\u3046\u30af\u30e9\u30b9\"\"\"\n\n    def __init__(self, service_name):\n        self.logger = logging.getLogger(service_name)\n        self.logger.setLevel(logging.INFO)\n\n        # \u30ed\u30b0\u30cf\u30f3\u30c9\u30e9\u30fc\u306e\u8a2d\u5b9a\n        handler = logging.StreamHandler()\n        formatter = logging.Formatter(\n            '%(asctime)s - %(name)s - %(levelname)s - %(message)s'\n        )\n        handler.setFormatter(formatter)\n        self.logger.addHandler(handler)\n\n    def log_operation(self, operation_name, request_params, response=None, error=None):\n        \"\"\"\n        DynamoDB\u64cd\u4f5c\u3092\u30ed\u30b0\u51fa\u529b\u3059\u308b\n\n        Args:\n            operation_name (str): \u64cd\u4f5c\u306e\u540d\u524d\n            request_params (dict): \u30ea\u30af\u30a8\u30b9\u30c8\u30d1\u30e9\u30e1\u30fc\u30bf\n            response (dict, optional): \u30ec\u30b9\u30dd\u30f3\u30b9\n            error (Exception, optional): \u30a8\u30e9\u30fc\u60c5\u5831\n        \"\"\"\n        log_entry = {\n            'timestamp': datetime.utcnow().isoformat(),\n            'operation': operation_name,\n            'request': request_params\n        }\n\n        if response:\n            log_entry['response'] = response\n            level = logging.INFO\n\n        if error:\n            log_entry['error'] = {\n                'type': error.__class__.__name__,\n                'message': str(error)\n            }\n            level = logging.ERROR\n\n        self.logger.log(\n            level,\n            json.dumps(log_entry, cls=DecimalEncoder, indent=2)\n        )\n\n# \u4f7f\u7528\u4f8b\ndef debug_example():\n    \"\"\"\u30c7\u30d0\u30c3\u30b0\u6a5f\u80fd\u306e\u4f7f\u7528\u4f8b\"\"\"\n    logger = DynamoDBLogger('MyService')\n    db_ops = DynamoDBOperations('MyTable')\n\n    try:\n        # \u64cd\u4f5c\u306e\u5b9f\u884c\n        request_params = {\n            'id': 'user123',\n            'name': 'Test User',\n            'points': Decimal('100')\n        }\n\n        logger.log_operation(\n            'put_item',\n            request_params\n        )\n\n        response = db_ops.safe_put_item(request_params)\n\n        logger.log_operation(\n            'put_item',\n            request_params,\n            response=response\n        )\n\n    except Exception as e:\n        logger.log_operation(\n            'put_item',\n            request_params,\n            error=e\n        )\n        raise<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-22\">2. \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import time\nfrom functools import wraps\n\ndef measure_performance(func):\n    \"\"\"\n    \u95a2\u6570\u306e\u5b9f\u884c\u6642\u9593\u3092\u8a08\u6e2c\u3059\u308b\u30c7\u30b3\u30ec\u30fc\u30bf\n\n    Args:\n        func: \u8a08\u6e2c\u5bfe\u8c61\u306e\u95a2\u6570\n    Returns:\n        wrapper: \u8a08\u6e2c\u6a5f\u80fd\u3092\u8ffd\u52a0\u3057\u305f\u95a2\u6570\n    \"\"\"\n    @wraps(func)\n    def wrapper(*args, **kwargs):\n        start_time = time.time()\n        result = func(*args, **kwargs)\n        end_time = time.time()\n\n        logger.info(\n            f\"Performance: {func.__name__} took {(end_time - start_time) * 1000:.2f}ms\"\n        )\n        return result\n    return wrapper\n\nclass PerformanceMonitor:\n    \"\"\"DynamoDB\u64cd\u4f5c\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u3059\u308b\u30af\u30e9\u30b9\"\"\"\n\n    def __init__(self):\n        self.operations = {}\n\n    def record_operation(self, operation_name, duration):\n        \"\"\"\n        \u64cd\u4f5c\u306e\u5b9f\u884c\u6642\u9593\u3092\u8a18\u9332\n\n        Args:\n            operation_name (str): \u64cd\u4f5c\u306e\u540d\u524d\n            duration (float): \u5b9f\u884c\u6642\u9593\uff08\u79d2\uff09\n        \"\"\"\n        if operation_name not in self.operations:\n            self.operations[operation_name] = {\n                'count': 0,\n                'total_time': 0,\n                'min_time': float('inf'),\n                'max_time': 0\n            }\n\n        stats = self.operations[operation_name]\n        stats['count'] += 1\n        stats['total_time'] += duration\n        stats['min_time'] = min(stats['min_time'], duration)\n        stats['max_time'] = max(stats['max_time'], duration)\n\n    def get_statistics(self):\n        \"\"\"\n        \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u7d71\u8a08\u3092\u53d6\u5f97\n\n        Returns:\n            dict: \u64cd\u4f5c\u3054\u3068\u306e\u7d71\u8a08\u60c5\u5831\n        \"\"\"\n        stats = {}\n        for op_name, op_stats in self.operations.items():\n            avg_time = op_stats['total_time'] \/ op_stats['count']\n            stats[op_name] = {\n                'count': op_stats['count'],\n                'average_time': f\"{avg_time * 1000:.2f}ms\",\n                'min_time': f\"{op_stats['min_time'] * 1000:.2f}ms\",\n                'max_time': f\"{op_stats['max_time'] * 1000:.2f}ms\"\n            }\n        return stats\n\n# \u4f7f\u7528\u4f8b\nmonitor = PerformanceMonitor()\n\n@measure_performance\ndef monitored_operation():\n    \"\"\"\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u6a5f\u80fd\u4ed8\u304d\u306e\u64cd\u4f5c\u4f8b\"\"\"\n    db_ops = DynamoDBOperations('MyTable')\n    start_time = time.time()\n\n    try:\n        response = db_ops.safe_put_item({\n            'id': 'test123',\n            'data': 'test_data'\n        })\n\n        duration = time.time() - start_time\n        monitor.record_operation('put_item', duration)\n\n        return response\n\n    except Exception as e:\n        duration = time.time() - start_time\n        monitor.record_operation('put_item_error', duration)\n        raise<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3068\u30c7\u30d0\u30c3\u30b0\u306e\u5b9f\u88c5\u4f8b\u306f\u3001\u5b9f\u969b\u306e\u958b\u767a\u73fe\u5834\u3067\u5fc5\u8981\u3068\u306a\u308b\u4e3b\u8981\u306a\u30b7\u30ca\u30ea\u30aa\u3092\u30ab\u30d0\u30fc\u3057\u3066\u3044\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u57fa\u76e4\u306e\u4e0a\u306b\u7acb\u3063\u3066\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u624b\u6cd5\u3092\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-23\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u624b\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-24\">\u30d0\u30c3\u30c1\u51e6\u7406\u306b\u3088\u308b\u51e6\u7406\u901f\u5ea6\u306e\u5411\u4e0a\u65b9\u6cd5<\/h3>\n\n\n\n<p>DynamoDB\u306e\u64cd\u4f5c\u3092\u6700\u9069\u5316\u3059\u308b\u4e0a\u3067\u3001\u30d0\u30c3\u30c1\u51e6\u7406\u306f\u975e\u5e38\u306b\u91cd\u8981\u306a\u5f79\u5272\u3092\u679c\u305f\u3057\u307e\u3059\u3002\u4ee5\u4e0b\u306b\u3001\u52b9\u7387\u7684\u306a\u30d0\u30c3\u30c1\u51e6\u7406\u306e\u5b9f\u88c5\u65b9\u6cd5\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-25\">1. \u6700\u9069\u306a\u30d0\u30c3\u30c1\u30b5\u30a4\u30ba\u306e\u9078\u5b9a<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import boto3\nfrom typing import List, Dict, Any\nimport concurrent.futures\nfrom time import sleep\n\nclass BatchProcessor:\n    \"\"\"\u52b9\u7387\u7684\u306a\u30d0\u30c3\u30c1\u51e6\u7406\u3092\u5b9f\u88c5\u3059\u308b\u30af\u30e9\u30b9\"\"\"\n\n    def __init__(self, table_name: str, batch_size: int = 25):\n        \"\"\"\n        Args:\n            table_name (str): DynamoDB\u30c6\u30fc\u30d6\u30eb\u540d\n            batch_size (int): 1\u56de\u306e\u30d0\u30c3\u30c1\u51e6\u7406\u3067\u306e\u6700\u5927\u9805\u76ee\u6570\n        \"\"\"\n        self.dynamodb = boto3.resource('dynamodb')\n        self.table = self.dynamodb.Table(table_name)\n        self.batch_size = min(batch_size, 25)  # DynamoDB\u306e\u5236\u9650\u306f25\u9805\u76ee\n\n    def process_items_in_batches(self, items: List[Dict[str, Any]]) -&gt; Dict[str, int]:\n        \"\"\"\n        \u9805\u76ee\u30ea\u30b9\u30c8\u3092\u30d0\u30c3\u30c1\u3067\u51e6\u7406\u3059\u308b\n\n        Args:\n            items: \u51e6\u7406\u3059\u308b\u9805\u76ee\u306e\u30ea\u30b9\u30c8\n        Returns:\n            dict: \u51e6\u7406\u7d50\u679c\u306e\u7d71\u8a08\u60c5\u5831\n        \"\"\"\n        stats = {\n            'total_items': len(items),\n            'successful': 0,\n            'failed': 0\n        }\n\n        # \u30d0\u30c3\u30c1\u30b5\u30a4\u30ba\u3054\u3068\u306b\u5206\u5272\n        for i in range(0, len(items), self.batch_size):\n            batch = items[i:i + self.batch_size]\n\n            try:\n                with self.table.batch_writer(\n                    overwrite_by_pkeys=['id', 'sort_key']\n                ) as batch_writer:\n                    for item in batch:\n                        batch_writer.put_item(Item=item)\n\n                stats['successful'] += len(batch)\n\n            except Exception as e:\n                stats['failed'] += len(batch)\n                print(f\"\u30d0\u30c3\u30c1\u51e6\u7406\u30a8\u30e9\u30fc: {str(e)}\")\n\n            # \u30b9\u30ed\u30c3\u30c8\u30ea\u30f3\u30b0\u9632\u6b62\u306e\u305f\u3081\u306e\u77ed\u3044\u5f85\u6a5f\n            sleep(0.1)\n\n        return stats<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-26\">2. \u518d\u8a66\u884c\u3068\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u6700\u9069\u5316<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class OptimizedBatchProcessor(BatchProcessor):\n    \"\"\"\u518d\u8a66\u884c\u30ed\u30b8\u30c3\u30af\u3092\u6700\u9069\u5316\u3057\u305f\u30d0\u30c3\u30c1\u51e6\u7406\u30af\u30e9\u30b9\"\"\"\n\n    def __init__(self, table_name: str, batch_size: int = 25, max_retries: int = 3):\n        super().__init__(table_name, batch_size)\n        self.max_retries = max_retries\n\n    def process_batch_with_retry(self, batch: List[Dict[str, Any]]) -&gt; Dict[str, int]:\n        \"\"\"\n        \u518d\u8a66\u884c\u30ed\u30b8\u30c3\u30af\u4ed8\u304d\u306e\u30d0\u30c3\u30c1\u51e6\u7406\n\n        Args:\n            batch: \u51e6\u7406\u3059\u308b\u9805\u76ee\u306e\u30d0\u30c3\u30c1\n        Returns:\n            dict: \u51e6\u7406\u7d50\u679c\u306e\u7d71\u8a08\u60c5\u5831\n        \"\"\"\n        retry_count = 0\n        failed_items = batch\n        stats = {'processed': 0, 'failed': 0}\n\n        while failed_items and retry_count &lt; self.max_retries:\n            unprocessed_items = []\n\n            try:\n                with self.table.batch_writer() as batch_writer:\n                    for item in failed_items:\n                        try:\n                            batch_writer.put_item(Item=item)\n                            stats['processed'] += 1\n                        except Exception:\n                            unprocessed_items.append(item)\n\n            except Exception as e:\n                print(f\"\u30d0\u30c3\u30c1\u51e6\u7406\u30a8\u30e9\u30fc\uff08\u8a66\u884c{retry_count + 1}\uff09: {str(e)}\")\n                unprocessed_items.extend(failed_items)\n\n            failed_items = unprocessed_items\n            retry_count += 1\n\n            if failed_items:\n                sleep_time = (2 ** retry_count) * 0.1\n                sleep(sleep_time)\n\n        stats['failed'] = len(failed_items)\n        return stats<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-27\">\u4e26\u5217\u51e6\u7406\u306e\u5b9f\u88c5\u3068\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\u306e\u91cd\u8981\u30dd\u30a4\u30f3\u30c8<\/h3>\n\n\n\n<p>DynamoDB\u306e\u64cd\u4f5c\u3092\u4e26\u5217\u5316\u3059\u308b\u3053\u3068\u3067\u3001\u51e6\u7406\u901f\u5ea6\u3092\u5927\u5e45\u306b\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-28\">1. \u30b9\u30ec\u30c3\u30c9\u30d7\u30fc\u30eb\u3092\u4f7f\u7528\u3057\u305f\u4e26\u5217\u51e6\u7406<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ParallelProcessor:\n    \"\"\"\u4e26\u5217\u51e6\u7406\u3092\u5b9f\u88c5\u3059\u308b\u30af\u30e9\u30b9\"\"\"\n\n    def __init__(self, table_name: str, max_workers: int = 5):\n        \"\"\"\n        Args:\n            table_name (str): DynamoDB\u30c6\u30fc\u30d6\u30eb\u540d\n            max_workers (int): \u6700\u5927\u4e26\u5217\u5b9f\u884c\u6570\n        \"\"\"\n        self.table_name = table_name\n        self.max_workers = max_workers\n        self.batch_processor = OptimizedBatchProcessor(table_name)\n\n    def process_items_parallel(self, items: List[Dict[str, Any]]) -&gt; Dict[str, int]:\n        \"\"\"\n        \u9805\u76ee\u3092\u4e26\u5217\u51e6\u7406\u3059\u308b\n\n        Args:\n            items: \u51e6\u7406\u3059\u308b\u9805\u76ee\u306e\u30ea\u30b9\u30c8\n        Returns:\n            dict: \u51e6\u7406\u7d50\u679c\u306e\u7d71\u8a08\u60c5\u5831\n        \"\"\"\n        # \u30d0\u30c3\u30c1\u30b5\u30a4\u30ba\u3067\u5206\u5272\n        batches = [\n            items[i:i + self.batch_processor.batch_size]\n            for i in range(0, len(items), self.batch_processor.batch_size)\n        ]\n\n        total_stats = {'processed': 0, 'failed': 0}\n\n        with concurrent.futures.ThreadPoolExecutor(max_workers=self.max_workers) as executor:\n            future_to_batch = {\n                executor.submit(self.batch_processor.process_batch_with_retry, batch): batch\n                for batch in batches\n            }\n\n            for future in concurrent.futures.as_completed(future_to_batch):\n                try:\n                    stats = future.result()\n                    total_stats['processed'] += stats['processed']\n                    total_stats['failed'] += stats['failed']\n                except Exception as e:\n                    batch = future_to_batch[future]\n                    total_stats['failed'] += len(batch)\n                    print(f\"\u30d0\u30c3\u30c1\u51e6\u7406\u30a8\u30e9\u30fc: {str(e)}\")\n\n        return total_stats<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-29\">2. \u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\u3068\u30b9\u30ed\u30c3\u30c8\u30ea\u30f3\u30b0\u5bfe\u7b56<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class AdaptiveParallelProcessor(ParallelProcessor):\n    \"\"\"\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\u3092\u6700\u9069\u5316\u3057\u305f\u4e26\u5217\u51e6\u7406\u30af\u30e9\u30b9\"\"\"\n\n    def __init__(self, table_name: str, min_workers: int = 1, max_workers: int = 5):\n        super().__init__(table_name, max_workers)\n        self.min_workers = min_workers\n        self.current_workers = min_workers\n        self.error_count = 0\n\n    def adjust_workers(self, success: bool) -&gt; None:\n        \"\"\"\n        \u30b9\u30ed\u30c3\u30c8\u30ea\u30f3\u30b0\u306b\u57fa\u3065\u3044\u3066\u30ef\u30fc\u30ab\u30fc\u6570\u3092\u8abf\u6574\n\n        Args:\n            success (bool): \u76f4\u524d\u306e\u64cd\u4f5c\u304c\u6210\u529f\u3057\u305f\u304b\u3069\u3046\u304b\n        \"\"\"\n        if success:\n            self.error_count = 0\n            if self.current_workers &lt; self.max_workers:\n                self.current_workers = min(\n                    self.current_workers + 1,\n                    self.max_workers\n                )\n        else:\n            self.error_count += 1\n            if self.error_count &gt;= 3:  # 3\u56de\u9023\u7d9a\u30a8\u30e9\u30fc\u3067\u7e2e\u5c0f\n                self.current_workers = max(\n                    self.current_workers - 1,\n                    self.min_workers\n                )\n                self.error_count = 0\n\n    def process_items_adaptive(self, items: List[Dict[str, Any]]) -&gt; Dict[str, int]:\n        \"\"\"\n        \u9069\u5fdc\u7684\u306a\u4e26\u5217\u51e6\u7406\u3092\u5b9f\u884c\n\n        Args:\n            items: \u51e6\u7406\u3059\u308b\u9805\u76ee\u306e\u30ea\u30b9\u30c8\n        Returns:\n            dict: \u51e6\u7406\u7d50\u679c\u306e\u7d71\u8a08\u60c5\u5831\n        \"\"\"\n        total_stats = {'processed': 0, 'failed': 0}\n        batches = [\n            items[i:i + self.batch_processor.batch_size]\n            for i in range(0, len(items), self.batch_processor.batch_size)\n        ]\n\n        for i in range(0, len(batches), self.current_workers):\n            current_batches = batches[i:i + self.current_workers]\n\n            with concurrent.futures.ThreadPoolExecutor(\n                max_workers=len(current_batches)\n            ) as executor:\n                future_to_batch = {\n                    executor.submit(\n                        self.batch_processor.process_batch_with_retry,\n                        batch\n                    ): batch\n                    for batch in current_batches\n                }\n\n                for future in concurrent.futures.as_completed(future_to_batch):\n                    try:\n                        stats = future.result()\n                        total_stats['processed'] += stats['processed']\n                        total_stats['failed'] += stats['failed']\n                        self.adjust_workers(True)\n                    except Exception as e:\n                        batch = future_to_batch[future]\n                        total_stats['failed'] += len(batch)\n                        self.adjust_workers(False)\n                        print(f\"\u30d0\u30c3\u30c1\u51e6\u7406\u30a8\u30e9\u30fc: {str(e)}\")\n\n            # \u30d0\u30c3\u30c1\u9593\u306e\u5f85\u6a5f\u6642\u9593\u3092\u52d5\u7684\u306b\u8abf\u6574\n            sleep(0.1 * (self.current_workers \/ self.max_workers))\n\n        return total_stats<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-30\">3. \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6e2c\u5b9a\u3068\u6700\u9069\u5316<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class PerformanceOptimizer:\n    \"\"\"\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u3092\u652f\u63f4\u3059\u308b\u30af\u30e9\u30b9\"\"\"\n\n    def __init__(self, table_name: str):\n        self.table_name = table_name\n        self.processors = {\n            'batch': BatchProcessor(table_name),\n            'optimized_batch': OptimizedBatchProcessor(table_name),\n            'parallel': ParallelProcessor(table_name),\n            'adaptive': AdaptiveParallelProcessor(table_name)\n        }\n\n    def benchmark_processors(\n        self,\n        items: List[Dict[str, Any]],\n        iterations: int = 3\n    ) -&gt; Dict[str, Dict[str, float]]:\n        \"\"\"\n        \u5404\u51e6\u7406\u65b9\u5f0f\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u8a08\u6e2c\n\n        Args:\n            items: \u30c6\u30b9\u30c8\u7528\u306e\u9805\u76ee\u30ea\u30b9\u30c8\n            iterations: \u8a08\u6e2c\u306e\u7e70\u308a\u8fd4\u3057\u56de\u6570\n        Returns:\n            dict: \u5404\u51e6\u7406\u65b9\u5f0f\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u7d71\u8a08\n        \"\"\"\n        results = {}\n\n        for name, processor in self.processors.items():\n            print(f\"\\n{name}\u306e\u8a08\u6e2c\u3092\u958b\u59cb...\")\n            times = []\n\n            for i in range(iterations):\n                start_time = time.time()\n\n                if name == 'adaptive':\n                    stats = processor.process_items_adaptive(items)\n                elif name == 'parallel':\n                    stats = processor.process_items_parallel(items)\n                else:\n                    stats = processor.process_items_in_batches(items)\n\n                elapsed_time = time.time() - start_time\n                times.append(elapsed_time)\n\n                print(f\"\u5b9f\u884c {i + 1}: {elapsed_time:.2f}\u79d2\")\n                print(f\"\u51e6\u7406\u7d50\u679c: {stats}\")\n\n            results[name] = {\n                'avg_time': sum(times) \/ len(times),\n                'min_time': min(times),\n                'max_time': max(times)\n            }\n\n        return results\n\n# \u4f7f\u7528\u4f8b\ndef optimization_example():\n    \"\"\"\u6700\u9069\u5316\u624b\u6cd5\u306e\u4f7f\u7528\u4f8b\"\"\"\n    # \u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u306e\u6e96\u5099\n    items = [\n        {\n            'id': f'test{i}',\n            'sort_key': f'2024-01-28',\n            'data': f'test_data_{i}'\n        }\n        for i in range(1000)\n    ]\n\n    # \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u8a08\u6e2c\u306e\u5b9f\u884c\n    optimizer = PerformanceOptimizer('TestTable')\n    results = optimizer.benchmark_processors(items)\n\n    # \u7d50\u679c\u306e\u8868\u793a\n    print(\"\\n\u30d9\u30f3\u30c1\u30de\u30fc\u30af\u7d50\u679c:\")\n    for name, stats in results.items():\n        print(f\"\\n{name}:\")\n        print(f\"\u5e73\u5747\u5b9f\u884c\u6642\u9593: {stats['avg_time']:.2f}\u79d2\")\n        print(f\"\u6700\u5c0f\u5b9f\u884c\u6642\u9593: {stats['min_time']:.2f}\u79d2\")\n        print(f\"\u6700\u5927\u5b9f\u884c\u6642\u9593: {stats['max_time']:.2f}\u79d2\")<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u6700\u9069\u5316\u624b\u6cd5\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001DynamoDB\u306e\u64cd\u4f5c\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u5927\u5e45\u306b\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u6700\u9069\u5316\u3092\u5b89\u5168\u306b\u5b9f\u88c5\u3059\u308b\u305f\u3081\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3068\u904b\u7528\u7ba1\u7406\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-31\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3068\u904b\u7528\u7ba1\u7406\u306e\u91cd\u8981\u30dd\u30a4\u30f3\u30c8<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-32\">IAM\u30dd\u30ea\u30b7\u30fc\u306e\u9069\u5207\u306a\u8a2d\u5b9a\u65b9\u6cd5\u3092\u7406\u89e3\u3059\u308b<\/h3>\n\n\n\n<p>DynamoDB\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u78ba\u4fdd\u3059\u308b\u4e0a\u3067\u3001IAM\u30dd\u30ea\u30b7\u30fc\u306e\u9069\u5207\u306a\u8a2d\u5b9a\u306f\u975e\u5e38\u306b\u91cd\u8981\u3067\u3059\u3002\u4ee5\u4e0b\u306b\u3001\u5b89\u5168\u3067\u52b9\u7387\u7684\u306aIAM\u30dd\u30ea\u30b7\u30fc\u306e\u5b9f\u88c5\u65b9\u6cd5\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-33\">1. \u6700\u5c0f\u6a29\u9650\u306e\u539f\u5247\u306b\u57fa\u3065\u304fIAM\u30dd\u30ea\u30b7\u30fc<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import boto3\nimport json\nfrom typing import List, Dict\n\nclass IAMPolicyGenerator:\n    \"\"\"\u6700\u5c0f\u6a29\u9650\u306e\u539f\u5247\u306b\u57fa\u3065\u304fIAM\u30dd\u30ea\u30b7\u30fc\u3092\u751f\u6210\u3059\u308b\u30af\u30e9\u30b9\"\"\"\n\n    def __init__(self):\n        self.iam = boto3.client('iam')\n\n    def generate_table_policy(\n        self,\n        table_name: str,\n        actions: List[str],\n        condition: Dict = None\n    ) -&gt; Dict:\n        \"\"\"\n        DynamoDB\u30c6\u30fc\u30d6\u30eb\u306b\u5bfe\u3059\u308b\u6700\u5c0f\u6a29\u9650\u306e\u30dd\u30ea\u30b7\u30fc\u3092\u751f\u6210\n\n        Args:\n            table_name: \u5bfe\u8c61\u30c6\u30fc\u30d6\u30eb\u540d\n            actions: \u8a31\u53ef\u3059\u308b\u30a2\u30af\u30b7\u30e7\u30f3\uff08\u4f8b\uff1a['dynamodb:GetItem', 'dynamodb:PutItem']\uff09\n            condition: \u8ffd\u52a0\u306e\u6761\u4ef6\uff08\u30aa\u30d7\u30b7\u30e7\u30f3\uff09\n        Returns:\n            dict: IAM\u30dd\u30ea\u30b7\u30fc\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\n        \"\"\"\n        table_arn = f\"arn:aws:dynamodb:*:*:table\/{table_name}\"\n\n        policy = {\n            \"Version\": \"2012-10-17\",\n            \"Statement\": [\n                {\n                    \"Effect\": \"Allow\",\n                    \"Action\": actions,\n                    \"Resource\": [\n                        table_arn,\n                        f\"{table_arn}\/index\/*\"  # \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3078\u306e\u30a2\u30af\u30bb\u30b9\u3082\u542b\u3080\n                    ]\n                }\n            ]\n        }\n\n        if condition:\n            policy[\"Statement\"][0][\"Condition\"] = condition\n\n        return policy\n\n# \u4f7f\u7528\u4f8b\ndef policy_example():\n    \"\"\"IAM\u30dd\u30ea\u30b7\u30fc\u751f\u6210\u306e\u4f8b\"\"\"\n    generator = IAMPolicyGenerator()\n\n    # \u8aad\u307f\u53d6\u308a\u5c02\u7528\u30dd\u30ea\u30b7\u30fc\n    read_only_policy = generator.generate_table_policy(\n        \"UserTable\",\n        [\"dynamodb:GetItem\", \"dynamodb:Query\", \"dynamodb:Scan\"]\n    )\n\n    # \u66f8\u304d\u8fbc\u307f\u53ef\u80fd\u30dd\u30ea\u30b7\u30fc\uff08\u6761\u4ef6\u4ed8\u304d\uff09\n    write_policy = generator.generate_table_policy(\n        \"UserTable\",\n        [\"dynamodb:PutItem\", \"dynamodb:UpdateItem\", \"dynamodb:DeleteItem\"],\n        {\n            \"StringEquals\": {\n                \"aws:RequestTag\/Environment\": \"production\"\n            }\n        }\n    )<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-34\">2. \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u7528\u306e\u30ab\u30b9\u30bf\u30e0\u30ed\u30fc\u30eb\u4f5c\u6210<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class CustomRoleManager:\n    \"\"\"\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u5c02\u7528\u306eIAM\u30ed\u30fc\u30eb\u3092\u7ba1\u7406\u3059\u308b\u30af\u30e9\u30b9\"\"\"\n\n    def __init__(self):\n        self.iam = boto3.client('iam')\n\n    def create_application_role(\n        self,\n        role_name: str,\n        policies: List[Dict]\n    ) -&gt; Dict:\n        \"\"\"\n        \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u7528\u306e\u30ab\u30b9\u30bf\u30e0\u30ed\u30fc\u30eb\u3092\u4f5c\u6210\n\n        Args:\n            role_name: \u4f5c\u6210\u3059\u308b\u30ed\u30fc\u30eb\u540d\n            policies: \u30a2\u30bf\u30c3\u30c1\u3059\u308b\u30dd\u30ea\u30b7\u30fc\u306e\u30ea\u30b9\u30c8\n        Returns:\n            dict: \u4f5c\u6210\u3055\u308c\u305f\u30ed\u30fc\u30eb\u306e\u60c5\u5831\n        \"\"\"\n        # \u4fe1\u983c\u30dd\u30ea\u30b7\u30fc\u306e\u4f5c\u6210\n        trust_policy = {\n            \"Version\": \"2012-10-17\",\n            \"Statement\": [\n                {\n                    \"Effect\": \"Allow\",\n                    \"Principal\": {\n                        \"Service\": \"lambda.amazonaws.com\"  # Lambda\u7528\u306e\u4f8b\n                    },\n                    \"Action\": \"sts:AssumeRole\"\n                }\n            ]\n        }\n\n        try:\n            # \u30ed\u30fc\u30eb\u306e\u4f5c\u6210\n            role = self.iam.create_role(\n                RoleName=role_name,\n                AssumeRolePolicyDocument=json.dumps(trust_policy)\n            )\n\n            # \u30dd\u30ea\u30b7\u30fc\u306e\u30a2\u30bf\u30c3\u30c1\n            for policy in policies:\n                policy_name = f\"{role_name}-policy-{policies.index(policy)}\"\n                self.iam.put_role_policy(\n                    RoleName=role_name,\n                    PolicyName=policy_name,\n                    PolicyDocument=json.dumps(policy)\n                )\n\n            return role\n\n        except self.iam.exceptions.EntityAlreadyExistsException:\n            print(f\"\u30ed\u30fc\u30eb {role_name} \u306f\u65e2\u306b\u5b58\u5728\u3057\u307e\u3059\")\n            return self.iam.get_role(RoleName=role_name)<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-35\">\u6697\u53f7\u5316\u3068\u30a2\u30af\u30bb\u30b9\u5236\u5fa1\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h3>\n\n\n\n<p>DynamoDB\u306e\u30c7\u30fc\u30bf\u3092\u5b89\u5168\u306b\u4fdd\u8b77\u3059\u308b\u305f\u3081\u306e\u6697\u53f7\u5316\u3068\u30a2\u30af\u30bb\u30b9\u5236\u5fa1\u306e\u5b9f\u88c5\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-36\">1. \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u30b5\u30a4\u30c9\u6697\u53f7\u5316\u306e\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from cryptography.fernet import Fernet\nfrom base64 import b64encode, b64decode\nimport os\n\nclass DataEncryption:\n    \"\"\"\u30c7\u30fc\u30bf\u306e\u6697\u53f7\u5316\u3092\u7ba1\u7406\u3059\u308b\u30af\u30e9\u30b9\"\"\"\n\n    def __init__(self, key_path: str = None):\n        \"\"\"\n        Args:\n            key_path: \u6697\u53f7\u5316\u30ad\u30fc\u3092\u4fdd\u5b58\u3059\u308b\u30d1\u30b9\uff08\u30aa\u30d7\u30b7\u30e7\u30f3\uff09\n        \"\"\"\n        if key_path and os.path.exists(key_path):\n            with open(key_path, 'rb') as key_file:\n                self.key = key_file.read()\n        else:\n            self.key = Fernet.generate_key()\n            if key_path:\n                with open(key_path, 'wb') as key_file:\n                    key_file.write(self.key)\n\n        self.cipher_suite = Fernet(self.key)\n\n    def encrypt_item(self, item: Dict) -&gt; Dict:\n        \"\"\"\n        \u9805\u76ee\u306e\u6a5f\u5bc6\u30c7\u30fc\u30bf\u3092\u6697\u53f7\u5316\n\n        Args:\n            item: \u6697\u53f7\u5316\u3059\u308b\u9805\u76ee\n        Returns:\n            dict: \u6697\u53f7\u5316\u3055\u308c\u305f\u9805\u76ee\n        \"\"\"\n        encrypted_item = item.copy()\n\n        # \u6a5f\u5bc6\u30c7\u30fc\u30bf\u306e\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u6697\u53f7\u5316\n        sensitive_fields = ['email', 'phone', 'address']\n        for field in sensitive_fields:\n            if field in encrypted_item:\n                value = str(encrypted_item[field]).encode()\n                encrypted_value = self.cipher_suite.encrypt(value)\n                encrypted_item[field] = b64encode(encrypted_value).decode()\n\n        return encrypted_item\n\n    def decrypt_item(self, item: Dict) -&gt; Dict:\n        \"\"\"\n        \u9805\u76ee\u306e\u6697\u53f7\u5316\u3055\u308c\u305f\u30c7\u30fc\u30bf\u3092\u5fa9\u53f7\n\n        Args:\n            item: \u5fa9\u53f7\u3059\u308b\u9805\u76ee\n        Returns:\n            dict: \u5fa9\u53f7\u3055\u308c\u305f\u9805\u76ee\n        \"\"\"\n        decrypted_item = item.copy()\n\n        # \u6697\u53f7\u5316\u3055\u308c\u305f\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u5fa9\u53f7\n        sensitive_fields = ['email', 'phone', 'address']\n        for field in sensitive_fields:\n            if field in decrypted_item:\n                encrypted_value = b64decode(decrypted_item[field])\n                decrypted_value = self.cipher_suite.decrypt(encrypted_value)\n                decrypted_item[field] = decrypted_value.decode()\n\n        return decrypted_item<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-37\">2. \u30bb\u30ad\u30e5\u30a2\u306a\u30c7\u30fc\u30bf\u30a2\u30af\u30bb\u30b9\u5c64\u306e\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class SecureDataAccessLayer:\n    \"\"\"\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u8003\u616e\u3057\u305f\u30c7\u30fc\u30bf\u30a2\u30af\u30bb\u30b9\u5c64\"\"\"\n\n    def __init__(self, table_name: str, encryption_key_path: str = None):\n        \"\"\"\n        Args:\n            table_name: DynamoDB\u30c6\u30fc\u30d6\u30eb\u540d\n            encryption_key_path: \u6697\u53f7\u5316\u30ad\u30fc\u306e\u30d1\u30b9\uff08\u30aa\u30d7\u30b7\u30e7\u30f3\uff09\n        \"\"\"\n        self.table = boto3.resource('dynamodb').Table(table_name)\n        self.encryption = DataEncryption(encryption_key_path)\n\n    def put_secure_item(self, item: Dict) -&gt; Dict:\n        \"\"\"\n        \u6697\u53f7\u5316\u3057\u3066\u30c7\u30fc\u30bf\u3092\u4fdd\u5b58\n\n        Args:\n            item: \u4fdd\u5b58\u3059\u308b\u9805\u76ee\n        Returns:\n            dict: DynamoDB\u306e\u30ec\u30b9\u30dd\u30f3\u30b9\n        \"\"\"\n        encrypted_item = self.encryption.encrypt_item(item)\n        return self.table.put_item(Item=encrypted_item)\n\n    def get_secure_item(self, key: Dict) -&gt; Dict:\n        \"\"\"\n        \u30c7\u30fc\u30bf\u3092\u53d6\u5f97\u3057\u3066\u5fa9\u53f7\n\n        Args:\n            key: \u53d6\u5f97\u3059\u308b\u9805\u76ee\u306e\u30ad\u30fc\n        Returns:\n            dict: \u5fa9\u53f7\u3055\u308c\u305f\u9805\u76ee\n        \"\"\"\n        response = self.table.get_item(Key=key)\n        if 'Item' in response:\n            return self.encryption.decrypt_item(response['Item'])\n        return None\n\n    def query_secure_items(\n        self,\n        key_condition_expression: str,\n        expression_values: Dict\n    ) -&gt; List[Dict]:\n        \"\"\"\n        \u30af\u30a8\u30ea\u7d50\u679c\u3092\u5fa9\u53f7\u3057\u3066\u8fd4\u3059\n\n        Args:\n            key_condition_expression: \u30ad\u30fc\u6761\u4ef6\u5f0f\n            expression_values: \u6761\u4ef6\u5f0f\u3067\u4f7f\u7528\u3059\u308b\u5024\n        Returns:\n            list: \u5fa9\u53f7\u3055\u308c\u305f\u9805\u76ee\u306e\u30ea\u30b9\u30c8\n        \"\"\"\n        response = self.table.query(\n            KeyConditionExpression=key_condition_expression,\n            ExpressionAttributeValues=expression_values\n        )\n\n        return [\n            self.encryption.decrypt_item(item)\n            for item in response.get('Items', [])\n        ]<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-38\">3. \u76e3\u67fb\u3068\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u306e\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class SecurityAuditor:\n    \"\"\"\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u76e3\u67fb\u3092\u5b9f\u88c5\u3059\u308b\u30af\u30e9\u30b9\"\"\"\n\n    def __init__(self, table_name: str):\n        \"\"\"\n        Args:\n            table_name: \u76e3\u67fb\u5bfe\u8c61\u306e\u30c6\u30fc\u30d6\u30eb\u540d\n        \"\"\"\n        self.table_name = table_name\n        self.cloudwatch = boto3.client('cloudwatch')\n        self.dynamodb = boto3.client('dynamodb')\n\n    def audit_table_access(\n        self,\n        start_time,\n        end_time\n    ) -&gt; Dict[str, int]:\n        \"\"\"\n        \u30c6\u30fc\u30d6\u30eb\u30a2\u30af\u30bb\u30b9\u306e\u76e3\u67fb\u3092\u5b9f\u884c\n\n        Args:\n            start_time: \u76e3\u67fb\u671f\u9593\u306e\u958b\u59cb\u6642\u523b\n            end_time: \u76e3\u67fb\u671f\u9593\u306e\u7d42\u4e86\u6642\u523b\n        Returns:\n            dict: \u64cd\u4f5c\u30bf\u30a4\u30d7\u3054\u3068\u306e\u30a2\u30af\u30bb\u30b9\u56de\u6570\n        \"\"\"\n        metrics = {\n            'GetItem': 'GetItem.ReturnedItemCount',\n            'Query': 'Query.ReturnedItemCount',\n            'Scan': 'Scan.ReturnedItemCount',\n            'PutItem': 'PutItem.ItemCount',\n            'UpdateItem': 'UpdateItem.ItemCount',\n            'DeleteItem': 'DeleteItem.ItemCount'\n        }\n\n        stats = {}\n        for operation, metric in metrics.items():\n            response = self.cloudwatch.get_metric_statistics(\n                Namespace='AWS\/DynamoDB',\n                MetricName=metric,\n                Dimensions=[\n                    {\n                        'Name': 'TableName',\n                        'Value': self.table_name\n                    }\n                ],\n                StartTime=start_time,\n                EndTime=end_time,\n                Period=3600,  # 1\u6642\u9593\u5358\u4f4d\n                Statistics=['Sum']\n            )\n\n            stats[operation] = sum(\n                point['Sum'] for point in response['Datapoints']\n            )\n\n        return stats\n\n    def check_encryption_status(self) -&gt; Dict:\n        \"\"\"\n        \u30c6\u30fc\u30d6\u30eb\u306e\u6697\u53f7\u5316\u72b6\u614b\u3092\u78ba\u8a8d\n\n        Returns:\n            dict: \u6697\u53f7\u5316\u306e\u8a2d\u5b9a\u60c5\u5831\n        \"\"\"\n        response = self.dynamodb.describe_table(\n            TableName=self.table_name\n        )\n\n        return {\n            'SSEDescription': response['Table'].get(\n                'SSEDescription',\n                {'Status': 'DISABLED'}\n            )\n        }<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5b9f\u88c5\u306b\u3088\u308a\u3001DynamoDB\u306e\u30c7\u30fc\u30bf\u3092\u5b89\u5168\u306b\u4fdd\u8b77\u3057\u3001\u9069\u5207\u306a\u30a2\u30af\u30bb\u30b9\u5236\u5fa1\u3092\u5b9f\u73fe\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u7279\u306b:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u6700\u5c0f\u6a29\u9650\u306e\u539f\u5247\u306b\u57fa\u3065\u304fIAM\u30dd\u30ea\u30b7\u30fc\u306e\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u30b5\u30a4\u30c9\u6697\u53f7\u5316\u306b\u3088\u308b\u6a5f\u5bc6\u30c7\u30fc\u30bf\u306e\u4fdd\u8b77<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30a2\u306a\u30c7\u30fc\u30bf\u30a2\u30af\u30bb\u30b9\u5c64\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u5b9a\u671f\u7684\u306a\u76e3\u67fb\u3068\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u8981\u7d20\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u5805\u7262\u306a\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u4f53\u5236\u3092\u69cb\u7bc9\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Warning: Undefined array key &#8220;is_admin&#8221; in \/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/ &#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":{"0":"post-2422","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-aws","7":"nothumb"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2422","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2422"}],"version-history":[{"count":2,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2422\/revisions"}],"predecessor-version":[{"id":2424,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2422\/revisions\/2424"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2422"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2422"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2422"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}