{"id":2425,"date":"2025-03-24T08:47:27","date_gmt":"2025-03-23T23:47:27","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=2425"},"modified":"2025-03-24T08:47:50","modified_gmt":"2025-03-23T23:47:50","slug":"%e3%80%90%e4%bf%9d%e5%ad%98%e7%89%88%e3%80%91boto3%e5%85%a5%e9%96%80%e3%81%8b%e3%82%89%e5%ae%9f%e8%b7%b5%e3%81%be%e3%81%a7-pythonxaws%e3%81%ae%e8%87%aa%e5%8b%95%e5%8c%96%e3%82%92%e5%ae%8c","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=2425","title":{"rendered":"\u3010\u4fdd\u5b58\u7248\u3011boto3\u5165\u9580\u304b\u3089\u5b9f\u8df5\u307e\u3067 &#8211; Python\u00d7AWS\u306e\u81ea\u52d5\u5316\u3092\u5b8c\u5168\u30de\u30b9\u30bf\u30fc"},"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\u3068\u306f\uff1fPython\u3067\u59cb\u3081\u308bAWS\u904b\u7528\u306e\u57fa\u790e\u77e5\u8b58<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">boto3\u306e\u7279\u5fb4\u3068\u4e3b\u8981\u306a\u6a5f\u80fd\u30925\u5206\u3067\u7406\u89e3\u3057\u3088\u3046<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-4\">\u74b0\u5883\u69cb\u7bc9\u304b\u3089AWS\u8a8d\u8a3c\u8a2d\u5b9a\u307e\u3067<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-9\">\u3010\u521d\u5fc3\u8005\u5411\u3051\u3011boto3\u3067\u306e\u57fa\u672c\u7684\u306aAWS\u30ea\u30bd\u30fc\u30b9\u64cd\u4f5c\u65b9\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-10\">S3\u30d0\u30b1\u30c3\u30c8\u306e\u4f5c\u6210\u30fb\u30a2\u30af\u30bb\u30b9\u30fb\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u306e\u5177\u4f53\u4f8b<\/a>      <\/li>      <li>        <a href=\"#i-13\">EC2\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u8d77\u52d5\u30fb\u505c\u6b62\u30fb\u72b6\u614b\u78ba\u8a8d\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-16\">IAM\u30e6\u30fc\u30b6\u30fc\u30fb\u30ed\u30fc\u30eb\u306e\u7ba1\u7406\u3068\u6a29\u9650\u8a2d\u5b9a\u306e\u30b3\u30fc\u30c9\u4f8b<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-20\">\u5b9f\u8df5\u7684\u306aboto3\u6d3b\u7528\u8853\u3068\u81ea\u52d5\u5316\u306e\u30c6\u30af\u30cb\u30c3\u30af<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-21\">\u8907\u6570\u306eAWS\u30ea\u30bd\u30fc\u30b9\u3092\u9023\u643a\u3055\u305b\u308b\u5b9f\u88c5\u30d1\u30bf\u30fc\u30f3<\/a>      <\/li>      <li>        <a href=\"#i-24\">\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3068\u30ea\u30c8\u30e9\u30a4\u51e6\u7406\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-26\">\u975e\u540c\u671f\u51e6\u7406\u3068\u30d0\u30c3\u30c1\u51e6\u7406\u306e\u52b9\u7387\u7684\u306a\u5b9f\u73fe\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-29\">boto3\u958b\u767a\u306b\u304a\u3051\u308b\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3068\u6ce8\u610f\u70b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-30\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u8003\u616e\u3057\u305f\u5b9f\u88c5\u624b\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-33\">\u30b3\u30b9\u30c8\u6700\u9069\u5316\u306e\u30ea\u30bd\u30fc\u30b9\u7ba1\u7406\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-35\">\u672c\u756a\u74b0\u5883\u3067\u306e\u904b\u7528\u306b\u5411\u3051\u305f\u30c6\u30b9\u30c8\u3068\u76e3\u8996\u306e\u5b9f\u88c5<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-39\">\u3010\u767a\u5c55\u7de8\u3011boto3\u3092\u4f7f\u3063\u305f\u5b9f\u8df5\u7684\u306a\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u96c6<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-40\">\u5927\u898f\u6a21\u30d0\u30c3\u30c1\u51e6\u7406\u306e\u81ea\u52d5\u5316\u4e8b\u4f8b<\/a>      <\/li>      <li>        <a href=\"#i-42\">\u30b5\u30fc\u30d0\u30fc\u30ec\u30b9\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3068\u306e\u9023\u643a\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-44\">\u30de\u30eb\u30c1\u30a2\u30ab\u30a6\u30f3\u30c8\u74b0\u5883\u3067\u306e\u52b9\u7387\u7684\u306a\u904b\u7528\u65b9\u6cd5<\/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\u3068\u306f\uff1fPython\u3067\u59cb\u3081\u308bAWS\u904b\u7528\u306e\u57fa\u790e\u77e5\u8b58<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">boto3\u306e\u7279\u5fb4\u3068\u4e3b\u8981\u306a\u6a5f\u80fd\u30925\u5206\u3067\u7406\u89e3\u3057\u3088\u3046<\/h3>\n\n\n\n<p>boto3\u306f\u3001Python\u304b\u3089AWS\u306e\u30b5\u30fc\u30d3\u30b9\u3084\u30ea\u30bd\u30fc\u30b9\u3092\u64cd\u4f5c\u3059\u308b\u305f\u3081\u306e\u516c\u5f0fSDK\u3067\u3059\u3002AWS\u306e\u8c4a\u5bcc\u306a\u30b5\u30fc\u30d3\u30b9\u3092Python\u306e\u30b3\u30fc\u30c9\u304b\u3089\u7c21\u5358\u306b\u5229\u7528\u3067\u304d\u308b\u5f37\u529b\u306a\u30c4\u30fc\u30eb\u3068\u3057\u3066\u3001\u591a\u304f\u306e\u958b\u767a\u8005\u306b\u5229\u7528\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-2\">boto3\u306e\u4e3b\u306a\u7279\u5fb4<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u8c4a\u5bcc\u306aAWS\u30b5\u30fc\u30d3\u30b9\u30b5\u30dd\u30fc\u30c8<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>200\u4ee5\u4e0a\u306eAWS\u30b5\u30fc\u30d3\u30b9\u306b\u5bfe\u5fdc<\/li>\n\n\n\n<li>\u5404\u30b5\u30fc\u30d3\u30b9\u306e\u6700\u65b0\u6a5f\u80fd\u306b\u30bf\u30a4\u30e0\u30ea\u30fc\u306b\u5bfe\u5fdc<\/li>\n\n\n\n<li>AWS\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u306b\u6e96\u62e0\u3057\u305f\u5b9f\u88c5<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>2\u7a2e\u985e\u306eAPI\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\uff08\u4f4e\u30ec\u30d9\u30eb\uff09API\uff1aAWS \u30b5\u30fc\u30d3\u30b9\u3068\u306e\u76f4\u63a5\u7684\u306a\u3084\u308a\u53d6\u308a\u304c\u53ef\u80fd<\/li>\n\n\n\n<li>\u30ea\u30bd\u30fc\u30b9\uff08\u9ad8\u30ec\u30d9\u30eb\uff09API\uff1a\u3088\u308aPython\u3089\u3057\u3044\u76f4\u611f\u7684\u306a\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u3092\u63d0\u4f9b<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5f37\u529b\u306a\u578b\u652f\u63f4\u3068\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>IDE\u88dc\u5b8c\u306e\u30b5\u30dd\u30fc\u30c8<\/li>\n\n\n\n<li>\u8c4a\u5bcc\u306a\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3068\u30b3\u30fc\u30c9\u4f8b<\/li>\n\n\n\n<li>\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u6a5f\u80fd\u306b\u3088\u308b\u5b9f\u884c\u524d\u30a8\u30e9\u30fc\u306e\u691c\u51fa<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-3\">boto3\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3068\u57fa\u672c\u7684\u306a\u4f7f\u3044\u65b9<\/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=\"\"># boto3\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\n# pip install boto3\n\nimport boto3\n\n# \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u4f5c\u6210\ns3_client = boto3.client('s3')  # \u4f4e\u30ec\u30d9\u30ebAPI\ns3_resource = boto3.resource('s3')  # \u9ad8\u30ec\u30d9\u30ebAPI\n\n# \u30ea\u30fc\u30b8\u30e7\u30f3\u3092\u6307\u5b9a\u3057\u3066\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3092\u4f5c\u6210\nec2_client = boto3.client('ec2', region_name='ap-northeast-1')\n\n# \u5229\u7528\u53ef\u80fd\u306a\u30d0\u30b1\u30c3\u30c8\u306e\u4e00\u89a7\u3092\u53d6\u5f97\u3059\u308b\u4f8b\nresponse = s3_client.list_buckets()\nbuckets = [bucket['Name'] for bucket in response['Buckets']]\nprint(\"\u5229\u7528\u53ef\u80fd\u306a\u30d0\u30b1\u30c3\u30c8:\", buckets)<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-4\">\u74b0\u5883\u69cb\u7bc9\u304b\u3089AWS\u8a8d\u8a3c\u8a2d\u5b9a\u307e\u3067<\/h3>\n\n\n\n<p>boto3\u3092\u4f7f\u7528\u3059\u308b\u305f\u3081\u306e\u74b0\u5883\u69cb\u7bc9\u3068\u8a8d\u8a3c\u8a2d\u5b9a\u306b\u3064\u3044\u3066\u3001\u9806\u3092\u8ffd\u3063\u3066\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-5\">1. \u74b0\u5883\u69cb\u7bc9\u624b\u9806<\/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=\"\"># \u4eee\u60f3\u74b0\u5883\u306e\u4f5c\u6210\uff08\u63a8\u5968\uff09\n# python -m venv boto3-env\n# source boto3-env\/bin\/activate  # Unix\u7cfb\n# .\\boto3-env\\Scripts\\activate   # Windows\n\n# boto3\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\n# pip install boto3\n\n# \u4f9d\u5b58\u95a2\u4fc2\u306e\u78ba\u8a8d\n# pip freeze | grep boto3<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-6\">2. AWS\u8a8d\u8a3c\u60c5\u5831\u306e\u8a2d\u5b9a<\/h4>\n\n\n\n<p>boto3\u3067\u306f\u3001\u4ee5\u4e0b\u306e\u512a\u5148\u9806\u4f4d\u3067\u8a8d\u8a3c\u60c5\u5831\u304c\u8aad\u307f\u8fbc\u307e\u308c\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u74b0\u5883\u5909\u6570\u306b\u3088\u308b\u8a2d\u5b9a<\/li>\n<\/ol>\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=\"\"># \u74b0\u5883\u5909\u6570\u306e\u8a2d\u5b9a\u4f8b\n# export AWS_ACCESS_KEY_ID=\"your_access_key\"\n# export AWS_SECRET_ACCESS_KEY=\"your_secret_key\"\n# export AWS_DEFAULT_REGION=\"ap-northeast-1\"<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u8a8d\u8a3c\u60c5\u5831\u30d5\u30a1\u30a4\u30eb\u306b\u3088\u308b\u8a2d\u5b9a<\/li>\n<\/ol>\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=\"\"># ~\/.aws\/credentials \u306e\u4f8b<\/pre>\n\n\n[default]\n\n\n\n<p>aws_access_key_id = your_access_key aws_secret_access_key = your_secret_key # ~\/.aws\/config \u306e\u4f8b<\/p>\n\n\n[default]\n\n\n\n<p>region = ap-northeast-1 output = json<\/p>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u30b3\u30fc\u30c9\u3067\u306e\u76f4\u63a5\u6307\u5b9a\uff08\u975e\u63a8\u5968\uff09<\/li>\n<\/ol>\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# \u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u4f5c\u6210\nsession = boto3.Session(\n    aws_access_key_id='YOUR_ACCESS_KEY',\n    aws_secret_access_key='YOUR_SECRET_KEY',\n    region_name='ap-northeast-1'\n)\n\n# \u30bb\u30c3\u30b7\u30e7\u30f3\u304b\u3089\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3092\u4f5c\u6210\ns3 = session.client('s3')<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-7\">3. \u8a8d\u8a3c\u8a2d\u5b9a\u306e\u78ba\u8a8d\u65b9\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\n\ndef check_aws_credentials():\n    try:\n        # \u30c7\u30d5\u30a9\u30eb\u30c8\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u30af\u30ec\u30c7\u30f3\u30b7\u30e3\u30eb\u3092\u53d6\u5f97\n        session = boto3.Session()\n        credentials = session.get_credentials()\n\n        # \u30af\u30ec\u30c7\u30f3\u30b7\u30e3\u30eb\u60c5\u5831\u306e\u78ba\u8a8d\n        current_credentials = credentials.get_frozen_credentials()\n        print(\"Access Key ID:\", current_credentials.access_key)\n        print(\"Secret Key:\", \"************\")  # \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u305f\u3081\u975e\u8868\u793a\n        print(\"Region:\", session.region_name)\n\n        return True\n    except Exception as e:\n        print(\"\u8a8d\u8a3c\u30a8\u30e9\u30fc:\", str(e))\n        return False\n\n# \u8a8d\u8a3c\u8a2d\u5b9a\u306e\u78ba\u8a8d\u3092\u5b9f\u884c\ncheck_aws_credentials()<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-8\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u6700\u5c0f\u6a29\u9650\u306e\u539f\u5247\u3092\u5b88\u308b<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5fc5\u8981\u6700\u5c0f\u9650\u306e\u6a29\u9650\u306e\u307f\u3092\u4ed8\u4e0e\u3057\u305fIAM\u30ed\u30fc\u30eb\u3092\u4f7f\u7528<\/li>\n\n\n\n<li>\u672c\u756a\u74b0\u5883\u3067\u306f\u74b0\u5883\u5909\u6570\u3084IAM\u30ed\u30fc\u30eb\u3092\u4f7f\u7528\u3057\u3001\u30cf\u30fc\u30c9\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u3092\u907f\u3051\u308b<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u8a8d\u8a3c\u60c5\u5831\u306e\u7ba1\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30a2\u30af\u30bb\u30b9\u30ad\u30fc\u306f\u5b9a\u671f\u7684\u306b\u30ed\u30fc\u30c6\u30fc\u30b7\u30e7\u30f3<\/li>\n\n\n\n<li>\u5171\u6709\u30b3\u30fc\u30c9\u306b\u306f\u8a8d\u8a3c\u60c5\u5831\u3092\u542b\u3081\u306a\u3044<\/li>\n\n\n\n<li>Git\u7b49\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u7ba1\u7406\u306b\u306f.gitignore\u3092\u9069\u5207\u306b\u8a2d\u5b9a<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30bb\u30c3\u30b7\u30e7\u30f3\u7ba1\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u9577\u6642\u9593\u5b9f\u884c\u3055\u308c\u308b\u51e6\u7406\u3067\u306f\u8a8d\u8a3c\u60c5\u5831\u306e\u6709\u52b9\u671f\u9650\u306b\u6ce8\u610f<\/li>\n\n\n\n<li>\u5fc5\u8981\u306b\u5fdc\u3058\u3066\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u518d\u4f5c\u6210\u51e6\u7406\u3092\u5b9f\u88c5<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u57fa\u672c\u3092\u62bc\u3055\u3048\u308b\u3053\u3068\u3067\u3001boto3\u3092\u4f7f\u7528\u3057\u305fAWS\u904b\u7528\u306e\u81ea\u52d5\u5316\u3078\u306e\u7b2c\u4e00\u6b69\u3092\u8e0f\u307f\u51fa\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u5177\u4f53\u7684\u306aAWS\u30ea\u30bd\u30fc\u30b9\u306e\u64cd\u4f5c\u65b9\u6cd5\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-9\">\u3010\u521d\u5fc3\u8005\u5411\u3051\u3011boto3\u3067\u306e\u57fa\u672c\u7684\u306aAWS\u30ea\u30bd\u30fc\u30b9\u64cd\u4f5c\u65b9\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">S3\u30d0\u30b1\u30c3\u30c8\u306e\u4f5c\u6210\u30fb\u30a2\u30af\u30bb\u30b9\u30fb\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u306e\u5177\u4f53\u4f8b<\/h3>\n\n\n\n<p>S3\uff08Simple Storage Service\uff09\u306f\u3001AWS\u306e\u4ee3\u8868\u7684\u306a\u30b9\u30c8\u30ec\u30fc\u30b8\u30b5\u30fc\u30d3\u30b9\u3067\u3059\u3002boto3\u3092\u4f7f\u7528\u3057\u3066S3\u3092\u64cd\u4f5c\u3059\u308b\u57fa\u672c\u7684\u306a\u65b9\u6cd5\u3092\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-11\">\u30d0\u30b1\u30c3\u30c8\u306e\u4f5c\u6210\u3068\u4e00\u89a7\u53d6\u5f97<\/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\n\ndef create_bucket(bucket_name, region=None):\n    \"\"\"\n    S3\u30d0\u30b1\u30c3\u30c8\u3092\u4f5c\u6210\u3059\u308b\n\n    :param bucket_name: \u30d0\u30b1\u30c3\u30c8\u540d\n    :param region: \u30ea\u30fc\u30b8\u30e7\u30f3\u540d\uff08\u7701\u7565\u53ef\uff09\n    :return: True if bucket is created, else False\n    \"\"\"\n    try:\n        s3_client = boto3.client('s3')\n        if region is None:\n            region = s3_client.meta.region_name\n\n        location = {'LocationConstraint': region}\n        s3_client.create_bucket(\n            Bucket=bucket_name,\n            CreateBucketConfiguration=location\n        )\n        return True\n    except ClientError as e:\n        print(f\"\u30a8\u30e9\u30fc: {e}\")\n        return False\n\n# \u30d0\u30b1\u30c3\u30c8\u4e00\u89a7\u306e\u53d6\u5f97\ns3 = boto3.client('s3')\nresponse = s3.list_buckets()\nfor bucket in response['Buckets']:\n    print(f\"\u30d0\u30b1\u30c3\u30c8\u540d: {bucket['Name']}, \u4f5c\u6210\u65e5\u6642: {bucket['CreationDate']}\")<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-12\">\u30d5\u30a1\u30a4\u30eb\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3068\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9<\/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 upload_file(file_name, bucket, object_name=None):\n    \"\"\"\n    \u30d5\u30a1\u30a4\u30eb\u3092S3\u306b\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3059\u308b\n\n    :param file_name: \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3059\u308b\u30d5\u30a1\u30a4\u30eb\u306e\u30d1\u30b9\n    :param bucket: \u30d0\u30b1\u30c3\u30c8\u540d\n    :param object_name: S3\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u540d\uff08\u7701\u7565\u6642\u306ffile_name\uff09\n    :return: True if file is uploaded, else False\n    \"\"\"\n    if object_name is None:\n        object_name = file_name\n\n    s3_client = boto3.client('s3')\n    try:\n        s3_client.upload_file(file_name, bucket, object_name)\n        return True\n    except ClientError as e:\n        print(f\"\u30a8\u30e9\u30fc: {e}\")\n        return False\n\ndef download_file(bucket, object_name, file_name):\n    \"\"\"\n    S3\u304b\u3089\u30d5\u30a1\u30a4\u30eb\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3059\u308b\n\n    :param bucket: \u30d0\u30b1\u30c3\u30c8\u540d\n    :param object_name: S3\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u540d\n    :param file_name: \u4fdd\u5b58\u3059\u308b\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9\n    :return: True if file is downloaded, else False\n    \"\"\"\n    s3_client = boto3.client('s3')\n    try:\n        s3_client.download_file(bucket, object_name, file_name)\n        return True\n    except ClientError as e:\n        print(f\"\u30a8\u30e9\u30fc: {e}\")\n        return False<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-13\">EC2\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u8d77\u52d5\u30fb\u505c\u6b62\u30fb\u72b6\u614b\u78ba\u8a8d\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<p>EC2\uff08Elastic Compute Cloud\uff09\u306f\u3001AWS\u306e\u4eee\u60f3\u30b5\u30fc\u30d0\u30fc\u30b5\u30fc\u30d3\u30b9\u3067\u3059\u3002\u57fa\u672c\u7684\u306a\u64cd\u4f5c\u65b9\u6cd5\u3092\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-14\">\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u8d77\u52d5\u3068\u505c\u6b62<\/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\n\ndef launch_ec2_instance(image_id, instance_type, key_name):\n    \"\"\"\n    EC2\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u8d77\u52d5\u3059\u308b\n\n    :param image_id: AMI ID\n    :param instance_type: \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u30bf\u30a4\u30d7\n    :param key_name: \u30ad\u30fc\u30da\u30a2\u540d\n    :return: \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9ID\n    \"\"\"\n    try:\n        ec2_client = boto3.client('ec2')\n        response = ec2_client.run_instances(\n            ImageId=image_id,\n            InstanceType=instance_type,\n            KeyName=key_name,\n            MinCount=1,\n            MaxCount=1\n        )\n        instance_id = response['Instances'][0]['InstanceId']\n        print(f\"\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u8d77\u52d5: {instance_id}\")\n        return instance_id\n    except ClientError as e:\n        print(f\"\u30a8\u30e9\u30fc: {e}\")\n        return None\n\ndef manage_instance_state(instance_id, action):\n    \"\"\"\n    EC2\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u72b6\u614b\u3092\u7ba1\u7406\u3059\u308b\n\n    :param instance_id: \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9ID\n    :param action: 'start', 'stop', 'terminate'\u306e\u3044\u305a\u308c\u304b\n    :return: True if successful, else False\n    \"\"\"\n    ec2_client = boto3.client('ec2')\n    try:\n        if action == 'start':\n            ec2_client.start_instances(InstanceIds=[instance_id])\n        elif action == 'stop':\n            ec2_client.stop_instances(InstanceIds=[instance_id])\n        elif action == 'terminate':\n            ec2_client.terminate_instances(InstanceIds=[instance_id])\n        return True\n    except ClientError as e:\n        print(f\"\u30a8\u30e9\u30fc: {e}\")\n        return False<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-15\">\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u72b6\u614b\u78ba\u8a8d<\/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 get_instance_state(instance_id):\n    \"\"\"\n    EC2\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u72b6\u614b\u3092\u53d6\u5f97\u3059\u308b\n\n    :param instance_id: \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9ID\n    :return: \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u72b6\u614b\n    \"\"\"\n    ec2_client = boto3.client('ec2')\n    try:\n        response = ec2_client.describe_instances(\n            InstanceIds=[instance_id]\n        )\n        state = response['Reservations'][0]['Instances'][0]['State']['Name']\n        return state\n    except ClientError as e:\n        print(f\"\u30a8\u30e9\u30fc: {e}\")\n        return None<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-16\">IAM\u30e6\u30fc\u30b6\u30fc\u30fb\u30ed\u30fc\u30eb\u306e\u7ba1\u7406\u3068\u6a29\u9650\u8a2d\u5b9a\u306e\u30b3\u30fc\u30c9\u4f8b<\/h3>\n\n\n\n<p>IAM\uff08Identity and Access Management\uff09\u3092\u4f7f\u7528\u3057\u305f\u30e6\u30fc\u30b6\u30fc\u3068\u30ed\u30fc\u30eb\u306e\u7ba1\u7406\u65b9\u6cd5\u3092\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-17\">IAM\u30e6\u30fc\u30b6\u30fc\u306e\u4f5c\u6210\u3068\u7ba1\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=\"\">import boto3\nfrom botocore.exceptions import ClientError\n\ndef create_iam_user(username, policy_arn=None):\n    \"\"\"\n    IAM\u30e6\u30fc\u30b6\u30fc\u3092\u4f5c\u6210\u3057\u3001\u5fc5\u8981\u306b\u5fdc\u3058\u3066\u30dd\u30ea\u30b7\u30fc\u3092\u30a2\u30bf\u30c3\u30c1\u3059\u308b\n\n    :param username: \u30e6\u30fc\u30b6\u30fc\u540d\n    :param policy_arn: \u30a2\u30bf\u30c3\u30c1\u3059\u308b\u30dd\u30ea\u30b7\u30fc\u306eARN\uff08\u7701\u7565\u53ef\uff09\n    :return: True if user is created, else False\n    \"\"\"\n    iam_client = boto3.client('iam')\n    try:\n        # \u30e6\u30fc\u30b6\u30fc\u306e\u4f5c\u6210\n        iam_client.create_user(UserName=username)\n\n        # \u30dd\u30ea\u30b7\u30fc\u306e\u30a2\u30bf\u30c3\u30c1\uff08\u6307\u5b9a\u304c\u3042\u308b\u5834\u5408\uff09\n        if policy_arn:\n            iam_client.attach_user_policy(\n                UserName=username,\n                PolicyArn=policy_arn\n            )\n        return True\n    except ClientError as e:\n        print(f\"\u30a8\u30e9\u30fc: {e}\")\n        return False\n\ndef create_access_key(username):\n    \"\"\"\n    IAM\u30e6\u30fc\u30b6\u30fc\u306e\u30a2\u30af\u30bb\u30b9\u30ad\u30fc\u3092\u4f5c\u6210\u3059\u308b\n\n    :param username: \u30e6\u30fc\u30b6\u30fc\u540d\n    :return: \u30a2\u30af\u30bb\u30b9\u30ad\u30fc\u60c5\u5831\n    \"\"\"\n    iam_client = boto3.client('iam')\n    try:\n        response = iam_client.create_access_key(\n            UserName=username\n        )\n        return response['AccessKey']\n    except ClientError as e:\n        print(f\"\u30a8\u30e9\u30fc: {e}\")\n        return None<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-18\">IAM\u30ed\u30fc\u30eb\u306e\u4f5c\u6210\u3068\u7ba1\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=\"\">def create_iam_role(role_name, trust_policy, policy_arn=None):\n    \"\"\"\n    IAM\u30ed\u30fc\u30eb\u3092\u4f5c\u6210\u3057\u3001\u4fe1\u983c\u30dd\u30ea\u30b7\u30fc\u3068\u30dd\u30ea\u30b7\u30fc\u3092\u8a2d\u5b9a\u3059\u308b\n\n    :param role_name: \u30ed\u30fc\u30eb\u540d\n    :param trust_policy: \u4fe1\u983c\u30dd\u30ea\u30b7\u30fc\u306eJSON\n    :param policy_arn: \u30a2\u30bf\u30c3\u30c1\u3059\u308b\u30dd\u30ea\u30b7\u30fc\u306eARN\uff08\u7701\u7565\u53ef\uff09\n    :return: True if role is created, else False\n    \"\"\"\n    iam_client = boto3.client('iam')\n    try:\n        # \u30ed\u30fc\u30eb\u306e\u4f5c\u6210\n        iam_client.create_role(\n            RoleName=role_name,\n            AssumeRolePolicyDocument=trust_policy\n        )\n\n        # \u30dd\u30ea\u30b7\u30fc\u306e\u30a2\u30bf\u30c3\u30c1\uff08\u6307\u5b9a\u304c\u3042\u308b\u5834\u5408\uff09\n        if policy_arn:\n            iam_client.attach_role_policy(\n                RoleName=role_name,\n                PolicyArn=policy_arn\n            )\n        return True\n    except ClientError as e:\n        print(f\"\u30a8\u30e9\u30fc: {e}\")\n        return False\n\n# EC2\u7528\u306e\u4fe1\u983c\u30dd\u30ea\u30b7\u30fc\u306e\u4f8b\nec2_trust_policy = {\n    \"Version\": \"2012-10-17\",\n    \"Statement\": [\n        {\n            \"Effect\": \"Allow\",\n            \"Principal\": {\n                \"Service\": \"ec2.amazonaws.com\"\n            },\n            \"Action\": \"sts:AssumeRole\"\n        }\n    ]\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-19\">\u5b9f\u88c5\u6642\u306e\u6ce8\u610f\u70b9<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5fc5\u305atry-except\u6587\u3067\u30a8\u30e9\u30fc\u3092\u6355\u6349\u3059\u308b<\/li>\n\n\n\n<li>ClientError\u306e\u8a73\u7d30\u3092\u78ba\u8a8d\u3057\u3001\u9069\u5207\u306a\u5bfe\u5fdc\u3092\u5b9f\u88c5\u3059\u308b<\/li>\n\n\n\n<li>\u30ea\u30c8\u30e9\u30a4\u51e6\u7406\u304c\u5fc5\u8981\u306a\u5834\u5408\u306f\u3001exponential backoff\u3092\u5b9f\u88c5\u3059\u308b<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u8003\u616e\u4e8b\u9805<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>IAM\u30e6\u30fc\u30b6\u30fc\u4f5c\u6210\u6642\u306f\u6700\u5c0f\u6a29\u9650\u306e\u539f\u5247\u306b\u5f93\u3046<\/li>\n\n\n\n<li>\u30a2\u30af\u30bb\u30b9\u30ad\u30fc\u306f\u9069\u5207\u306b\u7ba1\u7406\u3057\u3001\u5b9a\u671f\u7684\u306b\u30ed\u30fc\u30c6\u30fc\u30b7\u30e7\u30f3\u3059\u308b<\/li>\n\n\n\n<li>\u6a5f\u5bc6\u60c5\u5831\u306f\u30b3\u30fc\u30c9\u5185\u306b\u30cf\u30fc\u30c9\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u3057\u306a\u3044<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ea\u30bd\u30fc\u30b9\u7ba1\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4e0d\u8981\u306a\u30ea\u30bd\u30fc\u30b9\u306f\u9069\u5207\u306b\u524a\u9664\u3059\u308b<\/li>\n\n\n\n<li>\u30b3\u30b9\u30c8\u7ba1\u7406\u306e\u305f\u3081\u3001\u4f7f\u7528\u3057\u3066\u3044\u306a\u3044\u30ea\u30bd\u30fc\u30b9\u3092\u5b9a\u671f\u7684\u306b\u78ba\u8a8d\u3059\u308b<\/li>\n\n\n\n<li>\u30bf\u30b0\u4ed8\u3051\u3092\u6d3b\u7528\u3057\u3066\u30ea\u30bd\u30fc\u30b9\u306e\u7ba1\u7406\u3092\u52b9\u7387\u5316\u3059\u308b<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u57fa\u672c\u7684\u306a\u64cd\u4f5c\u3092\u7406\u89e3\u3059\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u8907\u96d1\u306aAWS\u904b\u7528\u306e\u81ea\u52d5\u5316\u306b\u3082\u5bfe\u5fdc\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3088\u308a\u5b9f\u8df5\u7684\u306a\u6d3b\u7528\u65b9\u6cd5\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-20\">\u5b9f\u8df5\u7684\u306aboto3\u6d3b\u7528\u8853\u3068\u81ea\u52d5\u5316\u306e\u30c6\u30af\u30cb\u30c3\u30af<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-21\">\u8907\u6570\u306eAWS\u30ea\u30bd\u30fc\u30b9\u3092\u9023\u643a\u3055\u305b\u308b\u5b9f\u88c5\u30d1\u30bf\u30fc\u30f3<\/h3>\n\n\n\n<p>\u8907\u6570\u306eAWS\u30b5\u30fc\u30d3\u30b9\u3092\u7d44\u307f\u5408\u308f\u305b\u305f\u5b9f\u8df5\u7684\u306a\u5b9f\u88c5\u30d1\u30bf\u30fc\u30f3\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-22\">S3\u30c8\u30ea\u30ac\u30fc\u306b\u3088\u308bLambda\u95a2\u6570\u306e\u5b9f\u884c<\/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\n\ndef create_s3_event_notification(bucket_name, lambda_function_arn):\n    \"\"\"\n    S3\u30d0\u30b1\u30c3\u30c8\u306bLambda\u95a2\u6570\u306e\u30a4\u30d9\u30f3\u30c8\u901a\u77e5\u3092\u8a2d\u5b9a\u3059\u308b\n\n    :param bucket_name: \u30d0\u30b1\u30c3\u30c8\u540d\n    :param lambda_function_arn: Lambda\u95a2\u6570\u306eARN\n    \"\"\"\n    s3_client = boto3.client('s3')\n    lambda_client = boto3.client('lambda')\n\n    # Lambda\u306b\u6a29\u9650\u3092\u4ed8\u4e0e\n    try:\n        lambda_client.add_permission(\n            FunctionName=lambda_function_arn,\n            StatementId='S3InvokeLambda',\n            Action='lambda:InvokeFunction',\n            Principal='s3.amazonaws.com',\n            SourceArn=f'arn:aws:s3:::{bucket_name}'\n        )\n    except lambda_client.exceptions.ResourceConflictException:\n        print(\"\u6a29\u9650\u306f\u65e2\u306b\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u307e\u3059\")\n\n    # S3\u30a4\u30d9\u30f3\u30c8\u901a\u77e5\u306e\u8a2d\u5b9a\n    notification_config = {\n        'LambdaFunctionConfigurations': [\n            {\n                'LambdaFunctionArn': lambda_function_arn,\n                'Events': ['s3:ObjectCreated:*']\n            }\n        ]\n    }\n\n    s3_client.put_bucket_notification_configuration(\n        Bucket=bucket_name,\n        NotificationConfiguration=notification_config\n    )<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-23\">EC2\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u81ea\u52d5\u30d0\u30c3\u30af\u30a2\u30c3\u30d7<\/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 create_ec2_snapshot(instance_id, description):\n    \"\"\"\n    EC2\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u5168\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u3092\u4f5c\u6210\n\n    :param instance_id: \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9ID\n    :param description: \u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u306e\u8aac\u660e\n    :return: \u4f5c\u6210\u3057\u305f\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u306eID\u30ea\u30b9\u30c8\n    \"\"\"\n    ec2_client = boto3.client('ec2')\n    snapshot_ids = []\n\n    # \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u8a73\u7d30\u3092\u53d6\u5f97\n    response = ec2_client.describe_instances(InstanceIds=[instance_id])\n    instance = response['Reservations'][0]['Instances'][0]\n\n    # \u5404\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u3092\u4f5c\u6210\n    for volume in instance['BlockDeviceMappings']:\n        if 'Ebs' in volume:  # EBS\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u5834\u5408\n            volume_id = volume['Ebs']['VolumeId']\n\n            # \u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u4f5c\u6210\n            snapshot = ec2_client.create_snapshot(\n                VolumeId=volume_id,\n                Description=f\"{description} - {volume_id}\"\n            )\n            snapshot_ids.append(snapshot['SnapshotId'])\n\n            # \u30bf\u30b0\u306e\u8a2d\u5b9a\n            ec2_client.create_tags(\n                Resources=[snapshot['SnapshotId']],\n                Tags=[\n                    {'Key': 'InstanceId', 'Value': instance_id},\n                    {'Key': 'AutoBackup', 'Value': 'true'}\n                ]\n            )\n\n    return snapshot_ids<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-24\">\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3068\u30ea\u30c8\u30e9\u30a4\u51e6\u7406\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<p>boto3\u3092\u4f7f\u7528\u3059\u308b\u969b\u306e\u5805\u7262\u306a\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3068\u30ea\u30c8\u30e9\u30a4\u51e6\u7406\u306e\u5b9f\u88c5\u4f8b\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-25\">\u30ab\u30b9\u30bf\u30e0\u30ea\u30c8\u30e9\u30a4\u30c7\u30b3\u30ec\u30fc\u30bf<\/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\nfrom botocore.exceptions import ClientError\n\ndef aws_retry(\n    max_attempts=3,\n    base_delay=1,\n    exponential_base=2,\n    error_codes=None\n):\n    \"\"\"\n    AWS API\u547c\u3073\u51fa\u3057\u306e\u30ea\u30c8\u30e9\u30a4\u30c7\u30b3\u30ec\u30fc\u30bf\n\n    :param max_attempts: \u6700\u5927\u30ea\u30c8\u30e9\u30a4\u56de\u6570\n    :param base_delay: \u521d\u56de\u5f85\u6a5f\u6642\u9593\uff08\u79d2\uff09\n    :param exponential_base: \u5f85\u6a5f\u6642\u9593\u306e\u6307\u6570\n    :param error_codes: \u30ea\u30c8\u30e9\u30a4\u5bfe\u8c61\u306e\u30a8\u30e9\u30fc\u30b3\u30fc\u30c9\n    \"\"\"\n    def decorator(func):\n        @wraps(func)\n        def wrapper(*args, **kwargs):\n            last_exception = None\n\n            for attempt in range(max_attempts):\n                try:\n                    return func(*args, **kwargs)\n                except ClientError as e:\n                    error_code = e.response['Error']['Code']\n\n                    # \u7279\u5b9a\u306e\u30a8\u30e9\u30fc\u30b3\u30fc\u30c9\u306e\u307f\u30ea\u30c8\u30e9\u30a4\n                    if error_codes and error_code not in error_codes:\n                        raise\n\n                    last_exception = e\n\n                    # \u6700\u5f8c\u306e\u8a66\u884c\u3067\u306f\u30ea\u30c8\u30e9\u30a4\u3057\u306a\u3044\n                    if attempt == max_attempts - 1:\n                        break\n\n                    # \u5f85\u6a5f\u6642\u9593\u3092\u8a08\u7b97\uff08exponential backoff\uff09\n                    delay = base_delay * (exponential_base ** attempt)\n                    time.sleep(delay)\n\n            raise last_exception\n\n        return wrapper\n    return decorator\n\n# \u30c7\u30b3\u30ec\u30fc\u30bf\u306e\u4f7f\u7528\u4f8b\n@aws_retry(\n    max_attempts=3,\n    error_codes=['ThrottlingException', 'RequestLimitExceeded']\n)\ndef list_all_buckets():\n    s3_client = boto3.client('s3')\n    return s3_client.list_buckets()<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-26\">\u975e\u540c\u671f\u51e6\u7406\u3068\u30d0\u30c3\u30c1\u51e6\u7406\u306e\u52b9\u7387\u7684\u306a\u5b9f\u73fe\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u5927\u898f\u6a21\u306a\u51e6\u7406\u3092\u52b9\u7387\u7684\u306b\u5b9f\u884c\u3059\u308b\u305f\u3081\u306e\u975e\u540c\u671f\u51e6\u7406\u3068\u30d0\u30c3\u30c1\u51e6\u7406\u306e\u5b9f\u88c5\u4f8b\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-27\">\u975e\u540c\u671f\u3067\u306eS3\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\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=\"\">import asyncio\nimport aioboto3\nfrom typing import List\n\nasync def process_s3_objects(\n    bucket_name: str,\n    prefix: str,\n    batch_size: int = 10\n) -&gt; List[dict]:\n    \"\"\"\n    S3\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u975e\u540c\u671f\u3067\u51e6\u7406\u3059\u308b\n\n    :param bucket_name: \u30d0\u30b1\u30c3\u30c8\u540d\n    :param prefix: \u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\n    :param batch_size: \u540c\u6642\u51e6\u7406\u6570\n    :return: \u51e6\u7406\u7d50\u679c\u306e\u30ea\u30b9\u30c8\n    \"\"\"\n    session = aioboto3.Session()\n    results = []\n\n    async with session.client('s3') as s3:\n        # \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u4e00\u89a7\u306e\u53d6\u5f97\n        paginator = s3.get_paginator('list_objects_v2')\n        async for page in paginator.paginate(\n            Bucket=bucket_name,\n            Prefix=prefix\n        ):\n            if 'Contents' not in page:\n                continue\n\n            # \u30d0\u30c3\u30c1\u30b5\u30a4\u30ba\u3054\u3068\u306b\u975e\u540c\u671f\u30bf\u30b9\u30af\u3092\u4f5c\u6210\n            tasks = []\n            for obj in page['Contents']:\n                if len(tasks) &gt;= batch_size:\n                    # \u30d0\u30c3\u30c1\u5b9f\u884c\u3057\u3066\u7d50\u679c\u3092\u5f85\u6a5f\n                    batch_results = await asyncio.gather(*tasks)\n                    results.extend(batch_results)\n                    tasks = []\n\n                # \u975e\u540c\u671f\u30bf\u30b9\u30af\u306e\u4f5c\u6210\n                task = process_single_object(s3, bucket_name, obj['Key'])\n                tasks.append(task)\n\n            # \u6b8b\u308a\u306e\u30bf\u30b9\u30af\u3092\u5b9f\u884c\n            if tasks:\n                batch_results = await asyncio.gather(*tasks)\n                results.extend(batch_results)\n\n    return results\n\nasync def process_single_object(\n    s3_client,\n    bucket_name: str,\n    object_key: str\n) -&gt; dict:\n    \"\"\"\n    \u5358\u4e00\u306eS3\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u51e6\u7406\u3059\u308b\n\n    :param s3_client: S3\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\n    :param bucket_name: \u30d0\u30b1\u30c3\u30c8\u540d\n    :param object_key: \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u30ad\u30fc\n    :return: \u51e6\u7406\u7d50\u679c\n    \"\"\"\n    try:\n        response = await s3_client.get_object(\n            Bucket=bucket_name,\n            Key=object_key\n        )\n        # \u3053\u3053\u3067\u5b9f\u969b\u306e\u51e6\u7406\u3092\u5b9f\u88c5\n        return {\n            'key': object_key,\n            'status': 'success',\n            'size': response['ContentLength']\n        }\n    except Exception as e:\n        return {\n            'key': object_key,\n            'status': 'error',\n            'error': str(e)\n        }\n\n# \u5b9f\u884c\u4f8b\nasync def main():\n    results = await process_s3_objects(\n        'my-bucket',\n        'data\/',\n        batch_size=20\n    )\n    print(f\"\u51e6\u7406\u5b8c\u4e86: {len(results)}\u4ef6\")\n\n# \u30a4\u30d9\u30f3\u30c8\u30eb\u30fc\u30d7\u306e\u5b9f\u884c\nif __name__ == '__main__':\n    asyncio.run(main())<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-28\">\u5b9f\u88c5\u306e\u30dd\u30a4\u30f3\u30c8<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ea\u30bd\u30fc\u30b9\u9023\u643a<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b5\u30fc\u30d3\u30b9\u9593\u306e\u4f9d\u5b58\u95a2\u4fc2\u3092\u8003\u616e<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u6a29\u9650\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u30a4\u30d9\u30f3\u30c8\u99c6\u52d5\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3\u306e\u6d3b\u7528<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4e00\u6642\u7684\u306a\u30a8\u30e9\u30fc\u306b\u5bfe\u3059\u308b\u30ea\u30c8\u30e9\u30a4<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u7a2e\u5225\u306b\u5fdc\u3058\u305f\u9069\u5207\u306a\u5bfe\u5fdc<\/li>\n\n\n\n<li>\u30ed\u30b0\u8a18\u9332\u3068\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u975e\u540c\u671f\u30fb\u30d0\u30c3\u30c1\u51e6\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ea\u30bd\u30fc\u30b9\u4f7f\u7528\u91cf\u306e\u5236\u5fa1<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30d0\u30c3\u30c1\u30b5\u30a4\u30ba\u306e\u9078\u5b9a<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u767a\u751f\u6642\u306e\u90e8\u5206\u7684\u306a\u51e6\u7406\u7d99\u7d9a<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30c6\u30af\u30cb\u30c3\u30af\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u52b9\u7387\u7684\u3067\u5805\u7262\u306aAWS\u904b\u7528\u306e\u81ea\u52d5\u5316\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u672c\u756a\u74b0\u5883\u3067\u306e\u904b\u7528\u306b\u5411\u3051\u305f\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-29\">boto3\u958b\u767a\u306b\u304a\u3051\u308b\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3068\u6ce8\u610f\u70b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-30\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u8003\u616e\u3057\u305f\u5b9f\u88c5\u624b\u6cd5<\/h3>\n\n\n\n<p>boto3\u3092\u4f7f\u7528\u3059\u308b\u969b\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3068\u5b9f\u88c5\u4f8b\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-31\">\u5b89\u5168\u306a\u8a8d\u8a3c\u60c5\u5831\u7ba1\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=\"\">import boto3\nimport os\nfrom botocore.config import Config\nfrom aws_encryption_sdk import CommeMaster, EncryptionSDKClient\n\nclass SecureAWSClient:\n    def __init__(self):\n        # \u30bb\u30ad\u30e5\u30a2\u306a\u8a2d\u5b9a\u3067\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3092\u521d\u671f\u5316\n        self.config = Config(\n            retries = dict(\n                max_attempts = 3,\n                mode = 'adaptive'\n            ),\n            connect_timeout = 5,\n            read_timeout = 10\n        )\n\n        # \u74b0\u5883\u5909\u6570\u304b\u3089\u8a8d\u8a3c\u60c5\u5831\u3092\u53d6\u5f97\n        self.session = boto3.Session(\n            region_name = os.environ.get('AWS_REGION'),\n            profile_name = os.environ.get('AWS_PROFILE')\n        )\n\n    def get_secure_client(self, service_name):\n        \"\"\"\u30bb\u30ad\u30e5\u30a2\u306a\u8a2d\u5b9a\u3067\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3092\u53d6\u5f97\"\"\"\n        return self.session.client(\n            service_name,\n            config=self.config\n        )\n\n    @staticmethod\n    def encrypt_sensitive_data(data, kms_key_id):\n        \"\"\"\u6a5f\u5bc6\u30c7\u30fc\u30bf\u306e\u6697\u53f7\u5316\"\"\"\n        client = EncryptionSDKClient()\n        master_key = CommeMaster(key_id=kms_key_id)\n\n        encrypted_data, _ = client.encrypt(\n            source=data,\n            key_provider=master_key\n        )\n        return encrypted_data<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-32\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30b0\u30eb\u30fc\u30d7\u306e\u9069\u5207\u306a\u8a2d\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=\"\">def create_secure_security_group(\n    vpc_id,\n    name,\n    description,\n    allowed_ips\n):\n    \"\"\"\n    \u30bb\u30ad\u30e5\u30a2\u306a\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30b0\u30eb\u30fc\u30d7\u3092\u4f5c\u6210\n\n    :param vpc_id: VPC ID\n    :param name: \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30b0\u30eb\u30fc\u30d7\u540d\n    :param description: \u8aac\u660e\n    :param allowed_ips: \u8a31\u53ef\u3059\u308bIP\u30a2\u30c9\u30ec\u30b9\u30ea\u30b9\u30c8\n    :return: \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30b0\u30eb\u30fc\u30d7ID\n    \"\"\"\n    ec2 = boto3.client('ec2')\n\n    # \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30b0\u30eb\u30fc\u30d7\u306e\u4f5c\u6210\n    response = ec2.create_security_group(\n        GroupName=name,\n        Description=description,\n        VpcId=vpc_id\n    )\n    group_id = response['GroupId']\n\n    # \u30a4\u30f3\u30d0\u30a6\u30f3\u30c9\u30eb\u30fc\u30eb\u306e\u8a2d\u5b9a\n    ec2.authorize_security_group_ingress(\n        GroupId=group_id,\n        IpPermissions=[\n            {\n                'IpProtocol': 'tcp',\n                'FromPort': 443,\n                'ToPort': 443,\n                'IpRanges': [\n                    {\n                        'CidrIp': ip,\n                        'Description': 'HTTPS access'\n                    } for ip in allowed_ips\n                ]\n            }\n        ]\n    )\n\n    # \u76e3\u67fb\u7528\u306e\u30bf\u30b0\u4ed8\u3051\n    ec2.create_tags(\n        Resources=[group_id],\n        Tags=[\n            {\n                'Key': 'Purpose',\n                'Value': 'Secure access'\n            },\n            {\n                'Key': 'ManagedBy',\n                'Value': 'boto3-automation'\n            }\n        ]\n    )\n\n    return group_id<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-33\">\u30b3\u30b9\u30c8\u6700\u9069\u5316\u306e\u30ea\u30bd\u30fc\u30b9\u7ba1\u7406\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u52b9\u7387\u7684\u306a\u30ea\u30bd\u30fc\u30b9\u7ba1\u7406\u3068\u30b3\u30b9\u30c8\u6700\u9069\u5316\u306e\u5b9f\u88c5\u4f8b\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-34\">\u30b3\u30b9\u30c8\u76e3\u8996\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=\"\">from datetime import datetime, timedelta\n\nclass AWSCostOptimizer:\n    def __init__(self):\n        self.ce_client = boto3.client('ce')\n        self.ec2_client = boto3.client('ec2')\n\n    def get_cost_and_usage(self, days=30):\n        \"\"\"\n        \u671f\u9593\u306e\u30b3\u30b9\u30c8\u3068\u4f7f\u7528\u72b6\u6cc1\u3092\u53d6\u5f97\n\n        :param days: \u53d6\u5f97\u3059\u308b\u671f\u9593\uff08\u65e5\u6570\uff09\n        :return: \u30b3\u30b9\u30c8\u30c7\u30fc\u30bf\n        \"\"\"\n        end_date = datetime.now().date()\n        start_date = end_date - timedelta(days=days)\n\n        response = self.ce_client.get_cost_and_usage(\n            TimePeriod={\n                'Start': start_date.isoformat(),\n                'End': end_date.isoformat()\n            },\n            Granularity='DAILY',\n            Metrics=['UnblendedCost'],\n            GroupBy=[\n                {'Type': 'DIMENSION', 'Key': 'SERVICE'},\n                {'Type': 'DIMENSION', 'Key': 'USAGE_TYPE'}\n            ]\n        )\n        return response['ResultsByTime']\n\n    def identify_idle_resources(self):\n        \"\"\"\u30a2\u30a4\u30c9\u30eb\u72b6\u614b\u306e\u30ea\u30bd\u30fc\u30b9\u3092\u7279\u5b9a\"\"\"\n        idle_resources = {\n            'ec2': self._get_idle_ec2_instances(),\n            'ebs': self._get_unused_ebs_volumes(),\n            'eip': self._get_unused_elastic_ips()\n        }\n        return idle_resources\n\n    def _get_idle_ec2_instances(self):\n        \"\"\"\n        \u4f4e\u4f7f\u7528\u7387\u306eEC2\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u7279\u5b9a\n        CloudWatch\u30e1\u30c8\u30ea\u30af\u30b9\u3092\u4f7f\u7528\u3057\u3066\u5224\u65ad\n        \"\"\"\n        cloudwatch = boto3.client('cloudwatch')\n        instances = []\n\n        response = self.ec2_client.describe_instances(\n            Filters=[{'Name': 'instance-state-name', 'Values': ['running']}]\n        )\n\n        for reservation in response['Reservations']:\n            for instance in reservation['Instances']:\n                # CPU\u4f7f\u7528\u7387\u3092\u53d6\u5f97\n                cpu_stats = cloudwatch.get_metric_statistics(\n                    Namespace='AWS\/EC2',\n                    MetricName='CPUUtilization',\n                    Dimensions=[\n                        {\n                            'Name': 'InstanceId',\n                            'Value': instance['InstanceId']\n                        }\n                    ],\n                    StartTime=datetime.now() - timedelta(days=7),\n                    EndTime=datetime.now(),\n                    Period=3600,\n                    Statistics=['Average']\n                )\n\n                # \u5e73\u5747CPU\u4f7f\u7528\u7387\u304c10%\u672a\u6e80\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u7279\u5b9a\n                if cpu_stats['Datapoints']:\n                    avg_cpu = sum(d['Average'] for d in cpu_stats['Datapoints']) \/ len(cpu_stats['Datapoints'])\n                    if avg_cpu &lt; 10:\n                        instances.append({\n                            'InstanceId': instance['InstanceId'],\n                            'AverageCPU': avg_cpu,\n                            'Type': instance['InstanceType']\n                        })\n\n        return instances<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-35\">\u672c\u756a\u74b0\u5883\u3067\u306e\u904b\u7528\u306b\u5411\u3051\u305f\u30c6\u30b9\u30c8\u3068\u76e3\u8996\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<p>\u52b9\u679c\u7684\u306a\u30c6\u30b9\u30c8\u3068\u76e3\u8996\u306e\u5b9f\u88c5\u4f8b\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-36\">\u7d71\u5408\u30c6\u30b9\u30c8\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 unittest\nimport boto3\nfrom moto import mock_s3, mock_ec2\nfrom botocore.exceptions import ClientError\n\nclass TestAWSOperations(unittest.TestCase):\n    @mock_s3\n    def test_s3_operations(self):\n        \"\"\"S3\u64cd\u4f5c\u306e\u30c6\u30b9\u30c8\"\"\"\n        s3_client = boto3.client('s3', region_name='us-east-1')\n        bucket_name = 'test-bucket'\n\n        # \u30d0\u30b1\u30c3\u30c8\u4f5c\u6210\u306e\u30c6\u30b9\u30c8\n        s3_client.create_bucket(Bucket=bucket_name)\n\n        # \u30d0\u30b1\u30c3\u30c8\u4e00\u89a7\u306e\u691c\u8a3c\n        response = s3_client.list_buckets()\n        buckets = [bucket['Name'] for bucket in response['Buckets']]\n        self.assertIn(bucket_name, buckets)\n\n        # \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\n        s3_client.put_object(\n            Bucket=bucket_name,\n            Key='test.txt',\n            Body='test content'\n        )\n\n        # \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u53d6\u5f97\u3068\u691c\u8a3c\n        response = s3_client.get_object(\n            Bucket=bucket_name,\n            Key='test.txt'\n        )\n        content = response['Body'].read().decode()\n        self.assertEqual(content, 'test content')\n\n    @mock_ec2\n    def test_ec2_operations(self):\n        \"\"\"EC2\u64cd\u4f5c\u306e\u30c6\u30b9\u30c8\"\"\"\n        ec2_client = boto3.client('ec2', region_name='us-east-1')\n\n        # \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u8d77\u52d5\u306e\u30c6\u30b9\u30c8\n        response = ec2_client.run_instances(\n            ImageId='ami-12345678',\n            MinCount=1,\n            MaxCount=1,\n            InstanceType='t2.micro'\n        )\n        instance_id = response['Instances'][0]['InstanceId']\n\n        # \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u72b6\u614b\u306e\u691c\u8a3c\n        response = ec2_client.describe_instances(\n            InstanceIds=[instance_id]\n        )\n        state = response['Reservations'][0]['Instances'][0]['State']['Name']\n        self.assertEqual(state, 'running')\n\ndef run_tests():\n    \"\"\"\u30c6\u30b9\u30c8\u306e\u5b9f\u884c\"\"\"\n    unittest.main()\n\nif __name__ == '__main__':\n    run_tests()<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-37\">\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=\"\">import logging\nfrom datetime import datetime, timedelta\n\nclass AWSResourceMonitor:\n    def __init__(self):\n        self.cloudwatch = boto3.client('cloudwatch')\n        self.logger = self._setup_logger()\n\n    def _setup_logger(self):\n        \"\"\"\u30ed\u30ac\u30fc\u306e\u8a2d\u5b9a\"\"\"\n        logger = logging.getLogger('AWSMonitor')\n        logger.setLevel(logging.INFO)\n\n        handler = logging.StreamHandler()\n        formatter = logging.Formatter(\n            '%(asctime)s - %(name)s - %(levelname)s - %(message)s'\n        )\n        handler.setFormatter(formatter)\n        logger.addHandler(handler)\n\n        return logger\n\n    def monitor_service_health(self, service_name):\n        \"\"\"\n        \u30b5\u30fc\u30d3\u30b9\u306e\u5065\u5168\u6027\u76e3\u8996\n\n        :param service_name: \u76e3\u8996\u5bfe\u8c61\u306e\u30b5\u30fc\u30d3\u30b9\u540d\n        :return: \u30e1\u30c8\u30ea\u30af\u30b9\u30c7\u30fc\u30bf\n        \"\"\"\n        metrics = self.cloudwatch.get_metric_data(\n            MetricDataQueries=[\n                {\n                    'Id': 'errors',\n                    'MetricStat': {\n                        'Metric': {\n                            'Namespace': f'AWS\/{service_name}',\n                            'MetricName': 'Errors',\n                            'Dimensions': []\n                        },\n                        'Period': 300,\n                        'Stat': 'Sum'\n                    }\n                },\n                {\n                    'Id': 'latency',\n                    'MetricStat': {\n                        'Metric': {\n                            'Namespace': f'AWS\/{service_name}',\n                            'MetricName': 'Latency',\n                            'Dimensions': []\n                        },\n                        'Period': 300,\n                        'Stat': 'Average'\n                    }\n                }\n            ],\n            StartTime=datetime.now() - timedelta(hours=1),\n            EndTime=datetime.now()\n        )\n\n        self.logger.info(\n            f\"Service: {service_name} - \"\n            f\"Errors: {sum(metrics['MetricDataResults'][0]['Values'])} - \"\n            f\"Avg Latency: {sum(metrics['MetricDataResults'][1]['Values'])\/len(metrics['MetricDataResults'][1]['Values']):.2f}ms\"\n        )\n\n        return metrics\n\n    def create_alarm(self, service_name, metric_name, threshold):\n        \"\"\"\n        CloudWatch\u30a2\u30e9\u30fc\u30e0\u306e\u4f5c\u6210\n\n        :param service_name: \u30b5\u30fc\u30d3\u30b9\u540d\n        :param metric_name: \u30e1\u30c8\u30ea\u30af\u30b9\u540d\n        :param threshold: \u3057\u304d\u3044\u5024\n        \"\"\"\n        self.cloudwatch.put_metric_alarm(\n            AlarmName=f\"{service_name}-{metric_name}-alarm\",\n            ComparisonOperator='GreaterThanThreshold',\n            EvaluationPeriods=2,\n            MetricName=metric_name,\n            Namespace=f'AWS\/{service_name}',\n            Period=300,\n            Statistic='Average',\n            Threshold=threshold,\n            ActionsEnabled=True,\n            AlarmDescription=f'Alarm when {metric_name} exceeds {threshold}',\n            AlarmActions=[\n                'arn:aws:sns:region:account-id:alert-topic'\n            ],\n            Dimensions=[\n                {\n                    'Name': 'ServiceName',\n                    'Value': service_name\n                }\n            ]\n        )<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-38\">\u5b9f\u88c5\u306e\u30dd\u30a4\u30f3\u30c8<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8a8d\u8a3c\u60c5\u5831\u306e\u9069\u5207\u306a\u7ba1\u7406<\/li>\n\n\n\n<li>\u6700\u5c0f\u6a29\u9650\u306e\u539f\u5247\u306e\u9075\u5b88<\/li>\n\n\n\n<li>\u6697\u53f7\u5316\u306e\u9069\u5207\u306a\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30b0\u30eb\u30fc\u30d7\u306e\u614e\u91cd\u306a\u8a2d\u5b9a<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b3\u30b9\u30c8\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ea\u30bd\u30fc\u30b9\u306e\u4f7f\u7528\u72b6\u6cc1\u76e3\u8996<\/li>\n\n\n\n<li>\u672a\u4f7f\u7528\u30ea\u30bd\u30fc\u30b9\u306e\u7279\u5b9a\u3068\u524a\u9664<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u30bf\u30a4\u30d7\u306e\u9078\u629e<\/li>\n\n\n\n<li>\u81ea\u52d5\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\u306e\u6d3b\u7528<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c6\u30b9\u30c8\u3068\u76e3\u8996<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5358\u4f53\u30c6\u30b9\u30c8\u3068\u7d71\u5408\u30c6\u30b9\u30c8\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30e2\u30c3\u30af\u3092\u4f7f\u7528\u3057\u305f\u30c6\u30b9\u30c8\u74b0\u5883\u306e\u69cb\u7bc9<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30e1\u30c8\u30ea\u30af\u30b9\u306e\u53ce\u96c6<\/li>\n\n\n\n<li>\u30a2\u30e9\u30fc\u30c8\u306e\u8a2d\u5b9a<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u9069\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u5b89\u5168\u3067\u52b9\u7387\u7684\u306aboto3\u306e\u5b9f\u88c5\u304c\u53ef\u80fd\u3068\u306a\u308a\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u5b9f\u8df5\u7684\u306a\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-39\">\u3010\u767a\u5c55\u7de8\u3011boto3\u3092\u4f7f\u3063\u305f\u5b9f\u8df5\u7684\u306a\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u96c6<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-40\">\u5927\u898f\u6a21\u30d0\u30c3\u30c1\u51e6\u7406\u306e\u81ea\u52d5\u5316\u4e8b\u4f8b<\/h3>\n\n\n\n<p>\u5927\u91cf\u306e\u30c7\u30fc\u30bf\u3092\u52b9\u7387\u7684\u306b\u51e6\u7406\u3059\u308b\u5b9f\u8df5\u7684\u306a\u5b9f\u88c5\u4f8b\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-41\">S3\u304b\u3089\u306e\u30c7\u30fc\u30bf\u53d6\u5f97\u3068\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=\"\">import boto3\nimport concurrent.futures\nimport pandas as pd\nfrom typing import List, Dict\nfrom datetime import datetime\n\nclass LargeDataProcessor:\n    def __init__(self, bucket_name: str, max_workers: int = 10):\n        self.s3_client = boto3.client('s3')\n        self.bucket_name = bucket_name\n        self.max_workers = max_workers\n\n    def process_large_dataset(\n        self,\n        prefix: str,\n        processor_func\n    ) -&gt; List[Dict]:\n        \"\"\"\n        \u5927\u898f\u6a21\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u306e\u4e26\u5217\u51e6\u7406\n\n        :param prefix: S3\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\n        :param processor_func: \u5404\u30d5\u30a1\u30a4\u30eb\u306b\u9069\u7528\u3059\u308b\u51e6\u7406\u95a2\u6570\n        :return: \u51e6\u7406\u7d50\u679c\u306e\u30ea\u30b9\u30c8\n        \"\"\"\n        # \u51e6\u7406\u5bfe\u8c61\u30d5\u30a1\u30a4\u30eb\u306e\u4e00\u89a7\u53d6\u5f97\n        files = self._list_files(prefix)\n        results = []\n\n        # ThreadPoolExecutor\u306b\u3088\u308b\u4e26\u5217\u51e6\u7406\n        with concurrent.futures.ThreadPoolExecutor(\n            max_workers=self.max_workers\n        ) as executor:\n            future_to_file = {\n                executor.submit(\n                    self._process_single_file,\n                    file,\n                    processor_func\n                ): file for file in files\n            }\n\n            for future in concurrent.futures.as_completed(future_to_file):\n                file = future_to_file[future]\n                try:\n                    result = future.result()\n                    results.append({\n                        'file': file,\n                        'status': 'success',\n                        'result': result\n                    })\n                except Exception as e:\n                    results.append({\n                        'file': file,\n                        'status': 'error',\n                        'error': str(e)\n                    })\n\n        return results\n\n    def _list_files(self, prefix: str) -&gt; List[str]:\n        \"\"\"S3\u30d0\u30b1\u30c3\u30c8\u5185\u306e\u30d5\u30a1\u30a4\u30eb\u4e00\u89a7\u3092\u53d6\u5f97\"\"\"\n        files = []\n        paginator = self.s3_client.get_paginator('list_objects_v2')\n\n        for page in paginator.paginate(\n            Bucket=self.bucket_name,\n            Prefix=prefix\n        ):\n            if 'Contents' in page:\n                files.extend([\n                    obj['Key'] for obj in page['Contents']\n                    if obj['Key'].endswith('.csv')  # \u4f8b\uff1aCSV\u30d5\u30a1\u30a4\u30eb\u306e\u307f\u5bfe\u8c61\n                ])\n\n        return files\n\n    def _process_single_file(\n        self,\n        file_key: str,\n        processor_func\n    ) -&gt; Dict:\n        \"\"\"\u5358\u4e00\u30d5\u30a1\u30a4\u30eb\u306e\u51e6\u7406\"\"\"\n        response = self.s3_client.get_object(\n            Bucket=self.bucket_name,\n            Key=file_key\n        )\n\n        # CSV\u30d5\u30a1\u30a4\u30eb\u306e\u8aad\u307f\u8fbc\u307f\u3068\u51e6\u7406\n        df = pd.read_csv(response['Body'])\n        return processor_func(df)\n\n# \u4f7f\u7528\u4f8b\ndef analyze_sales_data(df: pd.DataFrame) -&gt; Dict:\n    \"\"\"\u58f2\u4e0a\u30c7\u30fc\u30bf\u306e\u5206\u6790\u51e6\u7406\"\"\"\n    return {\n        'total_sales': df['sales'].sum(),\n        'average_sales': df['sales'].mean(),\n        'transaction_count': len(df)\n    }\n\n# \u51e6\u7406\u306e\u5b9f\u884c\nprocessor = LargeDataProcessor('my-data-bucket')\nresults = processor.process_large_dataset(\n    'sales\/2024\/',\n    analyze_sales_data\n)<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-42\">\u30b5\u30fc\u30d0\u30fc\u30ec\u30b9\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3068\u306e\u9023\u643a\u65b9\u6cd5<\/h3>\n\n\n\n<p>AWS Lambda\u3092\u6d3b\u7528\u3057\u305f\u30b5\u30fc\u30d0\u30fc\u30ec\u30b9\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5b9f\u88c5\u4f8b\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-43\">\u30a4\u30d9\u30f3\u30c8\u99c6\u52d5\u578b\u30c7\u30fc\u30bf\u51e6\u7406\u30b7\u30b9\u30c6\u30e0<\/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 json\nimport boto3\nimport os\nfrom typing import Dict, Any\nfrom datetime import datetime\n\nclass ServerlessDataProcessor:\n    def __init__(self):\n        self.s3 = boto3.client('s3')\n        self.sqs = boto3.client('sqs')\n        self.dynamodb = boto3.resource('dynamodb')\n\n        # \u74b0\u5883\u5909\u6570\u304b\u3089\u8a2d\u5b9a\u3092\u53d6\u5f97\n        self.queue_url = os.environ['PROCESSING_QUEUE_URL']\n        self.result_table = self.dynamodb.Table(\n            os.environ['RESULT_TABLE_NAME']\n        )\n\n    def handle_s3_event(self, event: Dict[str, Any]) -&gt; Dict[str, Any]:\n        \"\"\"\n        S3\u30a4\u30d9\u30f3\u30c8\u306e\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\n\n        :param event: Lambda\u95a2\u6570\u306e\u30a4\u30d9\u30f3\u30c8\n        :return: \u51e6\u7406\u7d50\u679c\n        \"\"\"\n        try:\n            # S3\u30a4\u30d9\u30f3\u30c8\u306e\u89e3\u6790\n            bucket = event['Records'][0]['s3']['bucket']['name']\n            key = event['Records'][0]['s3']['object']['key']\n\n            # \u30d5\u30a1\u30a4\u30eb\u60c5\u5831\u3092SQS\u306b\u9001\u4fe1\n            message = {\n                'bucket': bucket,\n                'key': key,\n                'timestamp': datetime.now().isoformat()\n            }\n\n            self.sqs.send_message(\n                QueueUrl=self.queue_url,\n                MessageBody=json.dumps(message)\n            )\n\n            return {\n                'statusCode': 200,\n                'body': json.dumps({\n                    'message': 'File processing initiated',\n                    'file': key\n                })\n            }\n\n        except Exception as e:\n            return {\n                'statusCode': 500,\n                'body': json.dumps({\n                    'error': str(e)\n                })\n            }\n\n    def process_queue_message(\n        self,\n        event: Dict[str, Any]\n    ) -&gt; Dict[str, Any]:\n        \"\"\"\n        SQS\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u51e6\u7406\n\n        :param event: Lambda\u95a2\u6570\u306e\u30a4\u30d9\u30f3\u30c8\n        :return: \u51e6\u7406\u7d50\u679c\n        \"\"\"\n        try:\n            for record in event['Records']:\n                message = json.loads(record['body'])\n\n                # S3\u304b\u3089\u30d5\u30a1\u30a4\u30eb\u3092\u53d6\u5f97\u3057\u3066\u51e6\u7406\n                response = self.s3.get_object(\n                    Bucket=message['bucket'],\n                    Key=message['key']\n                )\n\n                # \u51e6\u7406\u7d50\u679c\u3092DynamoDB\u306b\u4fdd\u5b58\n                result = self._process_data(response['Body'].read())\n                self.result_table.put_item(Item={\n                    'id': message['key'],\n                    'result': result,\n                    'processed_at': datetime.now().isoformat()\n                })\n\n            return {\n                'statusCode': 200,\n                'body': json.dumps({\n                    'message': 'Processing completed'\n                })\n            }\n\n        except Exception as e:\n            return {\n                'statusCode': 500,\n                'body': json.dumps({\n                    'error': str(e)\n                })\n            }\n\n    def _process_data(self, data: bytes) -&gt; Dict[str, Any]:\n        \"\"\"\n        \u30c7\u30fc\u30bf\u51e6\u7406\u306e\u5b9f\u88c5\n        \u5b9f\u969b\u306e\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u306b\u5fdc\u3058\u3066\u51e6\u7406\u3092\u5b9f\u88c5\n        \"\"\"\n        # \u3053\u3053\u306b\u5177\u4f53\u7684\u306a\u51e6\u7406\u3092\u5b9f\u88c5\n        return {\n            'processed': True,\n            'timestamp': datetime.now().isoformat()\n        }\n\n# Lambda\u95a2\u6570\u306e\u30cf\u30f3\u30c9\u30e9\u30fc\ndef s3_event_handler(event, context):\n    processor = ServerlessDataProcessor()\n    return processor.handle_s3_event(event)\n\ndef sqs_message_handler(event, context):\n    processor = ServerlessDataProcessor()\n    return processor.process_queue_message(event)<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-44\">\u30de\u30eb\u30c1\u30a2\u30ab\u30a6\u30f3\u30c8\u74b0\u5883\u3067\u306e\u52b9\u7387\u7684\u306a\u904b\u7528\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u8907\u6570\u306eAWS\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u52b9\u7387\u7684\u306b\u7ba1\u7406\u3059\u308b\u5b9f\u88c5\u4f8b\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-45\">\u30af\u30ed\u30b9\u30a2\u30ab\u30a6\u30f3\u30c8\u30ea\u30bd\u30fc\u30b9\u7ba1\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=\"\">import boto3\nfrom typing import List, Dict\nfrom concurrent.futures import ThreadPoolExecutor\n\nclass MultiAccountManager:\n    def __init__(self, master_role_arn: str):\n        self.master_role_arn = master_role_arn\n        self.sts = boto3.client('sts')\n\n    def assume_role(\n        self,\n        account_id: str,\n        role_name: str\n    ) -&gt; boto3.Session:\n        \"\"\"\n        \u5225\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u30ed\u30fc\u30eb\u3092\u5f15\u304d\u53d7\u3051\u308b\n\n        :param account_id: \u5bfe\u8c61\u30a2\u30ab\u30a6\u30f3\u30c8ID\n        :param role_name: \u5f15\u304d\u53d7\u3051\u308b\u30ed\u30fc\u30eb\u540d\n        :return: \u65b0\u3057\u3044\u30bb\u30c3\u30b7\u30e7\u30f3\n        \"\"\"\n        role_arn = f'arn:aws:iam::{account_id}:role\/{role_name}'\n\n        response = self.sts.assume_role(\n            RoleArn=role_arn,\n            RoleSessionName=f'multi-account-session-{account_id}'\n        )\n\n        return boto3.Session(\n            aws_access_key_id=response['Credentials']['AccessKeyId'],\n            aws_secret_access_key=response['Credentials']['SecretAccessKey'],\n            aws_session_token=response['Credentials']['SessionToken']\n        )\n\n    def scan_resources(\n        self,\n        account_ids: List[str],\n        role_name: str\n    ) -&gt; Dict[str, List[Dict]]:\n        \"\"\"\n        \u8907\u6570\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u30ea\u30bd\u30fc\u30b9\u3092\u30b9\u30ad\u30e3\u30f3\n\n        :param account_ids: \u30b9\u30ad\u30e3\u30f3\u5bfe\u8c61\u306e\u30a2\u30ab\u30a6\u30f3\u30c8ID\u30ea\u30b9\u30c8\n        :param role_name: \u4f7f\u7528\u3059\u308b\u30ed\u30fc\u30eb\u540d\n        :return: \u30a2\u30ab\u30a6\u30f3\u30c8\u3054\u3068\u306e\u30ea\u30bd\u30fc\u30b9\u60c5\u5831\n        \"\"\"\n        results = {}\n\n        with ThreadPoolExecutor(max_workers=10) as executor:\n            future_to_account = {\n                executor.submit(\n                    self._scan_account_resources,\n                    account_id,\n                    role_name\n                ): account_id for account_id in account_ids\n            }\n\n            for future in concurrent.futures.as_completed(future_to_account):\n                account_id = future_to_account[future]\n                try:\n                    results[account_id] = future.result()\n                except Exception as e:\n                    results[account_id] = {\n                        'error': str(e)\n                    }\n\n        return results\n\n    def _scan_account_resources(\n        self,\n        account_id: str,\n        role_name: str\n    ) -&gt; Dict[str, List[Dict]]:\n        \"\"\"\n        \u5358\u4e00\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u30ea\u30bd\u30fc\u30b9\u3092\u30b9\u30ad\u30e3\u30f3\n\n        :param account_id: \u30a2\u30ab\u30a6\u30f3\u30c8ID\n        :param role_name: \u30ed\u30fc\u30eb\u540d\n        :return: \u30ea\u30bd\u30fc\u30b9\u60c5\u5831\n        \"\"\"\n        session = self.assume_role(account_id, role_name)\n        resources = {\n            'ec2': self._scan_ec2_resources(session),\n            's3': self._scan_s3_resources(session),\n            'rds': self._scan_rds_resources(session)\n        }\n        return resources\n\n    def _scan_ec2_resources(self, session: boto3.Session) -&gt; List[Dict]:\n        \"\"\"EC2\u30ea\u30bd\u30fc\u30b9\u306e\u30b9\u30ad\u30e3\u30f3\"\"\"\n        ec2 = session.client('ec2')\n        instances = []\n\n        # \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u60c5\u5831\u306e\u53d6\u5f97\n        paginator = ec2.get_paginator('describe_instances')\n        for page in paginator.paginate():\n            for reservation in page['Reservations']:\n                instances.extend(reservation['Instances'])\n\n        return instances\n\n    def _scan_s3_resources(self, session: boto3.Session) -&gt; List[Dict]:\n        \"\"\"S3\u30ea\u30bd\u30fc\u30b9\u306e\u30b9\u30ad\u30e3\u30f3\"\"\"\n        s3 = session.client('s3')\n        buckets = []\n\n        response = s3.list_buckets()\n        for bucket in response['Buckets']:\n            try:\n                tags = s3.get_bucket_tagging(\n                    Bucket=bucket['Name']\n                ).get('TagSet', [])\n            except:\n                tags = []\n\n            buckets.append({\n                'name': bucket['Name'],\n                'creation_date': bucket['CreationDate'],\n                'tags': tags\n            })\n\n        return buckets\n\n    def _scan_rds_resources(self, session: boto3.Session) -&gt; List[Dict]:\n        \"\"\"RDS\u30ea\u30bd\u30fc\u30b9\u306e\u30b9\u30ad\u30e3\u30f3\"\"\"\n        rds = session.client('rds')\n        instances = []\n\n        paginator = rds.get_paginator('describe_db_instances')\n        for page in paginator.paginate():\n            instances.extend(page['DBInstances'])\n\n        return instances\n\n# \u4f7f\u7528\u4f8b\nmanager = MultiAccountManager('arn:aws:iam::master-account:role\/OrganizationAccountAccessRole')\naccounts = ['111111111111', '222222222222']\nresults = manager.scan_resources(accounts, 'CrossAccountAccessRole')<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-46\">\u5b9f\u88c5\u306e\u30dd\u30a4\u30f3\u30c8<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5927\u898f\u6a21\u30d0\u30c3\u30c1\u51e6\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4e26\u5217\u51e6\u7406\u306b\u3088\u308b\u52b9\u7387\u5316<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u9032\u6357\u7ba1\u7406\u3068\u30ea\u30ab\u30d0\u30ea\u30fc\u6a5f\u80fd<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u6700\u9069\u5316<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b5\u30fc\u30d0\u30fc\u30ec\u30b9\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30a4\u30d9\u30f3\u30c8\u99c6\u52d5\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>\u30de\u30a4\u30af\u30ed\u30b5\u30fc\u30d3\u30b9\u7684\u306a\u8a2d\u8a08<\/li>\n\n\n\n<li>\u52b9\u7387\u7684\u306a\u30ea\u30bd\u30fc\u30b9\u5229\u7528<\/li>\n\n\n\n<li>\u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3\u306e\u78ba\u4fdd<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30de\u30eb\u30c1\u30a2\u30ab\u30a6\u30f3\u30c8\u7ba1\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30bb\u30ad\u30e5\u30a2\u306a\u30af\u30ed\u30b9\u30a2\u30ab\u30a6\u30f3\u30c8\u30a2\u30af\u30bb\u30b9<\/li>\n\n\n\n<li>\u52b9\u7387\u7684\u306a\u30ea\u30bd\u30fc\u30b9\u7ba1\u7406<\/li>\n\n\n\n<li>\u4e00\u8cab\u6027\u306e\u3042\u308b\u904b\u7528<\/li>\n\n\n\n<li>\u30b3\u30f3\u30d7\u30e9\u30a4\u30a2\u30f3\u30b9\u306e\u78ba\u4fdd<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u8df5\u7684\u306a\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u3092\u53c2\u8003\u306b\u3001\u81ea\u8eab\u306e\u74b0\u5883\u306b\u9069\u3057\u305f\u5b9f\u88c5\u3092\u691c\u8a0e\u3057\u3066\u304f\u3060\u3055\u3044\u3002boto3\u306e\u67d4\u8edf\u6027\u3092\u6d3b\u304b\u3059\u3053\u3068\u3067\u3001\u69d8\u3005\u306a\u904b\u7528\u8981\u4ef6\u306b\u5bfe\u5fdc\u3059\u308b\u3053\u3068\u304c\u53ef\u80fd\u3067\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-2425","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\/2425","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=2425"}],"version-history":[{"count":2,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2425\/revisions"}],"predecessor-version":[{"id":2427,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2425\/revisions\/2427"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2425"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2425"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2425"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}