{"id":2259,"date":"2025-03-24T08:47:52","date_gmt":"2025-03-23T23:47:52","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=2259"},"modified":"2025-03-24T08:48:16","modified_gmt":"2025-03-23T23:48:16","slug":"%e3%80%90%e4%bf%9d%e5%ad%98%e7%89%88%e3%80%91aws-sdk-for-go%e5%ae%8c%e5%85%a8%e5%85%a5%e9%96%80%e3%82%ac%e3%82%a4%e3%83%892024-%e7%92%b0%e5%a2%83%e6%a7%8b%e7%af%89%e3%81%8b%e3%82%89%e5%ae%9f","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=2259","title":{"rendered":"\u3010\u4fdd\u5b58\u7248\u3011AWS SDK for Go\u5b8c\u5168\u5165\u9580\u30ac\u30a4\u30c92024 &#8211; \u74b0\u5883\u69cb\u7bc9\u304b\u3089\u5b9f\u8df5\u7684\u306a\u5b9f\u88c5\u4f8b\u307e\u3067"},"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\">AWS SDK for Go\u3068\u306f\uff1f\u57fa\u790e\u77e5\u8b58\u3068\u7279\u5fb4\u3092\u89e3\u8aac<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">AWS SDK for Go\u306e\u4e3b\u306a\u6a5f\u80fd\u3068\u7279\u5fb4<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-5\">\u4ed6\u8a00\u8a9e\u306eSDK\u3068\u6bd4\u8f03\u3057\u305f\u969b\u306e\u7279\u5fb4<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-9\">AWS SDK for Go\u306e\u74b0\u5883\u69cb\u7bc9\u624b\u9806<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-10\">Go\u8a00\u8a9e\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3068\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7<\/a>      <\/li>      <li>        <a href=\"#i-13\">AWS SDK for Go\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-16\">\u8a8d\u8a3c\u60c5\u5831\u306e\u8a2d\u5b9a\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-20\">AWS SDK for Go\u306b\u3088\u308b\u57fa\u672c\u7684\u306a\u64cd\u4f5c\u65b9\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-21\">\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u4f5c\u6210\u3068\u8a2d\u5b9a<\/a>      <\/li>      <li>        <a href=\"#i-24\">\u57fa\u672c\u7684\u306aAPI\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u5b9f\u884c\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-27\">\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-30\">\u5b9f\u88c5\u6642\u306e\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-31\">\u5b9f\u8df5\u7684\u306a\u30b3\u30fc\u30c9\u4f8b\u3067\u5b66\u3076AWS SDK for Go<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-32\">S3\u30aa\u30da\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u5b9f\u88c5\u4f8b<\/a>      <\/li>      <li>        <a href=\"#i-34\">EC2\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u5236\u5fa1\u4f8b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-36\">DynamoDB\u306eCRUD\u64cd\u4f5c\u4f8b<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-38\">AWS SDK for Go\u306e\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-39\">\u4e26\u884c\u51e6\u7406\u6642\u306e\u52b9\u7387\u7684\u306a\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-42\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u6700\u9069\u5316\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>      <li>        <a href=\"#i-45\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u9762\u3067\u306e\u63a8\u5968\u8a2d\u5b9a<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-49\">\u5b9f\u88c5\u6642\u306e\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-50\">\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u30c7\u30d0\u30c3\u30b0\u624b\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-51\">\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-54\">\u52b9\u679c\u7684\u306a\u30ed\u30b0\u51fa\u529b\u3068\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-57\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6539\u5584\u306e\u305f\u3081\u306e\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0\u30dd\u30a4\u30f3\u30c8<\/a>      <\/li>      <li>        <a href=\"#i-60\">\u30c7\u30d0\u30c3\u30b0\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-61\">\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/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\">AWS SDK for Go\u3068\u306f\uff1f\u57fa\u790e\u77e5\u8b58\u3068\u7279\u5fb4\u3092\u89e3\u8aac<\/h2>\n\n\n\n<p>AWS SDK for Go\u306f\u3001Go\u8a00\u8a9e\u3067AWS\u306e\u30b5\u30fc\u30d3\u30b9\u3092\u7c21\u5358\u306b\u5229\u7528\u3059\u308b\u305f\u3081\u306e\u30aa\u30d5\u30a3\u30b7\u30e3\u30eb\u306a\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u958b\u767a\u30ad\u30c3\u30c8\u3067\u3059\u3002\u3053\u306eSDK\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001Go\u30d7\u30ed\u30b0\u30e9\u30e0\u304b\u3089AWS\u306e\u5404\u7a2e\u30b5\u30fc\u30d3\u30b9\u306b\u5bfe\u3057\u3066\u64cd\u4f5c\u3092\u884c\u3046\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">AWS SDK for Go\u306e\u4e3b\u306a\u6a5f\u80fd\u3068\u7279\u5fb4<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-2\">1. \u5305\u62ec\u7684\u306aAWS\u30b5\u30fc\u30d3\u30b9\u30b5\u30dd\u30fc\u30c8<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>200\u4ee5\u4e0a\u306eAWS\u30b5\u30fc\u30d3\u30b9\u3078\u306e\u30a2\u30af\u30bb\u30b9\u3092\u63d0\u4f9b<\/li>\n\n\n\n<li>\u5404\u30b5\u30fc\u30d3\u30b9\u306eAPI\u306b\u5bfe\u5fdc\u3057\u305f\u578b\u5b89\u5168\u306a\u64cd\u4f5c\u304c\u53ef\u80fd<\/li>\n\n\n\n<li>AWS API\u306e\u6700\u65b0\u6a5f\u80fd\u306b\u3059\u3070\u3084\u304f\u5bfe\u5fdc<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-3\">2. Go\u8a00\u8a9e\u306b\u6700\u9069\u5316\u3055\u308c\u305f\u8a2d\u8a08<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Go\u306eidiomatic\u306a\u8a2d\u8a08\u539f\u5247\u306b\u5f93\u3063\u305f\u5b9f\u88c5<\/li>\n\n\n\n<li>goroutine\u3092\u6d3b\u7528\u3057\u305f\u52b9\u7387\u7684\u306a\u4e26\u884c\u51e6\u7406<\/li>\n\n\n\n<li>\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u3092\u6d3b\u7528\u3057\u305f\u67d4\u8edf\u306a\u62e1\u5f35\u6027<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-4\">3. \u9ad8\u5ea6\u306a\u6a5f\u80fd<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ea\u30c8\u30e9\u30a4\u30ed\u30b8\u30c3\u30af\u306e\u7d44\u307f\u8fbc\u307f<\/li>\n\n\n\n<li>\u81ea\u52d5\u7684\u306a\u30ea\u30af\u30a8\u30b9\u30c8\u7f72\u540d<\/li>\n\n\n\n<li>\u30ea\u30fc\u30b8\u30e7\u30f3\u5bfe\u5fdc<\/li>\n\n\n\n<li>\u8a8d\u8a3c\u60c5\u5831\u306e\u81ea\u52d5\u691c\u51fa<\/li>\n\n\n\n<li>\u30da\u30fc\u30b8\u30cd\u30fc\u30b7\u30e7\u30f3\u51e6\u7406\u306e\u7c21\u7565\u5316<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">\u4ed6\u8a00\u8a9e\u306eSDK\u3068\u6bd4\u8f03\u3057\u305f\u969b\u306e\u7279\u5fb4<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-6\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u9762\u3067\u306e\u512a\u4f4d\u6027<\/h4>\n\n\n<div id=\"id-763b28ce-7232-4146-a8de-5671d82bf3f2\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u7279\u5fb4<\/th><th>Go SDK<\/th><th>Python SDK<\/th><th>Node.js SDK<\/th><\/tr><\/thead><tbody><tr><td>\u4e26\u884c\u51e6\u7406<\/td><td>\u30cd\u30a4\u30c6\u30a3\u30d6\u30b5\u30dd\u30fc\u30c8<\/td><td>\u9650\u5b9a\u7684<\/td><td>\u975e\u540c\u671f\u51e6\u7406<\/td><\/tr><tr><td>\u30e1\u30e2\u30ea\u52b9\u7387<\/td><td>\u9ad8<\/td><td>\u4e2d<\/td><td>\u4e2d<\/td><\/tr><tr><td>\u8d77\u52d5\u901f\u5ea6<\/td><td>\u901f\u3044<\/td><td>\u4e2d\u7a0b\u5ea6<\/td><td>\u4e2d\u7a0b\u5ea6<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h4 class=\"wp-block-heading\" id=\"i-7\">\u958b\u767a\u52b9\u7387\u306e\u6bd4\u8f03<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u9759\u7684\u578b\u4ed8\u3051\u306b\u3088\u308b\u5b89\u5168\u6027<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b3\u30f3\u30d1\u30a4\u30eb\u6642\u306e\u30a8\u30e9\u30fc\u691c\u51fa<\/li>\n\n\n\n<li>IDE\u306b\u3088\u308b\u5f37\u529b\u306a\u88dc\u5b8c\u6a5f\u80fd<\/li>\n\n\n\n<li>\u578b\u5b89\u5168\u306aAPI\u64cd\u4f5c<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30b3\u30fc\u30c9\u751f\u6210\u30c4\u30fc\u30eb\u306e\u5145\u5b9f<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>API\u30e2\u30c7\u30eb\u306e\u81ea\u52d5\u751f\u6210<\/li>\n\n\n\n<li>\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u53ef\u80fd\u306a\u30b3\u30fc\u30c9\u751f\u6210<\/li>\n\n\n\n<li>\u30e2\u30c3\u30af\u306e\u81ea\u52d5\u751f\u6210\u6a5f\u80fd<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30c7\u30d0\u30c3\u30b0\u306e\u3057\u3084\u3059\u3055<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8a73\u7d30\u306a\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8<\/li>\n\n\n\n<li>\u30c8\u30ec\u30fc\u30b9\u6a5f\u80fd\u306e\u5145\u5b9f<\/li>\n\n\n\n<li>\u30c6\u30b9\u30c8\u7528\u30e6\u30fc\u30c6\u30a3\u30ea\u30c6\u30a3\u306e\u63d0\u4f9b<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-8\">\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u5225\u306e\u9069\u6027<\/h4>\n\n\n\n<p><strong>\u7279\u306b\u9069\u3057\u3066\u3044\u308b\u30b1\u30fc\u30b9\uff1a<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30de\u30a4\u30af\u30ed\u30b5\u30fc\u30d3\u30b9\u306e\u958b\u767a<\/li>\n\n\n\n<li>\u9ad8\u8ca0\u8377\u306a\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u30b7\u30b9\u30c6\u30e0<\/li>\n\n\n\n<li>CLI\/\u30b5\u30fc\u30d0\u30fc\u30c4\u30fc\u30eb\u306e\u958b\u767a<\/li>\n\n\n\n<li>AWS Lambda\u95a2\u6570\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u5927\u898f\u6a21\u30c7\u30fc\u30bf\u51e6\u7406\u30b7\u30b9\u30c6\u30e0<\/li>\n<\/ul>\n\n\n\n<p><strong>\u8003\u616e\u304c\u5fc5\u8981\u306a\u30b1\u30fc\u30b9\uff1a<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d7\u30ed\u30c8\u30bf\u30a4\u30d7\u306e\u8fc5\u901f\u306a\u958b\u767a<\/li>\n\n\n\n<li>\u30b9\u30af\u30ea\u30d7\u30c8\u7684\u306a\u5358\u7d14\u306a\u81ea\u52d5\u5316<\/li>\n\n\n\n<li>GUI\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3<\/li>\n<\/ul>\n\n\n\n<p>AWS SDK for Go\u306f\u3001\u7279\u306b\u672c\u756a\u74b0\u5883\u3067\u306e\u5229\u7528\u3092\u60f3\u5b9a\u3057\u305f\u30b7\u30b9\u30c6\u30e0\u958b\u767a\u306b\u304a\u3044\u3066\u3001\u305d\u306e\u771f\u4fa1\u3092\u767a\u63ee\u3057\u307e\u3059\u3002\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u4fe1\u983c\u6027\u3092\u91cd\u8996\u3059\u308b\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3084\u3001\u5927\u898f\u6a21\u306a\u30b7\u30b9\u30c6\u30e0\u958b\u767a\u306b\u304a\u3044\u3066\u3001\u512a\u308c\u305f\u9078\u629e\u80a2\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-9\">AWS SDK for Go\u306e\u74b0\u5883\u69cb\u7bc9\u624b\u9806<\/h2>\n\n\n\n<p>AWS SDK for Go\u3092\u4f7f\u7528\u3059\u308b\u305f\u3081\u306e\u74b0\u5883\u69cb\u7bc9\u306b\u3064\u3044\u3066\u3001\u30b9\u30c6\u30c3\u30d7\u30d0\u30a4\u30b9\u30c6\u30c3\u30d7\u3067\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">Go\u8a00\u8a9e\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3068\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-11\">1. Go\u8a00\u8a9e\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/h4>\n\n\n\n<p>\u307e\u305a\u3001Go\u8a00\u8a9e\u306e\u958b\u767a\u74b0\u5883\u3092\u6574\u3048\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p><strong>Windows\u306e\u5834\u5408:<\/strong><\/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=\"\"># \u516c\u5f0f\u30b5\u30a4\u30c8\u304b\u3089\u30a4\u30f3\u30b9\u30c8\u30fc\u30e9\u30fc\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\nhttps:\/\/golang.org\/dl\/\n\n# \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u5f8c\u3001\u30b3\u30de\u30f3\u30c9\u30d7\u30ed\u30f3\u30d7\u30c8\u3067\u78ba\u8a8d\ngo version<\/pre>\n\n\n\n<p><strong>macOS\u306e\u5834\u5408:<\/strong><\/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=\"\"># Homebrew\u3092\u4f7f\u7528\u3057\u3066\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\nbrew install go\n\n# \u30d0\u30fc\u30b8\u30e7\u30f3\u78ba\u8a8d\ngo version<\/pre>\n\n\n\n<p><strong>Linux\u306e\u5834\u5408:<\/strong><\/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=\"\"># Ubuntu\/Debian\nsudo apt-get update\nsudo apt-get install golang\n\n# \u30d0\u30fc\u30b8\u30e7\u30f3\u78ba\u8a8d\ngo version<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-12\">2. \u74b0\u5883\u5909\u6570\u306e\u8a2d\u5b9a<\/h4>\n\n\n\n<p>Go\u306e\u958b\u767a\u306b\u5fc5\u8981\u306a\u74b0\u5883\u5909\u6570\u3092\u8a2d\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=\"\"># GOPATH\u306e\u8a2d\u5b9a\uff08\u4f8b\uff1aLinux\u306e\u5834\u5408\uff09\necho 'export GOPATH=$HOME\/go' &gt;&gt; ~\/.bashrc\necho 'export PATH=$PATH:$GOPATH\/bin' &gt;&gt; ~\/.bashrc\nsource ~\/.bashrc<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-13\">AWS SDK for Go\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u65b9\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-14\">1. \u65b0\u898f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4f5c\u6210<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u4f5c\u6210\nmkdir my-aws-project\ncd my-aws-project\n\n# Go\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u521d\u671f\u5316\ngo mod init my-aws-project<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-15\">2. AWS SDK for Go\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/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=\"\"># AWS SDK v2\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\ngo get github.com\/aws\/aws-sdk-go-v2\ngo get github.com\/aws\/aws-sdk-go-v2\/config\n\n# \u5fc5\u8981\u306a\u30b5\u30fc\u30d3\u30b9\u56fa\u6709\u306e\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\uff08\u4f8b\uff1aS3\u306e\u5834\u5408\uff09\ngo get github.com\/aws\/aws-sdk-go-v2\/service\/s3<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-16\">\u8a8d\u8a3c\u60c5\u5831\u306e\u8a2d\u5b9a\u65b9\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-17\">1. AWS CLI\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\uff08\u63a8\u5968\uff09<\/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=\"\"># AWS CLI\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\uff08\u4f8b\uff1aLinux\/macOS\uff09\ncurl \"https:\/\/awscli.amazonaws.com\/awscli-exe-linux-x86_64.zip\" -o \"awscliv2.zip\"\nunzip awscliv2.zip\nsudo .\/aws\/install<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-18\">2. \u8a8d\u8a3c\u60c5\u5831\u306e\u8a2d\u5b9a<\/h4>\n\n\n\n<p>\u4ee5\u4e0b\u306e\u3044\u305a\u308c\u304b\u306e\u65b9\u6cd5\u3067\u8a8d\u8a3c\u60c5\u5831\u3092\u8a2d\u5b9a\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<p><strong>\u65b9\u6cd51: AWS CLI\u306e\u8a2d\u5b9a\uff08\u63a8\u5968\uff09<\/strong><\/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 configure\n\n# \u5bfe\u8a71\u7684\u306b\u4ee5\u4e0b\u306e\u60c5\u5831\u3092\u5165\u529b\nAWS Access Key ID: [\u30a2\u30af\u30bb\u30b9\u30ad\u30fcID]\nAWS Secret Access Key: [\u30b7\u30fc\u30af\u30ec\u30c3\u30c8\u30a2\u30af\u30bb\u30b9\u30ad\u30fc]\nDefault region name: [\u30ea\u30fc\u30b8\u30e7\u30f3\u540d]\nDefault output format: json<\/pre>\n\n\n\n<p><strong>\u65b9\u6cd52: \u74b0\u5883\u5909\u6570\u3067\u306e\u8a2d\u5b9a<\/strong><\/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=\"\">export AWS_ACCESS_KEY_ID=\u30a2\u30af\u30bb\u30b9\u30ad\u30fcID\nexport AWS_SECRET_ACCESS_KEY=\u30b7\u30fc\u30af\u30ec\u30c3\u30c8\u30a2\u30af\u30bb\u30b9\u30ad\u30fc\nexport AWS_DEFAULT_REGION=\u30ea\u30fc\u30b8\u30e7\u30f3\u540d<\/pre>\n\n\n\n<p><strong>\u65b9\u6cd53: \u5171\u6709\u8a8d\u8a3c\u60c5\u5831\u30d5\u30a1\u30a4\u30eb\u306e\u624b\u52d5\u4f5c\u6210<\/strong><br><code>~\/.aws\/credentials<\/code>\uff08Windows: <code>%UserProfile%\\.aws\\credentials<\/code>\uff09\u306b\u4ee5\u4e0b\u3092\u8a18\u8ff0\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=\"\">[default]\naws_access_key_id = \u30a2\u30af\u30bb\u30b9\u30ad\u30fcID\naws_secret_access_key = \u30b7\u30fc\u30af\u30ec\u30c3\u30c8\u30a2\u30af\u30bb\u30b9\u30ad\u30fc<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-19\">3. \u8a2d\u5b9a\u306e\u691c\u8a3c<\/h4>\n\n\n\n<p>\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u30b3\u30fc\u30c9\u3067\u8a2d\u5b9a\u3092\u691c\u8a3c\u3067\u304d\u307e\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=\"\">package main\n\nimport (\n    \"context\"\n    \"fmt\"\n    \"log\"\n\n    \"github.com\/aws\/aws-sdk-go-v2\/config\"\n)\n\nfunc main() {\n    \/\/ AWS\u8a2d\u5b9a\u306e\u8aad\u307f\u8fbc\u307f\n    cfg, err := config.LoadDefaultConfig(context.TODO())\n    if err != nil {\n        log.Fatal(err)\n    }\n\n    \/\/ \u30ea\u30fc\u30b8\u30e7\u30f3\u306e\u78ba\u8a8d\n    fmt.Printf(\"Region: %s\\n\", cfg.Region)\n}<\/pre>\n\n\n\n<p>\u4ee5\u4e0a\u306e\u624b\u9806\u3067\u3001AWS SDK for Go\u3092\u4f7f\u7528\u3059\u308b\u305f\u3081\u306e\u57fa\u672c\u7684\u306a\u74b0\u5883\u69cb\u7bc9\u306f\u5b8c\u4e86\u3067\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u306e\u74b0\u5883\u3092\u4f7f\u3063\u3066\u5b9f\u969b\u306bAWS\u30b5\u30fc\u30d3\u30b9\u3092\u64cd\u4f5c\u3059\u308b\u65b9\u6cd5\u3092\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-20\">AWS SDK for Go\u306b\u3088\u308b\u57fa\u672c\u7684\u306a\u64cd\u4f5c\u65b9\u6cd5<\/h2>\n\n\n\n<p>AWS SDK for Go\u3092\u4f7f\u7528\u3059\u308b\u969b\u306e\u57fa\u672c\u7684\u306a\u64cd\u4f5c\u65b9\u6cd5\u306b\u3064\u3044\u3066\u3001\u5b9f\u8df5\u7684\u306a\u30b3\u30fc\u30c9\u4f8b\u3068\u3068\u3082\u306b\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-21\">\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u4f5c\u6210\u3068\u8a2d\u5b9a<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-22\">1. \u57fa\u672c\u7684\u306a\u30bb\u30c3\u30b7\u30e7\u30f3\u4f5c\u6210<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">package main\n\nimport (\n    \"context\"\n    \"log\"\n\n    \"github.com\/aws\/aws-sdk-go-v2\/config\"\n    \"github.com\/aws\/aws-sdk-go-v2\/service\/s3\"\n)\n\nfunc main() {\n    \/\/ \u30c7\u30d5\u30a9\u30eb\u30c8\u8a2d\u5b9a\u3067AWS\u8a2d\u5b9a\u3092\u8aad\u307f\u8fbc\u307f\n    cfg, err := config.LoadDefaultConfig(context.TODO(),\n        config.WithRegion(\"ap-northeast-1\"), \/\/ \u30ea\u30fc\u30b8\u30e7\u30f3\u3092\u6307\u5b9a\n    )\n    if err != nil {\n        log.Fatal(err)\n    }\n\n    \/\/ S3\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u4f5c\u6210\n    client := s3.NewFromConfig(cfg)\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-23\">2. \u30ab\u30b9\u30bf\u30e0\u8a2d\u5b9a\u306b\u3088\u308b\u30bb\u30c3\u30b7\u30e7\u30f3\u4f5c\u6210<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">package main\n\nimport (\n    \"context\"\n    \"log\"\n    \"time\"\n\n    \"github.com\/aws\/aws-sdk-go-v2\/config\"\n    \"github.com\/aws\/aws-sdk-go-v2\/credentials\"\n    \"github.com\/aws\/aws-sdk-go-v2\/service\/s3\"\n)\n\nfunc main() {\n    \/\/ \u30ab\u30b9\u30bf\u30e0\u8a8d\u8a3c\u60c5\u5831\u3068\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u4f7f\u7528\n    cfg, err := config.LoadDefaultConfig(context.TODO(),\n        \/\/ \u30ea\u30fc\u30b8\u30e7\u30f3\u306e\u6307\u5b9a\n        config.WithRegion(\"ap-northeast-1\"),\n\n        \/\/ \u8a8d\u8a3c\u60c5\u5831\u306e\u660e\u793a\u7684\u306a\u8a2d\u5b9a\n        config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(\n            \"ACCESS_KEY\",\n            \"SECRET_KEY\",\n            \"SESSION_TOKEN\", \/\/ \u5fc5\u8981\u306a\u5834\u5408\u306e\u307f\n        )),\n\n        \/\/ \u30ea\u30c8\u30e9\u30a4\u8a2d\u5b9a\n        config.WithRetryMaxAttempts(5),\n        config.WithRetryMode(aws.RetryModeStandard),\n    )\n    if err != nil {\n        log.Fatal(err)\n    }\n\n    \/\/ \u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u4ed8\u304d\u306e\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u4f5c\u6210\n    ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)\n    defer cancel()\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-24\">\u57fa\u672c\u7684\u306aAPI\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u5b9f\u884c\u65b9\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-25\">1. \u57fa\u672c\u7684\u306a\u30ea\u30af\u30a8\u30b9\u30c8\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=\"\">func listBuckets(ctx context.Context, client *s3.Client) error {\n    \/\/ ListBuckets\u30aa\u30da\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u5b9f\u884c\n    result, err := client.ListBuckets(ctx, &amp;s3.ListBucketsInput{})\n    if err != nil {\n        return fmt.Errorf(\"\u30d0\u30b1\u30c3\u30c8\u4e00\u89a7\u306e\u53d6\u5f97\u306b\u5931\u6557: %v\", err)\n    }\n\n    \/\/ \u7d50\u679c\u306e\u51e6\u7406\n    for _, bucket := range result.Buckets {\n        fmt.Printf(\"\u30d0\u30b1\u30c3\u30c8\u540d: %s, \u4f5c\u6210\u65e5\u6642: %s\\n\",\n            *bucket.Name,\n            bucket.CreationDate.Format(time.RFC3339),\n        )\n    }\n    return nil\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-26\">2. \u30da\u30fc\u30b8\u30cd\u30fc\u30b7\u30e7\u30f3\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=\"\">func listObjectsWithPagination(ctx context.Context, client *s3.Client, bucketName string) error {\n    paginator := s3.NewListObjectsV2Paginator(client, &amp;s3.ListObjectsV2Input{\n        Bucket: aws.String(bucketName),\n    })\n\n    \/\/ \u30da\u30fc\u30b8\u3054\u3068\u306b\u51e6\u7406\n    for paginator.HasMorePages() {\n        page, err := paginator.NextPage(ctx)\n        if err != nil {\n            return fmt.Errorf(\"\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u4e00\u89a7\u306e\u53d6\u5f97\u306b\u5931\u6557: %v\", err)\n        }\n\n        for _, obj := range page.Contents {\n            fmt.Printf(\"\u30ad\u30fc: %s, \u30b5\u30a4\u30ba: %d bytes\\n\",\n                *obj.Key,\n                obj.Size,\n            )\n        }\n    }\n    return nil\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-27\">\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-28\">1. \u30a8\u30e9\u30fc\u30bf\u30a4\u30d7\u306e\u5224\u5225<\/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 (\n    \"errors\"\n\n    \"github.com\/aws\/aws-sdk-go-v2\/service\/s3\/types\"\n    \"github.com\/aws\/smithy-go\"\n)\n\nfunc handleS3Error(err error) error {\n    \/\/ \u30b9\u30df\u30b7\u30fc\u30a8\u30e9\u30fc\u306e\u53d6\u5f97\n    var smithyErr *smithy.OperationError\n    if errors.As(err, &amp;smithyErr) {\n        fmt.Printf(\"\u64cd\u4f5c\u30a8\u30e9\u30fc: %v\\n\", smithyErr.Operation())\n    }\n\n    \/\/ S3\u7279\u6709\u306e\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\n    var notFound *types.NoSuchKey\n    if errors.As(err, &amp;notFound) {\n        return fmt.Errorf(\"\u6307\u5b9a\u3055\u308c\u305f\u30ad\u30fc\u304c\u5b58\u5728\u3057\u307e\u305b\u3093\")\n    }\n\n    var noSuchBucket *types.NoSuchBucket\n    if errors.As(err, &amp;noSuchBucket) {\n        return fmt.Errorf(\"\u6307\u5b9a\u3055\u308c\u305f\u30d0\u30b1\u30c3\u30c8\u304c\u5b58\u5728\u3057\u307e\u305b\u3093\")\n    }\n\n    return err\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-29\">2. \u30ea\u30c8\u30e9\u30a4\u53ef\u80fd\u306a\u30a8\u30e9\u30fc\u306e\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=\"\">func retryableOperation(ctx context.Context, client *s3.Client, bucketName, key string) error {\n    maxRetries := 3\n    backoff := time.Second\n\n    for i := 0; i &lt; maxRetries; i++ {\n        _, err := client.HeadObject(ctx, &amp;s3.HeadObjectInput{\n            Bucket: aws.String(bucketName),\n            Key:    aws.String(key),\n        })\n\n        if err == nil {\n            return nil\n        }\n\n        \/\/ \u30ea\u30c8\u30e9\u30a4\u53ef\u80fd\u306a\u30a8\u30e9\u30fc\u304b\u30c1\u30a7\u30c3\u30af\n        var apiErr smithy.APIError\n        if errors.As(err, &amp;apiErr) {\n            if apiErr.RetryableError() {\n                \/\/ \u6307\u6570\u30d0\u30c3\u30af\u30aa\u30d5\n                time.Sleep(backoff * time.Duration(1&lt;&lt;i))\n                continue\n            }\n        }\n\n        return err\n    }\n\n    return fmt.Errorf(\"\u6700\u5927\u30ea\u30c8\u30e9\u30a4\u56de\u6570\u3092\u8d85\u3048\u307e\u3057\u305f\")\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-30\">\u5b9f\u88c5\u6642\u306e\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u306e\u9069\u5207\u306a\u4f7f\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u306e\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u30ad\u30e3\u30f3\u30bb\u30eb\u51e6\u7406\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u30b9\u30b3\u30fc\u30d7\u7ba1\u7406<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ea\u30bd\u30fc\u30b9\u306e\u9069\u5207\u306a\u89e3\u653e<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>defer\u3092\u4f7f\u7528\u3057\u305f\u30ea\u30bd\u30fc\u30b9\u89e3\u653e<\/li>\n\n\n\n<li>\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u306e\u30af\u30ed\u30fc\u30ba<\/li>\n\n\n\n<li>\u30b4\u30eb\u30fc\u30c1\u30f3\u306e\u30af\u30ea\u30fc\u30f3\u30a2\u30c3\u30d7<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u968e\u5c64\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u56fa\u6709\u306e\u30a8\u30e9\u30fc\u5b9a\u7fa9<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u306e\u30e9\u30c3\u30d4\u30f3\u30b0<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u9069\u5207\u306a\u4f1d\u64ad<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u8003\u616e<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u518d\u5229\u7528<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30d0\u30c3\u30d5\u30a1\u30b5\u30a4\u30ba\u306e\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u4e26\u884c\u51e6\u7406\u306e\u6d3b\u7528<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u57fa\u672c\u7684\u306a\u64cd\u4f5c\u65b9\u6cd5\u3092\u7406\u89e3\u3059\u308b\u3053\u3068\u3067\u3001AWS SDK for Go\u3092\u4f7f\u7528\u3057\u305f\u52b9\u7387\u7684\u306a\u958b\u767a\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u57fa\u672c\u64cd\u4f5c\u3092\u6d3b\u7528\u3057\u305f\u5b9f\u8df5\u7684\u306a\u30b3\u30fc\u30c9\u4f8b\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-31\">\u5b9f\u8df5\u7684\u306a\u30b3\u30fc\u30c9\u4f8b\u3067\u5b66\u3076AWS SDK for Go<\/h2>\n\n\n\n<p>\u5b9f\u969b\u306e\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u306b\u57fa\u3065\u3044\u305f\u5b9f\u88c5\u4f8b\u3092\u901a\u3058\u3066\u3001AWS SDK for Go\u306e\u5b9f\u8df5\u7684\u306a\u4f7f\u7528\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-32\">S3\u30aa\u30da\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u5b9f\u88c5\u4f8b<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-33\">1. \u30d5\u30a1\u30a4\u30eb\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u6a5f\u80fd<\/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=\"\">package main\n\nimport (\n    \"context\"\n    \"fmt\"\n    \"log\"\n    \"os\"\n    \"path\/filepath\"\n\n    \"github.com\/aws\/aws-sdk-go-v2\/config\"\n    \"github.com\/aws\/aws-sdk-go-v2\/service\/s3\"\n)\n\n\/\/ \u30d5\u30a1\u30a4\u30eb\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u7528\u306e\u69cb\u9020\u4f53\ntype S3Uploader struct {\n    client *s3.Client\n    bucket string\n}\n\n\/\/ \u30a2\u30c3\u30d7\u30ed\u30fc\u30c0\u30fc\u306e\u521d\u671f\u5316\nfunc NewS3Uploader(bucket string) (*S3Uploader, error) {\n    cfg, err := config.LoadDefaultConfig(context.TODO())\n    if err != nil {\n        return nil, fmt.Errorf(\"AWS\u8a2d\u5b9a\u306e\u8aad\u307f\u8fbc\u307f\u306b\u5931\u6557: %v\", err)\n    }\n\n    return &amp;S3Uploader{\n        client: s3.NewFromConfig(cfg),\n        bucket: bucket,\n    }, nil\n}\n\n\/\/ \u30d5\u30a1\u30a4\u30eb\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\nfunc (u *S3Uploader) UploadFile(ctx context.Context, filePath string) error {\n    \/\/ \u30d5\u30a1\u30a4\u30eb\u3092\u958b\u304f\n    file, err := os.Open(filePath)\n    if err != nil {\n        return fmt.Errorf(\"\u30d5\u30a1\u30a4\u30eb\u306e\u30aa\u30fc\u30d7\u30f3\u306b\u5931\u6557: %v\", err)\n    }\n    defer file.Close()\n\n    \/\/ \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u5b9f\u884c\n    _, err = u.client.PutObject(ctx, &amp;s3.PutObjectInput{\n        Bucket: &amp;u.bucket,\n        Key:    aws.String(filepath.Base(filePath)),\n        Body:   file,\n    })\n\n    if err != nil {\n        return fmt.Errorf(\"\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u306b\u5931\u6557: %v\", err)\n    }\n\n    return nil\n}\n\n\/\/ \u4f7f\u7528\u4f8b\nfunc main() {\n    uploader, err := NewS3Uploader(\"my-bucket\")\n    if err != nil {\n        log.Fatal(err)\n    }\n\n    ctx := context.Background()\n    if err := uploader.UploadFile(ctx, \"example.txt\"); err != nil {\n        log.Fatal(err)\n    }\n\n    fmt.Println(\"\u30d5\u30a1\u30a4\u30eb\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f\")\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-34\">EC2\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u5236\u5fa1\u4f8b<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-35\">1. \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u7ba1\u7406\u6a5f\u80fd<\/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=\"\">package main\n\nimport (\n    \"context\"\n    \"fmt\"\n    \"log\"\n    \"time\"\n\n    \"github.com\/aws\/aws-sdk-go-v2\/config\"\n    \"github.com\/aws\/aws-sdk-go-v2\/service\/ec2\"\n    \"github.com\/aws\/aws-sdk-go-v2\/service\/ec2\/types\"\n)\n\n\/\/ EC2\u7ba1\u7406\u7528\u306e\u69cb\u9020\u4f53\ntype EC2Manager struct {\n    client *ec2.Client\n}\n\n\/\/ \u30de\u30cd\u30fc\u30b8\u30e3\u30fc\u306e\u521d\u671f\u5316\nfunc NewEC2Manager() (*EC2Manager, error) {\n    cfg, err := config.LoadDefaultConfig(context.TODO())\n    if err != nil {\n        return nil, fmt.Errorf(\"AWS\u8a2d\u5b9a\u306e\u8aad\u307f\u8fbc\u307f\u306b\u5931\u6557: %v\", err)\n    }\n\n    return &amp;EC2Manager{\n        client: ec2.NewFromConfig(cfg),\n    }, nil\n}\n\n\/\/ \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u8d77\u52d5\nfunc (m *EC2Manager) StartInstance(ctx context.Context, instanceID string) error {\n    _, err := m.client.StartInstances(ctx, &amp;ec2.StartInstancesInput{\n        InstanceIds: []string{instanceID},\n    })\n    if err != nil {\n        return fmt.Errorf(\"\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u8d77\u52d5\u306b\u5931\u6557: %v\", err)\n    }\n\n    \/\/ \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u72b6\u614b\u304c\u300crunning\u300d\u306b\u306a\u308b\u307e\u3067\u5f85\u6a5f\n    return m.waitForInstanceState(ctx, instanceID, types.InstanceStateNameRunning)\n}\n\n\/\/ \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u505c\u6b62\nfunc (m *EC2Manager) StopInstance(ctx context.Context, instanceID string) error {\n    _, err := m.client.StopInstances(ctx, &amp;ec2.StopInstancesInput{\n        InstanceIds: []string{instanceID},\n    })\n    if err != nil {\n        return fmt.Errorf(\"\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u505c\u6b62\u306b\u5931\u6557: %v\", err)\n    }\n\n    \/\/ \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u72b6\u614b\u304c\u300cstopped\u300d\u306b\u306a\u308b\u307e\u3067\u5f85\u6a5f\n    return m.waitForInstanceState(ctx, instanceID, types.InstanceStateNameStopped)\n}\n\n\/\/ \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u72b6\u614b\u78ba\u8a8d\nfunc (m *EC2Manager) waitForInstanceState(ctx context.Context, instanceID string, targetState types.InstanceStateName) error {\n    waiter := ec2.NewInstanceStoppedWaiter(m.client)\n    return waiter.Wait(ctx, &amp;ec2.DescribeInstancesInput{\n        InstanceIds: []string{instanceID},\n    }, 5*time.Minute)\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-36\">DynamoDB\u306eCRUD\u64cd\u4f5c\u4f8b<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-37\">1. \u57fa\u672c\u7684\u306aCRUD\u64cd\u4f5c\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=\"\">package main\n\nimport (\n    \"context\"\n    \"fmt\"\n    \"log\"\n\n    \"github.com\/aws\/aws-sdk-go-v2\/config\"\n    \"github.com\/aws\/aws-sdk-go-v2\/feature\/dynamodb\/attributevalue\"\n    \"github.com\/aws\/aws-sdk-go-v2\/service\/dynamodb\"\n    \"github.com\/aws\/aws-sdk-go-v2\/service\/dynamodb\/types\"\n)\n\n\/\/ \u30e6\u30fc\u30b6\u30fc\u60c5\u5831\u306e\u69cb\u9020\u4f53\ntype User struct {\n    ID        string `dynamodbav:\"id\"`\n    Name      string `dynamodbav:\"name\"`\n    Email     string `dynamodbav:\"email\"`\n    CreatedAt string `dynamodbav:\"created_at\"`\n}\n\n\/\/ DynamoDB\u64cd\u4f5c\u7528\u306e\u69cb\u9020\u4f53\ntype DynamoDBManager struct {\n    client    *dynamodb.Client\n    tableName string\n}\n\n\/\/ \u30de\u30cd\u30fc\u30b8\u30e3\u30fc\u306e\u521d\u671f\u5316\nfunc NewDynamoDBManager(tableName string) (*DynamoDBManager, error) {\n    cfg, err := config.LoadDefaultConfig(context.TODO())\n    if err != nil {\n        return nil, fmt.Errorf(\"AWS\u8a2d\u5b9a\u306e\u8aad\u307f\u8fbc\u307f\u306b\u5931\u6557: %v\", err)\n    }\n\n    return &amp;DynamoDBManager{\n        client:    dynamodb.NewFromConfig(cfg),\n        tableName: tableName,\n    }, nil\n}\n\n\/\/ \u30e6\u30fc\u30b6\u30fc\u306e\u4f5c\u6210\nfunc (m *DynamoDBManager) CreateUser(ctx context.Context, user User) error {\n    item, err := attributevalue.MarshalMap(user)\n    if err != nil {\n        return fmt.Errorf(\"\u30c7\u30fc\u30bf\u306e\u30de\u30fc\u30b7\u30e3\u30eb\u306b\u5931\u6557: %v\", err)\n    }\n\n    _, err = m.client.PutItem(ctx, &amp;dynamodb.PutItemInput{\n        TableName: &amp;m.tableName,\n        Item:      item,\n    })\n    if err != nil {\n        return fmt.Errorf(\"\u30a2\u30a4\u30c6\u30e0\u306e\u4f5c\u6210\u306b\u5931\u6557: %v\", err)\n    }\n\n    return nil\n}\n\n\/\/ \u30e6\u30fc\u30b6\u30fc\u306e\u53d6\u5f97\nfunc (m *DynamoDBManager) GetUser(ctx context.Context, id string) (*User, error) {\n    key, err := attributevalue.MarshalMap(map[string]string{\n        \"id\": id,\n    })\n    if err != nil {\n        return nil, fmt.Errorf(\"\u30ad\u30fc\u306e\u30de\u30fc\u30b7\u30e3\u30eb\u306b\u5931\u6557: %v\", err)\n    }\n\n    result, err := m.client.GetItem(ctx, &amp;dynamodb.GetItemInput{\n        TableName: &amp;m.tableName,\n        Key:       key,\n    })\n    if err != nil {\n        return nil, fmt.Errorf(\"\u30a2\u30a4\u30c6\u30e0\u306e\u53d6\u5f97\u306b\u5931\u6557: %v\", err)\n    }\n\n    if result.Item == nil {\n        return nil, fmt.Errorf(\"\u30e6\u30fc\u30b6\u30fc\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\")\n    }\n\n    var user User\n    if err := attributevalue.UnmarshalMap(result.Item, &amp;user); err != nil {\n        return nil, fmt.Errorf(\"\u30c7\u30fc\u30bf\u306e\u30a2\u30f3\u30de\u30fc\u30b7\u30e3\u30eb\u306b\u5931\u6557: %v\", err)\n    }\n\n    return &amp;user, nil\n}\n\n\/\/ \u30e6\u30fc\u30b6\u30fc\u306e\u66f4\u65b0\nfunc (m *DynamoDBManager) UpdateUser(ctx context.Context, user User) error {\n    update := map[string]types.AttributeValue{\n        \":name\":  &amp;types.AttributeValueMemberS{Value: user.Name},\n        \":email\": &amp;types.AttributeValueMemberS{Value: user.Email},\n    }\n\n    _, err := m.client.UpdateItem(ctx, &amp;dynamodb.UpdateItemInput{\n        TableName: &amp;m.tableName,\n        Key: map[string]types.AttributeValue{\n            \"id\": &amp;types.AttributeValueMemberS{Value: user.ID},\n        },\n        UpdateExpression: aws.String(\"SET #name = :name, #email = :email\"),\n        ExpressionAttributeNames: map[string]string{\n            \"#name\":  \"name\",\n            \"#email\": \"email\",\n        },\n        ExpressionAttributeValues: update,\n    })\n    if err != nil {\n        return fmt.Errorf(\"\u30e6\u30fc\u30b6\u30fc\u306e\u66f4\u65b0\u306b\u5931\u6557: %v\", err)\n    }\n\n    return nil\n}\n\n\/\/ \u4f7f\u7528\u4f8b\nfunc main() {\n    manager, err := NewDynamoDBManager(\"users\")\n    if err != nil {\n        log.Fatal(err)\n    }\n\n    ctx := context.Background()\n\n    \/\/ \u30e6\u30fc\u30b6\u30fc\u306e\u4f5c\u6210\n    user := User{\n        ID:        \"user1\",\n        Name:      \"\u5c71\u7530\u592a\u90ce\",\n        Email:     \"yamada@example.com\",\n        CreatedAt: time.Now().Format(time.RFC3339),\n    }\n\n    if err := manager.CreateUser(ctx, user); err != nil {\n        log.Fatal(err)\n    }\n\n    \/\/ \u30e6\u30fc\u30b6\u30fc\u306e\u53d6\u5f97\n    retrievedUser, err := manager.GetUser(ctx, \"user1\")\n    if err != nil {\n        log.Fatal(err)\n    }\n\n    fmt.Printf(\"\u53d6\u5f97\u3057\u305f\u30e6\u30fc\u30b6\u30fc: %+v\\n\", retrievedUser)\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u4f8b\u306f\u3001\u5b9f\u969b\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u3059\u3050\u306b\u6d3b\u7528\u3067\u304d\u308b\u5f62\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002\u305f\u3060\u3057\u3001\u672c\u756a\u74b0\u5883\u3067\u4f7f\u7528\u3059\u308b\u969b\u306f\u4ee5\u4e0b\u306e\u70b9\u306b\u6ce8\u610f\u3057\u3066\u304f\u3060\u3055\u3044\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u5f37\u5316<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u3088\u308a\u8a73\u7d30\u306a\u30a8\u30e9\u30fc\u51e6\u7406<\/li>\n\n\n\n<li>\u30ea\u30c8\u30e9\u30a4\u30ed\u30b8\u30c3\u30af\u306e\u5b9f\u88c5<\/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>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56<\/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>\u6697\u53f7\u5316\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30a2\u30af\u30bb\u30b9\u5236\u5fa1\u306e\u8a2d\u5b9a<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u6700\u9069\u5316<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u30d7\u30fc\u30eb\u306e\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u30d0\u30c3\u30c1\u51e6\u7406\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u6d3b\u7528<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u3068\u30ed\u30ae\u30f3\u30b0<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CloudWatch\u3068\u306e\u9023\u643a<\/li>\n\n\n\n<li>\u30c8\u30ec\u30fc\u30b7\u30f3\u30b0\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30e1\u30c8\u30ea\u30af\u30b9\u306e\u53ce\u96c6<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30b3\u30fc\u30c9\u4f8b\u3092\u57fa\u306b\u3001\u5b9f\u969b\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u8981\u4ef6\u306b\u5408\u308f\u305b\u3066\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3059\u308b\u3053\u3068\u3067\u3001\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-38\">AWS SDK for Go\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3068\u6ce8\u610f\u70b9<\/h2>\n\n\n\n<p>AWS SDK for Go\u3092\u52b9\u7387\u7684\u306b\u6d3b\u7528\u3059\u308b\u305f\u3081\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3068\u3001\u5b9f\u88c5\u6642\u306e\u6ce8\u610f\u70b9\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-39\">\u4e26\u884c\u51e6\u7406\u6642\u306e\u52b9\u7387\u7684\u306a\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-40\">1. \u30b4\u30eb\u30fc\u30c1\u30f3\u30d7\u30fc\u30eb\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=\"\">package main\n\nimport (\n    \"context\"\n    \"fmt\"\n    \"sync\"\n    \"time\"\n\n    \"github.com\/aws\/aws-sdk-go-v2\/service\/s3\"\n)\n\n\/\/ \u30ef\u30fc\u30ab\u30fc\u30d7\u30fc\u30eb\u69cb\u9020\u4f53\ntype WorkerPool struct {\n    client     *s3.Client\n    numWorkers int\n    jobs       chan string\n    results    chan error\n    wg         sync.WaitGroup\n}\n\n\/\/ \u30ef\u30fc\u30ab\u30fc\u30d7\u30fc\u30eb\u306e\u521d\u671f\u5316\nfunc NewWorkerPool(client *s3.Client, numWorkers int) *WorkerPool {\n    return &amp;WorkerPool{\n        client:     client,\n        numWorkers: numWorkers,\n        jobs:       make(chan string, numWorkers),\n        results:    make(chan error, numWorkers),\n    }\n}\n\n\/\/ \u30ef\u30fc\u30ab\u30fc\u306e\u5b9f\u884c\nfunc (p *WorkerPool) startWorker(ctx context.Context) {\n    defer p.wg.Done()\n\n    for objectKey := range p.jobs {\n        _, err := p.client.GetObject(ctx, &amp;s3.GetObjectInput{\n            Bucket: aws.String(\"my-bucket\"),\n            Key:    aws.String(objectKey),\n        })\n\n        if err != nil {\n            select {\n            case p.results &lt;- fmt.Errorf(\"\u30aa\u30d6\u30b8\u30a7\u30af\u30c8 %s \u306e\u53d6\u5f97\u306b\u5931\u6557: %v\", objectKey, err):\n            default:\n                \/\/ results channel\u304c\u6e80\u676f\u306e\u5834\u5408\u306e\u51e6\u7406\n            }\n        }\n    }\n}\n\n\/\/ \u30ef\u30fc\u30ab\u30fc\u30d7\u30fc\u30eb\u306e\u958b\u59cb\nfunc (p *WorkerPool) Start(ctx context.Context, objects []string) []error {\n    \/\/ \u30ef\u30fc\u30ab\u30fc\u306e\u8d77\u52d5\n    for i := 0; i &lt; p.numWorkers; i++ {\n        p.wg.Add(1)\n        go p.startWorker(ctx)\n    }\n\n    \/\/ \u30b8\u30e7\u30d6\u306e\u6295\u5165\n    go func() {\n        for _, obj := range objects {\n            p.jobs &lt;- obj\n        }\n        close(p.jobs)\n    }()\n\n    \/\/ \u5b8c\u4e86\u5f85\u3061\n    go func() {\n        p.wg.Wait()\n        close(p.results)\n    }()\n\n    \/\/ \u30a8\u30e9\u30fc\u306e\u53ce\u96c6\n    var errors []error\n    for err := range p.results {\n        errors = append(errors, err)\n    }\n\n    return errors\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-41\">2. \u30ec\u30fc\u30c8\u5236\u9650\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=\"\">package main\n\nimport (\n    \"context\"\n    \"time\"\n\n    \"golang.org\/x\/time\/rate\"\n)\n\n\/\/ \u30ec\u30fc\u30c8\u5236\u9650\u4ed8\u304d\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\ntype RateLimitedClient struct {\n    client  *s3.Client\n    limiter *rate.Limiter\n}\n\n\/\/ \u65b0\u898f\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u4f5c\u6210\nfunc NewRateLimitedClient(client *s3.Client, rps float64) *RateLimitedClient {\n    return &amp;RateLimitedClient{\n        client:  client,\n        limiter: rate.NewLimiter(rate.Limit(rps), 1),\n    }\n}\n\n\/\/ \u30ec\u30fc\u30c8\u5236\u9650\u4ed8\u304d\u306e\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u53d6\u5f97\nfunc (c *RateLimitedClient) GetObject(ctx context.Context, input *s3.GetObjectInput) (*s3.GetObjectOutput, error) {\n    err := c.limiter.Wait(ctx)\n    if err != nil {\n        return nil, fmt.Errorf(\"\u30ec\u30fc\u30c8\u5236\u9650\u5f85\u6a5f\u4e2d\u306b\u30a8\u30e9\u30fc: %v\", err)\n    }\n\n    return c.client.GetObject(ctx, input)\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-42\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u6700\u9069\u5316\u30c6\u30af\u30cb\u30c3\u30af<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-43\">1. \u30b9\u30c8\u30ea\u30fc\u30df\u30f3\u30b0\u51e6\u7406\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=\"\">func processLargeFile(ctx context.Context, client *s3.Client, bucket, key string) error {\n    \/\/ \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u53d6\u5f97\n    resp, err := client.GetObject(ctx, &amp;s3.GetObjectInput{\n        Bucket: aws.String(bucket),\n        Key:    aws.String(key),\n    })\n    if err != nil {\n        return fmt.Errorf(\"\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u53d6\u5f97\u306b\u5931\u6557: %v\", err)\n    }\n    defer resp.Body.Close()\n\n    \/\/ \u30d0\u30c3\u30d5\u30a1\u30b5\u30a4\u30ba\u3092\u6307\u5b9a\u3057\u3066\u30b9\u30c8\u30ea\u30fc\u30df\u30f3\u30b0\u51e6\u7406\n    buffer := make([]byte, 32*1024) \/\/ 32KB\n    reader := bufio.NewReader(resp.Body)\n\n    for {\n        n, err := reader.Read(buffer)\n        if err == io.EOF {\n            break\n        }\n        if err != nil {\n            return fmt.Errorf(\"\u8aad\u307f\u8fbc\u307f\u4e2d\u306b\u30a8\u30e9\u30fc: %v\", err)\n        }\n\n        \/\/ \u30d0\u30c3\u30d5\u30a1\u306e\u51e6\u7406\n        if err := processBuffer(buffer[:n]); err != nil {\n            return fmt.Errorf(\"\u30d0\u30c3\u30d5\u30a1\u306e\u51e6\u7406\u306b\u5931\u6557: %v\", err)\n        }\n    }\n\n    return nil\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-44\">2. \u30e1\u30e2\u30ea\u30d7\u30fc\u30eb\u4f7f\u7528\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=\"\">var bufferPool = sync.Pool{\n    New: func() interface{} {\n        return make([]byte, 32*1024)\n    },\n}\n\nfunc processWithPool(ctx context.Context, client *s3.Client, bucket, key string) error {\n    \/\/ \u30d0\u30c3\u30d5\u30a1\u3092\u30d7\u30fc\u30eb\u304b\u3089\u53d6\u5f97\n    buffer := bufferPool.Get().([]byte)\n    defer bufferPool.Put(buffer)\n\n    resp, err := client.GetObject(ctx, &amp;s3.GetObjectInput{\n        Bucket: aws.String(bucket),\n        Key:    aws.String(key),\n    })\n    if err != nil {\n        return err\n    }\n    defer resp.Body.Close()\n\n    \/\/ \u30b9\u30c8\u30ea\u30fc\u30df\u30f3\u30b0\u51e6\u7406\n    for {\n        n, err := resp.Body.Read(buffer)\n        if err == io.EOF {\n            break\n        }\n        if err != nil {\n            return err\n        }\n\n        \/\/ \u30d0\u30c3\u30d5\u30a1\u306e\u51e6\u7406\n        processBuffer(buffer[:n])\n    }\n\n    return nil\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-45\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u9762\u3067\u306e\u63a8\u5968\u8a2d\u5b9a<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-46\">1. IAM\u30ed\u30fc\u30eb\u306e\u6700\u5c0f\u6a29\u9650\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=\"\">\/\/ IAM\u30dd\u30ea\u30b7\u30fc\u306e\u4f8b\nconst minimalPolicy = `{\n    \"Version\": \"2012-10-17\",\n    \"Statement\": [\n        {\n            \"Effect\": \"Allow\",\n            \"Action\": [\n                \"s3:GetObject\",\n                \"s3:PutObject\"\n            ],\n            \"Resource\": [\n                \"arn:aws:s3:::my-bucket\/*\"\n            ],\n            \"Condition\": {\n                \"StringEquals\": {\n                    \"aws:RequestedRegion\": \"ap-northeast-1\"\n                }\n            }\n        }\n    ]\n}`<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-47\">2. \u30bb\u30ad\u30e5\u30a2\u306a\u8a8d\u8a3c\u60c5\u5831\u306e\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=\"\">func getSecureConfig(ctx context.Context) (aws.Config, error) {\n    \/\/ AWS Systems Manager\u30d1\u30e9\u30e1\u30fc\u30bf\u30b9\u30c8\u30a2\u304b\u3089\u306e\u8a8d\u8a3c\u60c5\u5831\u53d6\u5f97\n    cfg, err := config.LoadDefaultConfig(ctx,\n        config.WithRegion(\"ap-northeast-1\"),\n        config.WithClientLogMode(aws.LogRetries|aws.LogRequestWithBody),\n    )\n    if err != nil {\n        return cfg, fmt.Errorf(\"\u8a2d\u5b9a\u306e\u8aad\u307f\u8fbc\u307f\u306b\u5931\u6557: %v\", err)\n    }\n\n    \/\/ \u30bb\u30c3\u30b7\u30e7\u30f3\u30c8\u30fc\u30af\u30f3\u306e\u6709\u52b9\u671f\u9650\u78ba\u8a8d\n    credentials, err := cfg.Credentials.Retrieve(ctx)\n    if err != nil {\n        return cfg, fmt.Errorf(\"\u8a8d\u8a3c\u60c5\u5831\u306e\u53d6\u5f97\u306b\u5931\u6557: %v\", err)\n    }\n\n    if credentials.Expired() {\n        return cfg, fmt.Errorf(\"\u8a8d\u8a3c\u60c5\u5831\u306e\u6709\u52b9\u671f\u9650\u304c\u5207\u308c\u3066\u3044\u307e\u3059\")\n    }\n\n    return cfg, nil\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-48\">3. \u6697\u53f7\u5316\u306e\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">func uploadEncryptedObject(ctx context.Context, client *s3.Client, bucket, key string, data []byte) error {\n    \/\/ \u30b5\u30fc\u30d0\u30fc\u30b5\u30a4\u30c9\u6697\u53f7\u5316\u306e\u8a2d\u5b9a\n    input := &amp;s3.PutObjectInput{\n        Bucket: aws.String(bucket),\n        Key:    aws.String(key),\n        Body:   bytes.NewReader(data),\n        ServerSideEncryption: types.ServerSideEncryptionAes256,\n        \/\/ KMS\u3092\u4f7f\u7528\u3059\u308b\u5834\u5408\n        \/\/ ServerSideEncryption: types.ServerSideEncryptionAwsKms,\n        \/\/ SSEKMSKeyId: aws.String(\"KMS-KEY-ARN\"),\n    }\n\n    _, err := client.PutObject(ctx, input)\n    if err != nil {\n        return fmt.Errorf(\"\u6697\u53f7\u5316\u3055\u308c\u305f\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u306b\u5931\u6557: %v\", err)\n    }\n\n    return nil\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-49\">\u5b9f\u88c5\u6642\u306e\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ea\u30bd\u30fc\u30b9\u306e\u9069\u5207\u306a\u7ba1\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u518d\u5229\u7528<\/li>\n\n\n\n<li>\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u30d7\u30fc\u30eb\u306e\u9069\u5207\u306a\u8a2d\u5b9a<\/li>\n\n\n\n<li>goroutine\u306e\u30ea\u30fc\u30af\u9632\u6b62<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u5f37\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u306e\u9069\u5207\u306a\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u30ea\u30c8\u30e9\u30a4\u6226\u7565\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u306e\u9069\u5207\u306a\u4f1d\u64ad<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u306e\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30e1\u30c8\u30ea\u30af\u30b9\u306e\u53ce\u96c6<\/li>\n\n\n\n<li>\u30ed\u30b0\u306e\u69cb\u9020\u5316<\/li>\n\n\n\n<li>\u30c8\u30ec\u30fc\u30b7\u30f3\u30b0\u306e\u5c0e\u5165<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c6\u30b9\u30c8\u306e\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30e2\u30c3\u30af\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>\u7d71\u5408\u30c6\u30b9\u30c8\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30ab\u30d0\u30ec\u30c3\u30b8\u306e\u78ba\u4fdd<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u9069\u5207\u306b\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001\u5b89\u5168\u3067\u52b9\u7387\u7684\u306aAWS\u30ea\u30bd\u30fc\u30b9\u306e\u5229\u7528\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-50\">\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u30c7\u30d0\u30c3\u30b0\u624b\u6cd5<\/h2>\n\n\n\n<p>AWS SDK for Go\u3092\u4f7f\u7528\u3059\u308b\u969b\u306b\u767a\u751f\u3059\u308b\u53ef\u80fd\u6027\u306e\u3042\u308b\u554f\u984c\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5\u3001\u52b9\u679c\u7684\u306a\u30c7\u30d0\u30c3\u30b0\u624b\u6cd5\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-51\">\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-52\">1. \u8a8d\u8a3c\u95a2\u9023\u306e\u30a8\u30e9\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=\"\">\/\/ \u8a8d\u8a3c\u30a8\u30e9\u30fc\u306e\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u4f8b\npackage main\n\nimport (\n    \"context\"\n    \"fmt\"\n    \"log\"\n\n    \"github.com\/aws\/aws-sdk-go-v2\/config\"\n    \"github.com\/aws\/aws-sdk-go-v2\/credentials\"\n    \"github.com\/aws\/smithy-go\"\n)\n\nfunc troubleshootAuth() error {\n    \/\/ 1. \u8a8d\u8a3c\u60c5\u5831\u306e\u660e\u793a\u7684\u306a\u78ba\u8a8d\n    cfg, err := config.LoadDefaultConfig(context.TODO())\n    if err != nil {\n        return fmt.Errorf(\"\u8a2d\u5b9a\u8aad\u307f\u8fbc\u307f\u30a8\u30e9\u30fc: %v\", err)\n    }\n\n    \/\/ 2. \u8a8d\u8a3c\u60c5\u5831\u306e\u53d6\u5f97\u3068\u691c\u8a3c\n    creds, err := cfg.Credentials.Retrieve(context.TODO())\n    if err != nil {\n        \/\/ \u8a8d\u8a3c\u60c5\u5831\u304c\u898b\u3064\u304b\u3089\u306a\u3044\u5834\u5408\u306e\u8a73\u7d30\u306a\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\n        var ae smithy.APIError\n        if errors.As(err, &amp;ae) {\n            switch ae.ErrorCode() {\n            case \"ExpiredToken\":\n                return fmt.Errorf(\"\u8a8d\u8a3c\u30c8\u30fc\u30af\u30f3\u306e\u671f\u9650\u5207\u308c\u3002\u65b0\u3057\u3044\u8a8d\u8a3c\u60c5\u5831\u3092\u53d6\u5f97\u3057\u3066\u304f\u3060\u3055\u3044\")\n            case \"InvalidAccessKeyId\":\n                return fmt.Errorf(\"\u7121\u52b9\u306a\u30a2\u30af\u30bb\u30b9\u30ad\u30fcID\u3002\u8a8d\u8a3c\u60c5\u5831\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\")\n            case \"SignatureDoesNotMatch\":\n                return fmt.Errorf(\"\u7f72\u540d\u304c\u4e00\u81f4\u3057\u307e\u305b\u3093\u3002\u30b7\u30fc\u30af\u30ec\u30c3\u30c8\u30ad\u30fc\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\")\n            default:\n                return fmt.Errorf(\"\u8a8d\u8a3c\u30a8\u30e9\u30fc: %v\", err)\n            }\n        }\n        return fmt.Errorf(\"\u8a8d\u8a3c\u60c5\u5831\u306e\u53d6\u5f97\u306b\u5931\u6557: %v\", err)\n    }\n\n    \/\/ 3. \u8a8d\u8a3c\u60c5\u5831\u306e\u8a73\u7d30\u306a\u30ed\u30b0\u51fa\u529b\uff08\u958b\u767a\u74b0\u5883\u306e\u307f\uff09\n    log.Printf(\"Provider: %s\", creds.Source)\n    log.Printf(\"Region: %s\", cfg.Region)\n\n    return nil\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-53\">2. \u30ea\u30af\u30a8\u30b9\u30c8\u5236\u9650\u3068\u30b9\u30ed\u30c3\u30c8\u30ea\u30f3\u30b0<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30b9\u30ed\u30c3\u30c8\u30ea\u30f3\u30b0\u5bfe\u7b56\u306e\u5b9f\u88c5\u4f8b\ntype ThrottledClient struct {\n    client  *s3.Client\n    limiter *rate.Limiter\n    retrier *retry.Retryer\n}\n\nfunc NewThrottledClient(client *s3.Client) *ThrottledClient {\n    return &amp;ThrottledClient{\n        client:  client,\n        limiter: rate.NewLimiter(rate.Every(time.Second\/5), 1), \/\/ 5 RPS\n        retrier: retry.NewRetryer(\n            retry.WithMaxAttempts(3),\n            retry.WithBackoff(retry.ExponentialBackoff{\n                Initial: 100 * time.Millisecond,\n                Max:     5 * time.Second,\n            }),\n        ),\n    }\n}\n\nfunc (c *ThrottledClient) GetObject(ctx context.Context, input *s3.GetObjectInput) (*s3.GetObjectOutput, error) {\n    var output *s3.GetObjectOutput\n    err := c.retrier.Retry(ctx, func(ctx context.Context) error {\n        if err := c.limiter.Wait(ctx); err != nil {\n            return err\n        }\n\n        var err error\n        output, err = c.client.GetObject(ctx, input)\n        if err != nil {\n            var ae smithy.APIError\n            if errors.As(err, &amp;ae) &amp;&amp; ae.ErrorCode() == \"ThrottlingException\" {\n                return retry.RetryableError(err)\n            }\n            return err\n        }\n        return nil\n    })\n    return output, err\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-54\">\u52b9\u679c\u7684\u306a\u30ed\u30b0\u51fa\u529b\u3068\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u65b9\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-55\">1. \u69cb\u9020\u5316\u30ed\u30b0\u306e\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u69cb\u9020\u5316\u30ed\u30b0\u306e\u5b9f\u88c5\u4f8b\ntype Logger struct {\n    client *s3.Client\n    logger *zap.Logger\n}\n\nfunc NewLogger(client *s3.Client) (*Logger, error) {\n    \/\/ \u672c\u756a\u74b0\u5883\u7528\u306e\u30ed\u30ac\u30fc\u8a2d\u5b9a\n    config := zap.NewProductionConfig()\n    config.OutputPaths = []string{\"stdout\", \"\/var\/log\/aws-sdk.log\"}\n\n    logger, err := config.Build()\n    if err != nil {\n        return nil, fmt.Errorf(\"\u30ed\u30ac\u30fc\u306e\u521d\u671f\u5316\u306b\u5931\u6557: %v\", err)\n    }\n\n    return &amp;Logger{\n        client: client,\n        logger: logger,\n    }, nil\n}\n\nfunc (l *Logger) LogOperation(ctx context.Context, operation string, input interface{}, err error) {\n    fields := []zap.Field{\n        zap.String(\"operation\", operation),\n        zap.Any(\"input\", input),\n        zap.String(\"requestID\", getRequestID(ctx)),\n        zap.Time(\"timestamp\", time.Now()),\n    }\n\n    if err != nil {\n        fields = append(fields,\n            zap.Error(err),\n            zap.String(\"errorType\", reflect.TypeOf(err).String()),\n        )\n        l.logger.Error(\"\u64cd\u4f5c\u5931\u6557\", fields...)\n    } else {\n        l.logger.Info(\"\u64cd\u4f5c\u6210\u529f\", fields...)\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-56\">2. \u30e1\u30c8\u30ea\u30af\u30b9\u53ce\u96c6\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=\"\">\/\/ \u30e1\u30c8\u30ea\u30af\u30b9\u53ce\u96c6\u306e\u5b9f\u88c5\u4f8b\ntype MetricsClient struct {\n    client        *s3.Client\n    metrics       *metrics.Registry\n    operationDur  metrics.Timer\n    errorCounter  metrics.Counter\n    successCounter metrics.Counter\n}\n\nfunc NewMetricsClient(client *s3.Client) *MetricsClient {\n    r := metrics.NewRegistry()\n    return &amp;MetricsClient{\n        client:        client,\n        metrics:       r,\n        operationDur:  metrics.NewTimer(r, \"aws.operation.duration\"),\n        errorCounter:  metrics.NewCounter(r, \"aws.operation.errors\"),\n        successCounter: metrics.NewCounter(r, \"aws.operation.success\"),\n    }\n}\n\nfunc (c *MetricsClient) GetObject(ctx context.Context, input *s3.GetObjectInput) (*s3.GetObjectOutput, error) {\n    start := time.Now()\n    output, err := c.client.GetObject(ctx, input)\n\n    c.operationDur.UpdateSince(start)\n    if err != nil {\n        c.errorCounter.Inc(1)\n    } else {\n        c.successCounter.Inc(1)\n    }\n\n    return output, err\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-57\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6539\u5584\u306e\u305f\u3081\u306e\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0\u30dd\u30a4\u30f3\u30c8<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-58\">1. \u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u30d7\u30fc\u30eb\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=\"\">\/\/ HTTP\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u6700\u9069\u5316\u4f8b\nfunc optimizedHTTPClient() *http.Client {\n    return &amp;http.Client{\n        Transport: &amp;http.Transport{\n            Proxy: http.ProxyFromEnvironment,\n            DialContext: (&amp;net.Dialer{\n                Timeout:   30 * time.Second,\n                KeepAlive: 30 * time.Second,\n            }).DialContext,\n            ForceAttemptHTTP2:     true,\n            MaxIdleConns:          100,\n            MaxIdleConnsPerHost:   10,\n            IdleConnTimeout:       90 * time.Second,\n            TLSHandshakeTimeout:   10 * time.Second,\n            ExpectContinueTimeout: 1 * time.Second,\n        },\n        Timeout: 30 * time.Second,\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-59\">2. \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u306e\u5b9f\u88c5\u4f8b\ntype PerformanceMonitor struct {\n    metrics    map[string]*rolling.TimedRollingWindow\n    mu         sync.RWMutex\n    windowSize time.Duration\n}\n\nfunc NewPerformanceMonitor(windowSize time.Duration) *PerformanceMonitor {\n    return &amp;PerformanceMonitor{\n        metrics:    make(map[string]*rolling.TimedRollingWindow),\n        windowSize: windowSize,\n    }\n}\n\nfunc (m *PerformanceMonitor) RecordLatency(operation string, duration time.Duration) {\n    m.mu.Lock()\n    defer m.mu.Unlock()\n\n    if _, exists := m.metrics[operation]; !exists {\n        m.metrics[operation] = rolling.NewTimedRollingWindow(m.windowSize)\n    }\n\n    m.metrics[operation].Add(float64(duration.Milliseconds()))\n}\n\nfunc (m *PerformanceMonitor) GetStats(operation string) (min, max, avg float64) {\n    m.mu.RLock()\n    defer m.mu.RUnlock()\n\n    if window, exists := m.metrics[operation]; exists {\n        values := window.GetValues()\n        if len(values) == 0 {\n            return 0, 0, 0\n        }\n\n        min = values[0]\n        max = values[0]\n        sum := 0.0\n\n        for _, v := range values {\n            if v &lt; min {\n                min = v\n            }\n            if v &gt; max {\n                max = v\n            }\n            sum += v\n        }\n\n        return min, max, sum \/ float64(len(values))\n    }\n\n    return 0, 0, 0\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-60\">\u30c7\u30d0\u30c3\u30b0\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u6bb5\u968e\u7684\u306a\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8a8d\u8a3c\u60c5\u5831\u306e\u78ba\u8a8d<\/li>\n\n\n\n<li>\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u63a5\u7d9a\u306e\u78ba\u8a8d<\/li>\n\n\n\n<li>\u30d1\u30fc\u30df\u30c3\u30b7\u30e7\u30f3\u306e\u78ba\u8a8d<\/li>\n\n\n\n<li>\u30ea\u30af\u30a8\u30b9\u30c8\u5185\u5bb9\u306e\u78ba\u8a8d<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u52b9\u679c\u7684\u306a\u30c7\u30d0\u30c3\u30b0\u624b\u6cd5<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ea\u30af\u30a8\u30b9\u30c8ID\u306e\u8a18\u9332<\/li>\n\n\n\n<li>\u8a73\u7d30\u306a\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u53d6\u5f97<\/li>\n\n\n\n<li>\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>\u518d\u73fe\u53ef\u80fd\u306a\u30c6\u30b9\u30c8\u30b1\u30fc\u30b9\u306e\u4f5c\u6210<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u5206\u6790<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d7\u30ed\u30d5\u30a1\u30a4\u30ea\u30f3\u30b0\u306e\u5b9f\u65bd<\/li>\n\n\n\n<li>\u30dc\u30c8\u30eb\u30cd\u30c3\u30af\u306e\u7279\u5b9a<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u30ea\u30fc\u30af\u306e\u691c\u51fa<\/li>\n\n\n\n<li>\u4e26\u884c\u51e6\u7406\u306e\u6700\u9069\u5316<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-61\">\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u8a8d\u8a3c\u95a2\u9023<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[ ] \u8a8d\u8a3c\u60c5\u5831\u306e\u6709\u52b9\u6027\u78ba\u8a8d<\/li>\n\n\n\n<li>[ ] IAM\u30ed\u30fc\u30eb\u306e\u6a29\u9650\u78ba\u8a8d<\/li>\n\n\n\n<li>[ ] \u30ea\u30fc\u30b8\u30e7\u30f3\u8a2d\u5b9a\u306e\u78ba\u8a8d<\/li>\n\n\n\n<li>[ ] \u8a8d\u8a3c\u60c5\u5831\u306e\u6709\u52b9\u671f\u9650\u78ba\u8a8d<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u95a2\u9023<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[ ] VPC\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u306e\u8a2d\u5b9a\u78ba\u8a8d<\/li>\n\n\n\n<li>[ ] \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30b0\u30eb\u30fc\u30d7\u306e\u8a2d\u5b9a\u78ba\u8a8d<\/li>\n\n\n\n<li>[ ] \u30d7\u30ed\u30ad\u30b7\u8a2d\u5b9a\u306e\u78ba\u8a8d<\/li>\n\n\n\n<li>[ ] DNS\u30ea\u30be\u30eb\u30d0\u30fc\u306e\u52d5\u4f5c\u78ba\u8a8d<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ea\u30af\u30a8\u30b9\u30c8\u95a2\u9023<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[ ] \u30ea\u30af\u30a8\u30b9\u30c8\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u59a5\u5f53\u6027\u78ba\u8a8d<\/li>\n\n\n\n<li>[ ] \u30ec\u30fc\u30c8\u5236\u9650\u306e\u78ba\u8a8d<\/li>\n\n\n\n<li>[ ] \u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u8a2d\u5b9a\u306e\u78ba\u8a8d<\/li>\n\n\n\n<li>[ ] \u30ea\u30c8\u30e9\u30a4\u8a2d\u5b9a\u306e\u78ba\u8a8d<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30c7\u30d0\u30c3\u30b0\u624b\u6cd5\u3068\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u65b9\u6cd5\u3092\u9069\u5207\u306b\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001AWS SDK for Go\u3092\u4f7f\u7528\u3057\u305f\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5b89\u5b9a\u6027\u3068\u4fe1\u983c\u6027\u3092\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Warning: Undefined array key &#8220;is_admin&#8221; in \/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/ &#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":{"0":"post-2259","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\/2259","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=2259"}],"version-history":[{"count":1,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2259\/revisions"}],"predecessor-version":[{"id":2260,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2259\/revisions\/2260"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2259"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2259"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2259"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}