{"id":2432,"date":"2025-03-24T08:47:17","date_gmt":"2025-03-23T23:47:17","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=2432"},"modified":"2025-03-24T08:47:49","modified_gmt":"2025-03-23T23:47:49","slug":"%e3%80%90%e4%bf%9d%e5%ad%98%e7%89%88%e3%80%91boto3-session%e3%81%ae%e5%ae%8c%e5%85%a8%e3%82%ac%e3%82%a4%e3%83%89%ef%bc%9a7%e3%81%a4%e3%81%ae%e5%ae%9f%e8%b7%b5%e7%9a%84%e3%81%aa%e4%bd%bf%e3%81%84","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=2432","title":{"rendered":"\u3010\u4fdd\u5b58\u7248\u3011boto3 session\u306e\u5b8c\u5168\u30ac\u30a4\u30c9\uff1a7\u3064\u306e\u5b9f\u8df5\u7684\u306a\u4f7f\u3044\u65b9\u3068\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 session\u3068\u306f\uff1f\u57fa\u790e\u304b\u3089\u5b9f\u8df5\u307e\u3067<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">boto3 session\u306e\u5f79\u5272\u3068\u91cd\u8981\u6027<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-2\">\u3044\u3088\u3044\u3088\u30bb\u30c3\u30b7\u30e7\u30f3vs\u30ab\u30b9\u30bf\u30e0\u30bb\u30c3\u30b7\u30e7\u30f3<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-5\">boto3 session\u306e\u57fa\u672c\u7684\u306a\u4f7f\u3044\u65b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-6\">\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u4f5c\u6210\u65b9\u6cd5\u3068\u57fa\u672c\u8a2d\u5b9a<\/a>      <\/li>      <li>        <a href=\"#i-9\">\u30ea\u30fc\u30b8\u30e7\u30f3\u3068\u5c02\u7528\u306e\u8a2d\u5b9a<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-10\">\u8a8d\u8a3c\u60c5\u5831\u306e\u7ba1\u7406\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-14\">boto3\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u5b9f\u8df5\u7684\u306a\u6d3b\u7528\u4f8b<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-15\">\u8907\u6570AWS\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u52b9\u7387\u7684\u306a\u7ba1\u7406<\/a>      <\/li>      <li>        <a href=\"#i-17\">\u7570\u306a\u308b\u30ea\u30fc\u30b8\u30e7\u30f3\u3078\u306e\u540c\u6642\u30a2\u30af\u30bb\u30b9<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-19\">\u4e00\u6642\u7684\u306a\u8a8d\u8a3c\u60c5\u5831\u306e\u4f7f\u7528<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-20\">boto3 session\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-21\">\u5b89\u5168\u306a\u8a8d\u8a3c\u60c5\u5831\u306e\u7ba1\u7406\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-24\">IAM\u30ed\u30fc\u30eb\u306e\u52b9\u679c\u7684\u306a\u6d3b\u7528<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-26\">\u30bb\u30c3\u30b7\u30e7\u30f3\u5171\u6709\u6642\u306e\u6ce8\u610f\u70b9<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-28\">boto3 \u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-29\">\u4e00\u822c\u7684\u306a\u30a8\u30e9\u30fc\u3068\u89e3\u6c7a\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-31\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u30dd\u30a4\u30f3\u30c8<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-33\">boto3 session \u306e\u5fdc\u7528\u30c6\u30af\u30cb\u30c3\u30af<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-34\">\u30ab\u30b9\u30bf\u30e0\u30bb\u30c3\u30b7\u30e7\u30f3\u8a2d\u5b9a\u306e\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>      <li>        <a href=\"#i-36\">\u81ea\u52d5\u518d\u63a5\u7d9a\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-37\">\u9ad8\u5ea6\u306a\u8a2d\u5b9a\u4f8b<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-38\">\u307e\u3068\u3081\uff1a\u52b9\u679c\u7684\u306aboto3 session\u306e\u4f7f\u3044\u65b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-39\">\u5b9f\u88c5\u6642\u306e\u91cd\u8981\u30dd\u30a4\u30f3\u30c8<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-42\">\u6b21\u306e\u30b9\u30c6\u30c3\u30d7\u3068\u5b66\u7fd2\u30ea\u30bd\u30fc\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 session\u3068\u306f\uff1f\u57fa\u790e\u304b\u3089\u5b9f\u8df5\u307e\u3067<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">boto3 session\u306e\u5f79\u5272\u3068\u91cd\u8981\u6027<\/h3>\n\n\n\n<p>boto3 session\u306f\u3001AWS Python SDK\u3067\u3042\u308bboto3\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u4e2d\u6838\u3068\u306a\u308b\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3067\u3059\u3002\u30bb\u30c3\u30b7\u30e7\u30f3\u306f\u3001AWS\u30b5\u30fc\u30d3\u30b9\u3068\u306e\u5bfe\u8a71\u306b\u5fc5\u8981\u306a\u8a2d\u5b9a\u3084\u8a8d\u8a3c\u60c5\u5831\u3092\u7ba1\u7406\u3059\u308b\u91cd\u8981\u306a\u8981\u7d20\u3068\u3057\u3066\u6a5f\u80fd\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4e3b\u306a\u5f79\u5272\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u8a8d\u8a3c\u60c5\u5831\u306e\u7ba1\u7406<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>AWS\u8a8d\u8a3c\u60c5\u5831\uff08\u30a2\u30af\u30bb\u30b9\u30ad\u30fc\u3001\u30b7\u30fc\u30af\u30ec\u30c3\u30c8\u30ad\u30fc\uff09\u306e\u4fdd\u6301<\/li>\n\n\n\n<li>IAM\u30ed\u30fc\u30eb\u306e\u4f7f\u7528\u6642\u306e\u8a8d\u8a3c\u60c5\u5831\u7ba1\u7406<\/li>\n\n\n\n<li>\u4e00\u6642\u7684\u306a\u8a8d\u8a3c\u60c5\u5831\u306e\u51e6\u7406<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u8a2d\u5b9a\u306e\u4e00\u5143\u7ba1\u7406<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ea\u30fc\u30b8\u30e7\u30f3\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8URL<\/li>\n\n\n\n<li>\u30d7\u30ed\u30ad\u30b7\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u30ea\u30c8\u30e9\u30a4\u8a2d\u5b9a<\/li>\n<\/ul>\n\n\n\n<p>\u4ee5\u4e0b\u306f\u3001\u57fa\u672c\u7684\u306a\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u4f5c\u6210\u4f8b\u3067\u3059\uff1a<\/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# \u30c7\u30d5\u30a9\u30eb\u30c8\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u4f5c\u6210\nsession = boto3.Session()\n\n# \u30ab\u30b9\u30bf\u30e0\u8a2d\u5b9a\u3067\u306e\u30bb\u30c3\u30b7\u30e7\u30f3\u4f5c\u6210\ncustom_session = boto3.Session(\n    region_name='ap-northeast-1',\n    aws_access_key_id='YOUR_ACCESS_KEY',\n    aws_secret_access_key='YOUR_SECRET_KEY'\n)<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">\u3044\u3088\u3044\u3088\u30bb\u30c3\u30b7\u30e7\u30f3vs\u30ab\u30b9\u30bf\u30e0\u30bb\u30c3\u30b7\u30e7\u30f3<\/h3>\n\n\n\n<p>boto3\u3067\u306f\u3001\u30c7\u30d5\u30a9\u30eb\u30c8\u30bb\u30c3\u30b7\u30e7\u30f3\u3068\u30ab\u30b9\u30bf\u30e0\u30bb\u30c3\u30b7\u30e7\u30f3\u306e2\u7a2e\u985e\u306e\u30bb\u30c3\u30b7\u30e7\u30f3\u7ba1\u7406\u65b9\u6cd5\u304c\u63d0\u4f9b\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-3\">1. \u30c7\u30d5\u30a9\u30eb\u30c8\u30bb\u30c3\u30b7\u30e7\u30f3<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>boto3.client()<\/code> \u3084 <code>boto3.resource()<\/code> \u3092\u76f4\u63a5\u4f7f\u7528\u3059\u308b\u5834\u5408\u306b\u6697\u9ed9\u7684\u306b\u4f5c\u6210<\/li>\n\n\n\n<li>\u74b0\u5883\u5909\u6570\u3084AWS CLI\u306e\u8a2d\u5b9a\u304b\u3089\u81ea\u52d5\u7684\u306b\u8a8d\u8a3c\u60c5\u5831\u3092\u8aad\u307f\u8fbc\u3080<\/li>\n\n\n\n<li>\u30b7\u30f3\u30d7\u30eb\u306a\u4f7f\u7528\u4f8b\uff1a<\/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=\"\"># \u30c7\u30d5\u30a9\u30eb\u30c8\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u4f7f\u7528\u3057\u305f\u4f8b\nimport boto3\n\n# \u30c7\u30d5\u30a9\u30eb\u30c8\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u4f7f\u7528\u3057\u3066S3\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3092\u4f5c\u6210\ns3_client = boto3.client('s3')<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-4\">2. \u30ab\u30b9\u30bf\u30e0\u30bb\u30c3\u30b7\u30e7\u30f3<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u3088\u308a\u7d30\u304b\u306a\u8a2d\u5b9a\u304c\u5fc5\u8981\u306a\u5834\u5408\u306b\u4f7f\u7528<\/li>\n\n\n\n<li>\u8907\u6570\u306eAWS\u30a2\u30ab\u30a6\u30f3\u30c8\u3084\u30ea\u30fc\u30b8\u30e7\u30f3\u3092\u6271\u3046\u5834\u5408\u306b\u6700\u9069<\/li>\n\n\n\n<li>\u660e\u793a\u7684\u306a\u8a2d\u5b9a\u4f8b\uff1a<\/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=\"\"># \u30ab\u30b9\u30bf\u30e0\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u4f7f\u7528\u3057\u305f\u4f8b\nsession = boto3.Session(\n    profile_name='development',\n    region_name='ap-northeast-1'\n)\n\n# \u3053\u306e\u30bb\u30c3\u30b7\u30e7\u30f3\u304b\u3089S3\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3092\u4f5c\u6210\ns3_client = session.client('s3')<\/pre>\n\n\n\n<p>\u30ab\u30b9\u30bf\u30e0\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u4e3b\u306a\u5229\u70b9\uff1a<\/p>\n\n\n<div id=\"id-b5c851fc-c6df-41c4-a39a-1c26d522a8c4\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u6a5f\u80fd<\/th><th>\u30e1\u30ea\u30c3\u30c8<\/th><\/tr><\/thead><tbody><tr><td>\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u6307\u5b9a<\/td><td>\u8907\u6570\u306eAWS\u30a2\u30ab\u30a6\u30f3\u30c8\u8a2d\u5b9a\u3092\u5207\u308a\u66ff\u3048\u53ef\u80fd<\/td><\/tr><tr><td>\u30ea\u30fc\u30b8\u30e7\u30f3\u5236\u5fa1<\/td><td>\u7279\u5b9a\u306e\u30ea\u30fc\u30b8\u30e7\u30f3\u306b\u56fa\u5b9a\u3057\u305f\u64cd\u4f5c\u304c\u53ef\u80fd<\/td><\/tr><tr><td>\u8a8d\u8a3c\u60c5\u5831\u7ba1\u7406<\/td><td>\u30bb\u30c3\u30b7\u30e7\u30f3\u5358\u4f4d\u3067\u8a8d\u8a3c\u60c5\u5831\u3092\u5206\u96e2\u53ef\u80fd<\/td><\/tr><tr><td>\u8a2d\u5b9a\u306e\u30ab\u30d7\u30bb\u30eb\u5316<\/td><td>\u518d\u5229\u7528\u53ef\u80fd\u306a\u8a2d\u5b9a\u3092\u30bb\u30c3\u30b7\u30e7\u30f3\u3068\u3057\u3066\u4fdd\u6301<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p>\u9078\u629e\u306e\u57fa\u6e96\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5358\u4e00\u306eAWS\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u307f\u3092\u4f7f\u7528\u3059\u308b\u5834\u5408 \u2192 \u30c7\u30d5\u30a9\u30eb\u30c8\u30bb\u30c3\u30b7\u30e7\u30f3<\/li>\n\n\n\n<li>\u8907\u6570\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3084\u30ea\u30fc\u30b8\u30e7\u30f3\u3092\u6271\u3046\u5834\u5408 \u2192 \u30ab\u30b9\u30bf\u30e0\u30bb\u30c3\u30b7\u30e7\u30f3<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u8981\u4ef6\u304c\u53b3\u3057\u3044\u5834\u5408 \u2192 \u30ab\u30b9\u30bf\u30e0\u30bb\u30c3\u30b7\u30e7\u30f3\uff08\u8a8d\u8a3c\u60c5\u5831\u306e\u660e\u793a\u7684\u306a\u7ba1\u7406\uff09<\/li>\n\n\n\n<li>\u30c1\u30fc\u30e0\u958b\u767a\u3067\u306e\u518d\u5229\u7528\u6027\u3092\u91cd\u8996\u3059\u308b\u5834\u5408 \u2192 \u30ab\u30b9\u30bf\u30e0\u30bb\u30c3\u30b7\u30e7\u30f3\uff08\u8a2d\u5b9a\u306e\u5171\u6709\u304c\u5bb9\u6613\uff09<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-5\">boto3 session\u306e\u57fa\u672c\u7684\u306a\u4f7f\u3044\u65b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-6\">\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u4f5c\u6210\u65b9\u6cd5\u3068\u57fa\u672c\u8a2d\u5b9a<\/h3>\n\n\n\n<p>boto3\u3067\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3059\u308b\u65b9\u6cd5\u306f\u3001\u30b7\u30f3\u30d7\u30eb\u306a\u3082\u306e\u304b\u3089\u9ad8\u5ea6\u306a\u8a2d\u5b9a\u307e\u3067\u8907\u6570\u306e\u65b9\u6cd5\u304c\u3042\u308a\u307e\u3059\u3002\u3053\u3053\u3067\u306f\u3001\u5b9f\u52d9\u3067\u4f7f\u7528\u983b\u5ea6\u306e\u9ad8\u3044\u65b9\u6cd5\u3092\u9806\u306b\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-7\">1. \u30c7\u30d5\u30a9\u30eb\u30c8\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u4f5c\u6210<\/h4>\n\n\n\n<p>\u6700\u3082\u30b7\u30f3\u30d7\u30eb\u306a\u65b9\u6cd5\u306f\u3001\u30c7\u30d5\u30a9\u30eb\u30c8\u8a2d\u5b9a\u3067\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3059\u308b\u3053\u3068\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=\"\">import boto3\n\n# \u30c7\u30d5\u30a9\u30eb\u30c8\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u4f5c\u6210\nsession = boto3.Session()\n\n# \u30bb\u30c3\u30b7\u30e7\u30f3\u304b\u3089S3\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3092\u4f5c\u6210\ns3_client = session.client('s3')<\/pre>\n\n\n\n<p>\u3053\u306e\u30b3\u30fc\u30c9\u306f\u4ee5\u4e0b\u306e\u9806\u5e8f\u3067\u8a8d\u8a3c\u60c5\u5831\u3092\u63a2\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u74b0\u5883\u5909\u6570\uff08AWS_ACCESS_KEY_ID\u3001AWS_SECRET_ACCESS_KEY\uff09<\/li>\n\n\n\n<li>SharedCredentials\u30d5\u30a1\u30a4\u30eb\uff08~\/.aws\/credentials\uff09<\/li>\n\n\n\n<li>IAM\u30ed\u30fc\u30eb\uff08EC2\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3084Lambda\u95a2\u6570\u306e\u5834\u5408\uff09<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-8\">2. \u30ea\u30fc\u30b8\u30e7\u30f3\u3092\u6307\u5b9a\u3057\u305f\u30bb\u30c3\u30b7\u30e7\u30f3\u4f5c\u6210<\/h4>\n\n\n\n<p>\u7279\u5b9a\u306e\u30ea\u30fc\u30b8\u30e7\u30f3\u3067\u306e\u64cd\u4f5c\u304c\u5fc5\u8981\u306a\u5834\u5408\u306f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u6307\u5b9a\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=\"\"># \u6771\u4eac\u30ea\u30fc\u30b8\u30e7\u30f3\u3092\u6307\u5b9a\u3057\u3066\u30bb\u30c3\u30b7\u30e7\u30f3\u4f5c\u6210\ntokyo_session = boto3.Session(region_name='ap-northeast-1')\n\n# \u30b7\u30f3\u30ac\u30dd\u30fc\u30eb\u30ea\u30fc\u30b8\u30e7\u30f3\u3092\u6307\u5b9a\u3057\u3066\u30bb\u30c3\u30b7\u30e7\u30f3\u4f5c\u6210\nsingapore_session = boto3.Session(region_name='ap-southeast-1')\n\n# \u5404\u30ea\u30fc\u30b8\u30e7\u30f3\u306eEC2\u60c5\u5831\u3092\u53d6\u5f97\u3059\u308b\u4f8b\ntokyo_ec2 = tokyo_session.client('ec2')\nsingapore_ec2 = singapore_session.client('ec2')\n\n# \u5404\u30ea\u30fc\u30b8\u30e7\u30f3\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u60c5\u5831\u3092\u53d6\u5f97\ntokyo_instances = tokyo_ec2.describe_instances()\nsingapore_instances = singapore_ec2.describe_instances()<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-9\">\u30ea\u30fc\u30b8\u30e7\u30f3\u3068\u5c02\u7528\u306e\u8a2d\u5b9a<\/h3>\n\n\n\n<p>AWS\u30ea\u30fc\u30b8\u30e7\u30f3\u306e\u8a2d\u5b9a\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30ec\u30a4\u30c6\u30f3\u30b7\u30fc\u3068\u30b3\u30b9\u30c8\u306b\u76f4\u63a5\u5f71\u97ff\u3092\u4e0e\u3048\u308b\u91cd\u8981\u306a\u8981\u7d20\u3067\u3059\u3002\u4ee5\u4e0b\u306b\u3001\u52b9\u679c\u7684\u306a\u8a2d\u5b9a\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.config import Config\n\n# \u30ab\u30b9\u30bf\u30e0\u8a2d\u5b9a\u306e\u4f5c\u6210\ncustom_config = Config(\n    region_name='ap-northeast-1',\n    retries = dict(\n        max_attempts = 3  # \u30ea\u30c8\u30e9\u30a4\u56de\u6570\n    ),\n    connect_timeout = 5,  # \u63a5\u7d9a\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\uff08\u79d2\uff09\n    read_timeout = 10     # \u8aad\u307f\u53d6\u308a\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\uff08\u79d2\uff09\n)\n\n# \u30ab\u30b9\u30bf\u30e0\u8a2d\u5b9a\u3092\u4f7f\u7528\u3057\u3066\u30bb\u30c3\u30b7\u30e7\u30f3\u4f5c\u6210\nsession = boto3.Session()\ns3_client = session.client('s3', config=custom_config)<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">\u8a8d\u8a3c\u60c5\u5831\u306e\u7ba1\u7406\u65b9\u6cd5<\/h3>\n\n\n\n<p>boto3\u3067\u306e\u8a8d\u8a3c\u60c5\u5831\u7ba1\u7406\u306b\u306f\u3001\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u8003\u616e\u3057\u305f\u8907\u6570\u306e\u65b9\u6cd5\u304c\u3042\u308a\u307e\u3059\u3002\u4ee5\u4e0b\u306b\u3001\u63a8\u5968\u3055\u308c\u308b\u65b9\u6cd5\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-11\">1. \u8a8d\u8a3c\u60c5\u5831\u30d5\u30a1\u30a4\u30eb\u306e\u4f7f\u7528<\/h4>\n\n\n\n<p><code>~\/.aws\/credentials<\/code>\u30d5\u30a1\u30a4\u30eb\u3092\u4f7f\u7528\u3059\u308b\u65b9\u6cd5\uff08\u63a8\u5968\uff09\uff1a<\/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=\"\"># ~\/.aws\/credentials<\/pre>\n\n\n[default]\n\n\n\n<p>aws_access_key_id = YOUR_ACCESS_KEY aws_secret_access_key = YOUR_SECRET_KEY<\/p>\n\n\n[development]\n\n\n\n<p>aws_access_key_id = DEV_ACCESS_KEY aws_secret_access_key = DEV_SECRET_KEY<\/p>\n\n\n[production]\n\n\n\n<p>aws_access_key_id = PROD_ACCESS_KEY aws_secret_access_key = PROD_SECRET_KEY<\/p>\n\n\n\n<p>\u3053\u306e\u8a8d\u8a3c\u60c5\u5831\u30d5\u30a1\u30a4\u30eb\u3092\u4f7f\u7528\u3059\u308b\u65b9\u6cd5\uff1a<\/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# \u30c7\u30d5\u30a9\u30eb\u30c8\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u3092\u4f7f\u7528\ndefault_session = boto3.Session()\n\n# \u958b\u767a\u74b0\u5883\u7528\u306e\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u3092\u4f7f\u7528\ndev_session = boto3.Session(profile_name='development')\n\n# \u672c\u756a\u74b0\u5883\u7528\u306e\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u3092\u4f7f\u7528\nprod_session = boto3.Session(profile_name='production')<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-12\">2. \u74b0\u5883\u5909\u6570\u3092\u4f7f\u7528\u3059\u308b\u65b9\u6cd5<\/h4>\n\n\n\n<p>\u74b0\u5883\u5909\u6570\u3092\u4f7f\u7528\u3059\u308b\u5834\u5408\uff08CI\/CD\u74b0\u5883\u306a\u3069\u3067\u63a8\u5968\uff09\uff1a<\/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 os\nimport boto3\n\n# \u74b0\u5883\u5909\u6570\u306e\u8a2d\u5b9a\nos.environ['AWS_ACCESS_KEY_ID'] = 'YOUR_ACCESS_KEY'\nos.environ['AWS_SECRET_ACCESS_KEY'] = 'YOUR_SECRET_KEY'\nos.environ['AWS_DEFAULT_REGION'] = 'ap-northeast-1'\n\n# \u74b0\u5883\u5909\u6570\u304b\u3089\u81ea\u52d5\u7684\u306b\u8a8d\u8a3c\u60c5\u5831\u3092\u8aad\u307f\u8fbc\u3080\nsession = boto3.Session()<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-13\">3. \u4e00\u6642\u7684\u306a\u8a8d\u8a3c\u60c5\u5831\u3092\u4f7f\u7528\u3059\u308b\u65b9\u6cd5<\/h4>\n\n\n\n<p>STS\u3092\u4f7f\u7528\u3057\u3066\u4e00\u6642\u7684\u306a\u8a8d\u8a3c\u60c5\u5831\u3092\u53d6\u5f97\u3059\u308b\u5834\u5408\uff1a<\/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# STS\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u4f5c\u6210\nsts = boto3.client('sts')\n\n# \u4e00\u6642\u7684\u306a\u8a8d\u8a3c\u60c5\u5831\u306e\u53d6\u5f97\nassumed_role = sts.assume_role(\n    RoleArn='arn:aws:iam::ACCOUNT_ID:role\/ROLE_NAME',\n    RoleSessionName='AssumedRoleSession1'\n)\n\n# \u4e00\u6642\u7684\u306a\u8a8d\u8a3c\u60c5\u5831\u3067\u30bb\u30c3\u30b7\u30e7\u30f3\u4f5c\u6210\ntemp_session = boto3.Session(\n    aws_access_key_id=assumed_role['Credentials']['AccessKeyId'],\n    aws_secret_access_key=assumed_role['Credentials']['SecretAccessKey'],\n    aws_session_token=assumed_role['Credentials']['SessionToken']\n)<\/pre>\n\n\n\n<p>\u5b9f\u88c5\u6642\u306e\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u8a8d\u8a3c\u60c5\u5831\u306e\u512a\u5148\u9806\u4f4d\uff1a<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u660e\u793a\u7684\u306b\u6307\u5b9a\u3055\u308c\u305f\u8a8d\u8a3c\u60c5\u5831<\/li>\n\n\n\n<li>\u74b0\u5883\u5909\u6570<\/li>\n\n\n\n<li>\u8a8d\u8a3c\u60c5\u5831\u30d5\u30a1\u30a4\u30eb<\/li>\n\n\n\n<li>IAM\u30ed\u30fc\u30eb<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\uff1a<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u672c\u756a\u74b0\u5883\u3067\u306f\u8a8d\u8a3c\u60c5\u5831\u30d5\u30a1\u30a4\u30eb\u306e\u4f7f\u7528\u3092\u907f\u3051\u308b<\/li>\n\n\n\n<li>\u53ef\u80fd\u306a\u9650\u308aIAM\u30ed\u30fc\u30eb\u3092\u4f7f\u7528\u3059\u308b<\/li>\n\n\n\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>\u8a8d\u8a3c\u60c5\u5831\u3092\u30b3\u30fc\u30c9\u306b\u30cf\u30fc\u30c9\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u3057\u306a\u3044<\/li>\n\n\n\n<li>\u6700\u5c0f\u6a29\u9650\u306e\u539f\u5247\u306b\u5f93\u3046<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30a8\u30e9\u30fc\u51e6\u7406\uff1a<\/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=\"\">try:\n    session = boto3.Session()\n    s3 = session.client('s3')\n    response = s3.list_buckets()\nexcept boto3.exceptions.NoCredentialsError:\n    print(\"\u8a8d\u8a3c\u60c5\u5831\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\")\nexcept boto3.exceptions.ClientError as e:\n    print(f\"\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: {e.response['Error']['Message']}\")<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u57fa\u672c\u7684\u306a\u4f7f\u7528\u65b9\u6cd5\u3092\u7406\u89e3\u3059\u308b\u3053\u3068\u3067\u3001\u30bb\u30ad\u30e5\u30a2\u3067\u52b9\u7387\u7684\u306aAWS\u30ea\u30bd\u30fc\u30b9\u306e\u7ba1\u7406\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-14\">boto3\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u5b9f\u8df5\u7684\u306a\u6d3b\u7528\u4f8b<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-15\">\u8907\u6570AWS\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u52b9\u7387\u7684\u306a\u7ba1\u7406<\/h3>\n\n\n\n<p>\u8907\u6570\u306eAWS\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u7ba1\u7406\u3059\u308b\u5834\u5408\u3001boto3 session\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u52b9\u7387\u7684\u306a\u904b\u7528\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002\u4ee5\u4e0b\u306b\u3001\u5b9f\u8df5\u7684\u306a\u5b9f\u88c5\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-16\">1. \u30a2\u30ab\u30a6\u30f3\u30c8\u5207\u308a\u66ff\u3048\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 boto3\nfrom typing import Dict, Any\n\nclass AWSAccountManager:\n    def __init__(self):\n        self.sessions: Dict[str, boto3.Session] = {}\n\n    def get_session(self, account_profile: str, region: str = 'ap-northeast-1') -&gt; boto3.Session:\n        \"\"\"\u6307\u5b9a\u3055\u308c\u305f\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u53d6\u5f97\u307e\u305f\u306f\u4f5c\u6210\"\"\"\n        session_key = f\"{account_profile}_{region}\"\n\n        if session_key not in self.sessions:\n            self.sessions[session_key] = boto3.Session(\n                profile_name=account_profile,\n                region_name=region\n            )\n\n        return self.sessions[session_key]\n\n    def get_client(self, service: str, account_profile: str, region: str = 'ap-northeast-1') -&gt; Any:\n        \"\"\"\u7279\u5b9a\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3068\u30ea\u30fc\u30b8\u30e7\u30f3\u306eAWS\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3092\u53d6\u5f97\"\"\"\n        session = self.get_session(account_profile, region)\n        return session.client(service)\n\n# \u4f7f\u7528\u4f8b\naccount_manager = AWSAccountManager()\n\n# \u958b\u767a\u74b0\u5883\u306eS3\u64cd\u4f5c\ndev_s3 = account_manager.get_client('s3', 'development')\ndev_s3.list_buckets()\n\n# \u672c\u756a\u74b0\u5883\u306eEC2\u64cd\u4f5c\nprod_ec2 = account_manager.get_client('ec2', 'production')\nprod_ec2.describe_instances()<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">\u7570\u306a\u308b\u30ea\u30fc\u30b8\u30e7\u30f3\u3078\u306e\u540c\u6642\u30a2\u30af\u30bb\u30b9<\/h3>\n\n\n\n<p>\u30b0\u30ed\u30fc\u30d0\u30eb\u306a\u30b5\u30fc\u30d3\u30b9\u5c55\u958b\u3084\u30c7\u30a3\u30b6\u30b9\u30bf\u30ea\u30ab\u30d0\u30ea\u306e\u5b9f\u88c5\u3067\u306f\u3001\u8907\u6570\u30ea\u30fc\u30b8\u30e7\u30f3\u3078\u306e\u540c\u6642\u30a2\u30af\u30bb\u30b9\u304c\u5fc5\u8981\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-18\">\u30de\u30eb\u30c1\u30ea\u30fc\u30b8\u30e7\u30f3\u64cd\u4f5c\u306e\u5b9f\u88c5\u4f8b<\/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 concurrent.futures import ThreadPoolExecutor\nfrom typing import List, Dict\n\nclass MultiRegionManager:\n    def __init__(self, regions: List[str], profile_name: str = 'default'):\n        self.regions = regions\n        self.profile_name = profile_name\n        self.sessions = self._create_sessions()\n\n    def _create_sessions(self) -&gt; Dict[str, boto3.Session]:\n        \"\"\"\u5404\u30ea\u30fc\u30b8\u30e7\u30f3\u7528\u306e\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\"\"\"\n        return {\n            region: boto3.Session(\n                profile_name=self.profile_name,\n                region_name=region\n            )\n            for region in self.regions\n        }\n\n    def execute_in_all_regions(self, service: str, operation: str, **kwargs):\n        \"\"\"\u5168\u30ea\u30fc\u30b8\u30e7\u30f3\u3067\u7279\u5b9a\u306e\u64cd\u4f5c\u3092\u5b9f\u884c\"\"\"\n        def execute_operation(region):\n            client = self.sessions[region].client(service)\n            method = getattr(client, operation)\n            try:\n                return region, method(**kwargs)\n            except Exception as e:\n                return region, str(e)\n\n        with ThreadPoolExecutor() as executor:\n            results = list(executor.map(\n                execute_operation,\n                self.regions\n            ))\n\n        return dict(results)\n\n# \u4f7f\u7528\u4f8b\nregions = ['ap-northeast-1', 'ap-southeast-1', 'us-east-1']\nmulti_region = MultiRegionManager(regions)\n\n# \u5168\u30ea\u30fc\u30b8\u30e7\u30f3\u306eEC2\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u60c5\u5831\u3092\u53d6\u5f97\nresults = multi_region.execute_in_all_regions(\n    service='ec2',\n    operation='describe_instances'\n)<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-19\">\u4e00\u6642\u7684\u306a\u8a8d\u8a3c\u60c5\u5831\u306e\u4f7f\u7528<\/h3>\n\n\n\n<p>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u5f37\u5316\u3059\u308b\u305f\u3081\u3001\u4e00\u6642\u7684\u306a\u8a8d\u8a3c\u60c5\u5831\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u304c\u63a8\u5968\u3055\u308c\u307e\u3059\u3002\u4ee5\u4e0b\u306b\u3001STS\u3092\u4f7f\u7528\u3057\u305f\u5b9f\u88c5\u4f8b\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 datetime import datetime, timezone\nfrom typing import Optional, Dict\n\nclass TemporaryCredentialManager:\n    def __init__(self, role_arn: str, session_name: str):\n        self.role_arn = role_arn\n        self.session_name = session_name\n        self.temp_session: Optional[boto3.Session] = None\n        self.expiration: Optional[datetime] = None\n\n    def get_session(self) -&gt; boto3.Session:\n        \"\"\"\u6709\u52b9\u306a\u4e00\u6642\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u53d6\u5f97\"\"\"\n        if self._is_session_expired():\n            self._refresh_session()\n        return self.temp_session\n\n    def _is_session_expired(self) -&gt; bool:\n        \"\"\"\u30bb\u30c3\u30b7\u30e7\u30f3\u304c\u671f\u9650\u5207\u308c\u304b\u3069\u3046\u304b\u3092\u78ba\u8a8d\"\"\"\n        if not self.expiration:\n            return True\n\n        # \u671f\u9650\u5207\u308c\u306e10\u5206\u524d\u304b\u3089\u66f4\u65b0\n        buffer_time = 600  # 10\u5206\n        now = datetime.now(timezone.utc)\n        return (self.expiration - now).total_seconds() &lt; buffer_time\n\n    def _refresh_session(self):\n        \"\"\"\u4e00\u6642\u7684\u306a\u8a8d\u8a3c\u60c5\u5831\u3092\u66f4\u65b0\"\"\"\n        sts = boto3.client('sts')\n        response = sts.assume_role(\n            RoleArn=self.role_arn,\n            RoleSessionName=self.session_name,\n            DurationSeconds=3600  # 1\u6642\u9593\n        )\n\n        credentials = response['Credentials']\n        self.temp_session = boto3.Session(\n            aws_access_key_id=credentials['AccessKeyId'],\n            aws_secret_access_key=credentials['SecretAccessKey'],\n            aws_session_token=credentials['SessionToken']\n        )\n        self.expiration = credentials['Expiration']\n\n# \u4f7f\u7528\u4f8b\ntemp_cred_manager = TemporaryCredentialManager(\n    role_arn='arn:aws:iam::123456789012:role\/MyRole',\n    session_name='TempSession'\n)\n\n# \u4e00\u6642\u7684\u306a\u8a8d\u8a3c\u60c5\u5831\u3092\u4f7f\u7528\u3057\u3066S3\u64cd\u4f5c\nsession = temp_cred_manager.get_session()\ns3 = session.client('s3')\nbuckets = s3.list_buckets()<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u4f8b\u306f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u5b9f\u52d9\u4e0a\u306e\u8ab2\u984c\u3092\u89e3\u6c7a\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u8907\u6570\u74b0\u5883\u306e\u7d71\u5408\u7ba1\u7406<\/li>\n\n\n\n<li>\u30af\u30ed\u30b9\u30ea\u30fc\u30b8\u30e7\u30f3\u306e\u30d0\u30c3\u30af\u30a2\u30c3\u30d7<\/li>\n\n\n\n<li>\u30b0\u30ed\u30fc\u30d0\u30eb\u30b5\u30fc\u30d3\u30b9\u306e\u5c55\u958b<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30a2\u306a\u8a8d\u8a3c\u60c5\u5831\u7ba1\u7406<\/li>\n\n\n\n<li>\u81ea\u52d5\u5316\u3055\u308c\u305f\u30de\u30eb\u30c1\u30a2\u30ab\u30a6\u30f3\u30c8\u64cd\u4f5c<\/li>\n<\/ol>\n\n\n\n<p>\u5b9f\u88c5\u6642\u306e\u6ce8\u610f\u70b9\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3092\u9069\u5207\u306b\u5b9f\u88c5\u3059\u308b<\/li>\n\n\n\n<li>\u30ea\u30c8\u30e9\u30a4\u30ed\u30b8\u30c3\u30af\u3092\u7d44\u307f\u8fbc\u3080<\/li>\n\n\n\n<li>\u8a8d\u8a3c\u60c5\u5831\u306e\u6709\u52b9\u671f\u9650\u3092\u7ba1\u7406\u3059\u308b<\/li>\n\n\n\n<li>\u30ea\u30bd\u30fc\u30b9\u306e\u9069\u5207\u306a\u89e3\u653e\u3092\u884c\u3046<\/li>\n\n\n\n<li>\u30ed\u30b0\u51fa\u529b\u3092\u5b9f\u88c5\u3059\u308b<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-20\">boto3 session\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-21\">\u5b89\u5168\u306a\u8a8d\u8a3c\u60c5\u5831\u306e\u7ba1\u7406\u65b9\u6cd5<\/h3>\n\n\n\n<p>boto3 session\u3092\u4f7f\u7528\u3059\u308b\u969b\u306e\u8a8d\u8a3c\u60c5\u5831\u7ba1\u7406\u306b\u306f\u3001\u7279\u306b\u6ce8\u610f\u3092\u6255\u3046\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u4ee5\u4e0b\u306b\u3001\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u78ba\u4fdd\u3059\u308b\u305f\u3081\u306e\u5177\u4f53\u7684\u306a\u5b9f\u88c5\u65b9\u6cd5\u3068\u63a8\u5968\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-22\">1. \u74b0\u5883\u5909\u6570\u3092\u4f7f\u7528\u3057\u305f\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 os\nimport boto3\nfrom pathlib import Path\nfrom dotenv import load_dotenv\n\ndef get_secure_session():\n    \"\"\"\u74b0\u5883\u5909\u6570\u304b\u3089\u5b89\u5168\u306b\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3059\u308b\"\"\"\n    # .env\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u74b0\u5883\u5909\u6570\u3092\u8aad\u307f\u8fbc\u3080\n    env_path = Path('.env')\n    load_dotenv(dotenv_path=env_path)\n\n    # \u74b0\u5883\u5909\u6570\u306e\u5b58\u5728\u78ba\u8a8d\n    required_vars = ['AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY', 'AWS_DEFAULT_REGION']\n    missing_vars = [var for var in required_vars if os.getenv(var) is None]\n\n    if missing_vars:\n        raise ValueError(f\"Missing required environment variables: {', '.join(missing_vars)}\")\n\n    # \u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u4f5c\u6210\n    return boto3.Session(\n        region_name=os.getenv('AWS_DEFAULT_REGION')\n    )<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-23\">2. \u8a8d\u8a3c\u60c5\u5831\u306e\u6697\u53f7\u5316\u3068\u5fa9\u53f7\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 cryptography.fernet import Fernet\nimport json\n\nclass SecureCredentialManager:\n    def __init__(self, encryption_key: bytes):\n        self.fernet = Fernet(encryption_key)\n\n    def encrypt_credentials(self, credentials: dict) -&gt; bytes:\n        \"\"\"\u8a8d\u8a3c\u60c5\u5831\u3092\u6697\u53f7\u5316\"\"\"\n        return self.fernet.encrypt(json.dumps(credentials).encode())\n\n    def decrypt_credentials(self, encrypted_data: bytes) -&gt; dict:\n        \"\"\"\u8a8d\u8a3c\u60c5\u5831\u3092\u5fa9\u53f7\u5316\"\"\"\n        return json.loads(self.fernet.decrypt(encrypted_data).decode())\n\n    def get_secure_session(self, encrypted_credentials: bytes) -&gt; boto3.Session:\n        \"\"\"\u6697\u53f7\u5316\u3055\u308c\u305f\u8a8d\u8a3c\u60c5\u5831\u304b\u3089\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\"\"\"\n        credentials = self.decrypt_credentials(encrypted_credentials)\n        return boto3.Session(**credentials)<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-24\">IAM\u30ed\u30fc\u30eb\u306e\u52b9\u679c\u7684\u306a\u6d3b\u7528<\/h3>\n\n\n\n<p>IAM\u30ed\u30fc\u30eb\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u9577\u671f\u7684\u306a\u8a8d\u8a3c\u60c5\u5831\u306e\u4f7f\u7528\u3092\u907f\u3051\u3001\u3088\u308a\u30bb\u30ad\u30e5\u30a2\u306a\u74b0\u5883\u3092\u69cb\u7bc9\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-25\">1. \u30ed\u30fc\u30eb\u306e\u7d99\u627f\u3068\u5207\u308a\u66ff\u3048<\/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 datetime import datetime, timezone\n\nclass RoleManager:\n    def __init__(self, base_session: boto3.Session):\n        self.base_session = base_session\n        self.sts_client = base_session.client('sts')\n\n    def assume_role(self, role_arn: str, session_name: str = None) -&gt; boto3.Session:\n        \"\"\"\n        IAM\u30ed\u30fc\u30eb\u3092\u7d99\u627f\u3057\u305f\u65b0\u3057\u3044\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\n        \"\"\"\n        if session_name is None:\n            session_name = f\"AssumedRole_{datetime.now(timezone.utc).strftime('%Y%m%d_%H%M%S')}\"\n\n        response = self.sts_client.assume_role(\n            RoleArn=role_arn,\n            RoleSessionName=session_name,\n            DurationSeconds=3600  # 1\u6642\u9593\n        )\n\n        credentials = response['Credentials']\n        return boto3.Session(\n            aws_access_key_id=credentials['AccessKeyId'],\n            aws_secret_access_key=credentials['SecretAccessKey'],\n            aws_session_token=credentials['SessionToken']\n        )\n\n    def validate_session_permissions(self, session: boto3.Session) -&gt; bool:\n        \"\"\"\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u6a29\u9650\u3092\u691c\u8a3c\"\"\"\n        try:\n            sts = session.client('sts')\n            identity = sts.get_caller_identity()\n            return True\n        except Exception:\n            return False<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-26\">\u30bb\u30c3\u30b7\u30e7\u30f3\u5171\u6709\u6642\u306e\u6ce8\u610f\u70b9<\/h3>\n\n\n\n<p>\u8907\u6570\u306e\u30d7\u30ed\u30bb\u30b9\u3084\u30b9\u30ec\u30c3\u30c9\u9593\u3067\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u5171\u6709\u3059\u308b\u969b\u306f\u3001\u4ee5\u4e0b\u306e\u70b9\u306b\u6ce8\u610f\u304c\u5fc5\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-27\">1. \u30b9\u30ec\u30c3\u30c9\u30bb\u30fc\u30d5\u306a\u30bb\u30c3\u30b7\u30e7\u30f3\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 threading\nfrom typing import Dict\nfrom contextlib import contextmanager\n\nclass ThreadSafeSessionManager:\n    def __init__(self):\n        self._sessions: Dict[str, boto3.Session] = {}\n        self._lock = threading.Lock()\n\n    @contextmanager\n    def get_session(self, profile_name: str) -&gt; boto3.Session:\n        \"\"\"\u30b9\u30ec\u30c3\u30c9\u30bb\u30fc\u30d5\u306a\u30bb\u30c3\u30b7\u30e7\u30f3\u53d6\u5f97\"\"\"\n        with self._lock:\n            if profile_name not in self._sessions:\n                self._sessions[profile_name] = boto3.Session(profile_name=profile_name)\n\n            try:\n                yield self._sessions[profile_name]\n            finally:\n                # \u30bb\u30c3\u30b7\u30e7\u30f3\u4f7f\u7528\u5f8c\u306e\u30af\u30ea\u30fc\u30f3\u30a2\u30c3\u30d7\u51e6\u7406\n                pass<\/pre>\n\n\n\n<p>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8\uff1a<\/p>\n\n\n<div id=\"id-8ccd59c8-bea8-4cb3-aede-cb405b85c32b\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u30c1\u30a7\u30c3\u30af\u9805\u76ee<\/th><th>\u91cd\u8981\u5ea6<\/th><th>\u5b9f\u88c5\u65b9\u6cd5<\/th><\/tr><\/thead><tbody><tr><td>\u8a8d\u8a3c\u60c5\u5831\u306e\u6697\u53f7\u5316<\/td><td>\u9ad8<\/td><td>\u74b0\u5883\u5909\u6570\u307e\u305f\u306f\u6697\u53f7\u5316\u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u4f7f\u7528<\/td><\/tr><tr><td>\u6700\u5c0f\u6a29\u9650\u306e\u539f\u5247<\/td><td>\u9ad8<\/td><td>IAM\u30dd\u30ea\u30b7\u30fc\u306e\u9069\u5207\u306a\u8a2d\u5b9a<\/td><\/tr><tr><td>\u30bb\u30c3\u30b7\u30e7\u30f3\u30c8\u30fc\u30af\u30f3\u306e\u6709\u52b9\u671f\u9650<\/td><td>\u4e2d<\/td><td>\u5b9a\u671f\u7684\u306a\u30c8\u30fc\u30af\u30f3\u306e\u66f4\u65b0<\/td><\/tr><tr><td>\u30a2\u30af\u30bb\u30b9\u30ed\u30b0\u306e\u8a18\u9332<\/td><td>\u4e2d<\/td><td>CloudTrail\u306e\u6709\u52b9\u5316<\/td><\/tr><tr><td>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/td><td>\u4e2d<\/td><td>\u4f8b\u5916\u51e6\u7406\u306e\u5b9f\u88c5<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5b9f\u88c5\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u8a8d\u8a3c\u60c5\u5831\u306e\u7ba1\u7406<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5e73\u6587\u3067\u306e\u4fdd\u5b58\u3092\u907f\u3051\u308b<\/li>\n\n\n\n<li>\u74b0\u5883\u5909\u6570\u3084\u30b7\u30fc\u30af\u30ec\u30c3\u30c8\u7ba1\u7406\u30b5\u30fc\u30d3\u30b9\u306e\u4f7f\u7528<\/li>\n\n\n\n<li>\u5b9a\u671f\u7684\u306a\u8a8d\u8a3c\u60c5\u5831\u306e\u30ed\u30fc\u30c6\u30fc\u30b7\u30e7\u30f3<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>IAM\u30ed\u30fc\u30eb\u306e\u4f7f\u7528<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5fc5\u8981\u6700\u5c0f\u9650\u306e\u6a29\u9650\u4ed8\u4e0e<\/li>\n\n\n\n<li>\u4e00\u6642\u7684\u306a\u8a8d\u8a3c\u60c5\u5831\u306e\u4f7f\u7528<\/li>\n\n\n\n<li>\u30ed\u30fc\u30eb\u306e\u7d99\u627f\u95a2\u4fc2\u306e\u9069\u5207\u306a\u8a2d\u5b9a<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u3068\u30ed\u30b0\u8a18\u9332<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>API\u547c\u3073\u51fa\u3057\u306e\u30ed\u30b0\u53d6\u5f97<\/li>\n\n\n\n<li>\u7570\u5e38\u691c\u77e5\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u5b9a\u671f\u7684\u306a\u76e3\u67fb\u306e\u5b9f\u65bd<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30a8\u30e9\u30fc\u51e6\u7406<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u9069\u5207\u306a\u4f8b\u5916\u51e6\u7406<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u95a2\u9023\u306e\u30a8\u30e9\u30fc\u30ed\u30b0<\/li>\n\n\n\n<li>\u30ea\u30c8\u30e9\u30a4\u30e1\u30ab\u30cb\u30ba\u30e0\u306e\u5b9f\u88c5<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-28\">boto3 \u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-29\">\u4e00\u822c\u7684\u306a\u30a8\u30e9\u30fc\u3068\u89e3\u6c7a\u65b9\u6cd5<\/h3>\n\n\n\n<p>boto3 session\u3092\u4f7f\u7528\u3059\u308b\u969b\u306b\u906d\u9047\u3057\u3084\u3059\u3044\u30a8\u30e9\u30fc\u3068\u305d\u306e\u5bfe\u51e6\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-30\">1. \u8a8d\u8a3c\u95a2\u9023\u306e\u30a8\u30e9\u30fc\u5bfe\u51e6<\/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 botocore\nfrom typing import Optional, Dict\nimport logging\n\nclass SessionTroubleshooter:\n    def __init__(self):\n        self.logger = logging.getLogger(__name__)\n        self.logger.setLevel(logging.INFO)\n\n    def verify_credentials(self) -&gt; Dict[str, bool]:\n        \"\"\"\u8a8d\u8a3c\u60c5\u5831\u306e\u691c\u8a3c\"\"\"\n        checks = {\n            'environment_vars': self._check_environment_vars(),\n            'aws_config': self._check_aws_config(),\n            'iam_permissions': self._check_iam_permissions()\n        }\n        return checks\n\n    def _check_environment_vars(self) -&gt; bool:\n        \"\"\"\u74b0\u5883\u5909\u6570\u306e\u78ba\u8a8d\"\"\"\n        import os\n        required_vars = ['AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY']\n        return all(var in os.environ for var in required_vars)\n\n    def _check_aws_config(self) -&gt; bool:\n        \"\"\"AWS\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u78ba\u8a8d\"\"\"\n        try:\n            session = boto3.Session()\n            session.get_credentials()\n            return True\n        except Exception:\n            return False\n\n    def _check_iam_permissions(self) -&gt; bool:\n        \"\"\"IAM\u6a29\u9650\u306e\u78ba\u8a8d\"\"\"\n        try:\n            sts = boto3.client('sts')\n            sts.get_caller_identity()\n            return True\n        except Exception:\n            return False\n\n# \u4e00\u822c\u7684\u306a\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u4f8b\ndef handle_session_errors(func):\n    \"\"\"\u30bb\u30c3\u30b7\u30e7\u30f3\u95a2\u9023\u306e\u30a8\u30e9\u30fc\u3092\u51e6\u7406\u3059\u308b\u30c7\u30b3\u30ec\u30fc\u30bf\"\"\"\n    def wrapper(*args, **kwargs):\n        try:\n            return func(*args, **kwargs)\n        except botocore.exceptions.ClientError as e:\n            error_code = e.response['Error']['Code']\n            error_message = e.response['Error']['Message']\n\n            error_handlers = {\n                'ExpiredToken': handle_expired_token,\n                'InvalidClientTokenId': handle_invalid_credentials,\n                'AccessDenied': handle_access_denied\n            }\n\n            handler = error_handlers.get(error_code, handle_default_error)\n            return handler(error_message)\n    return wrapper\n\ndef handle_expired_token(message: str) -&gt; Optional[boto3.Session]:\n    \"\"\"\u671f\u9650\u5207\u308c\u30c8\u30fc\u30af\u30f3\u306e\u51e6\u7406\"\"\"\n    logging.warning(f\"Token expired: {message}\")\n    # \u30c8\u30fc\u30af\u30f3\u306e\u518d\u53d6\u5f97\u51e6\u7406\n    return refresh_session()\n\ndef handle_invalid_credentials(message: str) -&gt; None:\n    \"\"\"\u7121\u52b9\u306a\u8a8d\u8a3c\u60c5\u5831\u306e\u51e6\u7406\"\"\"\n    logging.error(f\"Invalid credentials: {message}\")\n    raise ValueError(\"\u8a8d\u8a3c\u60c5\u5831\u304c\u7121\u52b9\u3067\u3059\u3002AWS\u8a8d\u8a3c\u60c5\u5831\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\")\n\ndef handle_access_denied(message: str) -&gt; None:\n    \"\"\"\u30a2\u30af\u30bb\u30b9\u62d2\u5426\u306e\u51e6\u7406\"\"\"\n    logging.error(f\"Access denied: {message}\")\n    raise PermissionError(\"\u5fc5\u8981\u306a\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093\u3002IAM\u30dd\u30ea\u30b7\u30fc\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\")\n\ndef handle_default_error(message: str) -&gt; None:\n    \"\"\"\u305d\u306e\u4ed6\u306e\u30a8\u30e9\u30fc\u51e6\u7406\"\"\"\n    logging.error(f\"Unexpected error: {message}\")\n    raise Exception(f\"\u4e88\u671f\u305b\u306c\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: {message}\")<\/pre>\n\n\n\n<p>\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u89e3\u6c7a\u65b9\u6cd5\uff1a<\/p>\n\n\n<div id=\"id-f1c22a5d-4f5f-41c0-8e69-cd8652e5339e\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u30a8\u30e9\u30fc<\/th><th>\u539f\u56e0<\/th><th>\u89e3\u6c7a\u65b9\u6cd5<\/th><\/tr><\/thead><tbody><tr><td>ExpiredToken<\/td><td>\u30bb\u30c3\u30b7\u30e7\u30f3\u30c8\u30fc\u30af\u30f3\u306e\u671f\u9650\u5207\u308c<\/td><td>\u30c8\u30fc\u30af\u30f3\u306e\u518d\u53d6\u5f97<\/td><\/tr><tr><td>InvalidClientTokenId<\/td><td>\u7121\u52b9\u306a\u8a8d\u8a3c\u60c5\u5831<\/td><td>\u8a8d\u8a3c\u60c5\u5831\u306e\u78ba\u8a8d\u3068\u66f4\u65b0<\/td><\/tr><tr><td>AccessDenied<\/td><td>\u6a29\u9650\u4e0d\u8db3<\/td><td>IAM\u30dd\u30ea\u30b7\u30fc\u306e\u78ba\u8a8d<\/td><\/tr><tr><td>NoRegion<\/td><td>\u30ea\u30fc\u30b8\u30e7\u30f3\u672a\u8a2d\u5b9a<\/td><td>\u30c7\u30d5\u30a9\u30eb\u30c8\u30ea\u30fc\u30b8\u30e7\u30f3\u306e\u8a2d\u5b9a<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"i-31\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u30dd\u30a4\u30f3\u30c8<\/h3>\n\n\n\n<p>boto3 session\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u6700\u9069\u5316\u3059\u308b\u305f\u3081\u306e\u4e3b\u8981\u306a\u30dd\u30a4\u30f3\u30c8\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-32\">1. \u30bb\u30c3\u30b7\u30e7\u30f3\u518d\u5229\u7528\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=\"\">from functools import lru_cache\nimport threading\nfrom typing import Optional\n\nclass OptimizedSessionManager:\n    _instance = None\n    _lock = threading.Lock()\n\n    def __new__(cls):\n        with cls._lock:\n            if cls._instance is None:\n                cls._instance = super().__new__(cls)\n        return cls._instance\n\n    def __init__(self):\n        self._sessions = {}\n        self._lock = threading.Lock()\n\n    @lru_cache(maxsize=128)\n    def get_session(self, region: str) -&gt; boto3.Session:\n        \"\"\"\u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u6d3b\u7528\u3057\u305f\u30bb\u30c3\u30b7\u30e7\u30f3\u53d6\u5f97\"\"\"\n        with self._lock:\n            if region not in self._sessions:\n                self._sessions[region] = boto3.Session(region_name=region)\n            return self._sessions[region]\n\n    def clear_cache(self):\n        \"\"\"\u30bb\u30c3\u30b7\u30e7\u30f3\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u30af\u30ea\u30a2\"\"\"\n        with self._lock:\n            self._sessions.clear()\n            self.get_session.cache_clear()<\/pre>\n\n\n\n<p>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u305f\u3081\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u518d\u5229\u7528<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b7\u30f3\u30b0\u30eb\u30c8\u30f3\u30d1\u30bf\u30fc\u30f3\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>\u30bb\u30c3\u30b7\u30e7\u30f3\u30d7\u30fc\u30ea\u30f3\u30b0\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u9069\u5207\u306a\u7ba1\u7406<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u975e\u540c\u671f\u51e6\u7406\u306e\u6d3b\u7528<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4e26\u5217\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u30d7\u30fc\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u30d0\u30c3\u30c1\u51e6\u7406\u306e\u6700\u9069\u5316<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30ea\u30bd\u30fc\u30b9\u7ba1\u7406<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u6570\u306e\u5236\u5fa1<\/li>\n\n\n\n<li>\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u8a2d\u5b9a\u306e\u8abf\u6574<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30a8\u30e9\u30fc\u30ea\u30c8\u30e9\u30a4\u306e\u6700\u9069\u5316<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6307\u6570\u30d0\u30c3\u30af\u30aa\u30d5\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30ea\u30c8\u30e9\u30a4\u56de\u6570\u306e\u9069\u5207\u306a\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u7a2e\u5225\u306b\u5fdc\u3058\u305f\u51e6\u7406<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u6700\u9069\u5316\u3092\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u52b9\u679c\u304c\u671f\u5f85\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ec\u30b9\u30dd\u30f3\u30b9\u6642\u9593\u306e\u77ed\u7e2e<\/li>\n\n\n\n<li>\u30ea\u30bd\u30fc\u30b9\u4f7f\u7528\u52b9\u7387\u306e\u5411\u4e0a<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u8010\u6027\u306e\u5f37\u5316<\/li>\n\n\n\n<li>\u904b\u7528\u30b3\u30b9\u30c8\u306e\u524a\u6e1b<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-33\">boto3 session \u306e\u5fdc\u7528\u30c6\u30af\u30cb\u30c3\u30af<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-34\">\u30ab\u30b9\u30bf\u30e0\u30bb\u30c3\u30b7\u30e7\u30f3\u8a2d\u5b9a\u306e\u30c6\u30af\u30cb\u30c3\u30af<\/h3>\n\n\n\n<p>\u3088\u308a\u9ad8\u5ea6\u306aboto3 session\u306e\u4f7f\u7528\u65b9\u6cd5\u3068\u3057\u3066\u3001\u30ab\u30b9\u30bf\u30e0\u8a2d\u5b9a\u3068\u62e1\u5f35\u6a5f\u80fd\u306e\u5b9f\u88c5\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-35\">1. \u30ab\u30b9\u30bf\u30e0\u30bb\u30c3\u30b7\u30e7\u30f3\u30d5\u30a1\u30af\u30c8\u30ea\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=\"\">from typing import Optional, Dict, Any\nimport boto3\nimport botocore.config\nfrom dataclasses import dataclass\n\n@dataclass\nclass SessionConfig:\n    \"\"\"\u30bb\u30c3\u30b7\u30e7\u30f3\u8a2d\u5b9a\u3092\u4fdd\u6301\u3059\u308b\u30c7\u30fc\u30bf\u30af\u30e9\u30b9\"\"\"\n    region_name: str\n    profile_name: Optional[str] = None\n    max_retries: int = 3\n    timeout: int = 300\n    max_pool_connections: int = 10\n\nclass CustomSessionFactory:\n    def __init__(self, default_config: SessionConfig):\n        self.default_config = default_config\n        self._config_cache: Dict[str, botocore.config.Config] = {}\n\n    def create_session(self, config: Optional[SessionConfig] = None) -&gt; boto3.Session:\n        \"\"\"\u30ab\u30b9\u30bf\u30e0\u8a2d\u5b9a\u3067\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\"\"\"\n        session_config = config or self.default_config\n\n        # boto3\u8a2d\u5b9a\u306e\u4f5c\u6210\n        boto_config = self._get_or_create_config(session_config)\n\n        # \u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u4f5c\u6210\n        session = boto3.Session(\n            region_name=session_config.region_name,\n            profile_name=session_config.profile_name\n        )\n\n        return SessionWrapper(session, boto_config)\n\n    def _get_or_create_config(self, config: SessionConfig) -&gt; botocore.config.Config:\n        \"\"\"\u8a2d\u5b9a\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u3068\u53d6\u5f97\"\"\"\n        cache_key = f\"{config.region_name}_{config.max_retries}_{config.timeout}\"\n\n        if cache_key not in self._config_cache:\n            self._config_cache[cache_key] = botocore.config.Config(\n                region_name=config.region_name,\n                retries=dict(max_attempts=config.max_retries),\n                connect_timeout=config.timeout,\n                read_timeout=config.timeout,\n                max_pool_connections=config.max_pool_connections\n            )\n\n        return self._config_cache[cache_key]\n\nclass SessionWrapper:\n    \"\"\"\u30bb\u30c3\u30b7\u30e7\u30f3\u30e9\u30c3\u30d1\u30fc\u30af\u30e9\u30b9\"\"\"\n    def __init__(self, session: boto3.Session, config: botocore.config.Config):\n        self._session = session\n        self._config = config\n        self._clients: Dict[str, Any] = {}\n\n    def client(self, service_name: str) -&gt; Any:\n        \"\"\"\u8a2d\u5b9a\u6e08\u307f\u306e\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3092\u53d6\u5f97\"\"\"\n        if service_name not in self._clients:\n            self._clients[service_name] = self._session.client(\n                service_name,\n                config=self._config\n            )\n        return self._clients[service_name]<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-36\">\u81ea\u52d5\u518d\u63a5\u7d9a\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u554f\u984c\u3084\u4e00\u6642\u7684\u306a\u969c\u5bb3\u306b\u5bfe\u5fdc\u3059\u308b\u305f\u3081\u306e\u81ea\u52d5\u518d\u63a5\u7d9a\u6a5f\u80fd\u3092\u5b9f\u88c5\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 time\nfrom typing import Callable, TypeVar, Any\nfrom functools import wraps\n\nT = TypeVar('T')\n\nclass AutoReconnectSession:\n    def __init__(self, session_factory: CustomSessionFactory):\n        self.session_factory = session_factory\n        self.session = None\n        self.last_connection_time = 0\n        self.connection_timeout = 3600  # 1\u6642\u9593\n\n    def get_session(self) -&gt; boto3.Session:\n        \"\"\"\u5fc5\u8981\u306b\u5fdc\u3058\u3066\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u518d\u4f5c\u6210\"\"\"\n        current_time = time.time()\n\n        if (self.session is None or \n            current_time - self.last_connection_time &gt; self.connection_timeout):\n            self.session = self.session_factory.create_session()\n            self.last_connection_time = current_time\n\n        return self.session\n\ndef with_auto_reconnect(max_retries: int = 3, base_delay: float = 1.0):\n    \"\"\"\u81ea\u52d5\u518d\u63a5\u7d9a\u3092\u884c\u3046\u30c7\u30b3\u30ec\u30fc\u30bf\"\"\"\n    def decorator(func: Callable[..., T]) -&gt; Callable[..., T]:\n        @wraps(func)\n        def wrapper(*args, **kwargs) -&gt; T:\n            retries = 0\n            while retries &lt; max_retries:\n                try:\n                    return func(*args, **kwargs)\n                except botocore.exceptions.ClientError as e:\n                    if e.response['Error']['Code'] in ['RequestTimeout', 'TokenExpired']:\n                        retries += 1\n                        if retries &lt; max_retries:\n                            time.sleep(base_delay * (2 ** (retries - 1)))  # \u6307\u6570\u30d0\u30c3\u30af\u30aa\u30d5\n                            continue\n                    raise\n            raise Exception(\"Max retries exceeded\")\n        return wrapper\n    return decorator<\/pre>\n\n\n\n<p>\u5b9f\u88c5\u4f8b\uff1a<\/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=\"\"># \u30bb\u30c3\u30b7\u30e7\u30f3\u8a2d\u5b9a\u306e\u4f5c\u6210\ndefault_config = SessionConfig(\n    region_name='ap-northeast-1',\n    max_retries=5,\n    timeout=600\n)\n\n# \u30bb\u30c3\u30b7\u30e7\u30f3\u30d5\u30a1\u30af\u30c8\u30ea\u30fc\u306e\u521d\u671f\u5316\nfactory = CustomSessionFactory(default_config)\n\n# \u81ea\u52d5\u518d\u63a5\u7d9a\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u4f5c\u6210\nauto_session = AutoReconnectSession(factory)\n\n# \u4f7f\u7528\u4f8b\nclass S3Manager:\n    def __init__(self, session_manager: AutoReconnectSession):\n        self.session_manager = session_manager\n\n    @with_auto_reconnect(max_retries=5)\n    def list_buckets(self) -&gt; list:\n        \"\"\"\u30d0\u30b1\u30c3\u30c8\u4e00\u89a7\u3092\u53d6\u5f97\"\"\"\n        session = self.session_manager.get_session()\n        s3_client = session.client('s3')\n        response = s3_client.list_buckets()\n        return response['Buckets']<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-37\">\u9ad8\u5ea6\u306a\u8a2d\u5b9a\u4f8b<\/h3>\n\n\n\n<p>\u7279\u6b8a\u306a\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u306b\u5bfe\u5fdc\u3059\u308b\u305f\u3081\u306e\u8a2d\u5b9a\u4f8b\u3092\u7d39\u4ecb\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d7\u30ed\u30ad\u30b7\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=\"\">proxy_config = botocore.config.Config(\n    proxies={\n        'http': 'http:\/\/proxy.example.com:8080',\n        'https': 'https:\/\/proxy.example.com:8080'\n    }\n)<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30ab\u30b9\u30bf\u30e0\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8<\/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=\"\">endpoint_config = botocore.config.Config(\n    endpoints_config={\n        's3': {\n            'endpoint_url': 'https:\/\/custom-s3.example.com'\n        }\n    }\n)<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u8a73\u7d30\u306a\u30ed\u30ae\u30f3\u30b0\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=\"\">logging_config = botocore.config.Config(\n    logging=dict(\n        logformat='%(asctime)s - %(name)s - %(levelname)s - %(message)s'\n    )\n)<\/pre>\n\n\n\n<p>\u5fdc\u7528\u30c6\u30af\u30cb\u30c3\u30af\u4f7f\u7528\u6642\u306e\u6ce8\u610f\u70b9\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u8003\u616e<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u9069\u5207\u306a\u4f7f\u7528<\/li>\n\n\n\n<li>\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u30d7\u30fc\u30eb\u306e\u7ba1\u7406<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u76e3\u8996<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u5f37\u5316<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u518d\u8a66\u884c\u6226\u7565\u306e\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30ed\u30b0\u306e\u5145\u5b9f<\/li>\n\n\n\n<li>\u969c\u5bb3\u691c\u77e5\u306e\u5b9f\u88c5<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u904b\u7528\u7ba1\u7406<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\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<h2 class=\"wp-block-heading\" id=\"i-38\">\u307e\u3068\u3081\uff1a\u52b9\u679c\u7684\u306aboto3 session\u306e\u4f7f\u3044\u65b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-39\">\u5b9f\u88c5\u6642\u306e\u91cd\u8981\u30dd\u30a4\u30f3\u30c8<\/h3>\n\n\n\n<p>boto3 session\u306e\u5b9f\u88c5\u306b\u304a\u3044\u3066\u3001\u4ee5\u4e0b\u306e\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\u3092\u62bc\u3055\u3048\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u5b89\u5168\u3067\u52b9\u7387\u7684\u306aAWS\u30ea\u30bd\u30fc\u30b9\u7ba1\u7406\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-40\">1. \u30bb\u30c3\u30b7\u30e7\u30f3\u7ba1\u7406\u306e\u57fa\u672c\u539f\u5247<\/h4>\n\n\n\n<p>\u52b9\u679c\u7684\u306aboto3 session\u7ba1\u7406\u306e\u91cd\u8981\u30dd\u30a4\u30f3\u30c8\u3092\u4ee5\u4e0b\u306b\u307e\u3068\u3081\u307e\u3059\uff1a<\/p>\n\n\n<div id=\"id-0ec288ad-e942-4609-8ede-c1c9325cb9dd\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u30ab\u30c6\u30b4\u30ea<\/th><th>\u63a8\u5968\u4e8b\u9805<\/th><th>\u7406\u7531<\/th><\/tr><\/thead><tbody><tr><td>\u8a8d\u8a3c\u7ba1\u7406<\/td><td>IAM\u30ed\u30fc\u30eb\u306e\u4f7f\u7528<\/td><td>\u9577\u671f\u7684\u306a\u8a8d\u8a3c\u60c5\u5831\u306e\u30ea\u30b9\u30af\u3092\u4f4e\u6e1b<\/td><\/tr><tr><td>\u30bb\u30c3\u30b7\u30e7\u30f3\u5171\u6709<\/td><td>\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u518d\u5229\u7528<\/td><td>\u30ea\u30bd\u30fc\u30b9\u306e\u52b9\u7387\u7684\u306a\u4f7f\u7528<\/td><\/tr><tr><td>\u30a8\u30e9\u30fc\u51e6\u7406<\/td><td>\u9069\u5207\u306a\u30ea\u30c8\u30e9\u30a4\u6226\u7565<\/td><td>\u30b7\u30b9\u30c6\u30e0\u306e\u8010\u969c\u5bb3\u6027\u5411\u4e0a<\/td><\/tr><tr><td>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9<\/td><td>\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u30d7\u30fc\u30ea\u30f3\u30b0<\/td><td>\u30ec\u30b9\u30dd\u30f3\u30b9\u6642\u9593\u306e\u6539\u5584<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h4 class=\"wp-block-heading\" id=\"i-41\">2. \u5b9f\u88c5\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/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 logging\nfrom typing import Optional\nfrom contextlib import contextmanager\n\nclass BestPracticeSessionManager:\n    \"\"\"boto3 session\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u5b9f\u88c5\u3057\u305f\u30de\u30cd\u30fc\u30b8\u30e3\u30fc\"\"\"\n\n    def __init__(self, region_name: str = 'ap-northeast-1'):\n        self.region_name = region_name\n        self.logger = logging.getLogger(__name__)\n        self._session: Optional[boto3.Session] = None\n\n    @contextmanager\n    def get_session(self) -&gt; boto3.Session:\n        \"\"\"\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u5b89\u5168\u306b\u53d6\u5f97\"\"\"\n        try:\n            if self._session is None:\n                self._session = boto3.Session(region_name=self.region_name)\n            yield self._session\n        except Exception as e:\n            self.logger.error(f\"Session error: {str(e)}\")\n            raise\n\n    @contextmanager\n    def get_client(self, service_name: str):\n        \"\"\"\u7279\u5b9a\u306e\u30b5\u30fc\u30d3\u30b9\u306e\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3092\u5b89\u5168\u306b\u53d6\u5f97\"\"\"\n        with self.get_session() as session:\n            try:\n                client = session.client(service_name)\n                yield client\n            finally:\n                # \u5fc5\u8981\u306b\u5fdc\u3058\u3066\u30af\u30ea\u30fc\u30f3\u30a2\u30c3\u30d7\u51e6\u7406\u3092\u5b9f\u88c5\n                pass\n\n# \u4f7f\u7528\u4f8b\nsession_manager = BestPracticeSessionManager()\n\n# S3\u64cd\u4f5c\u306e\u4f8b\nwith session_manager.get_client('s3') as s3:\n    response = s3.list_buckets()<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-42\">\u6b21\u306e\u30b9\u30c6\u30c3\u30d7\u3068\u5b66\u7fd2\u30ea\u30bd\u30fc\u30b9<\/h3>\n\n\n\n<p>boto3 session\u306e\u7406\u89e3\u3092\u6df1\u3081\u3001\u3055\u3089\u306a\u308b\u30b9\u30ad\u30eb\u5411\u4e0a\u3092\u76ee\u6307\u3059\u305f\u3081\u306e\u30ed\u30fc\u30c9\u30de\u30c3\u30d7\u3092\u63d0\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-43\">1. \u30b9\u30ad\u30eb\u30a2\u30c3\u30d7\u306e\u30ed\u30fc\u30c9\u30de\u30c3\u30d7<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u57fa\u790e\u77e5\u8b58\u306e\u5f37\u5316<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>AWS\u8a8d\u8a3c\u30e1\u30ab\u30cb\u30ba\u30e0\u306e\u7406\u89e3<\/li>\n\n\n\n<li>IAM\u30dd\u30ea\u30b7\u30fc\u306e\u8a2d\u8a08\u30b9\u30ad\u30eb<\/li>\n\n\n\n<li>Python\u975e\u540c\u671f\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5b9f\u8df5\u7684\u306a\u30b9\u30ad\u30eb<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30de\u30eb\u30c1\u30a2\u30ab\u30a6\u30f3\u30c8\u7ba1\u7406<\/li>\n\n\n\n<li>\u30af\u30ed\u30b9\u30ea\u30fc\u30b8\u30e7\u30f3\u64cd\u4f5c<\/li>\n\n\n\n<li>\u5927\u898f\u6a21\u30b7\u30b9\u30c6\u30e0\u3067\u306e\u30bb\u30c3\u30b7\u30e7\u30f3\u7ba1\u7406<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5fdc\u7528\u6280\u8853<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ab\u30b9\u30bf\u30e0\u30bb\u30c3\u30b7\u30e7\u30f3\u5b9f\u88c5<\/li>\n\n\n\n<li>\u9ad8\u5ea6\u306a\u30a8\u30e9\u30fc\u51e6\u7406<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-44\">2. \u63a8\u5968\u5b66\u7fd2\u30ea\u30bd\u30fc\u30b9<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u516c\u5f0f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/boto3.amazonaws.com\/v1\/documentation\/api\/latest\/index.html\">Boto3 Documentation<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/aws.amazon.com\/sdk-for-python\/\">AWS SDK for Python<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.aws.amazon.com\/IAM\/latest\/UserGuide\/best-practices.html\">IAM Best Practices<\/a><\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u8ab2\u984c<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8907\u6570\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u8a8d\u8a3c\u60c5\u5831\u7ba1\u7406<\/li>\n\n\n\n<li>\u30bb\u30c3\u30b7\u30e7\u30f3\u30d7\u30fc\u30ea\u30f3\u30b0\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u81ea\u52d5\u518d\u63a5\u7d9a\u30e1\u30ab\u30cb\u30ba\u30e0\u306e\u69cb\u7bc9<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5fdc\u7528\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u6848<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30de\u30eb\u30c1\u30ea\u30fc\u30b8\u30e7\u30f3\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u30c4\u30fc\u30eb<\/li>\n\n\n\n<li>\u30af\u30ed\u30b9\u30a2\u30ab\u30a6\u30f3\u30c8\u30ea\u30bd\u30fc\u30b9\u7ba1\u7406<\/li>\n\n\n\n<li>\u30ab\u30b9\u30bf\u30e0\u30bb\u30c3\u30b7\u30e7\u30f3\u7ba1\u7406\u30e9\u30a4\u30d6\u30e9\u30ea<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-45\">3. \u5b9f\u88c5\u6642\u306e\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/h4>\n\n\n\n<p>\u6700\u7d42\u7684\u306a\u5b9f\u88c5\u524d\u306b\u4ee5\u4e0b\u306e\u9805\u76ee\u3092\u78ba\u8a8d\u3059\u308b\u3053\u3068\u3092\u63a8\u5968\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<p>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u9762\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[ ] \u8a8d\u8a3c\u60c5\u5831\u306e\u5b89\u5168\u306a\u7ba1\u7406<\/li>\n\n\n\n<li>[ ] IAM\u30ed\u30fc\u30eb\u306e\u9069\u5207\u306a\u4f7f\u7528<\/li>\n\n\n\n<li>[ ] \u6700\u5c0f\u6a29\u9650\u306e\u539f\u5247\u306e\u9075\u5b88<\/li>\n<\/ul>\n\n\n\n<p>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u9762\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[ ] \u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u518d\u5229\u7528<\/li>\n\n\n\n<li>[ ] \u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u30d7\u30fc\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>[ ] \u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u8a2d\u5b9a<\/li>\n<\/ul>\n\n\n\n<p>\u904b\u7528\u9762\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[ ] \u30ed\u30b0\u51fa\u529b\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>[ ] \u30a8\u30e9\u30fc\u51e6\u7406\u306e\u5b8c\u5099<\/li>\n\n\n\n<li>[ ] \u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u306e\u8a2d\u5b9a<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u77e5\u8b58\u3068\u5b9f\u8df5\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u5805\u7262\u3067\u52b9\u7387\u7684\u306aAWS\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u958b\u767a\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002\u7d99\u7d9a\u7684\u306a\u5b66\u7fd2\u3068\u5b9f\u8df5\u3092\u901a\u3058\u3066\u3001\u3055\u3089\u306a\u308b\u30b9\u30ad\u30eb\u5411\u4e0a\u3092\u76ee\u6307\u3057\u3066\u3044\u304d\u307e\u3057\u3087\u3046\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-2432","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\/2432","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=2432"}],"version-history":[{"count":1,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2432\/revisions"}],"predecessor-version":[{"id":2433,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2432\/revisions\/2433"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2432"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2432"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2432"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}