SCSKã®çã§ãã9åç®ã®æçš¿ã§ãã ä»åã¯ã 6åç® ã®ãšã³ããªã§å°ãèšåããã¢ããªã±ãŒã·ã§ã³ã®åæååŠçã«ã€ããŠã詳现ã«ã€ããŠèšèŒããŠã¿ãŸãã ã¢ãŒããã¯ãã£æŠèŠ ããããé£å·æ°å³ãããããŸããããã€ãã®å³ããä»åã¯ã»ãšãã©ã¢ããªã±ãŒã·ã§ã³åŽã®è©±é¡ã§ãããäžéš Amazon Cognito èªèšŒã®è©±ãåºãŠããŸãã èæ¯ ãããŸã§ã®ãšã³ããªã§èª¬æããéããæ¬ã¢ããªã±ãŒã·ã§ã³ã§ã¯ããŒãã«ã®ã¹ããŒã¿ã¹ïŒç·šéç¶æ
ïŒç®¡çãéèŠãšãªããŸãããäžã§ãã¹ããŒã¿ã¹ã®åæåãã©ã®ã¿ã€ãã³ã°ã§å®æœããããšããã®ãç¹ã«éèŠãšãªããŸããåãšã³ããªã§èšåããéããã¹ããŒã¿ã¹ãã¢ããªã±ãŒã·ã§ã³ã®ã«ãŒãã£ã³ã°ãç»é¢å¶åŸ¡ã«äœ¿çšãããããã§ããéãæ©ãã¿ã€ãã³ã°ã§åæåããã®ãå®è£
äžæãŸããã§ãã ãã®ããããã¬ãŒã ã¯ãŒã¯ (Nuxt3) ã®ã©ã€ããµã€ã¯ã«ã確èªã®äžãå
·äœçã«ã¯ Nuxt3 ã® Plugin å
ã§åæåãããããªæ¹éãšããŸãããNuxt3 ã SSR ã§äœ¿çšããŠããããšãããããµãŒããµã€ããšã¯ã©ã€ã¢ã³ããµã€ãäž¡æ¹ããå®è¡ããåŸãããã䞡察å¿ããäžã§ãªãã¹ãæ©ãã¿ã€ãã³ã°ã§å®è¡ã§ããæ¹æ³ãšããŠæé©ã§ãããšèããŸããã aws-amplify ã«ããã SSR 察å¿ã«ã€ããŠããå
¬åŒããã¥ã¡ã³ãå
ã§ã¯ Plugin ã䜿çšããŠãããšããã®ã倿ææã®äžã€ã«ãªããŸããã https://nuxt.com/docs/guide/going-further/hooks åé¡çºç ãšããããšã§ããã®å®è£
ã«ãããŠãã°ããéçºãç¶ããŠããã®ã§ãããã¢ããªã±ãŒã·ã§ã³ã«ããã Cognito ãŠãŒã¶/ã°ã«ãŒãæš©éåšãã®æ©èœãå®è£
ãå§ããã¿ã€ãã³ã°ã§åé¡ãçºçããŸããã åæ©èœã®åäœç¢ºèªã宿œããã«ããããåœç¶ãªããè€æ°ã®ãŠãŒã¶ã§ãã°ã€ã³/ãã°ã¢ãŠããç¹°ãè¿ããªããç»é¢ãæäœããå¿
èŠããããããäžåºŠãã°ã¢ãŠãããŠããå¥ãŠãŒã¶ã§ãã°ã€ã³ãããšããã»ã» ãããå·Šãã€ã³ã®ã¡ãã¥ãŒã空ã«ãªã£ãŠãããæ¬æ¥ã¯èµ€æ éšåã«ã¡ã³ããã³ã¹å¯Ÿè±¡ã®ããŒãã«ãäžèŠ§è¡šç€ºãããã¯ãã»ã»ãšããããšã§ãã©ãŠã¶ã®ã³ã³ãœãŒã«ãèŠãŠã¿ããšããã以äžã®ãããªãšã©ãŒãåºãŠããŸãããïŒåœæã¯éçºçã£æäžã ã£ãããšãããããšã©ãŒåºåçšã®æ±çšã³ã³ããŒãã³ããªã©ã¯ãŸã çšæããŠããŸããã§ããïŒ UserUnAuthenticatedException: User needs to be authenticated to call this API. èŠãéããAppSync API ã Unauthorized ã§å©ããªããšãããšã©ãŒã§ããããã¹ããŒã¿ã¹åæå颿°å
ã§ã® AppSync API å®è¡æã«åºåãããŠããã®ãæ¬äºè±¡ã®åå ã§ããããã ãã¹ããŒã¿ã¹åæååŠçã Cognito èªèšŒåšãã®å®è£
ã¯å€æŽããŠããªãã£ãã®ã§ãæåã¯äœæ
ãããããšã©ãŒãçºçããã®ãåãããŸããã§ããã ãããããã®ç»é¢ã§ãªããŒããããšæ£åžžã«ç»é¢è¡šç€ºããããã§ããããããã ãããå®è£
å€ããŠãªããã ããåé¡ãªãã¯ãããã»ã»ãšãããšãããŸã§ç¢ºèªãããšããã§ããããæ°ã¥ããŸããã ããPlugin å
ã§ã¹ããŒã¿ã¹åæåãããã¿ã€ãã³ã°ã§ããŸã ãŠãŒã¶ã Cognito èªèšŒãããŠããªãã®ã§ã¯ããšã»ã» 2åç® ã®ãšã³ããªã§ AppSync API ã®èªå¯æ¹åŒã説æããéããæ¬ã¢ããªã±ãŒã·ã§ã³ã«ãããŠã¯ IAM ã䜿çšããŠããŸããã§ã¯ããã® IAM æš©éã¯ã©ãããä»äžãããã®ããšãããšãCognito ID ããŒã«ã®ãèªèšŒãããã¢ã¯ã»ã¹ããéããŠãšãªããŸããã€ãŸããåœç¶ã§ãã Cognito æªèªèšŒã®æç¹ïŒïŒæªãã°ã€ã³æç¹ïŒã§ã¯ãã® AppSync API ãå©ããæš©éãä»äžãããŠããŸãããPlugin ãå®è¡ãããã¿ã€ãã³ã°ã¯ Nuxt.js ã®ã©ã€ããµã€ã¯ã«ã«ãããã¢ããªã±ãŒã·ã§ã³ã®äœææã§ãããCognito ã®èªèšŒç»é¢ã®è¡šç€ºåã«å®è¡ããããããäžèšã®ãšã©ãŒãåºåããããšããæµãã«ãªããŸãã Nuxt3å
¥é(第7å) - Nuxt3ã®ãã©ã°ã€ã³ã»ããã«ãŠã§ã¢ã䜿ã | è±èµããããããŒãµã€ã ååã¯Nuxt3ã®ãšã©ãŒãã³ããªã³ã°ã«ã€ããŠèŠãŠããŸãããä»åã¯ãã©ã°ã€ã³ãšããã«ãŠã§ã¢ãèŠãŠãããŸããäž¡æ¹ãšãå¿
é ãšããèš³ã§ã¯ãããŸããããããŸã䜿ãã°ã¢ããªã±ãŒã·ã§ã³éçºãå¹çåã§ããŸãããã©ã°ã€ã³ã¯Nuxtã¢ããªã±ãŒã·ã§ã³åæåæã«å®... developer.mamezou-tech.com ãã ãã¢ããªã±ãŒã·ã§ã³ã®å®è£
ãšã㊠plugin ã§åæåããèãèªäœã¯å
è¬ã®éãééã£ãŠããªããšèããŠãããããæªãã°ã€ã³ïŒæªèªèšŒïŒã®å Žåã¯ãã°ã€ã³çŽåŸã«åæåãããããªããžãã¯ã远å ããããšèããŸããããã°ã€ã³ïŒèªèšŒïŒããç¶æ
ã§ã¢ããªã±ãŒã·ã§ã³ã䜿çšããããšãåæã§ãã以äžããã°ã€ã³çŽåŸã®ã¿ã€ãã³ã°ã§åæåã§ããŠããã°åé¡ãªãã ãããšãã倿ã§ãã 2åç®ã®ãšã³ããªã§èšèŒããCognito ID ããŒã«ã®ã²ã¹ãã¢ã¯ã»ã¹ã䜿çšããŠã ã²ã¹ãã¢ã¯ã»ã¹çµç±ã§ä»äžããã IAM ããŒã«ã«ã¹ããŒã¿ã¹åæåã§äœ¿çšãã graphql query ã®ã¿èš±å¯ãããã㪠IAM æš©éãå²ãåœãŠãããšã§ãæªãã°ã€ã³æã§ãã¹ããŒã¿ã¹åæåãè¡ããããã«ãã ããšããã®ã仿¯ãè¿ããšäžã€ã®æã§ã¯ãã£ããšæããŸãããã åœæã¯ãããŸã§çºæ³ãåã°ãªãã£ããšããã®ãæ£çŽãªãšããã§ãã ãŸãããã®å Žåã¯ä»¥äžé
ç®ã«ã€ããŠèæ
®ã»æ€èšããŠããå¿
èŠããã£ããšèããŠããŸãã IAM ããªã·ãŒã«ãã㊠resource å¥å
ã® type ã field ãåã¯ãšãªã®ã¿èš±å¯ããããæ£ç¢ºã«èšå®ãã cognito æªèªèšŒïŒâæ¬ã¢ããªã±ãŒã·ã§ã³ã䜿çšããæš©éã®ç¡ããŠãŒã¶ãå«ãïŒãã©ããŸã§ã¢ããªã±ãŒã·ã§ã³å
éšã§æ
å ±ãååŸã§ããŠããã®ãã®æ€èš 詊è¡é¯èª€ãã®1 ã§ã¯ãã°ã€ã³ç»é¢ã®ããžãã¯ã倿ŽããŠåé¡è§£æ±ºã»ã»ãšäžççžã«ã¯ãããŸããã§ãããçç±ã¯ããã°ã€ã³ç»é¢ã®å®è£
ã§ã銎æã¿ã® Amplify UI ã¢ãžã¥ãŒã«ã䜿çšããŠããããã§ãããã¡ããæ¹ããŠèª¬æã®å¿
èŠããªããããã«ã¯äŸ¿å©ãªã¢ãžã¥ãŒã«ã§ãããèªåã§å®è£
ããŠããªã以äžç°¡åã«å€æŽã§ããªãïŒå€æŽã§ãããšããŠãã¢ãžã¥ãŒã«ã䜿çšãã以äžä¿å®ã®èгç¹ãããœãŒã¹ã³ãŒãèªäœã倿ŽããããããŸããã§ããã ããã§å
¬åŒããã¥ã¡ã³ããæ¹ããŠèª¿ã¹ããšããããã°ã€ã³çŽåŸã«ä»»æã®åŠçãå®è¡ãããããªãOverride Function Callsããšããæ©èœããããŸãããæ£ã«ä»åã®ãããªã·ãã¥ãšãŒã·ã§ã³ã§æ¬²ããã£ãæ©èœã§ããããããã«åºã䜿ãããŠããã¢ãžã¥ãŒã«ã ãªããšæå¿ããã®ã§ããã»ã» https://ui.docs.amplify.aws/vue/connected-components/authenticator/customization ãã®æ©èœãç§ã詊ããéãã§ã¯ Nuxt3 (Vue3) ã§ã¯åäœããŸããã§ããããã æåéãã察象ã®é¢æ°ããªãŒããŒã©ã€ããããããªä»çµã¿ã ã£ãã®ã§ãåãããçµæäœãããã®ãšã©ãŒãåºãã®ã§ããã°ãããã°ã®ãããããããªãšæã£ãã®ã§ãããããšããããšãèšãããã»ãŒãµã³ãã«ã³ãŒãéãã®å®è£
ã§ã NGãåæ©èœã䜿ã£ãŠã¿ããããªäºäŸèªäœã¯ WEB äžããããã€ãèŠã€ãã£ãã®ã§ããã»ãŒ Next.js (React ) ã ã£ãã®ã§ãã²ãã£ãšãããšãã Nuxt.js (Vue) ã§åäœããå®çžŸãå°ãªãã®ã§ã¯ãªãããšéªæšããŠããã®æ©èœã䜿ãã®ã¯äžæŠè«ŠããŸããã ãªããæ¬ä»¶ã«ã€ããŠè©Šè¡ããã®ã¯æ°ã¶æåã®ããšã«ãªããããããçŸæç¹ã§æ£åžžã«åäœãããšããæ
å ±ããæã¡ã®æ¹ãããã°ãæç€ºé ããŸããšå¹žãã§ãã 詊è¡é¯èª€ãã®2 ããã§ã¯ä»æ¹ããªãã®ã§ããã°ã€ã³ç»é¢ãèªåã§å®è£
ãããããªããã»ã»ãšãèããã®ã§ãããã¡ãã¯å²ãšããã«è«ŠããŸãããçç±ã¯æå¿«ã§ ãAmplify UI ã®äœããšãããæ©èœæ§ãåçŽã«åªããŠããããã§ãã åçŽãª Cognito ã®èªèšŒç»é¢ã§ããã°äœãããšæã£ãŠããã®ã§ãããå®éã®èªèšŒãããŒãæ³å®ãããšãã¡ãŒã«ã¢ãã¬ã¹ã®æ€èšŒããã¹ã¯ãŒã倿Žã»ãªã»ããã®ãããªã±ãŒã¹ã«ã€ããŠã察å¿ããå¿
èŠãããããããããã®ç»é¢ãªãããžãã¯ãçšæãããšãªããšäžããäœãã®ã¯ãããªãã®ã³ã¹ãããããããã ãªãšãå
ã
ãã°ã€ã³ç»é¢ã¯ Amplify UI ã«ä»»ããã€ããã§å®è£
ã®èšç»ãç«ãŠãŠããããšãããã ãã¯ãå
¬åŒã®ã©ã€ãã©ãª/ã¢ãžã¥ãŒã«ã䜿çšããŠããã®ããã¿ãŒãšå€æããŸããã 解決 ãšã¯èšããå
è¿°ã®éã Amplify UI ã®æ©èœã§è§£æ±ºããããšãã§ãããã«ãªãããã©ããããã®ãã»ã»ãšããããšã§ãäžæã¯å®å
šã«ã¹ã¿ãã¯ããŠããã®ã§ãããæ¹åæ§èªäœã¯å
è¬ã®éãããã°ã€ã³çŽåŸã®ã¿ã€ãã³ã°ã§åæåããããæ£ãããšèããŠããããããããå®çŸããããã®æ¹æ³ãããããèããçµæãæçµçã«ä»¥äžã®ããã«è§£æ±ºããããšãã§ããŸããã ãã°ã€ã³çŽåŸã«å®è¡ãããåŠçãå®è¡ããããã®ãç»é¢ãªãããŒãžãçšæ æªãã°ã€ã³æã¯å¿
ãåããŒãžã«ãªãã€ã¬ã¯ãããããã« middleware ã§ã«ãŒãã£ã³ã°ïŒã«ãŒãããã«ãŠã§ã¢ã䜿çšïŒ ãã°ã€ã³ããŠåããŒãžå
ã®åŠçãå®è¡åŸããããããŒãžã«é·ç§» ãŸãåæãšããŠãAmplify UI & Nuxt3 (Vue3) ã«ããã Cognito èªèšŒã¯ app.vue ã«ä»¥äžã®ãããªã³ãŒããå®è£
ããããšã§å®çŸããŠããŸãã <Authenticator> ã¿ã°ã§å²ãããŠããèŠçŽ ã Cognito èªèšŒãããŠããªããšèŠããªããªãã代ããã«ãã°ã€ã³ç»é¢ã衚瀺ãããŸãã以äžå®è£
äŸã®å Žåã¯å®è³ªçã«ã¢ããªã±ãŒã·ã§ã³äžã®å
šããŒãž/ã³ã³ããŒãã³ããèªèšŒã®å¯Ÿè±¡ãšãªããŸãã ãããŠããã°ã€ã³ã«æåãããšã¢ã¯ã»ã¹ããŠãã URL ã«å¯Ÿå¿ããããŒãžã«é·ç§»ãããšãããããªæåãšãªããŸãããã®ãããå°ãªããšã以äžå®è£
äŸã«ãããŠã¯ããããããã°ã€ã³ããŒãžã®ãããªåºæã® URL ãã¹ã¯ååšããŸããã <template> <Authenticator :hide-sign-up="true"> <NuxtLayout> <NuxtPage /> </NuxtLayout> </Authenticator> </template> <script setup lang="ts"> import { Authenticator } from "@aws-amplify/ui-vue"; import "@aws-amplify/ui-vue/styles.css"; </script> Authenticator | Amplify UI for Vue Authenticator component adds complete authentication flows to your application with minimal boilerplate. ui.docs.amplify.aws ãã®ãããæªãã°ã€ã³ç¶æ
ã§ãäºå®äžå
šãŠã® URL ã«ã¢ã¯ã»ã¹ããããšèªäœã¯ã§ããŠããŸããããã°ã€ã³çŽåŸã«ç¹å®ã®åŠçãå®è¡ããããããªå®è£
ãé£ããåå ãšãªã£ãŠããã®ã§ãããããã middleware ã䜿çšããã«ãŒãã£ã³ã°ã«ãã解決ããããšãã§ããŸãããååŠçã®ããã®ããŒãžã«ç»é¢ã¯äžèŠãªã®ã§ããã®ãŸãŸãããããŒãžã«ãªãã€ã¬ã¯ããããããªå®è£
ãšããŠããŸãã æåŸã«ããããå®è£
äŸã瀺ããŠæ¬ãšã³ããªãçµãããããšæããŸãã ãã°ã€ã³çŽåŸã®åŠçå®è¡çšããŒãž (login.vue) å
è¿°ã®éããæ¬ããŒãžã«ãããåŠçå
容ã¯ã·ã³ãã«ã§ããupdateTableStatusDict() ã§ããŒãã«ã¹ããŒã¿ã¹ã®åæåã宿œããåŸãå®è¡åŸã«ãããããŒãžã«ãªãã€ã¬ã¯ããããããªåŠçãšãªã£ãŠããŸãããªãã宿¡ä»¶äºäŸã§ã¯ä»æ
å ±ã®åæåãªã©ãåãããŠå®æœããŠããŸããã説æã®ããçç¥ããŸãã ãŸããNuxt3 ã® Layout ã§åããŒãžã®ã¬ã€ã¢ãŠããå¶åŸ¡ããŠããŸãããæ¬ããŒãžã«ã¯ã¡ãã¥ãŒããŒãããã²ãŒã·ã§ã³ããŒã®ãããªå
±é衚瀺ã³ã³ããŒãã³ããäžèŠãªãããå°çšã¬ã€ã¢ãŠããé©çšããŠé衚瀺ãšããŠããŸãã <template></template> <script setup lang="ts"> definePageMeta({ layout: 'login' }) const { updateTableStatusDict } = useTableStatus() onMounted(async () => { await updateTableStatusDict() return navigateTo('/') }) </script> middleware ã«ããã«ãŒãã£ã³ã° (auth.global.ts) ãã¡ããå®è£
äŸã«èœãšããšå
容ã¯ã·ã³ãã«ã§ããã«ãŒãããã«ãŠã§ã¢ã®å®çŸ©ã defineNuxtRouteMiddleware ã«å¯Ÿå¿ããŸããåŒæ°ã® to ãé·ç§»å
ã®ã«ãŒãïŒãã¹ïŒã from ãé·ç§»å
ã®ã«ãŒãïŒãã¹ïŒã瀺ããŠãããä»ã®æ
å ±ïŒãŠãŒã¶ã®ã¢ããªã±ãŒã·ã§ã³æš©éããããŒãã«ã®ã¹ããŒã¿ã¹ãªã©ïŒãšçµã¿åãããŠã«ãŒãã£ã³ã°ã®å¶åŸ¡ãè¡ã£ãŠããŸãã ãã ããã®çãã³ãŒãã®äžã§èºãããã€ã³ããå®ã¯2ã€ã»ã©ãã£ãããã以äžã«ãŸãšããŸããã Cognito ãŠãŒã¶èªèšŒæžã¿ãã©ãããçŽæ¥ç¢ºèªããã¡ãœãã㯠aws-amplify/auth ã«ã¯ååšããªãããã§ãããã®ãããæªèªèšŒæã«å®è¡ããå ŽåäŸå€ãã¹ããŒããããããªã¡ãœããïŒä»¥äžå®è£
äŸã®å Žå㯠getCurrentUser()ïŒãå®è¡ãããã®äŸå€ã catch ããããšã§ãŠãŒã¶èªèšŒæžã¿ãã©ããã®å€å®ãããŠããŸãã error ã catch ããå Žå㯠Cognito ãŠãŒã¶æªèªèšŒã®ãããäžèšã§èª¬æãããã°ã€ã³çŽåŸã®åŠçå®è¡çšããŒãžã«å¯Ÿå¿ããã«ãŒãïŒä»¥äžå®è£
äŸã®å Žå㯠/loginïŒã«é·ç§»ããããã®ã§ãããã«ãŒãããã«ãŠã§ã¢ã¯ããŒãžã®é·ç§»ããšã«åŒã³åºããããããåçŽã«å®è£
ãããšæªèªèšŒæã®ã«ãŒãã£ã³ã°ãç¡éã«ãŒãããŠããŸããŸãããã®ãããé·ç§»å
ã /login ã§ãªãå Žåã®ã¿é·ç§»ããããã«ããããšã§ãç¡éã«ãŒããææ¢ããŠããŸãã export default defineNuxtRouteMiddleware( async(to, from) => { try { if ( await useNuxtApp().$Amplify.Auth.getCurrentUser() ) { // Cognitoãã°ã€ã³æžã¿ã®å Žå //// 以äžããŠãŒã¶ã®ã¢ããªã±ãŒã·ã§ã³æš©éã«å¿ããã«ãŒãã£ã³ã°ãå¶åŸ¡ //// } } catch (error) { // Cognitoæªãã°ã€ã³ã®å Žå // ã«ãŒãã£ã³ã°ã®ç¡éã«ãŒããé²ãããããã°ã€ã³ããŒãžãžã®é·ç§»ã¯äžåºŠã ãã«ãã if (to.path !== '/login') { return navigateTo('/login') } } } ãŸãšã 仿¯ãè¿ããšæå€ãšãã£ãã解決ããããã«æããã®ã§ãããéçºäžã¯ããããæãæ©ãã§ããèšæ¶ããããŸããäžæã¯ AppSync ã®èªå¯æ¹åŒããèŠçŽãããšãèããŠããŸããããå
è¿°ãããã㪠ID ããŒã«ã®ã²ã¹ãã¢ã¯ã»ã¹ã䜿çšããçºæ³ã«ã¯è³ãããææª Lambda ã«å€æŽããã°åæ¥ã§ã©ãã«ããªãããããªãããšæã£ãããããŸãããããããã«çãæªããã§ããããšèšãããšã§çµå±è³å
ã§åŽäžããŸããã ãšããããã¢ããªã±ãŒã·ã§ã³éçºã«ãããŠãããã話ã£ãŠæ£çŽãããããšããããçã£å
ã«èããŠãããªããšãããªãããšã®äžã€ã§ã¯ãªãããšæãè³ããæ¹ããŠç§èªèº«ã®éçºçµéšäžè¶³ã宿ããæ¬¡ç¬¬ã§ãã æçµçã«åœåã®æ¹åæ§ã§è§£æ±ºçã«èŸ¿ãã€ããããšèªäœã¯è¯ãã£ããšæãã®ã§ããããã£ãšç²Ÿé²ãããã§ãããã æ¬æçš¿ãã©ãªããã®åœ¹ã«ç«ãŠã°å¹žãã§ãã
æ¬èšäºã¯ æ°äººããã°ãã©ãœã³2024 ã®èšäºã§ã ã ããã«ã¡ã¯ïŒSCSKã®æ°äººãé»ã§ãã ååã®èšäºã§ã¯ãRubrikãšããããã¯ã¢ããããŒã¿ç®¡çã«ç¹åããITäŒæ¥ãšããã®äž»èŠè£œåãæ©èœã«ã€ããŠã玹ä»ããŸããã å€ãã®æ¹ã«èªãã§ããã ãããšãŠãå¬ããã£ãã§ãïŒ ããŸã èªãã§ããªãïŒããšããæ¹ã¯ããã²ä»¥äžã®èšäºãã芧ãã ããã Rubrikãšã¯ïŒã¯ã©ãŠãïŒãªã³ãã¬ã«ã察å¿ããæ¬¡äžä»£ããã¯ã¢ãã管çãçŽ¹ä» â TechHarmony ããŠãä»åã¯ååå°ãè§ŠãããRubrikã®ã©ã³ãµã ãŠã§ã¢å¯Ÿçããããã«æãäžããèªåã§ãå®éã«è©ŠããŠã¿ãçµæãå
±æããããšæããŸãã ããã§ã¯ããã£ããå§ããŸãããïŒ ã¯ããã« ã©ã³ãµã ãŠã§ã¢ãšããèšèããã£ãšäžåºŠã¯è³ã«ããããšãããã®ã§ã¯ãªãã§ããããïŒ ããŒã¿ãæå·åãããã®è§£é€ã®ããã«èº«ä»£éãèŠæ±ãããµã€ããŒæ»æã§ãããæ°å¹Žããã®è¢«å®³ã¯äžçäžã§åºããç¶ããŠããŸãã ããã ãã§ãåååä»ã§ãããå®ã¯ æ»æè
ã®çã ã¯ãéåžžã®ããŒã¿ã ãã«çãŸããŸããã ãªããš ããã¯ã¢ããããŒã¿ãŸã§æšç ã«ããŠããã®ã§ãïŒ ãããã¯ã¢ãããããã°å®å¿ããšèããã®ã¯åœç¶ã§ãããæ»æè
ãã¡ã¯ãã®æ²¹æãã€ããŠããŸãã äžäŸãšããŠãäžèšã®ãããªæå£ã§ããã¯ã¢ãããçã£ãŠããŸãïŒ ããã¯ã¢ããããŒã¿ã®æå·å ããã¯ã¢ããããŒã¿ãæå·åãã埩æ§ãäžå¯èœã«ããŸãã ããã¯ã¢ããããŒã¿ã®åé€ å€§åãªããã¯ã¢ããããŒã¿ãåé€ãã埩å
ææ®µãå®å
šã«å¥ªããŸãã ããã¯ã¢ãããœããã®åæ¢ ããã¯ã¢ããæ©èœãã®ãã®ãç¡å¹åããŸãã ããããè
åšã«å¯Ÿå¿ããããã«ãRubrikã¯ãä¿åããã ããã§ã¯ãªãå€è§çãªå¯Ÿçãææ¡ããŠããŸãã ãã®è©³çްã«ã€ããŠã次ã®ç« ã§è©³ãã解説ããŸãã Rubrikã®ã©ã³ãµã ãŠã§ã¢å¯Ÿçã®æŠèŠ Rubrikã®ã©ã³ãµã ãŠã§ã¢å¯Ÿçã«ã¯ãäž»ã«äžã€ã®ããŒã¯ãŒãããããŸãïŒ äžå¯å€ããã¯ã¢ãã ãµããŸãæ€ç¥ïŒç°åžžæ€ç¥ïŒ è
åšãã³ãã£ã³ã°ïŒè
åšè¿œè·¡ïŒ ååã®èšäºã§ã¯ãäžå¯å€ããã¯ã¢ãããšãµããŸãæ€ç¥ã»è
åšãã³ãã£ã³ã°ã䞊åã«ç޹ä»ããŸããããå®éã®ãšããã äžå¯å€ããã¯ã¢ããã¯Rubrikã®ã©ã³ãµã ãŠã§ã¢å¯Ÿçã®ãåå°ã ãšãªãååšã§ãã äžå¯å€ããã¯ã¢ããïŒRubrikãç¬èªã«éçºããOSã«ãã£ãŠãããŒã¿ãRubrikã«ä¿åãããéã« äžå€ã®åœ¢åŒã§ãã㯠ãããä»çµã¿ã§ãã ãã®ä»çµã¿ã«ãããæ»æè
ãããã¯ã¢ããããŒã¿ãæ¹ãããããåé€ãããããããšã¯ç©ççã«äžå¯èœãšãªããŸãã äžå¯å€ããã¯ã¢ããã«ããããããã¯ã¢ãããæ¹ãããããããâŠâŠããšããäžå®ãåãé€ããå®å
šã«ããŒã¿ãä¿ç®¡ããããšãã§ããŸãã ããã«ããã®ä»çµã¿ããããããããRubrikã® ãµããŸãæ€ç¥ ã è
åšãã³ãã£ã³ã° ãæå€§éã«å¹æãçºæ®ããŸãã ãµããŸãæ€ç¥ïŒAnomaly DetectionïŒ Rubrikã®ãµããŸãæ€ç¥ã¯ã ã¡ã¿ããŒã¿ç£èŠ ãš ãšã³ããããŒè§£æ ãçµã¿åãããå€å±€çãªä»çµã¿ã§ãã©ã³ãµã ãŠã§ã¢æ»æãæ©æã«æ€ç¥ããããšãã§ããŸãã ã§ã¯ããã©ããã£ãŠç°åžžãæ€ç¥ããã®ïŒããã®ä»çµã¿ã詳ããã玹ä»ããŸãã ã¡ã¿ããŒã¿ã掻çšããç£èŠ ãŸãæåã«æ³šç®ãã¹ããã€ã³ãã¯ããµããŸãæ€ç¥ãããŒã¿ãã®ãã®ã§ã¯ãªãã ã¡ã¿ããŒã¿ ãç£èŠã®å¯Ÿè±¡ãšããŠããããšã§ãã ã¡ã¿ããŒã¿ïŒãã¡ã€ã«åããã£ã¬ã¯ããªæ§é ããµã€ãºãUUIDãªã©ã®æ
å ±ãæããŸãã ã¡ã¿ããŒã¿ã掻çšããããšã§ãããŒã¿ãã®ãã®ã«ã¯è§Šããã«ãã©ã€ãã·ãŒãä¿è·ããªãããæ£ç¢ºãªç£èŠãå®çŸããŸãã ãããŠãRubrikã®ãµããŸãæ€ç¥ã§ã¯äž»ã«ä»¥äžã®æ¹æ³ã§ç°åžžãèŠã€ããŸãïŒ æ©æ¢°åŠç¿ã§é·æçãªå€æŽãã¿ãŒã³ã®åæ Rubrikã¯ãéå»ã®ããã¯ã¢ããããŒã¿ãããšã«ãéåžžã®ããŒã¿å€æŽã®ãã¿ãŒã³ãåŠç¿ããŸãããã®ãã¿ãŒã³ãè¶
ãããããªçªç¶ã®å€§èŠæš¡ãªå€åããã£ããããä»çµã¿ã§ãã ããšãã°ãããªå Žåã«æ€ç¥ããŸãïŒ æ¯æ¥æ°MBçšåºŠãã倿Žã®ãªãããŒã¿ããããæ¥çªç¶æ°GBã®å€æŽãèšé²ããå Žåã ã2025幎床èšç»ããšãããã©ã«ãã«10åã®ãã¡ã€ã«ãä¿åãããŠããã®ã«ã次ã®ããã¯ã¢ããã§ã¯ãã®ãã©ã«ããäžžããšæ¶ããŠããå Žåã ãããã®ã±ãŒã¹ã§ã¯ããç°åžžãªå€åããšããŠRubrikãèŠåãåºããŸãã ãšã³ããããŒè§£æã«ããç°åžžæ€ç¥ ããããã¡ã¿ããŒã¿ã ããåºã«ããç°åžžæ€ç¥ã«ã¯éçããããŸããäŸãã°ã æ»æè
ã®æå£ãå·§åŠã ã£ãå Žå æ»æè
ãããŒã«ã«ç°å¢ã§ãã¡ã€ã«ãæå·åããŠããããã¯ã¢ãããè¡ãããå Žåãã¡ã¿ããŒã¿ã«ã¯ç¹ã«ç®ç«ã£ãå€åãçŸããªãã å©çšè
ã®è¡åã«ãã誀æ€ç¥ æ£åžžãªæäœã®äžç°ãšããŠå€§éã®ãã¡ã€ã«ã远å ããå Žåã§ããç°åžžãšå€æãããŠããŸãã ãã®ãããªã±ãŒã¹ã«å¯Ÿå¿ããããã«ãRubrik㯠ãšã³ããã㌠ãå©çšããŠããŸãã ãšã³ããããŒïŒããŒã¿ã®ã©ã³ãã æ§ãè¡šãææšã§ããããŒã¿ãã©ãããããã©ãã©ã§èŠåæ§ããªããã瀺ããŸãã æå·åãããããŒã¿ã¯ã©ã³ãã æ§ãé«ãŸããšããç¹åŸŽã掻ããããã®å€åããã£ããããããšã§ãã©ã³ãµã ãŠã§ã¢æ»æã®å
åãæ€ç¥ããŸãã äŸãšããŠïŒ æ»æåã®ãã¡ã€ã«åïŒã顧客æ
å ±.xlsxããèŠç©æž.pdfã æ»æåŸã®ãã¡ã€ã«åïŒãabc123.xyzããxyz789.encã æå·åããããã¡ã€ã«ã®ååãæ§é ã倧ããå€ãããšããšã³ããããŒãæ¥æ¿ã«å¢å ããŸããRubrikã¯ãã®å€åããã¡æ©ãæ€ç¥ããèŠåãçºããããšã§æ©æå¯Ÿå¿ãä¿ããŸãã è
åšãã³ãã£ã³ã° ïŒThreat HuntingïŒ è
åšãã³ãã£ã³ã° 㯠YARAã«ãŒã« ã®ãããªå
·äœçãªçè·¡æ
å ±ãåºã«ãããã¯ã¢ããããŒã¿ã詳现ã«ã¹ãã£ã³ãã æææºã䟵å
¥ææãç¹å®ãã æ©èœã§ãã ãµããŸãæ€ç¥ãšã®éãïŒ ãµããŸãæ€ç¥ ïŒæ©æ¢°åŠç¿ã掻çšããŠããã¯ã¢ããããŒã¿ã®å€æŽãã¿ãŒã³ãåæãã ã©ã³ãµã ãŠã§ã¢æ»æåŸ ã«çºçããç°åžžïŒå€§éã®å€æŽãæå·åïŒãæ€ç¥ããã è
åšãã³ãã£ã³ã° ïŒå
·äœçãªçè·¡æ
å ±ãåºã«ã æ»æãåãããã©ããã«é¢ä¿ãªã ãæææºãã©ã³ãµã ãŠã§ã¢ã®äŸµå
¥ææããã§ãã¯ããã è
åšãã³ãã£ã³ã°ã§ã¯ã以äžã®ããã»ã¹ã§ããã¯ã¢ããããŒã¿ãè§£æããŸãïŒ çè·¡æ
å ±ãå
¥å ãŸããã©ã³ãµã ãŠã§ã¢ã«é¢é£ãã YARAã«ãŒã« ãå
¥åããŸãã YARAã«ãŒã«ãšã¯ãæ»æè
ã䜿çšããç¹å®ã®æå·åæ¹æ³ãæ¡åŒµåïŒäŸïŒã.encryptedããã.lockãïŒãæ€åºããããã®ã«ãŒã«ã»ããã§ãã ãããèå³ãããã°ãäžèšã®ããã¥ã¡ã³ãããåç
§ãã ãããïŒããããè±èªçã®ã¿ã§ããããåèã«ãªãããšæããŸããïŒ Welcome to YARA’s documentation! â yara 4.5.0 documentation ãŠãŒã¶ãŒãèªèº«ã§å
¥åããå¿
èŠããããŸãããRubrikã¯ãããããããã©ã«ãã®YARAã«ãŒã«ãæäŸããŠãããåããŠã®æ¹ã§ãã¹ã ãŒãºã«å©çšãéå§ã§ããŸãã ããã¯ã¢ããããŒã¿ãç
§å 次ã«ãRubrikãå
¥åãããæ
å ±ãåºã«ããã¯ã¢ããããŒã¿ãã¹ãã£ã³ããŸããäŸãã°ä»¥äžã®ãããªããšããã§ãã¯ããŸãïŒ ç¹å®ã®ãã¡ã€ã«ããã©ã«ããååšããŠããªããã ã©ã³ãµã ãŠã§ã¢ã«ããæå·åã®çè·¡ããªããã ææã·ã¹ãã ã®ç¹å® ã¹ãã£ã³ãå®äºãããšãããã©ã³ãµã ãŠã§ã¢ã䟵å
¥ããŠããå Žåãã㮠䟵å
¥ã¿ã€ãã³ã° ã ææããã·ã¹ãã ãç¹å®ãããŸãã ããã«ãããåé¡ãçºçããç®æããã®åœ±é¿ç¯å²ãæç¢ºã«ãªããé©åãªå¯Ÿçãè¬ãããããªããŸãã Rubrikã®ã©ã³ãµã ãŠã§ã¢å¯Ÿçãå®éã«è©ŠããŠã¿ã ãããŸã§Rubrikã®ã©ã³ãµã ãŠã§ã¢å¯Ÿçã«ã€ããŠã玹ä»ããŠããŸãããããå®éã«ã©ã®ããã«åãã®ãïŒããšæã£ãæ¹ãå€ãã®ã§ã¯ãªãã§ããããïŒ ä»åã¯ããã®ä»çµã¿ã確ãããããã«ã ãµããŸãæ€ç¥ ã䜿ã£ãã·ãã¥ã¬ãŒã·ã§ã³ ãè¡ããŸããã Rubrikã¯ãªã³ãã¬ãã¹ç°å¢ã ãã§ãªããAWSãGoogle CloudãvSphereãªã©ãããŸããŸãªã¯ã©ãŠãç°å¢ã«å¯Ÿå¿ããŠããŸããã ä»åã¯ãã®äžã§ã vSphereã®ä»®æ³ãã·ã³ ã䜿çšããŠå®éšãè¡ããŸããããã®æ§åããã²ã芧ãã ããïŒ ã·ãã¥ã¬ãŒã·ã§ã³æ¹æ³ Rubrikã®ãµããŸãæ€ç¥ã¯ã 倧éã®ãã¡ã€ã«è¿œå ãæå·åãªã©ã®ç°åžžãªåã ãæ€ç¥ããä»çµã¿ãªã®ã§ã ä»åã®ã·ãã¥ã¬ãŒã·ã§ã³ã§ã¯ã以äžã®æé ã§æ€èšŒãé²ããŸããã ç®ç æé 1 æ£åžžæã®ç¶æ
ååŸ æ£åžžãªããã¯ã¢ããããŒã¿ãè€æ°åååŸããRSCïŒRubrik Security CloudïŒã«é£æºããã 2 ã©ã³ãµã ãŠã§ã¢æ»æã®åçŸ ä»®æ³ãã·ã³å
ã§å€§éã®ãã¡ã€ã«ã远å ããããããæå·åããã 3 ç°åžžæ€ç¥ã®ç¢ºèª å床ããã¯ã¢ãããååŸããRSCã§ã©ã®ããã«æ€ç¥ããããã確èªããã ã·ãã¥ã¬ãŒã·ã§ã³çµæ æ£åžžæã®ç¶æ
ååŸ ãŸãã¯ãããã¯ã¢ããããŒã¿ã®é·æçãªãã¿ãŒã³ãåŠç¿ã§ããããã«ãæ£åžžãªç¶æ
ã®ããã¯ã¢ããããŒã¿ã 5åå ååŸããŸããã ãããã®ããŒã¿ã¯RSCäžã«ãåæ ãããŠãããRubrikã¯ããããããšã«æ©æ¢°åŠç¿ã§ éåžžã®åã ãåŠç¿ããŸãã 以äžã®å³ã¯ãæ£åžžæã®ããã¯ã¢ãããã©ã®ããã«èšé²ãããŠãããã瀺ããŠããŸãïŒ ã©ã³ãµã ãŠã§ã¢æ»æã®åçŸ æ¬¡ã«ãä»®æ³ãã·ã³å
ã§å€§éã®ãã¡ã€ã«ã远å ããããããæå·åããŸããã 以äžã®å³ã«ãã ãxxxxx.encryptedã ã®ãããªãã¡ã€ã«ã¯ãæå·åãããããšã瀺ããŠããŸãïŒ ãã®åŸãããäžåºŠããã¯ã¢ãããååŸããRubrikãã©ã®ããã«åå¿ãããã確èªããŸããã ç°åžžæ€ç¥ã®ç¢ºèª çµæã¯æåŸ
éãã§ããïŒ å€§éã®ãã¡ã€ã«å€æŽãæå·å ãçŽ æ©ãæç¥ããç°åžžãšã㊠Event ã«èšé²ããŸããã 以äžã®å³ã®ããã«ã Event Timeline ã«ãä»åã®å€æŽå
å®¹ïŒ 5003ä»¶ã®è¿œå ã17ä»¶ã®å€æŽã2ä»¶ã®åé€ ïŒã詳现ã«èšé²ãããŠããŸãïŒ ãŸããRSCã§ã¯ãµããŸãæ€ç¥ã®çµæãäžã®å³ã®ããã«ãå¯èŠåãããŠè¡šç€ºãããŸãã 䟿å©ãªã®ã¯ã Anomaliesã»ã¯ã·ã§ã³ ãèŠãã ãã§ãéå»24æé以å
ã« 1ä»¶ã®ç°åžž ãæ€ç¥ãããŠããããšãç°¡åã«ç¢ºèªã§ããŸãïŒ ããã«ããã®Anomaliesãã¯ãªãã¯ããããšã§ã ã©ã®æ©åšã®ã©ã®ãã©ã«ãå
ã®ã©ã®ãã¡ã€ã«ã圱é¿ãåããã®ã ãŸã§ç¹å®ããããšãã§ããŸããã æåŸã«ã¡ãŒã«ã確èªãããšãæ€ç¥ã¢ã©ãŒããå±ããŠããŸããã䟿å©ã§ãç¶æ³ãããã«ææ¡ããããšãã§ããŸããã æåŸã« ä»åã®èšäºã§ã¯ãRubrikã®ã©ã³ãµã ãŠã§ã¢å¯Ÿçã«ã€ããŠãä»çµã¿ã®è§£èª¬ãšã·ãã¥ã¬ãŒã·ã§ã³ã®çµæã亀ããªãããå±ãããŸãããããµããŸãæ€ç¥ããšãè
åšãã³ãã£ã³ã°ãã®2ã€ã®å¯Ÿçããã©ã³ãµã ãŠã§ã¢æ»æã«ã©ã圹ç«ã€ã®ããå°ãã§ããäŒãã§ããŠããã°å¬ããã§ãïŒ ç¹ã«ã·ãã¥ã¬ãŒã·ã§ã³ãéããŠããµããŸãæ€ç¥ãããã«è¿
éãã€æ£ç¢ºã«ç°åžžãçºèŠã§ãããããã®äŸ¿å©ããæããŠããã ããã§ããããïŒ ä»åã¯è
åšãã³ãã£ã³ã°ã®ã·ãã¥ã¬ãŒã·ã§ã³ãŸã§ã¯ã§ããŸããã§ããããæ°ã«ãªãæ¹ã¯ãã²è©ŠããŠã¿ãŠãã ããã æåŸãŸã§èªãã§ããã ããããããšãããããŸããïŒ
æ¬èšäºã¯ãã AWS User Notifications ã§ EC2 ã® AWS Health ã€ãã³ããéç¥ããŠã¿ãïŒ ãã®ç¶ç·šãšãªããŸãã ååã®èšäºã§å®è£
ããAWS User Notificationsããã¹ããããããAWS Health ã€ãã³ããçºçãããEã¡ãŒã«ã§éç¥ãå±ãããšã確èªããããšæããŸãã 宿œå
容 æŠèР以äžã®å
容ã§ãã¹ãã宿œããŸãã EC2ã«é¢ããAWS Health ã€ãã³ããçºçããã EC2ã«é¢ããAWS Health ã€ãã³ããEã¡ãŒã«ã§éç¥ãããããšã確èªãã ããã§ã¯æ©éã§ãããå®éã«ãã¹ãããŠãããŸãããïŒïŒ 1. EC2ã«é¢ããAWS Health ã€ãã³ããçºçããã AWS Healthãã¹ãã€ãã³ããçºçããããå Žåã¯ãAWSãµããŒãã«ãªã¯ãšã¹ãããããšãã§ããŸãã â»ãªã¯ãšã¹ããããããã«ã¯ãããããããŒãããžãã¹ãŸãã¯ãšã³ã¿ãŒãã©ã€ãºãµããŒããã©ã³ã«å å
¥ããŠããå¿
èŠããããŸãã â»æ¬èšäºã¯AWS User Notificationsããã¹ããç®çãšããŠãããããAWSãµããŒããžã®ãªã¯ãšã¹ãã®è©³çŽ°ãªæé ã«ã€ããŠã¯å²æããããŸãããªã¯ãšã¹ããè¡ãå Žåã¯ã以äžãªã³ã¯ãã確èªããã ã宿œããããšãããããããŸãã ãã¹ãçšã® AWS Health ã€ãã³ãããªã¯ãšã¹ããã AWS Health ã€ãã³ãã䜿çšã㊠AWS Health ãšã®çµ±åããã¹ãããããšæããŸãã repost.aws ä»åã¯ã以äžã®AWS Health ã€ãã³ããAWSãµããŒãã«ãªã¯ãšã¹ãããŸããã ãªãŒãžã§ã³æ±äº¬ãªãŒãžã§ã³ïŒãap-northeast-1 ã€ãã³ãã¿ã€ãã®ã«ããŽãªãŒïŒãaccountNotification ã€ãã³ãã¿ã€ãã®ã³ãŒãïŒãAWS_EC2_OPERATIONAL_NOTIFICATION EC2ã®ãµãŒãã¹ã«åé¡ãããå Žåã«çºçããã€ãã³ããæå®ããŠããŸãã ã©ã®ãããªã€ãã³ãã¿ã€ããããã®ãã«ã€ããŠã¯ãã AWS User Notifications ã§ EC2 ã® AWS Health ã€ãã³ããéç¥ããŠã¿ãïŒ ãã®äºå確èªã§ç޹ä»ããAWS Health APIã§ç¢ºèªããããšãå¯èœã§ãã 2ïŒEC2ã«é¢ããAWS Health ã€ãã³ããEã¡ãŒã«ã§éç¥ãããããšã確èªãã AWSãµããŒããžã®ãªã¯ãšã¹ãæã«ããã¹ãã€ãã³ããäœæããããæ¥æãæå®ããã®ã§ãæå®ããæéã«AWS Health ã€ãã³ããçºçããŠããããšã確èªããŸãã â»ãã¹ãã€ãã³ããäœæããããã€ãã³ãã®æ¥æã¯ãåžæã®æ¥æã§ã®å¯Ÿå¿ãçŽæãããã®ã§ã¯ãªãããããã¹ãã€ãã³ãã®çºè¡ãŸã§æå€§3å¶æ¥æ¥ãããããšãããããã§ãã æå®ããæ¥æã«ä»¥äžã®ãããªã¡ãŒã«ãåä¿¡ããŸããããã¡ãã§åé¡ãªããAWS User Notificationsãèšå®ã§ããŠããããšã確èªã§ããŸããã ã¡ãªã¿ã«ãã³ã³ãœãŒã«ãããAWS Health ã€ãã³ãã確èªããããšãã§ããŸãã ãŸãšã AWS Healthã€ãã³ããå©çšããããšã§ä»¥äžã®ãããªã¡ãªãããåŸãããšãã§ããŸãã é害çºçæã®åãåããçŽ æ©ãè¡ãããšãã§ãã é害ãã¡ã³ããã³ã¹ã®éç¥ãåãåãããšã§ãæºåã察åŠãã§ãã ãµãŒãã¹ã®å¯çšæ§ãé«ããããšãã§ãã ããã«AWS User Notificationsãå©çšããŠéç¥æ©èœãå®è£
ããããšã§ãæ¯èŒç容æã«èšå®ããããšãå¯èœã ãšæããŸãã çãããAWS User Notificationsãå©çšããAWS Health ã€ãã³ãã®å®è£
ãããŠã¿ãã®ã¯ãããã§ããããã çæ§ã®ã圹ã«ç«ã¡ãŸããããå¬ããã§ãã æåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã
ServiceNowã®UI Builderãè§Šãæ©äŒããã£ããããäžéšã§ãããã®æ©èœã玹ä»ãããŠããã ããŸãã æ¬èšäºã¯å·çæç¹ïŒ2025幎1æïŒã®æ
å ±ã§ããææ°ã®æ
å ±ã¯è£œåããã¥ã¡ã³ããåèã«ããŠãã ããã UI Builderãšã¯ UI Builderãšã¯ãã¯ãŒã¯ã¹ããŒã¹ãªã©ã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãäœæããããšãã§ããããŒã³ãŒãããŒã«ã§ãã æ§ã
ãªçš®é¡ã®ã³ã³ããŒãã³ããæšæºã§çšæãããŠããããããã䜿çšããŠã¬ã€ã¢ãŠããã¹ã¿ã€ãªã³ã°ãã€ã³ã¹ã¿ã³ã¹å
ã«èç©ãããããŒã¿ãå¯èŠåããããšã§ãåãŠãŒã¶ãŒã«å¯ŸããŠããŒãœãã©ã€ãºããããšã¯ã¹ããªãšã³ã¹ãæäŸããããšãã§ããŸãã å®éã«è§Šã£ãŠã¿ã ã¬ã€ã¢ãŠã UI Builderã§ç»é¢ãäœãéã¯ããŸãã¬ã€ã¢ãŠããæ±ºããŠãã³ã³ããŒãã³ããé
眮ããŠããæµããšãªããŸãã ç»åã®ããã«ãã¬ãã·ãã«ã«ã¬ã€ã¢ãŠããèšå®ããããšãå¯èœã§ãã ããŒã¿ã®å¯èŠå ServiceNowäžã«èç©ããããã©ã³ã¶ã¯ã·ã§ã³ããŒã¿ãèŠèŠçã«åããããããŠãŒã¶ãŒã«å¯ŸããŠè¡šç€ºããããšãã§ããŸãã ç»åã®ããã«èªåã«ã¢ãµã€ã³ãããã¿ã¹ã¯ãä»é±æéã®ã€ã³ã·ãã³ã察å¿ç¶æ³ãªã©ãåãã«ãœãã®ç®çã«å¿ããŠæè»ã«å¯èŠåããããšãã§ããŸããïŒãã°ã€ã³ããŠãããŠãŒã¶ãŒã«ãããå€ã¯åçã«å€åããŸãïŒ ãã°ã€ã³åŸã®æåã®ç»é¢ã§è¡šç€ºããã°ããŠãŒã¶ãŒã¯ç¬æã«èªèº«ãèªèº«ãæå±ããã°ã«ãŒãã®ã¿ã¹ã¯ç¶æ³ãææ¡ããããšãã§ããŸãã ãŸããç»é¢ãã¯ãªãã¯ããããšã§å¯Ÿè±¡ã®ã¬ã³ãŒãã«é·ç§»ããããšãå¯èœã§ãã ã¡ãã¥ãŒã»ãªã¹ã èªç±ã«ã¡ãã¥ãŒãèšå®ã§ããŸããåãã«ãœããæ¥åãéè¡ããäžã§å¿
èŠãªããŒãã«ã®ã¿ãã¡ãã¥ãŒãšããŠçšæããã°ãããå¹ççã«äœæ¥ãé²ããããšãã§ãããã§ãã ã€ã³ã¹ã¿ã³ã¹ã«ãã°ã€ã³ããéã«ç»é¢å·Šã«è¡šç€ºãããã¢ããªã±ãŒã·ã§ã³ããã²ãŒã¿ãŒã§ã¯ãé²èŠ§æš©éã®ããã¢ãžã¥ãŒã«ãå
šãŠè¡šç€ºãããã®ã§ãç®çã®ã¢ãžã¥ãŒã«ã®å ŽæãèŠããããªããæ€çŽ¢ããã®ã倧å€ãšãã£ãå Žåã«æŽ»çšã§ããããšæããŸããã ã«ã¬ã³ã㌠ã«ã¬ã³ããŒåœ¢åŒã§èªèº«ã®ã¿ã¹ã¯ã管çããããšãå¯èœã§ãã ç»åã§ã¯èªèº«ã®ã¿ã¹ã¯ã«ã€ããŠã起祚æ¥ããå¯Ÿå¿æéãŸã§ã垯ãšããŠã«ã¬ã³ããŒè¡šç€ºãããŠããŸãã ãµããŒãã»ã³ã¿ãŒçãªããŒãžãäœæããŠã¿ã æšæºã§çšæãããŠããã³ã³ããŒãã³ãã䜿çšããã ããªã®ã§ã30åçšåºŠã§ç°¡åã«äœæããããšãã§ããŸããã ã»ç»é¢äžéš ããã¥ã¢ã«ãããªãŒåœ¢åŒã§è¡šç€ºããŠããŸãããªã³ã¯ãã¯ãªãã¯ãããšå€éšURLã«é·ç§»ã§ããŸãã ã»ç»é¢äžå€® ServiceNowäžã«äœæããããã¬ããžèšäºãFAQãšããŠäžèŠ§è¡šç€ºããŸããããã¿ã³ãã¯ãªãã¯ããããšã§ãã¬ããžèšäºãé²èЧã§ããŸãã ã»ç»é¢äžéš ååããã©ãŒã ã衚瀺ããŠããŸããããã¥ã¢ã«ãFAQã§è§£æ±ºããªãå Žåã«ãµããŒããžååãããããšãã§ããŸãã ææ³ ä»åèšäºã«ããã®ã¯äžéšã®ã³ã³ããŒãã³ãã®ã¿ã§ãããä»ã«ãæ²¢å±±ã®æ©èœãçšæãããŠããŸããïŒæ°ããŠã¿ããšçŽ150åãããŸããïŒ äŒæ¥å
ã§ServiceNowã䜿çšããŠããéãæ§ã
ãªãã«ãœããç»å ŽããŸããåã
ãèŠããæ
å ±ãæ¥åã®éè¡ã«å¿
èŠãªæ©èœãäžã€ã®ç»é¢ã«è¡šç€ºãããªã©ãªã©ãããŒãœãã©ã€ãºããããšã¯ã¹ããªãšã³ã¹ããŠãŒã¶ãŒã«æäŸã§ããããšãå©ç¹ãšæããŸããã ServiceNow ServiceNowã¯ãäŒæ¥ã®çç£æ§åäžãæ¥åããã»ã¹æ¹åãæ¯ãããµãŒãã¹ãããžã¡ã³ãã¯ã©ãŠããœãªã¥ãŒã·ã§ã³ã§ããåŸæ¥å¡æºè¶³åºŠã»é¡§å®¢æºè¶³åºŠã®åäžãæ¥åå¹çåã匷åã«æ¯æŽããŸãã www.scsk.jp
ããã«ã¡ã¯ãåºéã§ãã AWS AppSync 㯠Amazon API Gateway ãšåæ§ã« API ãå
¬éããŠããããµãŒãã¹ã§ãããå¿
ãäœãããã®èªèšŒããªããšåããªããµãŒãã¹ã§ããç§ã¯ Amazon Cognito èªèšŒã䜿çšããããšãå€ãã®ã§ãããAmazon Cognito ã§èªèšŒããããŠãŒã¶ãŒã§ããã°èª°ã§ãå®è¡ã§ããã¯ãšãªãããã°ãäŸãã°ç®¡çè
ã®ã¿ã«å®è¡ããããã¯ãšãªããããŸãã ãããªãšãã« Amazon Cognito ãŠãŒã¶ãŒã®å±æ§ãšããŠã°ã«ãŒããããããããæ ãæã«ããŠæš©éãåããæ¹æ³ãæãç°¡æã§ããAWS IAM ããŒã«ã䜿çšããæ¹æ³ãå®è£
å¯èœã ãšæããŸãããIAM ããŒã«ãã°ã«ãŒãããšã«çšæããªããšãããªãã®ã§é¢åã§ãã ä»åã¯ãAWS AppSync Lambda ãªãŸã«ã (JavaScript) ã®æšæºçãªæžãæ¹èª¬æãå
ŒããŠãæš©éåãã®æžãæ¹ã玹ä»ããããšæããŸããã¡ãªã¿ã«æ¬ä»¶ã¯ AWS å
¬åŒããã¥ã¡ã³ãã§ã¯ä»¥äžã®ããŒãžãé¢é£ããŸãã AWS AppSync JavaScript リゾルバーの概要 - AWS AppSync AWS AppSync ã® JavaScript ãªãŸã«ããŒã®æŠèŠ docs.aws.amazon.com リクエストとレスポンスを保護するためのアクセスコントロールのユースケース - AWS AppSync AWS AppSync ã®æ¿èªã·ããªãªã docs.aws.amazon.com ãµã³ãã«ã¢ãŒããã¯ã㣠以äžã®æ§æäŸã§ç޹ä»ããŸããäž»ã«ç·è²ã®ç·ã®éšåã«ãã©ãŒã«ã¹ããŸãã AWS AppSync 㯠Amazon Cognito èªèšŒã§ããåºæ¬çã«ãAmazon Cognito èªèšŒãåãããŠãŒã¶ãŒã¯ AWS AppSync ã«ã¢ã¯ã»ã¹ã§ããæ§æã§ãã AWS AppSync ã« Lambda ãªãŸã«ããäœæããAWS Lambda 颿°ãé¢é£ä»ããŸãã AWS Lambda 颿°ã¯ãAmazon Cognito ãŠãŒã¶ãŒã®ãªã¹ããååŸããŸãã AWS AppSync ã§ã¯ãããŒã¿ããŒã¹ãžã®èªã¿æžã㯠AWS Lambda 颿°æãã§åºæ¬çãªããšã¯ã§ããã®ã§ãAWS Lambda 颿°ã䜿çšããæ©äŒãå°ãªãã§ãããããŠãAWS Lambda 颿°ãç¡ãæ¹ãã¬ã¹ãã³ã¹ãéããªããŸãããªã®ã§ãAWS Lambda 颿°ã䜿çšããäŸãšã㊠Amazon Cognito ãŠãŒã¶ãŒã®ãªã¹ããååŸããããšãæ¡çšããŠããŸãã ãã®äŸã®ããã« Amazon Cognito ã®ãŠãŒã¶ãŒãªã¹ããååŸããŠè¯ã人ã¯ãäžè¬çã«ã¯ç®¡çè
ã«éãããŠããã¯ãã§ãããã®ããããã® Lambda ãªãŸã«ãã¯ç®¡çè
çšã® Amazon Cognito ã°ã«ãŒãã«æå±ããŠãã人ã§ãªããšå®è¡ã§ããªãããã«ãããã§ãã å®è£
ãããã® æš©éé¢é£èšå®ã«ã€ããŠå°ããã¬ãŒã¯ããŠã³ããŠèª¬æããŸãã ãŸããã¢ããªåŽã§ã¯ã管çè
以å€ã«èŠããããªãç»é¢ã¯è¡šç€ºãããªãããã«ããŸããã¢ããªå
ã§ Amazon Cognito ãŠãŒã¶ãŒã®å±æ§ã¯ååŸã§ããã®ã§ãCognito ã°ã«ãŒã屿§ãããšã«è¡šç€ºãã/ããªããå€å¥ãããŸãã ãã ããããã¯ãããŸã§ãã¢ããªã«ãã衚é¢çãªè¡šç€ºå¶åŸ¡ã ãã§ãããŠãŒã¶ãŒã«ç¡çšãª API ã¢ã¯ã»ã¹ããããªãããã ãã®ãAWS AppSync ã«äœããã®åœ¢ã§çŽæ¥åœä»€ãæ¥ãŠããŸã£ããšãã¯èš±å¯ããŠããŸãã®ã§ãAWS AppSync åŽã§ã Cognito ã°ã«ãŒãã«ããå®è¡å¶åŸ¡ãå
¥ããŸããLambda ãªãŸã«ãå
ã§ Amazon Cognito èªèšŒã«äœ¿çšãããããŒã¯ã³ã®å
容ãååŸã§ããã®ã§ããããããšã«å€å¥ããŸããAWS Lambda 颿°ãåŒã³åºãåã«ãªãŸã«ãå
ã§åŠçããŸãã ã¢ããªåŽã®ç»é¢è¡šç€ºå¶åŸ¡ æ¬èšäºã®æ¬é¡ã§ã¯ãªãã§ãããäžå¿ React ã¢ããªãäŸãšããŠã³ãŒããèŒããŸãã åæãšããŠã以äžã®èšäºã§ç޹ä»ããŠãããã㪠React ã¢ããªãã AWS AppSync ã« Amazon Cognito èªèšŒã§ã¢ã¯ã»ã¹ããèšå®ãæžãã§ããããšãšããŸãã AWS AppSync ã®ãªãŸã«ãå
ã§ Amazon Cognito ãŠãŒã¶ãŒã® email 屿§ãã«ã¹ã¿ã 屿§ãååŸãã AWS Lambda 颿°ã䜿çšããã«å®çŸããæ¹æ³ãããã£ãã®ã§ç޹ä»ããŸãã blog.usize-tech.com 2025.01.08 ãŸããReact ã¢ããªå
ã§ Amazon Cognito ã®å±æ§æ
å ±ã¯ä»¥äžã®ã³ãŒãã§ååŸã§ããŸããæžãæ¹ã¯ããããããã®ã§ãäžäŸã§ãã //å¿
èŠã¢ãžã¥ãŒã«ã€ã³ããŒã import { fetchAuthSession } from 'aws-amplify/auth'; //stateåæå const [email, setEmail] = useState(); //ãŠãŒã¶ãŒã®ã¡ãŒã«ã¢ãã¬ã¹ const [authToken, setAuthToken] = useState(); //ãŠãŒã¶ãŒã®ããŒã¯ã³ const [groups, setGroups] = useState(); //ãŠãŒã¶ãŒã®Cognitoã°ã«ãŒã //ã»ãã·ã§ã³æ
å ±ååŸ const getSession = async () => { const { tokens } = await fetchAuthSession(); setEmail(tokens?.idToken?.payload.email); //ã¡ãŒã«ã¢ãã¬ã¹ã¯ããã§ååŸ setGroups(tokens?.idToken?.payload["cognito:groups"]); //Cognitoã°ã«ãŒãã¯ããã§ååŸ setAuthToken(tokens?.idToken?.toString()); //IDããŒã¯ã³ã¯ããã§ååŸ }; useEffect(() => { getSession(); }, []); ããããŠååŸãã groups ã®äžã«ãŠãŒã¶ãŒãæå±ãã Cognito ã°ã«ãŒããé
åã§æ ŒçŽãããŠããã®ã§ã(è€æ°æå±ããŠããå¯èœæ§ãããã®ã§) ãã®æ
å ±ãæŽ»çšããŠè©²åœã®ç»é¢ã衚瀺/é衚瀺ãå¶åŸ¡ã§ããŸãã äŸãã°ã管çè
çšã®ã°ã«ãŒãåã ADMIN ã ã£ããšãããšãã·ã³ãã«ã«ä»¥äžã®ããã«æžããŸããã¡ãã¥ãŒç»é¢ã®ãã¡ã管çè
çšç»é¢ãžã®ãªã³ã¯ã衚瀺å¶åŸ¡ããäŸã§ããgroups ã« ADMIN ãå«ãŸããŠãããã©ãããæ¡ä»¶ã«ããŠããŸãã {/* ããŒã ç»é¢ãã¿ã³ */} <Button to="/" onClick={handleCloseNavMenu} component={Link} sx={{mr:2,color:"white",display:"block"}}>ããŒã </Button> {/* èšå®ã¡ãã¥ãŒãã¿ã³ */} <Button to="/config" onClick={handleCloseNavMenu} component={Link} sx={{mr:2,color:"white",display:"block"}}>èšå®</Button> {/* Adminã¡ãã¥ãŒãã¿ã³ */} {(groups.includes("ADMIN")) && ( <Button to="/admin" onClick={handleCloseNavMenu} component={Link} sx={{mr:2,color:"white",display:"block"}}>Admin</Button> )} {/* ãµã€ã³ã¢ãŠããã¿ã³ */} <Button onClick={signOut} sx={{mr:2,color:"white",display:"block"}}>ãµã€ã³ã¢ãŠã</Button> ãã¡ããããªã³ã¯å
ã®ãã¹ãç¥ãããŠãããæå³ããªãã®ã§ããªã³ã¯å
ã®æ¹ã§ãç»é¢å
šäœã«åæ§ã®è¡šç€ºå¶åŸ¡æ¡ä»¶ããããŸãã 管çè
çšç»é¢ã§ã¯ãAmazon Cognito ãŠãŒã¶ãŒãªã¹ããååŸããããã®ã¯ãšãªãæžããŸãã ããã§ãæ³å®ãããªã¯ãšã¹ããšã¬ã¹ãã³ã¹ã®æžåŒãæŽçããŸãã 以éããã®ããŒã¿æåãããåæã§ AWS AppSync ã®èšå®ãæžããŸãã AWS AppSync ã®èšå® ã¹ããŒã å¿
èŠãªç®æãæç²ããŸãã schema { query: Query mutation: Mutation subscription: Subscription } type CognitoUsersItems { id: Int email: String createddate: String status: String } type CognitoUsers { items: [CognitoUsersItems] } type Query { queryListCognitoUsers(dummy: String!): CognitoUsers } ãªã¯ãšã¹ãã§ dummy ãšãããã©ã¡ãŒã¿ãæž¡ãã®ã§ãQuery ã®å®çŸ©ã«å
¥ããŠããŸãã ã¬ã¹ãã³ã¹ã¯ items ãšããããŒã§é
åãæ ŒçŽããéå±€æ§é ã«ãªã£ãŠããã®ã§ãããã衚çŸããŠããŸãã ããŒã¿ãœãŒã¹ AWS AppSync ã® Lambda ãªãŸã«ãã䜿çšããå ŽåãããŒã¿ãœãŒã¹ã®ã¿ã€ãã Lambda ã«ããå¿
èŠããããŸããããŒã¿ãœãŒã¹ã®èšå®ã§ãé¢é£ä»ãã AWS Lambda 颿°ãããã® AWS Lambda 颿°ãåŒã³åºããæš©é (IAM ããŒã«) ãèšå®ããŸãããã®è©³çްã¯å²æããŸãã Lambda ãªãŸã«ã ãªãŸã«ãã®èšå®ã§ãããŒã¿ãœãŒã¹ãäžè¿°ã®ãã®ãæå®ããŸããããã«ããããã®ãªãŸã«ããããŒã¿ãœãŒã¹ã§èšå®ããã AWS Lambda 颿°ãšé£æºã§ããããã«ãªããŸããèšäºã®æ¬é¡ã®1ã€ã§ãããããã®ãªãŸã«ãã®æžãæ¹ã説æããŸãã JavaScript ãªãŸã«ãã§ã¯ããããã³ã°ãã³ãã¬ãŒãã®ãªã¯ãšã¹ããã¬ã¹ãã³ã¹ã¯ 1 ã€ã® JavaScript ã³ãŒãã®äžã§è¡šçŸããŸããVTL ã§ã¯ãããããåãããŠããŸãããã ä»åã®ãªã¯ãšã¹ããã¬ã¹ãã³ã¹ä»æ§ãå®çŸãããšã以äžã®ã³ãŒãã«ãªããŸãã //ãªãŸã«ãå
ã§äœ¿çšå¯èœãªãŠãŒãã£ãªãã£é¢æ°ãã€ã³ããŒã import { util } from '@aws-appsync/utils'; //ãªã¯ãšã¹ããããã³ã°ãã³ãã¬ãŒã export function request(ctx) { //ctx ã®äžã«ã¢ããªããæž¡ãããåŒæ°(args)ãããããŒæ
å ±ãæ ŒçŽããã const groups = ctx.identity.claims['cognito:groups'] //ããã§ãããŒã¯ã³ã«æ ŒçŽããã Cognito ã°ã«ãŒããååŸ if (groups.indexOf('ADMIN') === -1) { //Cognitoã°ã«ãŒãã« ADMIN ãå«ãŸããŠããããã§ã㯠util.unauthorized(); //ADMIN ãå«ãŸããŠããªããã°ãèªèšŒãšã©ãŒãšããŠè¿ã } else { return { operation: 'Invoke', //Lambda颿°ãåŒã³åºããªãã¬ãŒã·ã§ã³å®çŸ© payload: { ctx.args //Lambda颿°ã«æž¡ããã€ããŒããããã§ã¯ã¢ããªããããã£ãå€(dummy)ããã¹ã¹ã«ãŒãã } }; } } //ã¬ã¹ãã³ã¹ãããã³ã°ãã³ãã¬ãŒã export function response(ctx) { //ctx ã®äžã«Lambda颿°ã®ã¬ã¹ãã³ã¹ãæ ŒçŽããã if (ctx.error) { util.error(ctx.error.message, ctx.error.type); //ã¬ã¹ãã³ã¹ã«ãšã©ãŒãå«ãŸããŠããã°ãšã©ãŒã§çµäºããã } return ctx.result; //Lambda颿°ãã return ã§è¿ããå€ã¯ ctx.result ã«æ ŒçŽããããããã§ã¯ãã®ãŸãŸ AppSync ã«ãã¹ã¹ã«ãŒãã } ctx.identity.claims[‘cognito:groups’] ã«æ ŒçŽãããŠããã°ã«ãŒãåã®é
åã« ADMIN ãå«ãŸããŠããããã§ãã¯ããã®ã« includes ã䜿çšããããšããã§ãããJavaScript ãªãŸã«ãã§ã¯ãµããŒããããŠããªãã®ã§ã代ããã« indexOf ã䜿çšããŠããŸããJavaScript ã®æ©èœã¯äœã§ããªãŸã«ãå
ã§äœ¿ããããšèšããšå
šç¶ããã§ã¯ãªããŠãããªãéå®ãããŠããã®ã§æ³šæãå¿
èŠã§ãã リゾルバーおよび関数の AWS AppSync JavaScript ランタイム機能 - AWS AppSync AWS AppSync ã® JavaScript ãªãŸã«ããŒãŠãŒãã£ãªãã£ãã«ããŒã«ã€ããŠèª¬æããŸãã docs.aws.amazon.com ãã®ãªãŸã«ãæ§æã¯ãçµæ§æšæºçã«äœ¿ããã®ã§ã¯ãªãããšèããŠããŸãã AWS Lambda 颿° ãªãŸã«ãããåŒã³åºããã AWS Lambda 颿°ã¯ãAWS AppSync çµç±ã§ã¢ããªããæž¡ãããåŒæ° (ããã§ã¯ dummy ã®å€) ãååŸã§ããŸããã³ãŒãå
ã§ã¯è¡šçŸããŠããŸããããæ¬èšäºã®ãªã¯ãšã¹ã仿§ã§ã¯ãevent[‘dummy’] ã§ “dummy” ãååŸã§ããŸãã ãŸããã¬ã¹ãã³ã¹ãšããŠæ³å®ããŠãããã©ãŒãããã§ã¬ã¹ãã³ã¹ãè¿ããããæžãããã®ã以äžã®ã³ãŒãã«ãªããŸããPython ã§ãã Amazon Cognito ãŠãŒã¶ãŒããŒã« ID ã¯ç°å¢å€æ°ã«ããŠããŸããIAM ããŒã«ã¯å²æããŸãã import json import boto3 import os LIMIT = 60 # Amazon Cognito ã® list_users ã¯æå€§60ä»¶ããäžåºŠã«ããŒã¿ãååŸã§ããªã USER_POOL_ID = os.environ['CognitoUserPoolID'] client = boto3.client('cognito-idp') def lambda_handler(event, context): try: response = client.list_users( UserPoolId=USER_POOL_ID, AttributesToGet=['email'], Limit=LIMIT ) user_records = response['Users'] while True: # PaginationToken ãç¡ããªããŸã§(ããŒã¿ãå
šãŠååŸãããŸã§)ããŒã¿ååŸåŠçãç¹°ãè¿ã if 'PaginationToken' not in response: break # PagenationToken ãããéããããŒã¿ãååŸãã response = client.list_users( UserPoolId=USER_POOL_ID, AttributesToGet=['email'], Limit=LIMIT, PaginationToken=response['PaginationToken'] ) user_records.extend(response['Users']) # user_records ã«æçµçã«å
šããŒã¿ãæ ŒçŽããã except Exception as e: print(e) reserr = { "items": [ { "id": 0, "email": "Error", "createddate": None, "status": "Error" } ] } return reserr # ãšã©ãŒçºçæã¯ãšã©ãŒçšã®ã¬ã¹ãã³ã¹ã AppSync ã«è¿ã else: output = [] # Amazon Cognito ããè¿ã£ãŠããçããŒã¿ããå¿
èŠãªããŒã¿ã ãæœåºãã for i, row in enumerate(user_records): transformed = { "id": i, "email": next(attr["Value"] for attr in row["Attributes"] if attr["Name"] == "email"), "createddate": str(row["UserCreateDate"]), "status": row["UserStatus"] } output.append(transformed) return { "items": output # æœåºããããŒã¿(é
å)ã items ã«æ ŒçŽã㊠AppSync ã«è¿ã } æåŸãreturn ã§ items ãè¿ããŠããŸããããããAWS AppSync ããã¹ã¹ã«ãŒããŠã¢ããªã«è¿ã£ãŠããŸãã ã¢ããªåŽã® AppSync ã¯ãšãªå®è¡ ã¢ããªåŽã§ã¯ãäžè¿°ã®ã¬ã¹ãã³ã¹ãååŸããããã®ã¯ãšãªãå®è¡ããŸããæ¬èšäºã®ã·ããªãªã§ã¯ã管çè
çšç»é¢ã§å®è¡ãããã®ã§ãã AWS AppSync ã¹ããŒãã®ä»æ§ã«åãããŠèšè¿°ããŸããåè¿°ã®ã¹ããŒãèšå®ãšç
§ããåããããšãããããããšæããŸããèšè¿°ç®æãé¢ããŠãŠãã¿ãŸããããªã¯ãšã¹ããã¬ã¹ãã³ã¹ã®ããŒã¿å®çŸ©ãã¹ããŒãã®ä»æ§ãšå°ãã§ãåããªããšãšã©ãŒã«ãªããŸããåä»ã§ãã //AppSyncåŒåºçšã¢ãžã¥ãŒã«ã€ã³ããŒã import { generateClient } from 'aws-amplify/api'; import gql from 'graphql-tag'; //AppSync Client const client = generateClient(); //CognitoãŠãŒã¶ãŒãªã¹ãååŸé¢æ° const listCognitoUsers = async () => { const queryListCognitoUsers = gql` query queryListCognitoUsers($dummy: String!) { queryListCognitoUsers(dummy: $dummy) { items { id email createddate status } } } `; const res = await client.graphql({ query: queryListCognitoUsers, variables: { dummy: 'dummy' //dummyãAppSyncã«æž¡ã(æ¬èšäºã®èª¬æçšéã§) } }); return res.data.queryListCognitoUsers.items; //AppSyncããã®ã¬ã¹ãã³ã¹ã¯ãdata.Queryåã«æ ŒçŽããã }; ãã® listCognitoUsers 颿°ã§ãã¢ããªãã Amazon Cognito ãŠãŒã¶ãŒã®ãªã¹ããé
åã§ååŸã§ããŸãããã©ãŒãããã¯å¿
èŠæ
å ±ãæœåºãããã®ã«ãªã£ãŠããŸããã ãŸãšã ãããã§ããã§ããããã ã¢ããªãAWS AppSyncãAWS Lambda 颿°ã®éã§ããŒã¿ãæåãã仿§ãçè§£ã§ããã®ã§ã¯ãªãããšæããŸããåæã«ãAmazon Cognito ã°ã«ãŒãã«ãããªãŸã«ãã®å®è¡å¶åŸ¡ãç°¡æã«ä»æããããšãã§ããŠããŸãã æ¬èšäºãçæ§ã®ã圹ã«ç«ãŠãã°å¹žãã§ãã
æ¬èšäºã¯ æ°äººããã°ãã©ãœã³2024 ã®èšäºã§ã ã çããããã«ã¡ã¯ïŒå
¥ç€ŸããŠéããªãæ°ç±³ãšã³ãžãã¢ã®äœã
æšã§ãã ååãåã
åãš2åã«æž¡ã£ãŠãSnowflake CortexAIã䜿ã£ãŠããã¥ã¡ã³ãæ€çŽ¢ã¢ã·ã¹ã¿ã³ããæ§ç¯ãããã¥ãŒããªã¢ã«ã«ææŠãããã®æ§åãèšäºã«ãŸãšããããŠããã ããŸãããå€ãã®æ¹ã
ã«èªãã§ããã ãã倧å€å¬ããæã£ãŠããŸãã ãŸã èªããŠããªããšããæ¹ã¯ã以äžã®èšäºããŸãã¯èªãã§ããã ãããšå¹žãã§ãïŒïŒ æ°ç±³ãšã³ãžãã¢ãæãïŒSnowflake CortexAIã§ããã¥ã¡ã³ãæ€çŽ¢ã¢ã·ã¹ã¿ã³ããæ§ç¯ããŠã¿ã â TechHarmony æ°ç±³ãšã³ãžãã¢ãæãïŒSnowflake CortexAIã§ããã¥ã¡ã³ãæ€çŽ¢ã¢ã·ã¹ã¿ã³ããæ§ç¯ããŠã¿ãããã£ãããããããŒãžã§ã³ã â TechHarmony ããŠä»åã®èšäºã¯ããããããã®ãã¥ãŒããªã¢ã«ã® æçµè©± ãšãªããŸããæçµè©±ã®ç«ã¡äœçœ®ãšããŠã¯ãååãŸã§ã®å
容ã«ãªãã·ã§ã³æ©èœã远å ããã©ã€ããªå
容ãšãªããŸãïŒ å
·äœçã«ã¯ãååãŸã§ã§ãã£ãããããããŒãžã§ã³ã®ããã¥ã¡ã³ãæ€çŽ¢ã¢ã·ã¹ã¿ã³ãã®æ§ç¯ãå®äºãããããä»å㯠æ°ããããã¥ã¡ã³ãã®èªååŠç ã«èžã¿èŸŒãã§ã¿ãããšæããŸãã ããã§ã¯æ©éè¡ããŸãããïŒïŒ ååãŸã§ã®æ¯ãè¿ã ååãåã
åãšä»¥äžã®å
¬åŒãã¥ãŒããªã¢ã«ããã³ãºãªã³åœ¢åŒã§å®è·µãã Snowflake Cortex AIã®ãã¯ãã«åãèŸŒã¿æ©èœãå©çšããŠãããã¥ã¡ã³ãæ€çŽ¢ã¢ã·ã¹ã¿ã³ããæ§ç¯ ããŸããïŒ Build A Document Search Assistant using Vector Embeddings in Cortex AI ç¹ã«ååã¯ãåã
åã®å
容ã«ãã©ã¹ã㊠ããé«åºŠãªãã£ãããããããŒãžã§ã³ã®ããã¥ã¡ã³ãæ€çŽ¢ã¢ã·ã¹ã¿ã³ãã®æ§ç¯ ãããŸããïŒ å
·äœçãªStreamlitã®ã³ãŒãè§£èª¬ãæ°ã«ãªãæ¹ã¯ååã®èšäºãåç
§ããŠããã ãããã®ã§ãããæçµçã«ã¯ä»¥äžã®ãããªã¢ããªãæ§ç¯ããããšãã§ããŸããïŒ äžèšãèŠãŠãããéãã ãŠãŒã¶ãŒãšã®äŒè©±å
容ãèšæ¶ããŠããã£ãããããã®ããã«äŒè©±ã§ããã¢ã㪠ãšãªã£ãŠããŸãã ãªããã®ãããªãã£ããã®ãããªäŒè©±ãå®çŸã§ããã®ãã«ã€ããŠç°¡åã«èª¬æããŸãã ãŸãããŠãŒã¶ãŒã質åãæãããããšäºãSnowflakeäžã«æ ŒçŽãããããã¥ã¡ã³ããããšã«LLMãåçãäœæïŒRAGïŒãå¿çããŸãããã®ãšãããŠãŒã¶ãŒã®è³ªåãšäœæãããåçããã¢ãšããŠStreamlitã®ã»ãã·ã§ã³é åã«äžæçã«æ ŒçŽããŸãã æ¬¡ã«ããŠãŒã¶ãŒãç¶ããŠè³ªåããããšãã»ãã·ã§ã³ã«æ ŒçŽãã ãã£ããå±¥æŽãšè³ªåå
容ãçµã¿åãããŠèŠçŽãããå
容ãLLMã«æž¡ãããåçäœæããã³å¿çãããšããä»çµã¿ã§ãã ããã«ãããååã®äŒè©±å
容ãèšæ¶ããäŒè©±åœ¢åŒãå®çŸã§ããããã§ãã 倧éæãªèª¬æãšã¯ãªã£ãŠããŸããŸããããè©³çŽ°ãæ°ã«ãªãæ¹ã¯ååã®èšäºããã²ã芧ãã ããïŒïŒ ä»å宿œãããã¥ãŒããªã¢ã«ã®æŠèŠ åå宿œãããã¥ãŒããªã¢ã«ã§ã¯åè¿°ãããšããããŠãŒã¶ãŒãšã®äŒè©±å
容ãèšæ¶ããŠããã£ãããããã®ããã«äŒè©±ã§ããã¢ããªãæ§ç¯ããŸããã ãããŸã§ã®å
容ã§ããã¥ã¡ã³ãæ€çŽ¢ã¢ã·ã¹ã¿ã³ãã®9å²ä»¥äžã¯æ§ç¯å®äºããŠããã®ã§ããã1ã€ã ãäžäŸ¿ãªç¹ããããŸãã ãã㯠æ°ããããã¥ã¡ã³ãã远å ããããšã ã§ãã çŸç¶ã ãšãSnowflakeã®ã¹ããŒãžäžã«æ°ããããã¥ã¡ã³ãã远å ããã ãã§ã¯ãRAGã§æ€çŽ¢å¯Ÿè±¡ã®ããã¥ã¡ã³ããšã¯ãªããŸããããªããªããããã¥ã¡ã³ããæ€çŽ¢ããéã«ã¯ã¹ããŒãžäžã®ããã¥ã¡ã³ããã®ãã®ãåç
§ããã®ã§ã¯ãªããããã¥ã¡ã³ãã®ãã£ã³ã¯ãæ ŒçŽãããç¬èªã®ããŒãã«ïŒdocs_chunk_tableïŒãåç
§ããããã§ãããã®ããã«ããŠããçç±ã¯ãæ€çŽ¢å¹çãåäžãããããã§ãã ã€ãŸããçŸç¶ã ãšæ°ããããã¥ã¡ã³ããRAGã®æ€çŽ¢å¯Ÿè±¡ã«ãããã®ã§ããã°ãããã¥ã¡ã³ããããšã«åå²ããããã£ã³ã¯ãdocs_chunk_tableã«insertããã³ãã³ããæåã§å®è¡ããªããŠã¯ãªããªããšããäžäŸ¿ãããããŸãã ããã§ãããå¿«é©ãªéçšã«åã㊠æ°ããããã¥ã¡ã³ããèªååŠçããä»çµã¿ãæ§ç¯ ããŠãããããšæããŸãïŒ å®éã«ææŠããŠã¿ãïŒïŒ ã¯ãŒã¯ããŒãå®çŸ© æ°ããããã¥ã¡ã³ãã®èªååŠçãå®çŸããããã«ãä»åã¯Snowflakeã® ã¹ããªãŒã ãš ã¿ã¹ã¯ ãšãã2ã€ãçšããŸãïŒ æ©éã§ãããSnowflakeã¯ãŒã¯ã·ãŒãã§ä»¥äžã®ã³ãŒããå®è¡ããŸãã create or replace stream docs_stream on stage docs ; create or replace task task_extract_chunk_vec_from_pdf warehouse = COMPUTE_WH schedule = '1 minute' when system$stream_has_data ( 'docs_stream' ) as insert into docs_chunks_table ( relative_path , size , file_url , scoped_file_url , chunk , chunk_vec ) select relative_path , size , file_url , build_scoped_file_url ( @docs , relative_path ) as scoped_file_url , func . chunk as chunk , SNOWFLAKE . CORTEX . EMBED_TEXT_768 ( 'e5-base-v2' , chunk ) as chunk_vec from docs_stream , TABLE ( pdf_text_chunker ( build_scoped_file_url ( @docs , relative_path ))) as func ; alter task task_extract_chunk_vec_from_pdf resume ; äžèšã®ã³ãŒãã«ã€ããŠè£è¶³èª¬æãããŸãã ã³ãŒãå
šäœãšããŠã¯ã æ°ããPDFãã¡ã€ã«ãã¹ããŒãžã«è¿œå ããããã³ã«ãèªåçã«ããã¹ããã£ã³ã¯ãæœåºããåã蟌ã¿ãã¯ãã«ãçæãããšããã¯ãŒã¯ããŒããå®çŸ©ããŠããŸãã ã§ã¯å
·äœçã«ãåè¡ãã©ã®ãããªåŠçãè¡ã£ãŠããã®ãã«ã€ããŠè§ŠããŠãããŸãã 1è¡ç®ïŒ create or replace stream docs_stream on stage docs ; docs_streamãšããååã®ã¹ããªãŒã ãæ°ãã«äœæããŠããŸãã ã¹ããªãŒã ã¯ãããŒãã«ããã¥ãŒããŸãã¯ã¹ããŒãã«å ããããDML倿ŽïŒæ¿å
¥ãæŽæ°ãåé€ïŒã®å€æŽå±¥æŽãèšé²ãã圹å²ãæã¡ãŸããããã«ãããæ°ããPDFãã¡ã€ã«ãdocsã¹ããŒãžã«è¿œå ããããšãdocs_streamã¯ãããã®å€æŽãèšé²ããããšãã§ããŸãã 3è¡ç®ïŒ create or replace task task_extract_chunk_vec_from_pdf task_extract_chunk_vec_from_pdfãšããååã®ã¿ã¹ã¯ãäœæããŠããŸãã ã¿ã¹ã¯ã¯ãSQLã¹ããŒãã¡ã³ãïŒã¯ãšãªãDMLæäœãã¹ãã¢ãããã·ãŒãžã£ã®å®è¡ãªã©ïŒãèªåçã«å®è¡ããããã«ã¹ã±ãžã¥ãŒã«ã§ããããŒã¿ããŒã¹ãªããžã§ã¯ãã§ãã 4è¡ç®ïœ6è¡ç®ïŒ warehouse = XS_WH schedule = '1 minute' when system$stream_has_data ( 'docs_stream' ) äžèšã¿ã¹ã¯ãå®è¡ãããŠã§ã¢ããŠã¹ãé »åºŠãæ¡ä»¶ãå®çŸ©ããŠããŸãã å
·äœçã«ã¯ä»¥äžã®å®çŸ©ã§ãã ãŠã§ã¢ããŠã¹ïŒCOMPUTE_WH é »åºŠ: æ¯å æ¡ä»¶ïŒdocs_streamã¹ããªãŒã ã«æ°ããã¬ã³ãŒããããå Žåã«å®è¡ 9è¡ç®ïœ19è¡ç®ïŒ insert into docs_chunks_table ( relative_path , size , file_url , scoped_file_url , chunk , chunk_vec ) ã»ã»ã» ã¿ã¹ã¯ã§å®è¡ããSQLã¹ããŒãã¡ã³ããå®çŸ©ããŠããŸãã å
·äœçã«ã¯ãdocs_chunks_tableããŒãã«ã«ããŒã¿ãæ¿å
¥ããã¯ãšãªãå®çŸ©ããŠããŸããããŒãã«ã«ã¯ããã¡ã€ã«ãã¹ããµã€ãºãURLããã£ã³ã¯ããã¹ãããããŠåã蟌ã¿ãã¯ãã«ãªã©ã®æ
å ±ãæ ŒçŽãããŸãã 21è¡ç®ïŒ alter task task_extract_chunk_vec_from_pdf resume ; ã¿ã¹ã¯ãåéããããã®åŠçã§ãã ã¿ã¹ã¯ã¯æå忢ããšã©ãŒçºçæãªã©æ§ã
ãªçç±ã§äžæåæ¢ç¶æ
ã«ãªãããšããããŸãããã®ãããäžæåæ¢ç¶æ
ã®ã¿ã¹ã¯ãåéããã¹ã±ãžã¥ãŒã«ãããéãããŸãã¯ããªã¬ãŒæ¡ä»¶ãæºãããããšãã«å®è¡ãããããã«ã§ããŸãã æ€èšŒ ã§ã¯å®éã«æ°ããããã¥ã¡ã³ããã¹ããŒãžäžã«ã¢ããããŒãããããšã§ãèªåçã«ã¿ã¹ã¯ãå®è¡ããããã«ã€ããŠç¢ºèªããŠã¿ãŸãããïŒ å
·äœçã«ã¯ãããã¥ã¡ã³ããã¢ããããŒãããåãšåŸã®ç¶æ
ã§ããã¥ã¡ã³ãã«é¢é£ãã質åãæããããç確ãªåçãè¿ã£ãŠãããåŠãã確èªããŠã¿ãŸããæ³å®ãšããŠã¯ãããã¥ã¡ã³ããã¢ããããŒãããåã®ç¶æ
ã ãšç確ãªåçãè¿ã£ãŠããªãã®ã«å¯ŸããŠãã¢ããããŒãããåŸã®ç¶æ
ã ãšç確ãªåçãè¿ã£ãŠããã¯ãã§ãã ã§ã¯å®éã«ã¢ããããŒãããããã¥ã¡ã³ãã«ã€ããŠã§ãããä»åã¯å
¬åŒãã¥ãŒããªã¢ã«ããæåãããThe_Xtreme_Road_Bike_105_SL.pdfããšãããšã¯ã¹ããªãŒã ããŒããã€ã¯ã«é¢ããPDFãã¡ã€ã«ã䜿çšããããšæããŸãã ãããŠããã®ããã¥ã¡ã³ãã«é¢é£ãããIs there any discount for the Xtreme Road Bike?ïŒãšã¯ã¹ããªãŒã ããŒããã€ã¯ã®å²åŒã¯ãããŸããïŒïŒããšãã質åããã£ããã§æããããŠã¿ãããšæããŸãã ããã¥ã¡ã³ãã¢ããããŒãå ãŸãã¯ãããã¥ã¡ã³ããã¢ããããŒãããåã®ç¶æ
ã§ãã£ããã«è³ªåãæããããŠã¿ãŸãã æããããçµæã以äžã®ãããªåçãè¿ãããŸããã äžèšã®ãã£ããå
å®¹ãæ¥æ¬èªã«èš³ããšä»¥äžã®éãã§ããããã§ã黿åã質åãèµ€æåãåçãšãªããŸãã ãšã¯ã¹ããªãŒã ããŒããã€ã¯ã®å²åŒã¯ãããŸããïŒ ãšã¯ã¹ããªãŒã ã»ããŒããã€ã¯ã®å²åŒæ
å ±ã¯ãããŸãããæãæ£ç¢ºã§ææ°ã®äŸ¡æ Œæ
å ±ã«ã€ããŠã¯ãã¡ãŒã«ãŒã®ãŠã§ããµã€ãã確èªããããã«ã¹ã¿ããŒãµãŒãã¹ã«åãåãããããšããå§ãããŸãã äžèšã®éããããã¥ã¡ã³ãã¢ããããŒãåã§ã¯ãããã¥ã¡ã³ãã«é¢ãããŠãŒã¶ãŒã®è³ªåã«å¯ŸããŠé©åãªåçãè¿ããŠããªãããšãããããŸãã ããã¥ã¡ã³ãã¢ããããŒãåŸ æ¬¡ã«ãããã¥ã¡ã³ããã¢ããããŒãããåã®ç¶æ
ã§ãã£ããã«è³ªåãæããããŠã¿ãŸãã æããããçµæã以äžã®ãããªåçãè¿ãããŸããã äžèšã®ãã£ããå
å®¹ãæ¥æ¬èªã«èš³ããšä»¥äžã®éãã§ããããã§ã黿åã質åãèµ€æåãåçãšãªããŸãã ãšã¯ã¹ããªãŒã ããŒããã€ã¯ã®å²åŒã¯ãããŸããïŒ ã¯ããå²åŒã®è©±ããããŸããèªåã®ãµãã«ãæåãããš100ãã«å²åŒã«ãªããŸãã äžèšã®éããããã¥ã¡ã³ãã¢ããããŒãåŸã§ã¯ãããã¥ã¡ã³ãã«é¢ãããŠãŒã¶ãŒã®è³ªåã«å¯ŸããŠå²åŒé¡ãå«ããé©åãªåçãè¿ããŠããããšãããããŸãã ã€ãŸããæ°ããããã¥ã¡ã³ããã¹ããŒãžäžã«ã¢ããããŒãããã ãã§ãèªåçã«ããã¥ã¡ã³ãã®ãã£ã³ã¯åå²ãããŒãã«æ¿å
¥ããããŠçµæçã«RAGã®æ€çŽ¢å¯Ÿè±¡ã«ã§ããŠãããšèšããŸãïŒ ãŸãšã æ¬èšäºã§ã¯ãååã®èšäºãŸã§ã§äœæãããã£ãããããUIã«å¯ŸããŠã æ°ããªããã¥ã¡ã³ããèªååŠçããããã®ã¯ãŒã¯ãããŒã«ã€ããŠè§£èª¬ ããŸããã åŸæ¥ãããã¥ã¡ã³ãã®æ€çŽ¢ãåæã«ã¯ãæåã§ã®ã¢ããããŒããã€ã³ããã¯ã¹äœæãå¿
èŠã§ãæéãšåŽåãèŠããŠããŸãããããããSnowflakeãæäŸããã¹ããªãŒã ãã¿ã¹ã¯ã®æ©èœã䜿ãããšã§ããããã®ããã»ã¹ãèªååã§ããããšãåãããŸããïŒ ããã«ãããè¿
éãªæ
å ±æ€çŽ¢ãå¯èœã«ãªããæ¥åå¹çã®å€§å¹
ãªåäžãæåŸ
ã§ãããšããã¡ãªããããããŸãã ããã«ãæ§ã
ãªãã¡ã€ã«åœ¢åŒã«å¯Ÿå¿ããŠãããããæ§ã
ãªçš®é¡ã®ããã¥ã¡ã³ããçµ±äžçã«ç®¡çã»æ€çŽ¢ã§ããç¹ã倧ããªã¡ãªããã ãšèããããŸãããã®ããã倧éã®ããã¥ã¡ã³ããæ±ãäŒæ¥ã«ãšã£ãŠããã®æ©èœã¯æ¥åå¹çåã®åŒ·åãªããŒã«ãšãªãã§ãããã ãã²ãååãåã
åã§ç޹ä»ããCortexAIãçšããããã¥ã¡ã³ãæ€çŽ¢ã¢ã·ã¹ã¿ã³ããæ¬èšäºã§ç޹ä»ããããã¥ã¡ã³ãã®èªååŠçæ©èœãåèã«ããŠãRAGã·ã¹ãã ã®æ§ç¯ãæ
å ±æ€çŽ¢ã®å¹çåã«æŽ»ãããŠã¿ãŠãã ããïŒ
ããã«ã¡ã¯ãSCSKæ ªåŒäŒç€Ÿã®å¶è°·ã§ãã2024幎床å
¥ç€Ÿã®æ°å
¥ç€Ÿå¡ã§ãã çŸåšç§ã¯ãAIãã©ãããã©ãŒã ãWebãµãŒãã»ç£èŠãµãŒãã®æ§ç¯ãšãã£ãã€ã³ãã©åºç€ã®æ§ç¯æ¥åã«æºãã£ãŠããŸãã ä»åã¯ãDockeräžã«æ§ç¯ããAIãã©ãããã©ãŒã åºç€ãMackerelã§ç£èŠããŠã¿ãããšæããŸãã Mackerelãšã¯ Mackerelã¯ãæ ªåŒäŒç€Ÿã¯ãŠãªãæäŸããSaaSåã®ç£èŠããŒã«ã§ãã ãµãŒãã®ç¶æ
(CPUãã¡ã¢ãª)ãç£èŠããäºåã«èšå®ãããéŸå€ãè¶
ãããšãã«ãªãã¬ãŒã¿ã管çè
ã«éç¥ãè¡ãããšãã§ããããŒã«ã§ããå ããŠããªã³ãã¬ãã¹ç°å¢ã ãã§ãªãã¯ã©ãŠãç°å¢ãã³ã³ããç°å¢ãç£èŠããããšãã§ããŸãã Mackerelã®è©³çްæ
å ±ã«ã€ããŠã¯ãäžèšãªã³ã¯ããåç
§ãã ããã MackerelïŒãã«ã¬ã«ïŒ: å§ãããããŠå¥¥æ·±ããå¯èŠ³æž¬æ§ãã©ãããã©ãŒã Mackerel(ãã«ã¬ã«)ã¯èª°ã§ãç°¡åã«å§ãããã奥深ãå¯èŠ³æž¬æ§ãã©ãããã©ãŒã ãéçšãã€ãŒãžãŒã«ãããªãã¶ãŒãããªãã£ãé«ããæªç¥ã®åé¡ã«ç«ã¡åããéçºè
ã«åãäžããŸãããµãŒããŒç£èŠãMackerelã§ã¯ãããŠã¿ãŸãããïŒç¡æãã©ã³ã2... ja.mackerel.io Mackerelã§Dockerãç£èŠããèšäºãæ°å°ãªããããä»åå®éã«å®è£
ããŠèšäºãæžããããšæããŸããã Dockerãç£èŠããŠã¿ã(ç£èŠå¯Ÿè±¡ã«ã€ããŠ) ä»åã®æ€èšŒã§ã¯ãDockerãç£èŠããããã«ã³ã³ãããäœæããå¿
èŠããããŸããããã§ã仿µè¡ãã®LLMãRAGãæŽ»çšããç°¡åã«ã¢ããªéçºãå¯èœãªAIãã©ãããã©ãŒã ãDifyããAWSç°å¢ã«æ§ç¯ããŸããã ç£èŠå¯Ÿè±¡ã®æ§æå³ã¯ä»¥äžã®éãã§ãAWSã®EC2äžã«Dockerç°å¢ãæ§ç¯ããDockeräžã§Difyç°å¢ãæ§ç¯ããŠããŸãã Difyã«ã€ããŠã¯æ¬èšäºã®äž»èŠãªãããã¯ã§ã¯ãªããããèå³ãããæ¹ã¯äžèšãªã³ã¯ããåç
§ãã ããã Dify.AI · å
é²çãªAIã¢ããªã±ãŒã·ã§ã³ã®ããã®ã€ãããŒã·ã§ã³ãšã³ãžã³ å
é²çãªAIã¢ããªã±ãŒã·ã§ã³ã®ããã®ã€ãããŒã·ã§ã³ãšã³ãžã³ dify.ai Dockerãç£èŠããŠã¿ã(èšå®æ¹æ³) ããã§ã¯ãMackerelã§Dockerãç£èŠããæ¹æ³ã説æããŠãããŸãã(ä»åã¯AmazonLinux2ã®OSã䜿çšããŠããããããã®æ¹æ³ã«ã€ããŠèšèŒããŸãã) ãšãŒãžã§ã³ãã®ã€ã³ã¹ããŒã«ãšèµ·å ãŸãã¯ãç£èŠå¯Ÿè±¡ãã¹ãã«ãšãŒãžã§ã³ããã€ã³ã¹ããŒã«ããŸãã 以äžã®ã³ãã³ããå®è¡ããŠã€ã³ã¹ããŒã«ãšèµ·åãè¡ããŸãã APIããŒã¯Mackerelã®Webã³ã³ãœãŒã«ããåç
§ããŠããŸãã curl -fsSL https://mackerel.io/file/script/amznlinux/setup-all-yum-v2.sh | MACKEREL_APIKEY='YOUR_API_KEY' sh sudo systemctl start mackerel-agent èµ·åãããšMackerelã«ç£èŠå¯Ÿè±¡ãã¹ã(EC2)ãç»é²ãããŸãã Mackerelã®ç»é¢ã§ã¯ä»¥äžã®è¡šç€ºã«ãªãããã¹ãåã»ãã¹ãã®æ
å ±ã»ååŸããã¡ããªãã¯ã®ã°ã©ãã衚瀺ãããŠããŸãã ããã¥ã¡ã³ãã©ããã«ã³ãã³ããå®è¡ããã ãã§ãã¹ããç»é²ã§ããŸããã ããã¥ã¡ã³ãã©ããã«èšå®ããŠãåäœããªãäœæ¥ãçµéšããŠããã®ã§ããã®äœæ¥ã¯ãµã¯ããšå®äºããŠææ¿ããŸããã å
¬åŒãã©ã°ã€ã³ã®ã€ã³ã¹ããŒã« Dockerãç£èŠããããã«å
¬åŒãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã 以äžã®ã³ãã³ããå®è¡ããŠå
¬åŒãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããŸãã(ãã©ã°ã€ã³ã3ã®æé ã§äœ¿çšããŸãã) sudo yum install mackerel-agent-plugins ãã®äœæ¥ãããã¥ã¡ã³ãã©ããã«ã³ãã³ããå®è¡ããã ãã§å®äºããŸãã èšå®ãã¡ã€ã«ã®ä¿®æ£ æåŸã«èšå®ãã¡ã€ã«ã«ä»¥äžã®ãã©ã°ã€ã³ã远èšããŸãã [plugin.metrics.docker] command = ["mackerel-plugin-docker", "-name-format", "name_id"] -name-formatã§ã¯ã³ã³ããå(name)ãã³ã³ããID(id)ãã³ã³ããå+ã³ã³ããID(name_id)ãªã©è€æ°ã®ãªãã·ã§ã³ãèšå®ããããšãã§ããŸãããã®ãªãã·ã§ã³ã«ãã£ãŠMackereläžã®ã°ã©ã衚瀺ã«éãããããŸãã ããã§æ³šæãå¿
èŠã§ãïŒ å®æã«ãªãã·ã§ã³ãã³ã³ããIDã«èšå®ããŠããŸããšMackereläžã§ã³ã³ããIDãã衚瀺ããããäœã®æ©èœãæã€ã³ã³ãããããããªããªããŸãã ãã®ããä»åã¯ã³ã³ããå+ã³ã³ããID(name_id)ã«èšå®ããããšã§ååãšIDãã°ã©ãäžã§çŽã¥ããŠããŸãã ãã©ã°ã€ã³ã远èšåŸããšãŒãžã§ã³ãã以äžã®ã³ãã³ãã§åèµ·åããŸãã sudo systemctl restart mackerel-agent ãããšãMackereläžã§Dockerã³ã³ããã®CPUã®äœ¿çšçãã°ã©ããšããŠè¡šç€ºãããŸãã! ä»åäœæããç°å¢ã¯ã³ã³ããã9ã€äœæãããŠãããã°ã©ãã¯ã³ã³ããæ¯ã«æãç·ã°ã©ããšããŠè¡šç€ºãããŠããŸã(äžèšã°ã©ãã¯èŠèªæ§ã®ããã«2ã€ã®ã³ã³ããã®ã°ã©ãã衚瀺ããŠããŸã)ãããããã®æãç·ã°ã©ãã®ååãæé 3ã®-name-formatã§èšå®ããã³ã³ããå+ã³ã³ããID(å
é 6æå)ã«ãªã£ãŠããŸããã°ã©ãã®çžŠè»žã¯äœ¿çšé(%)ãæšªè»žã¯æå»ãšãªã£ãŠããŸãã ã¡ãªã¿ã«-name-formatãã³ã³ããID(id)ã«èšå®ãããšMackereläžã§ã¯ä»¥äžã®ç»åã®ããã«è¡šç€ºãããŸããéåžžã«èŠã«ãããIDãšã³ã³ããã®åœ¹å²ãçŽã¥ããããšãå°é£ã§ããã¿ãªãããèšå®ãããšãã¯æ°ãã€ããŸãããã Mackerelã®Dockerç£èŠã§ã¯CPUã»ã¡ã¢ãªã»I/Oæäœã®3ã€ã®ã¡ããªãã¯ãç£èŠããããšãã§ããŸãããã°ç£èŠã¯ã§ããŸãããããããã®è©³çްãªã¡ããªãã¯ã«ã€ããŠã¯äžèšããåç
§ãã ããã mackerel-agent-plugins/mackerel-plugin-docker at master · mackerelio/mackerel-agent-plugins Plugins for mackerel-agent. Contribute to mackerelio/mackerel-agent-plugins development by creating an account on GitHub... github.com ãããã« Mackerelã§Dockerç°å¢ãç£èŠããããšãã§ããŸãããMackereläžã§ã®ç£èŠèšå®ã¯ããã¥ã¡ã³ãéãã«äœæ¥ãé²ããããšã§ç°¡åã«èšå®ããããšãã§ããŸããããããã-name-formatã®èšå®ã«ããMackereläžã§ã®è¡šç€ºå
容ã®éãã¯ããªãã·ã§ã³ã倿ŽããŠã¿ãããšã§æ°ã¥ãããšãã§ããŸããããã£ãŠã¿ãªããšããããªãããšãããããšãŠãå匷ã«ãªããŸããã ä»åã¯Dockerç°å¢ãç£èŠããŸããããMackerelã¯ãªã³ãã¬ãã¹ç°å¢ã ãã§ãªãã¯ã©ãŠãç°å¢ãç£èŠããããšãã§ããããããŸããŸãªç°å¢ãç£èŠããŠã¿ãããšæããŸãã æ¬¡åã¯ãMackerelãšåŒç€Ÿã®çµ±åç£èŠåºç€FusionCOREãšã®é£æºã«ã€ããŠã®ããã°ãæçš¿ããããšæããŸãã
SCSKã®çã§ãã8åç®ã®æçš¿ã§ãã ä»åã¯ã ååã®ãšã³ã㪠ã§å°ãã ãè§ŠãããAWS Amplify ãçæãã AWS AppSync ãªãœãŒã¹ã®æåç§»è¡ã«é¢ããåå¿é²ã®ãããªãTips ã®ãããªå
容ã«ãªããŸããåŠäœãããã®ãããªäœæ¥ãå¿
èŠãšãªããããªæ¡ä»¶ããšãã·ãã¥ãšãŒã·ã§ã³èªäœãçãããšæããŸãã®ã§ãããããªå
容ã«ãªããšã¯æããŸãã埡芧é ããã°å¹žãã§ãã ãªããã¿ã€ãã«éã Amplify ãš AppSync ã®è©±é¡ã«éããŠããã®ã§ã¢ãŒããã¯ãã£å³ã¯èŒããŸããããããäœæ°ã«ä»åãåããŠã§ããã»ã» åææ¡ä»¶ïŒååãšã³ããªã®ããããå«ãïŒ ã客ãããäž»äœçã«ç®¡çããŠãã AWS ç°å¢äžã§åçš® AWS ãµãŒãã¹ããªãœãŒã¹ã®æ§ç¯ã»å®è£
ãè¡ã£ãã CloudFormation ã AWS CDKãterraform ãªã©ã®äœ¿çšã¯åå NGãAWS ãããžã¡ã³ãã³ã³ãœãŒã«ã®äœ¿çšã䜿çšããæ§ç¯ãåºæ¬ã Amplify ã«ã€ããŠã¯ã客ããã®ç°å¢ããªã·ãŒäžå°å
¥ NG ã ã£ããããåŒç€Ÿã® AWS ç°å¢äžã§ Amplify ã«ããäœæãããåçš® AppSync ãªãœãŒã¹ããã客ããã® AWS ç°å¢ã«æåç§»è¡ããå¿
èŠããã£ãã ç§»è¡å¯Ÿè±¡ã¯ã¹ããŒãããªãŸã«ãã颿°ã®3ã€ã ããŒã¿ãœãŒã¹ã«ã€ããŠã¯äžèš3ã€ãšæ¯èŒããŠå€æŽã®ã¿ã€ãã³ã°ãéå®çã§ããããã€ãªãœãŒã¹ãšãªã DynamoDB ã®ããŒãã«ã Lambda 颿°ã«ã€ããŠãç³è«ã®äžã客ããåŽã§äœæé ãå¿
èŠããããããèšå®æ
å ±ãã客ããã«é£æºããŠäœæé ã圢åŒãšããã 以äžã®å
容ãèžãŸããŠãããã€ãã®èгç¹ããåå¿é²æ¿ããã«èšèŒããŠãããŸãã äœå㪠query ã mutation ã Amplify ã«çæãããªã ãŸã㯠Amplify ã¹ããŒãå®çŸ©äžã®å·¥å€«ããã @model ãšããŠå®çŸ©ãããšãããŒãã«ã ãã§ãªã察å¿ãã query ãªã mutation ãèªåçæããŠãããã®ã Amplify ã®äŸ¿å©ãªç¹ãªã®ã§ãããã¢ããªã±ãŒã·ã§ã³ãã䜿çšããªãããšãæç¢ºãªãã®ãããããããã®ãããªäžèŠãªãã®ã¯çæããªãããã«ããããšã§ç§»è¡äœæ¥ã®å¯Ÿè±¡ãæžããã®ãç®çã§ããå
·äœçã«ã¯ãã¹ããŒãå®çŸ©ã«ãããŠçæå¯Ÿè±¡ã® type ãæå®ããããšã§å®çŸã§ããŸãã æä»å¶åŸ¡ã®å®è£
äŸïŒç¬¬äžåïŒ ã§äŸç€ºãã TableInfo ã«ãããŠãquery 㯠listãmutation 㯠create ã®ã¿ãããããçæããããã«ããå Žåã¯ä»¥äžã®ããã«å®çŸ©ããããšã§å®çŸã§ããŸãã type TableInfo @ model ( queries: { list: "listTableInfos" }, mutations: { create : "createTableInfo" }, ) @ auth ( rules : [ { allow : public, provider : apiKey}, { allow : private, provider : iam}, ]) { name : String! @primaryKey status : TableStatus! editor : String locked_by : String } æåç§»è¡æã«èšå®å€æŽãå¿
èŠãªãããã³ã°ãã³ãã¬ãŒãã®æŽç 次ã«ãå®äœæ¥ã«ã€ããŠã§ããã»ã»ãã¡ãã¯åçŽã« AWS ãããžã¡ã³ãã³ã³ãœãŒã«ãåŒç€Ÿã® AWS ç°å¢ãšã客ããã® AWS ç°å¢ã§2ç»é¢éããŠãæçŽã«æåã§ç§»è¡ïŒããšãã³ããïŒããŠããã ããªã®ã§ãç¹ã«å
容ãšããŠåãäžããããã®ã¯ãããŸããããã£ãšæ¥œãªããæ¹ãæ¡çšãããã£ããšã¯æããŸãããã ãã ãAWS ç°å¢ãç°ãªã以äžãç§»è¡æã«å€æŽããå¿
èŠãããé
ç®ã幟ã€ããã£ããããã®ç¹ã«ã¯çæããŸãããç¹ã«ããªãŸã«ãã®ãªã¯ãšã¹ããããã³ã°ãã³ãã¬ãŒãã«ã€ããŠã¯ VTL ãæžãæããå¿
èŠããã£ããããåå¿é²ãšããŠä»¥äžã«èšèŒããŠãããŸããéã«èšããšãæ³šææ·±ã倿Žããå¿
èŠããã£ãã®ã¯ãã®é
ç®ãããã ã£ããããç§»è¡èªäœã¯æã£ãŠããã»ã©æéãããããªãã£ãã®ã¯å¹žãã§ããã äŸãã°ãããŒã¿ãœãŒã¹åã¯ã客ããã«äœæé ãå¿
èŠãããããšããããAmplify ã«ããçææã®åç§°ããæå³çã«å€æŽããŠããŸãããããŒã¿ãœãŒã¹ãæå³çã«æå®ããå¿
èŠãããã®ã¯é¢æ°ããªãŸã«ãäœææçšåºŠãªã®ã§ãããŸãæ°ã«ãªããŸããã§ããã äžèšäŸã®éãã倧äœã³ããã®ãŸãŸã§è¡ããã®ã§ãã以äž2ç¹ã«ã€ããŠã¯ä¿®æ£ã®å¿
èŠããããŸããã authRole, unAuthRole ã䜿çšããªãããããããã³ã°ãã³ãã¬ãŒãããåé€ adminRoles ã® AWS ã¢ã«ãŠã³ã ID ãã客ããã® AWS ç°å¢ã®ãã®ã«å€æŽ ## [Start] Stash resolver specific context.. ** $util.qr($ctx.stash.put("typeName", "<Query or Mutation or Subscription>")) $util.qr($ctx.stash.put("fieldName", "<QueryName or MutationName or SubscriptionName>")) $util.qr($ctx.stash.put("adminRoles", ["arn:aws:sts::<AWS Account ID>:assumed-role"])) {} ## [End] Stash resolver specific context.. ** æåç§»è¡ãã AppSync ãªãœãŒã¹ã®èšå®ãã§ãã¯ã«ããã工倫 æåŸã«ãæåç§»è¡åŸã® AppSync èšå®ç¢ºèªæ¹æ³ã«ã€ããŠã æåã§ç§»è¡ããããšããããç°å¢éã§ç§»è¡ãããªãœãŒã¹èšå®ãã©ã®ããã«æ¯èŒãã§ãã¯ããã®ããã¡ãã£ãšãã課é¡ã§ãããã¹ããŒãã¯ç»é¢ããã³ãããããã®ã diff æ¯èŒããã°è¯ããšããŠãã颿°/ãªãŸã«ãã®ãããã³ã°ãã³ãã¬ãŒãã§éœåºŠãããããã®ã¯ãããã«é¢åã ãããããã³ã°ãã³ãã¬ãŒãå
ã®é¢æ°å®è¡é ãªã©ã¯ç»é¢äžã§æ¯èŒãããããªããšããããšã§ãã©ããããã®ããšãåœåã¯ç®èŠç¢ºèªããããªãããšæã£ãŠããã®ã§ãããæ¡ã®å®èšå®ãã¹ã§åäœããªãã£ã mutation ãåºãŠããŸããããçšåºŠã¯ã¡ãããšæ©æ¢°çã«æ¯èŒã§ããæ¹æ³ãèããå¿
èŠããããŸããã ãšèšã£ãŠããå
è¿°ã®éã IaC ã«è©²åœããä»çµã¿ã¯äœ¿çšã§ããªãã£ãã®ã§ã倧人ãã Python/Boto3 ã§ AppSync ã®èšå®ãäžèЧåã㊠S3 ã«åºåãããããªã³ãŒããæžãããšã«ããŸãããåŒç€Ÿ/ã客ããã® AWS ç°å¢ã§åºåãããã®ã diff æ¯èŒããããã«ããã°ãAWS ã¢ã«ãŠã³ã ID ãªã©å·®ç°ãçºçããé
ç®ã¯åºãã«ãããç»é¢ã®ç®èŠç¢ºèªããã¯å€§åãã·ã ãããªãšã ãªããé çªãååŸããŠããŸããŸãããçŸåšã¯ Amplify ã¹ããŒãæŽæ°æãªã©ã«ã©ãã倿Žãããã®ãïŒïŒã©ã®ãªãŸã«ã/颿°ãæåç§»è¡ããå¿
èŠãããã®ãïŒãæ€åºããããã«ã䜿çšããŠããŸããåçŽãª type ã®è¿œå çšåºŠãªãäœãç§»è¡ããã°è¯ãã®ãããçšåºŠçŽæçã«åãããšæãã®ã§ããã倿ŽïŒæŽæ°ïŒãšãã«ãªããšãªãŸã«ãå
ã®ã©ã®é¢æ°ãªããããã³ã°ãã³ãã¬ãŒãã倿Žããããåãããªãã§ãããããã ãšããããšã§å
容ã¯å€§ããããšãªãã®ã§ãããä»¥äž Lambda ã«ããå®è£
äŸã§ãã幞ã Boto3 ã«ãã®ãã®ãºããªãªã¡ãœãããæã£ãŠãããããããããé æ¬¡å®è¡ããçµæã S3 ã«åºåããŠããã ãã®ç°¡å仿§ã§ãããå°ãã ãè£è¶³ã§ãã get_introspection_schema() ãš list_types() ãè¿ãæ
å ±ã¯ã»ãŒå矩ã§ããïŒã¹ããŒãèšå®ã«ããå type ãå®çŸ©ãããã®ã§ïŒãäžå¿äž¡æ¹åºåããããã«ããŠããŸãã åè
㯠JSON ã§ã¯ãªã SDL ã§åºåããŠããã®ã§ãstreamingBody ã read() ãããã®ããã®ãŸãŸåºåããŠããŸãã list_resolvers() ã®åŒæ°ãšããŠããªãŸã«ããå®è£
ãã type åãæå®ããå¿
èŠããããŸããAmplify ã䜿çšããŠããããšããããgraphql ã®ã¯ãšãªèšèªã«å¯Ÿå¿ãããã®ããã®ãŸãŸçŽæå®ããŠããŸãã ãŸããåºåçµæã¯ãã©ã«ãããš Winmerge ãªã©ã® diff ããŒã«ã§æ¯èŒãããããªäœ¿ãæ¹ãããŠããŸãããfunctionID 絡ã¿ã§æ¯èŒã«æ¯éããã£ãéšåã«ã€ããŠã¯ä»¥äžã®ããã«å€æããœãŒãåŠçãå
¥ããŠããŸãã list_functions() ã®çµæãã©ããã functionId ã§ãœãŒããããŠè¿ã£ãŠãããããªã®ã§ãããID ã¯åœç¶ãªããç°å¢éã§ç°ãªããããã®ãŸãŸã ãšææãªæ¯èŒãã§ããŸããããã£ãŠã nameïŒé¢æ°åïŒã§ãœãŒããçŽãããã®ãåºåããŠããŸãã ãªãŸã«ãå
ã®é¢æ°å®è¡å®çŸ©ã functionId ã«ãã衚çŸãšãªã£ãŠãããããfunctionId ãã name ãå°åºã§ãããã㪠dict ãçšæã®äžãå®çŸ©å
容ã眮æããŠããŸãã ä»ã«ãããããã³ã°ãã³ãã¬ãŒãã types ã«ããã definition ã®åºåçµæãæŽåœ¢ãããªã©ãããã¡ãã£ãšé 匵ãã©ããã¯ãããããªãã§ããããããã®å
容ã§å·®åãçããŠããããŸã§æ¯èŒã«æ¯éãåºãªãããã ã£ãã®ã§ãäžæŠãã®ãŸãŸåºåããŠããŸã£ãŠããŸãã import json import datetime import boto3 import botocore BUCKET_NAME = '<BUCKET_NAME>' API_ID = '<APPSYNC_API_ID>' appsync = boto3.client('appsync') s3 = boto3.resource('s3') bucket = s3.Bucket(BUCKET_NAME) def put_json_to_S3(obj_key, json_data): obj = bucket.Object(obj_key) obj.put(Body = json.dumps(json_data, indent=4, sort_keys=True, separators=(',', ': '))) def lambda_handler(event, context): obj_key_prefix = f'appsync_setting_dumps/{datetime.datetime.now().strftime("%Y%m%d_%H%M%S")}' # æ
å ±ååŸïŒfunctionsïŒ response = appsync.list_functions( apiId=API_ID ) # functionã®ååã§ãœãŒã sorted_func_json = sorted(response['functions'], key=lambda x: x['name']) put_json_to_S3(f'{obj_key_prefix}/functions.json', sorted_func_json) # æ
å ±ååŸïŒresolversïŒ id_name_dict = {item['functionId']: item['name'] for item in sorted_func_json} for typename in ['Query', 'Mutation', 'Subscription']: response = appsync.list_resolvers( apiId=API_ID, typeName=typename ) # functionså®è¡å®çŸ©ãIDããååã«å€æ converted_resolvers_json = response['resolvers'] for item in converted_resolvers_json: pipeline_config = item["pipelineConfig"] if "functions" in pipeline_config: pipeline_config["functions"] = [id_name_dict[id] for id in pipeline_config["functions"]] put_json_to_S3(f'{obj_key_prefix}/resolvers_{typename}.json', converted_resolvers_json) # æ
å ±ååŸïŒtypesïŒ response = appsync.list_types( apiId=API_ID, format='JSON' ) put_json_to_S3(f'{obj_key_prefix}/types.json', response['types']) # æ
å ±ååŸïŒschemaïŒ response = appsync.get_introspection_schema( apiId=API_ID, format='SDL' ) obj = bucket.Object(f'{obj_key_prefix}/introspection_schema.json') obj.put(Body = response['schema'].read()) ãªãããã®æ¹åæ§ã§ AppSync ãªãœãŒã¹ã®äœæãæŽæ°ãèªååããã°ããããããšããã»ã«ãããã³ããæç«ããããªã®ã§ãããè»èŒªã®åçºææããã®ãããã£ãã®ã§ä»åã¯ãããŸããããã£ãšå¯Ÿè±¡ã®ãªãœãŒã¹æ°ãå€ãã£ãããããæ€èšãããããããŸããããããããã¯ã客ããã« Amplify ã®äœ¿çšèš±å¯ãè²°ãããã亀æžãé 匵ããšããAmplifyããããŠèªåã§ãªãŸã«ããå®è£
ããããã«ããæ¹ãè²ããªæå³ã§å¥å
šããªãšæããŸãããã äœè« Amplify ã®èªåçæã䟿å©ãšã¯ããæåç§»è¡ã«æéãããããããèªåã§ãªãŸã«ããæžãã°è¯ãããããªãã®ïŒãšçåãæãããæ¹ãããããšæãã®ã§ããããã®èãèªäœã¯æ£ãããšæããŸããäœæ
ããã§ã Amplify ãæ¡çšããã®ããšãããšãåçŽã«æéãå·¥æ°ãšã®å
Œãåãããã§ãããAppSync ãæ¬æ Œçã«æ±ãã®ãåããŠã ã£ããšããããšãããã®ã§ããããªãŸã«ãã®äœæãæªçµéšã®èšèªïŒVTL or AppSync JSïŒã§é 匵ãã®ã¯ã¡ãã£ãšçŸå®çã§ã¯ãªãã£ãã§ããç¹ã« VTL ã¯æ£çŽæ§æãšãèŠãŠãããŸã奜ãã«ãªããã»ã» ããŒã¿ãœãŒã¹ãå
šãŠ Lambda ã«ãªããããªã¢ããªã±ãŒã·ã§ã³ã§ããã°ãAppSync ããã㊠API Gateway + Lambda ãšããæ§æã§ãããã£ãã®ã§ããããã®å Žåã¯ã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšããDBãã©ã®ããã«çšæãããããšããã®ãããã¯ã§ããããªãã¹ããµãŒãã¬ã¹ã®ãµãŒãã¹ã§æ§æããããšãããšçµå±äžçªçãè¯ããããªã®ã¯ DynamoDB ã«ãªããŸããããããªã AppSync åã³ Amplify ãšçµã¿åãããŠäœ¿ã£ãæ¹ãçãè¯ãã®ã§ã¯ãªãããšãAurora Serverless ãéžæè¢ã§ã¯ãããŸãããããããã«ä»åã®çšéã ãšãªãŒããŒã¹ããã¯ã§ããããåŸã¯ãå¥ãšã³ããªã§èª¬æããéã AppSync ã® Subscription ãã¢ããªã±ãŒã·ã§ã³åŽã§æŽ»çšããããšã念é ã«çœ®ããŠãããšããèŠå ã倧ããã§ãã ãŸãšã æ¬æ¥ã§ããã°ãã®ãããªå¯Ÿå¿ãåããªãã«è¶ããããšã¯ãªãã®ã§ãããæåç§»è¡ããããšã«ãããªãŸã«ãã颿°ã®ä»çµã¿ãå®è£
ã«ã€ããŠçè§£ãæ·±ãŸã£ãããšã確ããªã®ã§ãããŒã¿ã«ã§ã¯è¯ãã£ãã®ãããããŸãããçŸåšãã¢ããªã±ãŒã·ã§ã³ã®éçºã¯ç¶ç¶ããŠãããã¡ããã¡ããåŒç€Ÿç°å¢ããã客ããç°å¢ã« AppSync æŽæ°åãç§»è¡ããæ©äŒã¯ããã®ã§ããããããã®åãçµã¿ã«ããç§»è¡èªäœã«ãããå·¥æ°ã¯å€§ååæžã§ããããã«ãªããŸããããã ãããå¥ã®æ¡ä»¶ã§åããããªå¯Ÿå¿ãè¿«ãããå Žåã¯ããã£ãšã©ã¯ãªããæ¹ãæ€èšããããšããã§ã¯ãããŸããã æ¬èšäºãã©ãªããã®åœ¹ã«ç«ãŠã°å¹žãã§ãã
äŒæ¥ãããã¯ãŒã¯ã«ãããã¯ã©ãŠããµãŒãã¹å©çšã®ãªã¹ã¯å¯ŸçãšããŠãCloud Access Security Broker(CASB)ã®å°å
¥ãå¢ããŠããŸãã CASBã¯ãå¯èŠå(Visibility)ããã¢ã»ã¹ã¡ã³ã(Assessment)ãã匷å¶(Enforcement)ããé²åŸ¡(Protection)ãã®4ã€ã®ããã»ã¹ã§èª¬æãããŸãããã®ãã¡ã匷å¶ãã§ã¯ãã¯ã©ãŠããµãŒãã¹ã®å©çšèš±å¯ã»æåŠçã®ã«ãŒã«ãèšå®ããããšãšãªããŸãããå
·äœçã«ã©ããã£ãã«ãŒã«ã«ããã¹ããããçžè«ãããã ãããšãå€ãã§ãã ããã§ãã®èšäºã§ã¯ã å®éã«èšå®ãããããšã®å€ãCASBã«ãŒã«ã®äŸãã玹ä»ããŸãã èšå®ã¯SASEãœãªã¥ãŒã·ã§ã³ã§ãããCatoã¯ã©ãŠããã®CASBæ©èœã«æ²¿ã£ãŠã玹ä»ããŸãããä»ã®CASB補åã«ãããŠãã«ãŒã«æ€èšã®ãåèã«ããŠããã ããŸããã幞ãã§ãã ãªããCatoã¯ã©ãŠãã®CASBæ©èœã«ã€ããŠã¯ã以äžã®èšäºããåç
§ãã ããã Catoã¯ã©ãŠãã®CASBã«ã€ã㊠Catoã¯ã©ãŠãã®ã»ãã¥ãªãã£ãªãã·ã§ã³ CASB ã«ã€ããŠè§£èª¬ããŸãã blog.usize-tech.com 2023.09.12 Catoã¯ã©ãŠãã§ã¢ããªã±ãŒã·ã§ã³ãå¶åŸ¡ããã«ã¯ CASBæ©èœã®Application Controlã®èšå®æ¹æ³ãå®éã«ã©ã®ãããªå¶éãã§ããã®ãã«ã€ããŠè§£èª¬ããŠãããããšæããŸãã blog.usize-tech.com 2023.11.02 CASBã§ã¯ã©ããªå¶åŸ¡ãã§ãã? CASBã§ã®å¶åŸ¡ã¯ã次äžä»£ãã¡ã€ã¢ãŠã©ãŒã«(L7FWãNGFW)ã§ã®ã¢ã¯ã»ã¹å¶åŸ¡ãšã¯å°ãéããŸãã æ¬¡äžä»£ãã¡ã€ã¢ãŠã©ãŒã«ã§ã®å¶åŸ¡ ã¢ããªã±ãŒã·ã§ã³èå¥ãããŠããã®ã¢ããªã±ãŒã·ã§ã³ãžã®éä¿¡ãèš±å¯ã»æåŠããããšãã§ããã äŸ) X(æ§Twitter)ãžã®ã¢ã¯ã»ã¹ãæåŠãããé²èЧãæçš¿ãã§ããªãã CASBã§ã®å¶åŸ¡ ã¢ããªã±ãŒã·ã§ã³èå¥ãããŠããã®ã¢ããªã±ãŒã·ã§ã³ã® ç¹å®ã® æäœãæå®ããŠèš±å¯ã»æåŠ ããããšãã§ããã äŸ) X(æ§Twitter)ã®é²èЧã¯èš±å¯ããããæçš¿ã®ã¿çŠæ¢ããããšãã§ããã ãã®ãããªéãããããããCASBã®ã«ãŒã«äœæã«ãããŠã¯ãèš±å¯ã»æåŠããã¢ããªã±ãŒã·ã§ã³ã«å ãã©ã®æäœãèš±å¯ã»æåŠããããæ€èšããå¿
èŠããã£ãŠãæ€èšãé£ããæããããã®ã§ã¯ãªãããšæããŸãã ãªããCatoã¯ã©ãŠãã«ãããŠã¯ãCASBã¯ãªãã·ã§ã³æ©èœãšãªã£ãŠããŸããCASBãªãã·ã§ã³ã远å ããããšã§ãã¯ã©ãŠããµãŒãã¹ã«å¯Ÿããæäœãªã©ãè©³çŽ°ãªæ
å ±ãååŸã§ããããã«ãªããŸãã CASBã§ã®ããããå¶åŸ¡ã«ãŒã«äŸ ã§ã¯ãCASBãå°å
¥ãããŠããäŒæ¥ã§ã¯ã©ã®ãããªå¶åŸ¡ããããŠããã®ã§ãããããSCSKã§å®éã«ãçžè«ãåããããèšå®ããæ¡å
ããäžã§å€ãäŸãã玹ä»ããŸãã ã¯ã©ãŠããµãŒãã¹ã§ã®å人ã¢ã«ãŠã³ãå©çšã®å¶é äŒç€Ÿã§å©çšããã¯ã©ãŠããµãŒãã¹ãå
·äœçã«ã¯Microsoftã®M365ãGoogle Workspaceã«ã€ããŠã äŒç€Ÿã®ã¡ãŒã«ã¢ãã¬ã¹ã§ã®ãã°ã€ã³ãèš±å¯ãããããã®ä»ã®ã¡ãŒã«ã¢ãã¬ã¹ã§ã®ãã°ã€ã³ãæåŠãã ãšããèšå®ã§ãã ãã®èšå®ã«ãããäŒç€Ÿã®ç«¯æ«ããå人ã®GoogleDriveã«æ¥åæ
å ±ãã¢ããããŒããããšãã£ãæäœãææ¢ã§ããŸãã ãŸããåæ§ã«ChatGPTãžã®ç€Ÿå
æ
å ±ã®ã¢ããããŒããææ¢ããç®çã§ãOpenAIãžã®ãã°ã€ã³ãå¶åŸ¡ããŠãããå©çšäŸããããŸãã Catoã¯ã©ãŠãã§ã®èšå®äŸ 以äžã¯ãCatoã¯ã©ãŠãã®CASBæ©èœã§ããApplication Controlã§ã®èšå®äŸã§ããããããäžã®è¡ã§äŒç€Ÿã¢ãã¬ã¹ã§ã®ãã°ã€ã³ãèš±å¯ããäžã®è¡ã§ãã®ä»ã®ãã¹ãŠã®ãã°ã€ã³ãæåŠããèšå®ã§ãã ãªããCatoã¯ã©ãŠãã§ã¯ãã®ä»ã«Tenant Restriction(æ§åç§°:Header Injection)æ©èœãå©çšããç¹å®ã®ãµãŒãã¹ãžã®éä¿¡æã«HTTPããããæ¿å
¥ããããšãå¯èœã§ããããã«ãããã¯ã©ãŠããµãŒãã¹åŽã§ãã¢ã¯ã»ã¹å¯èœãªã¢ã«ãŠã³ããããã³ããå¶éãããªã©ã®åäœãå¯èœã§ãã詳现ã¯äžèšèšäºããåç
§ãã ããã Catoã§ãããMicrosoft 365ãã®ããã³ãå¶åŸ¡ïœãHeader Injectionãæ©èœã®ç޹ä»ïœ Catoã®ãHeader Injectionãæ©èœã䜿ã£ãŠãMicrosoft365ãã®ããã³ãå¶åŸ¡ã宿œããæ¹æ³ã玹ä»ããŸãã blog.usize-tech.com 2024.07.12 ãã¡ã€ã«å
±æãµãŒãã¹ãžã®ã¢ããããŒãã®å¶é Dropboxãboxãªã©ãšãã£ãã ãã¡ã€ã«å
±æãµãŒãã¹ããªã³ã©ã€ã³ã¹ãã¬ãŒãžã«å¯Ÿããã¢ããããŒãã®ã¿ãæåŠãã èšå®ã§ãã ãããã®ãµãŒãã¹ã¯ãååŒå
çããã®ãã¡ã€ã«éä»ã«å©çšãããããšããããããã¢ã¯ã»ã¹èªäœãæåŠããŠããŸããšãããšãã«æ¯éãåºãŠããŸããŸãããã®ããã以äžã®ãããªã«ãŒã«ã«ãããå Žåãå€ãã§ãã èªç€Ÿã§å¥çŽããŠãããã¡ã€ã«å
±æãµãŒãã¹ã¯å
šã¢ã¯ã·ã§ã³ãèš±å¯ ãã以å€ã®ãã¡ã€ã«å
±æã»ãªã³ã©ã€ã³ã¹ãã¬ãŒãžã¯ãã¢ããããŒãã®ã¿ãæåŠ (é²èЧã»ããŠã³ããŒãã¯å¯èœ) Catoã¯ã©ãŠãã§ã®èšå®äŸ Custom Categoriesã«ãŠãã¢ããããŒãæåŠå¯Ÿè±¡ãšããã«ããŽãªãäœæãã Application Controlã«ãŠãDropboxã®ã¿å
šã¢ã¯ã·ã§ã³ãèš±å¯ããã®ä»Custom Categoriesã«å¯ŸããUploadã®ã¿ãæåŠãšããŸãã â»2025幎1æçŸåšã®ä»æ§ã§ãApplication Categoriesã«å¯ŸããŠã¯Activitiesãæå®ã§ããªããããCustom CategoriesãäœæããŠããŸãã SNSæçš¿ã®å¶é XãInstagramçã® SNSã«å¯Ÿããæçš¿ã®ã¿ãæåŠãã èšå®ã§ãã æ
å ±åéã®ããé²èЧã¯èš±å¯ããããããªã¹ã¯ç®¡çäžã瀟å
ããã®æçš¿ã¯ã§ããªãããã«ããããšããå Žåã«æå¹ã§ãã Catoã¯ã©ãŠãã§ã®èšå®äŸ äŸãšããŠãåºå ±æ
åœã®ã¿ã¯æçš¿å«ããã¹ãŠã®æäœãèš±å¯ãããã®ä»ãŠãŒã¶ã¯æçš¿ãæåŠããèšå®ã§ãã ãªã¹ã¯ãé«ãã¯ã©ãŠããµãŒãã¹ã®å©çšå¶é äžã®äžã«ã¯ã¯ã©ãŠããµãŒãã¹ãç¡æ°ã«ãããå©çšè
ããã®äžã€äžã€ã®å®å
šæ§ã倿ããããã«ãŒã«ãèšå®ããã®ã¯çŸå®çã«äžå¯èœã§ãã ãã®åé¡ãžã®è§£æ±ºçãšããŠãåCASBã§ã¯ã¯ã©ãŠããµãŒãã¹ã«å¯Ÿãç¬èªã®ãªã¹ã¯å€å®ãè¡ã£ãŠããããã®ãªã¹ã¯å€å®ãããšã«ãå©çšè
ãã«ãŒã«ãèšå®ããããšãå¯èœã§ãã Catoã¯ã©ãŠãã§ã®èšå®äŸ Catoã¯ã©ãŠãã§ã¯ãã¯ã©ãŠããµãŒãã¹ã®èªå®ååŸãã»ãã¥ãªãã£å¯Ÿçç¶æ³ãããšã«ã1(äœ)ïœ10(é«)ã®ãªã¹ã¯ã¹ã³ã¢ãã€ããŠããŸããäŸãšããŠãGmailã®ãªã¹ã¯ã¹ã³ã¢ã¯ã4ãã§ã(2025幎1ææç¹)ã ãã®ãªã¹ã¯ã¹ã³ã¢ãå
ã«ã ã¹ã³ã¢8以äžã®ã¯ã©ãŠããµãŒãã¹ã¯ã¢ã¯ã»ã¹ãæåŠãã ãªã©ã®èšå®ãè¡ãããšã§ãã»ãã¥ãªãã£ãªã¹ã¯ãé«ããšå€å®ããããµãŒãã¹ã®å©çšãå¶éããããšãã§ããŸãã ãã¹ãŠã®ã¯ã©ãŠããµãŒãã¹ãžã®ã¢ããããŒãããã°ã«èšé² ã¯ã©ãŠããµãŒãã¹ããšã®CASBã«ãŒã«ãèšå®ããäžã§ããã®ä»ãã¹ãŠã®ã¯ã©ãŠããµãŒãã¹ã«å¯Ÿãã ãã¡ã€ã«ã®ã¢ããããŒãåäœããã°ã«æ®ãèšå® ã§ãã äžãäžæ
å ±ã®æã¡åºãçããã£ãå Žåã«ããã°ãã远ããããã«ããããšããç®çã§ãã Catoã¯ã©ãŠãã§ã®èšå®äŸ ãã¹ãŠã®ã¯ã©ãŠããµãŒãã¹ãžã®Uploadããèš±å¯ã¯ããããEvent(ãã°)ã«æ®ããšããå
容ã§ãã è£è¶³ Catoã¯ã©ãŠãã®CASBæ©èœã§ã¯ãã«ãŒã«ãå
šäœã«ãããã ãã§ãªãããŠãŒã¶ãã°ã«ãŒããæå®ããŠèšå®ããããšãã§ããã®ã§ãäŸãã°å人æ
å ±ãæ±ãéšçœ²ã«ã¯ããå³ããã«ãŒã«ãé©çšããããç¹å®ã®ãŠãŒã¶ã¯ã«ãŒã«ã®å¯Ÿè±¡å€ã«ããããšãã£ãã现ããªèšå®ãå¯èœã§ãã ãŸããèšå®äŸã®äžã«ãããããã«ãæå®ã®åäœã«ã€ããŠãæåŠã§ã¯ãªããèš±å¯ããããã°ã«æ®ãããèš±å¯ããã管çè
ã«ã¡ãŒã«éç¥ããããšãã£ãæå®ãå¯èœã§ãã æåŠã«ãŒã«ãæ¥ã«èšå®ãããšæ¥åã«æ¯éãåºãå Žåãããããšããã ãŸãã¯ããã°ã«æ®ããèšå®ã§ã«ãŒã«é©çšãããã®åŸãã°ç¶æ³ãèŠãŠæåŠã«å€ããŠããéçšããããã ã§ãã æåŸã« æ¬èšäºã§ã¯ãå®éã«CASBã§èšå®ãããããšã®å€ãã«ãŒã«ãã玹ä»ããŸãããCASBå°å
¥æã®ã«ãŒã«æ€èšã«ã掻çšããã ããŸããšå¹žãã§ãã èªç€Ÿç°å¢ã«åã£ãCASBå¶åŸ¡ãè¡ãã«ã¯ãã¯ã©ãŠããµãŒãã¹ã®å®éã®å©çšç¶æ³ã宿çã«ç¢ºèªããèªç€Ÿã®ããªã·ãŒãšç
§ããåãããŠã«ãŒã«ããã©ãã·ã¥ã¢ããããŠããå¿
èŠããããŸãããå¯èŠå(Visibility)ããã¢ã»ã¹ã¡ã³ã(Assessment)ãã匷å¶(Enforcement)ããé²åŸ¡(Protection)ãã®ãµã€ã¯ã«ã®éçšã§ãã SCSKã§ã¯ãéçšçµéšè±ããªãšã³ãžãã¢ã倿°åšç±ããŠãããã客æ§ã«ãããããæ¯æŽãå¯èœã§ãããå°ãããšãªã©ããããŸãããããã²ãçžè«ãã ããã
Amazon Athena ãš AWS Glue ã䜿çšããŠãAmazon S3 äžã«ãã CSV ããŒã¿ã«å¯ŸããŠã¯ãšãªãå®è¡ããŠã¿ãã®ã§ããã®æé ããŸãšããŸãã AWS Glue 㚠㯠AWS Glueã¯ãAmazon Web ServicesãæäŸãããã«ãããŒãžãã®ETLïŒæœåºã倿ãããŒãïŒãµãŒãã¹ã§ãããã®ãµãŒãã¹ã¯ã倧éã®ããŒã¿ãå¹ççã«æºåãã倿ããç°ãªãããŒã¿ã¹ãã¢éã§ç§»åãããããšãç®çãšããŠããŸãã Glueãå©çšããã«ããããç»å Žããçšèªã«ã€ããŠç°¡åã«èª¬æããŸãã ETLïŒExtract, Transform, LoadïŒ: ããŒã¿ãæœåºïŒExtractïŒãã倿ïŒTransformïŒããããŒãïŒLoadïŒããããã»ã¹ãæããŸããAWS Glueã¯ãã®ETLããã»ã¹ãèªååããã³ç°¡çŽ åããããã®ãµãŒãã¹ã§ãã AWS Glue Data Catalog: AWS Glue Data Catalogã¯ãã¡ã¿ããŒã¿ã管çããããã®äžå¿çãªãµãŒãã¹ã§ããããŒã¿ã¹ãã¢ã®ã¹ããŒãæ
å ±ãããŒã¿ã®å Žæããã®ä»ã®ã¡ã¿ããŒã¿ãä¿æããããŒã¿ã®æŽçãšç®¡çããµããŒãããŸãã AWS Glue ããŒã¿ããŒã¹: AWS GlueããŒã¿ããŒã¹ã¯ãData Catalogå
ã§ããŒãã«ãã°ã«ãŒãåããããã®è«ççãªã³ã³ããã§ããããŒã¿ããŒã¹ã¯ã¹ããŒããå«ãã§ãããããŒã¿ã®æŽçãšã¹ããŒãã®äžè²«æ§ãä¿ã€ããã«äœ¿çšãããŸãã AWS Glue ããŒãã«: AWS GlueããŒãã«ã¯ãããŒã¿ãšãã®æ§é ã«é¢ããã¡ã¿ããŒã¿ã衚ããŸããéåžžã¯ç¹å®ã®ããŒã¿ã»ããã®ã¹ããŒãæ
å ±ãå«ã¿ãããŒã¿ããªãã³ãªã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšãããŸãã ã¯ããŒã©ãŒ: ã¯ããŒã©ãŒã¯ãèªåçã«ããŒã¿ãœãŒã¹ãæ¢çŽ¢ããããŒã¿ã«ã¿ãã°ã«ã¡ã¿ããŒã¿ãç»é²ããããã®ã³ã³ããŒãã³ãã§ããã¯ããŒã©ãŒã¯ããŒã¿ã®æ§é ãè§£æããããŒãã«å®çŸ©ãçæãŸãã¯æŽæ°ããŸãã AWS Glue ãžã§ã: AWS Glueãžã§ãã¯ãETLïŒæœåºã倿ãããŒãïŒããã»ã¹ãå®è¡ããããã®åºæ¬åäœã§ãããžã§ããäœæããŠãããŒã¿ã倿ããå¿
èŠãªåºåå
ã«ããŒãããããšãã§ããŸãã AWS Glue æ¥ç¶: AWS Glueæ¥ç¶ã¯ãGlueãããŒã¿ã¹ãã¢ã«ã¢ã¯ã»ã¹ããéã®æ¥ç¶æ
å ±ãä¿åããŸãããã¹ãåãããŒãçªå·ãèªèšŒæ
å ±ãªã©ãå«ãŸããããŒã¿ã¢ã¯ã»ã¹ãå®å
šãã€å¹ççã«è¡ããŸãã Amazon Athena ãšã¯ Amazon Athenaã¯ãAmazon Web ServicesïŒAWSïŒãæäŸãããµãŒããŒã¬ã¹ã®ã€ã³ã¿ã©ã¯ãã£ãã¯ãšãªãµãŒãã¹ã§ããAthenaã䜿çšãããšãAmazon S3ã«ä¿åãããŠããããŒã¿ã«å¯ŸããŠçŽæ¥SQLã¯ãšãªãå®è¡ããè€éãªETLããã»ã¹ãå¿
èŠãšããã«ããŒã¿ãåæã§ããŸãã Amazon Athenaã«ã¯ã以äžã®ç¹åŸŽããããŸããïŒ ãµãŒããŒã¬ã¹: Athenaã¯å®å
šã«ãµãŒããŒã¬ã¹ã§ãããããã€ã³ãã©ã¹ãã©ã¯ãã£ã®ç®¡çãäžèŠã§ãããŠãŒã¶ãŒã¯ã¯ãšãªã®å®è¡ã«å¯ŸããŠã®ã¿æéãæ¯æããŸãã SQLãµããŒã: Athenaã¯æšæºSQLã䜿çšããŠã¯ãšãªãèšè¿°ã§ãããããSQLã«ç²ŸéãããŠãŒã¶ãŒãç°¡åã«å©çšã§ããŸãã ããŒã¿ãœãŒã¹ã®ãµããŒã: äž»ã«Amazon S3ã«ä¿åãããããŒã¿ã«å¯ŸããŠã¯ãšãªãå®è¡ããŸãããAthenaãä»ã®ããŒã¿ãœãŒã¹ã«æ¥ç¶ããããšãå¯èœã§ãã 䜿ãããã: ããŒããã¯ã©ã¹ã¿ã®ç®¡çãäžèŠã§ãã¯ãšãªãæžãã ãã§ããŒã¿åæãå§ããããŸãã çµ±åæ©èœ: Amazon QuickSightãªã©ã®ä»ã®AWSãµãŒãã¹ãšçµ±åãããããããã·ã¥ããŒããéããããžã¥ã¢ã«åæãå¯èœã§ãã ããŒã¿åœ¢åŒã®ãµããŒã: Athenaã¯CSVãJSONãORCãAvroãParquetãªã©ãããŸããŸãªããŒã¿åœ¢åŒã«å¯Ÿå¿ããŠããŸãã ãããã®ç¹åŸŽã«ãããAmazon Athenaã¯ããŒã¿ã¢ããªã¹ããããŒã¿ãµã€ãšã³ãã£ã¹ãã«ãšã£ãŠãã¹ããŒãã£ãŒã§å¹æçãªããŒã¿åæããŒã«ãšãªã£ãŠããŸãã ãã£ãŠã¿ã AWS Glue 1.ããŒã¿ããŒã¹ã®äœæ ãŸãã¯ã¯ããŒã©ã®åºåå
ãšãªãããŒã¿ããŒã¹ãäœæããŸãã ããã§ã¯ååã®ã¿æå®ããŸããã 2.ã¯ããŒã©ãŒã®äœæ ã¯ããŒã©ãŒã®ååãå
¥åããŸãã ãAdd a data sourceãããããŒã¿ãœãŒã¹ãæå®ããŸãã ä»åã¯S3ã®ããŒã¿ãå©çšãããã®ã§ãããŒã¿ãé
眮ããS3ã®ãã¹ãæå®ããŸãã ãŸãããSubsequent crawler runsãã§ã¯ãã¯ããŒã©ãŒã®åå®è¡æã«ã©ã®ãã©ã«ããã¯ããŒã«ããããéžæã§ããŸãã ä»åã¯ãå
šãŠåã¯ããŒã«ãããCrawl all foldersããéžæããŸããã ããŒã¿ãœãŒã¹ãæå®ã§ããããNextããžé²ã¿ãŸãã IAMããŒã«ãéžæããŸãã ä»åã¯ãAWSGlueServiceRoleãããã³ãœãŒã¹ããŒã¿ãé
眮ããS3ãžã®ã¢ã¯ã»ã¹æš©éãä»äžããŸããã ã¯ããŒã©ã®åºåå
ãæå®ããŸãã ã1.ããŒã¿ããŒã¹ã®äœæãã§äºåã«äœæããããŒã¿ããŒã¹ãæå®ããŸãã èšå®ã«åé¡ããªããã°ãCreate crawlerããã¯ãªãã¯ããŸãã 以äžã§ã¯ããŒã©ã®äœæã¯å®äºã§ãïŒ 3.ã¯ããŒã©ã®å®è¡ æ©éã¯ããŒã©ãå®è¡ããŠã¿ãŸãã äœæããã¯ããŒã©ã®è©³çްç»é¢ãããRun crawlerãã¯ãªãã¯ããŸãã åºåå
ã«èšå®ããããŒã¿ããŒã¹ã確èªãããšãã¯ããŒã©ã«ããS3äžã®ããŒã¿ãèªåã§èªã¿åãããæ§é åãããã€ã³ããã¯ã¹ãã«ã¿ãã°(Glue Data Catalog)ãšããŠä¿åãããŠããŸãã Amazon Athena ã¯ãšãªã®å®è¡ Athenaã§ã¯ãšãªãå®è¡ããŠã¿ãŸãã Athenaã§ã®ã¯ãšãªå®è¡æã«ãããŒã¿ããŒã¹ã«Glue Data Catalogã®ããŒã¿ããŒã¹ãæå®ããããšã§ãããŒã¿ããŒã¹å
ã®ããŒãã«ãããŒãã«å
ã®é
ç®åã䜿ãããšãã§ããŸãã ããŒã¿ãœãŒã¹æ¬ã§ãAWSDataCatalogããæå®ãããšãããŒã¿ããŒã¹æ¬ããGlueã§äœæããããŒã¿ã«ã¿ãã°å
ã®ããŒã¿ããŒã¹ãéžæã§ããŸãã ã¯ãšãªãå®è¡ããŠã¿ãŸããã selectæãå®è¡ããŠãããŒãã«å
ã®é
ç®ãæœåºããããšãã§ããŸããïŒ ãããã« S3ã®ããŒã¿ãGlueã§ããŒã¿ããŒã¹ã«æ ŒçŽããŠãAthena ã§å¿
èŠãªããŒã¿ãååŸãããŸã§ã®æé ããŸãšããŸãããGlueãå©çšããããšã§ç°¡åã«S3äžã®ããŒã¿ãæ§é åãã容æã«å¿
èŠãªå€ãååŸããããšãã§ããŸããã æ¬¡åã¯Athenaã®ããŒã¿ãQuickSightã«é£æºããå¯èŠåããŠã¿ãããšæããŸãã
ããã«ã¡ã¯ãã²ãããã¬ã§ãã æ¬å¹Žããããããé¡ãããããŸããä»å¹Žã¯å·³å¹Žã§ããã å°ããé ã«ãåäºæ¯ã¯ç¥æ§ã®å·ä»€ã®äžãç«¶äºããŠæ©ãé ã«æ±ºãŸã£ãããšèšãããèšæ¶ãããã®ã§ãããå®éã«æ¬åœã«æ©ãé ã«åäºæ¯ã䞊ã¹ããšã©ã®ããã«ãªãã®ãããµãšæ°ã«ãªã£ãŠããŸããŸããã 調ã¹ããšããããã§ã«ãã®çåã«å¯ŸããŠèª¿æ»ãããŠãã ãã£ãŠããèšäºããããŸããã®ã§äžéšãæç²ããŠã玹ä»ããŸãã æ¬ããããã«é床ãåºãŠãããã®ã¯ããããæ¡çšãããã以å€ã®ãã®ã¯ãçè
ã®çµéšãã®ä»ãã匷åŒã«ç®åºãããªã©ããçµæã13å¹ã®åç©ãã¡ã®é床ã¯ä»¥äžã®ããã«ãªã£ãã åïŒéŒ ïŒæé10km äžïŒçïŒæé4kmïŒæ³š1ïŒ å¯
ïŒèïŒæé64km å¯ïŒå
ïŒæé72km 蟰ïŒç«ïŒæé360km以äžïŒæ³š2ïŒ å·³ïŒèïŒæé16kmïŒæ³š3ïŒ åïŒéŠ¬ïŒæé68kmïŒæ³š4ïŒ æªïŒçŸïŒæé13kmïŒæ³š5ïŒ ç³ïŒç¿ïŒæé30kmïŒæ³š6ïŒ é
ïŒé¶ïŒæé18kmïŒæ³š7ïŒ æïŒç¬ïŒæé36kmïŒæ³š8ïŒ äº¥ïŒçªïŒæé45km ç«ïŒæé48kmïŒæ³š9ïŒ åŒçšïŒYahoo! ãã¥ãŒã¹ã ãåäºæ¯ãã®é çªããããã¯ã§ããªããå®éã®åç©ã®ã¹ããŒããèãããšãã©ããªé çªã«ãªããïŒ ã äžèšããã什åçã®åäºæ¯ã¯ã蟰å¯åå¯
ç«äº¥æç³é
å·³æªåããšãªãããã§ãããç«ãå§åã®ããã§ãã æŠç¥ãç·Žã£ãŠäºäœã«æŒãçããŠããçã¯ãã¹ã¿ã¡ã³ããå€ããŠããŸããŸããã ãŸãããããå
ã«èãããšãä»å¹Žã¯äº¥å¹Žãšããããšã«ãªããŸããã âŠããŠãä»åã¯IaCãšãããã®ãå°ã䜿ãããªããããã«ãªã£ãŠèª¿åã«ä¹ã£ãŠããçµæã倧ããªèœãšã穎ã«ã¯ãŸã£ãŠããŸã£ãã®ã§ãèªæã®æå³ã蟌ããŠã玹ä»ããããŸãã ããããããš ãšãããã°ãEventBridgeãçµç±ããŠCloudWatch Logsã«éããïŒãšãããããããã®ã§ãã ãã£ãããªã®ã§ãããžã¡ã³ãã³ã³ãœãŒã«ããã§ã¯ãªããIaCïŒCloudFormationïŒã䜿çšããŠæ§ç¯ãããïŒãšããããšã«ãªããŸããã ãã£ãããš ãããžã¡ã³ãã³ã³ãœãŒã«ã§ã¯EventBridgeã®ã«ãŒã«äœæãšCloudWatch Logsã®ãã°ã°ã«ãŒãäœæã®ã¿ã§å®æœã§ããã®ã§ãåãããã«CloudFormationãæžããŠã¿ãŸãããä»åã¯æ€èšŒã®ãããEC2ã«é¢ããä»»æã®ã€ãã³ããCloudWatch Logsã®ãã°ã°ã«ãŒããžè»¢éããããšã«ããŸãã AWSTemplateFormatVersion: '2010-09-09' Resources: RuleEC2Activity: Type: AWS::Events::Rule Properties: EventPattern: { "source": ["aws.ec2"] } Targets: - Arn: !GetAtt LogEC2Activity.Arn Id: LogGroup LogEC2Activity: Type: AWS::Logs::LogGroup Properties: RetentionInDays: 14 LogGroupName: /aws/events/EC2Activity äžèšã®ãã¡ã€ã«ã®ãããã€ã¯åé¡ãªãå®äºããŸããã èµ·ããããš ãã°ãžè»¢éãããããã確èªããããã«ãEC2ã€ã³ã¹ã¿ã³ã¹ãç«ã¡äžããŸãããããããåŸ
ãŠã©æ®ããã©ãã°ã¯åºåãããŸããã ãããããªâŠãšæããEventBridgeã®åœè©²ã«ãŒã«ã®ã¢ãã¿ãªã³ã°ããã§ãã¯ããããšã«ããŸããããããšâŠ EventBridgeã®ã«ãŒã«èªäœã¯åããŠããã®ã§ããããã®ãã¹ãŠã®å®è¡ã倱æïŒFailedInvocationsã«èšé²ïŒããŠããã®ã§ãã åå èª¿æ» ãããªãšãã«åœ¹ã«ç«ã€ã®ã¯ãã€ã³ã¿ãŒãããã«åºããç¥èã®æµ·ã§ãã調æ»ããŠã¿ããšãããå
¬åŒããã¥ã¡ã³ãã«æ°ã«ãªãèšèŒããããŸããã CloudWatch Logs ãã«ãŒã«ã®ã¿ãŒã²ããã§ããå ŽåãEventBridge ããã°ã¹ããªãŒã ãäœæããCloudWatch Logs ããã°ãšã³ããªãšããŠã€ãã³ãããããã¹ããä¿åããŸããEventBridge ããã°ã¹ããªãŒã ãäœæããŠã€ãã³ããèšé²ããããã«ã¯ãEventBridge ã CloudWatch Logs ã«æžã蟌ãããšãå¯èœã«ãããªãœãŒã¹ããŒã¹ããªã·ãŒã CloudWatch Logs ã«å«ããå¿
èŠããããŸãã AWS Management Console ã䜿çšããŠãCloudWatch Logs ãã«ãŒã«ã®ã¿ãŒã²ãããšããŠè¿œå ããå ŽåããªãœãŒã¹ããŒã¹ã®ããªã·ãŒã¯èªåçã«äœæãããŸããAWS CLI ã䜿çšããŠã¿ãŒã²ããã远å ããããªã·ãŒããŸã ååšããªãå Žåã¯ãäœæããå¿
èŠããããŸãã åŒçšïŒAWSã Amazon EventBridge ãŠãŒã¶ãŒã¬ã€ãïŒAmazon EventBridge ã®ãªãœãŒã¹ããŒã¹ã®ããªã·ãŒã䜿çšãã ã ä»ãŸã§ã®ç§ã¯åè
ïŒãããžã¡ã³ãã³ã³ãœãŒã«ã§ã®æäœïŒããè¡ã£ãããšããªãã£ãã®ã§æ°ã¥ããªãã£ãã®ã§ãããå®ã¯ãªãœãŒã¹ããŒã¹ããªã·ãŒã®èšå®ãå¿
èŠãªããã§ãããèšãããŠã¿ãã°ãæš©éãèšå®ããŠããªãã®ã«æžã蟌ããã®ã¯äžæè°ã§ããããããã 解決ã«åããŠâŠ ãªãœãŒã¹ããŒã¹ããªã·ãŒãIaCã«ãŠèšå® åŸè¿°ããåèèšäºã«ãããšãCloudFormationã§ãªãœãŒã¹ããŒã¹ããªã·ãŒãèšå®ã§ãããããªã®ã§ããŸãã¯ãã¡ãã詊ããŠã¿ãŸãã äžèšã®ãã³ãã¬ãŒããã¡ã€ã«ãäœæããæ°èŠã§ã¹ã¿ãã¯ãäœæããŠãããã€ããŸãã PolicyDocumentå
ã®ã¢ã«ãŠã³ãIDããã°ã°ã«ãŒãåãªã©ã¯é©å®ä¿®æ£ããŠãã ããã AWSTemplateFormatVersion: '2010-09-09' Resources: EventBridgeToCWLPolicy: Type: AWS::Logs::ResourcePolicy Properties: PolicyDocument: "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"TrustEventsToStoreLogEvent\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":[\"delivery.logs.amazonaws.com\",\"events.amazonaws.com\"]},\"Action\":[\"logs:CreateLogStream\",\"logs:PutLogEvents\"],\"Resource\":\"arn:aws:logs:ap-northeast-1:123456789012:log-group:/aws/events/*:*\"}]}" PolicyName: TrustEventsToStoreLogEvents ããã«ãããæ£åžžã«ãã°ã転éãããŸããïŒ ãŸãããã®ã¹ã¿ãã¯ãåé€ããããšã«ããããªã·ãŒããªããªãããã°è»¢éãã§ããªããªãç¹ã確èªã§ããŸããã ãªãœãŒã¹ããŒã¹ããªã·ãŒããããžã¡ã³ãã³ã³ãœãŒã«ã«ãŠèšå® ã§ã¯ããããžã¡ã³ãã³ã³ãœãŒã«ã§ã«ãŒã«ãäœæããå Žåã¯ã©ããªãã®ã§ããããã ãªãœãŒã¹ããŒã¹ããªã·ãŒãè£ã§èšå®ãããŠãããšã®ããšã ã£ãã®ã§ããã®æåãäžå¿ã«ç¢ºèªããŠã¿ãŸãã ã«ãŒã«ãäœæããåŸã«CloudShellã«ãŠãªãœãŒã¹ããŒã¹ããªã·ãŒã®æç¡ã確èªããŠã¿ããšâŠ å
ã»ã©IaCã«ãŠèšå®ããããªã·ãŒãšåæ§ã®ãã®ãä»äžãããŠããŸããã ç¥ããªããšããã§åãããããã«ããŠãããŠããã®ã§ããã âŠããã§æ°ã«ãªã£ãç¹ããããŸããã ããã®ãããžã¡ã³ãã³ã³ãœãŒã«ã§äœã£ãã«ãŒã«ãæ¶ããããªãœãŒã¹ããŒã¹ããªã·ãŒã¯ã©ããªã£ã¡ããã®åé¡ãã§ãã å®éã«ãã£ãŠã¿ãä»ãããŸãããïŒãã£ãŠã¿ãŸããã âŠæ®ã£ãŠããŸããããã®ããã ãããžã¡ã³ãã³ã³ãœãŒã«ããEventBridgeã®ã«ãŒã«ãäžåºŠã§ãäœæããŠããå Žåããã®ããã°ã®ãããªçç¶ã«ã¯åºäŒããªãå¯èœæ§ããã ãšããããšã§ããã ãããã« æ¹ããŠãAWSã®æš©éã«å¯Ÿããèãæ¹ãçæããè¯ããã£ãããšãªããŸããã äœäºã«ãèš±å¯ãããâŠçŸå®ã§ãã¯ã©ãŠãäžã§ããããªèªèã§ããã®ã倧äºãªã®ããªãšæããŸãã ãŸããä»åã®èšäºã¯ä»¥äžãåèã«äœæããããŸãããWebäžã®çããŸã®èšäºã«ã¯ãã€ãå©ããããŠã°ããã§ããã CloudWatch Logsãã¿ãŒã²ãããšããEventBridgeã«ãŒã«ãCloudFormationã§äœæããã«ã¯ | DevelopersIO dev.classmethod.jp äžèšãµã€ãã«ãèšèŒããããŸãããããã®ãªãœãŒã¹ããŒã¹ããªã·ãŒã¯ãããžã¡ã³ãã³ã³ãœãŒã«äžãã確èªããããšãã§ããªãããã§ããïŒCLIãçšããŠç¢ºèªããïŒ ããŸãéèŠã¯ãªããããããŸãããããããæ°è»œã«ç¢ºèªã§ããããã«ãªããšããè¯ãã®ããªâŠãšæã£ã次第ã§ãã äœè«ã§ãããåäºæ¯ã®æè©±ã¯YouTubeã§ã芳ããã®ã§ããã
ã¿ãªãããAmazon Redshift Serverlessã䜿ã£ãããšã¯ãããŸããïŒ ããããžã§ã³ãã¿ã€ããšç°ãªãããµãŒãã¬ã¹ã®åŒ·ã¿ãçãããé«å¯çšæ§ãé«ã¹ã±ãŒã©ããªãã£ãã³ã¹ãã¡ãªããæããšäœ¿ããããæçŸ€ã®ãµãŒãã¬ã¹ã¿ã€ãã§ããã ãµãŒãã¬ã¹ç¹æã®ã³ã³ãã¥ãŒãã£ã³ã°ãã£ãã·ãã£ã®èãæ¹ãçè§£ãããšãããã¡ãªããã享åããããšãåºæ¥ããã§ãã ä»åèªåãæºãã£ããããžã§ã¯ãã§Redshift Serverlessãæ§ç¯ããã®ã§ããã®éã«åãã£ãããšã»è©Šããããšãèšäºã«ãŸãšããŠã¿ãŸããã â»ææ°æ
å ±ã«ã€ããŠã¯AWSå
¬åŒããã¥ã¡ã³ããåç
§ãã ããã Redshiftããããžã§ã³ãã¿ã€ããšãµãŒãã¬ã¹ã¿ã€ãã®éã ãŸãRedshiftãšã¯ã ãã«ãããŒãžãåã®ããŒã¿ãŠã§ã¢ããŠã¹ãµãŒãã¹ ã§ãã é«éãªãªã¢ã«ã¿ã€ã åæãåŸæã§ãBIããŒã«ãšé£æºãå¯èœãªãããäŒæ¥ã®æææ±ºå®ã«å€§ãã«åœ¹ç«ã€ãµãŒãã¹ã§ãã ããããžã§ã³ãã¿ã€ãã¯ã¯ã©ã¹ã¿ã®ç®¡çãå¿
èŠã§ãã¯ã©ã¹ã¿ã®ãµã€ãºãæåã§èšå®ããå¿
èŠããããŸããããµãŒãã¬ã¹ã¿ã€ã㯠ã¯ãŒã¯ããŒãã«å¿ããŠèªåã§ã¹ã±ãŒãªã³ã° ããŸãã åŸã«èª¬æãããããŒã¹å®¹éããããæå€§å®¹éããŸã§ã®ç¯å²ã§èªåã§ã¹ã±ãŒãªã³ã°ããããªããããããã³ã¹ãå¹çåãéçšè² è·åæžã«æå¹ã§ãã ã³ã³ãã¥ãŒãã£ã³ã°ãã£ãã·ãã£ã®èãæ¹ Redshift Serverlessã§ã¯ãã³ã³ãã¥ãŒãã£ã³ã°ãã£ãã·ãã£ã RPUïŒRedshift Processing UnitïŒ ãšããåäœã§èšå®ããŸãã 1ã€ã®RPUã¯16GBã®ã¡ã¢ãªãæäŸããŸãã èšå®ç®æãšããŠã¯ãããŒã¹å®¹éãããªãã·ã§ã³ã§ãæå€§å®¹éããã䜿çšå¶éããããã®ã§ãããããã¯ãŒã¯ããŒãã®ã¯ãšãªããã©ãŒãã³ã¹ãç®æšã³ã¹ãã«å¿ããŠRPUãèšå®ããŠãããŸãã ããŒã¹å®¹éïŒèšå®ã¯ãã¹ãïŒ ã¯ãšãªã®åŠçã«äœ¿çšããã³ã³ãã¥ãŒãã£ã³ã°ãªãœãŒã¹ã®åºæ¬å®¹éãããã§èšå®ããŸãã ããã©ã«ãå€ã¯128RPUã§ã8RPU ãã512RPU ãŸã§8åäœã§èª¿æŽå¯èœã§ãã ããŒã¹å®¹éã倧ããèšå®ããããšã§ãã¯ãšãªã®ããã©ãŒãã³ã¹ãåäžããŸãã æå€§å®¹éïŒèšå®ã¯ãªãã·ã§ã³ïŒ Redshiftã ã¹ã±ãŒã«ã¢ããã§ããRPUã®äžé ãããã§èšå®ããŸãã ã¯ãšãªå®è¡éå§æã¯ãããŒã¹å®¹éãã§èšå®ããRPUã§åŠçãå®è¡ãããŸãããã¯ãšãªã®è² è·ã«å¿ããŠãã®ãæå€§å®¹éããŸã§èªåã§ã¹ã±ãŒãªã³ã°ãããŸãã 䜿çšå¶éïŒèšå®ã¯ãªãã·ã§ã³ïŒ Redshift㮠䜿çšãå¶éãããå Žå ã¯ããã§èšå®ããŸãã é »åºŠïŒæ¯æ¥/æ¯é±/æ¯æïŒãå¶éRPUæ°ãã¢ã¯ã·ã§ã³ïŒãã°åºå/ã¢ã©ãŒã/ã¯ãšãªç¡å¹ïŒãèšå®ã§ããŸãã Redshiftã¯ã¯ãšãªã®å®è¡ã«äœ¿çšãããRPUæéã«å¿ããŠèª²éãããããããã以äžã³ã¹ãããããããªãããšããç®å®ãããå Žåã«ã¯èšå®ããå§ãã§ãã ããŒã¹å®¹éãšæå€§å®¹éã®æ±ºãæ¹ ããŒã¹å®¹éãšæå€§å®¹éã¯ã©ã®ããã«å®ããã®ãè¯ãã§ããããïŒ ãŸãèšå®åŸã«ã容éã倿Žãã¹ãããšãã倿ã®åºæºãã©ã®ããã«æã£ãŠããã°è¯ãã®ã§ããããã ããããã¯èªåãå®éã«è©ŠããŠã¿ãèšå®å€æ±ºãã®æ¹æ³ãã玹ä»ããŸãã ãã£ãããšRPUèšå®å€ã決ãã RPUã¯åºæ¬çã«ã¯ã ãããŒã¿éã ãš ãã¯ãšãªã®è€éããé »åºŠã ã§èããŠãããŸãã ä»®ã§ã以äžèŠä»¶ã®å Žåã®ããŒã¹å®¹éãèããŠã¿ãŸãã ã»Redshiftã§ã®åæã®å
ãšãªãããŒã¿éã¯3TBçšåºŠã ã»åæã®ããã«å®è¡ããã¯ãšãªã¯éèšãªã©ã®SQLæãå®è¡æéã¯å¹³æ¥ã®å€åæéå
ã ãããŒã¿éãã§èãããšãå
¬åŒããã¥ã¡ã³ãã§ã8ã16ã24RPU ã®åºæ¬RPU容éã¯ã128TB æªæºã®ããŒã¿ãå¿
èŠãªã¯ãŒã¯ããŒãã察象ãšããŠããŸããããšã®èšèŒããããä»åã®å¯Ÿè±¡ããŒã¿ã¯3TBã§ããããšããã8ïœ24RPUãéžæã®åè£ãšããŸãã ãã¯ãšãªã®è€éããé »åºŠãã§èãããšãæ£çŽã©ã®çšåºŠããŒã¿åæã§Redshiftã䜿çšãããã«ãããããäžæŠ16RPUãéžæããæ€èšŒã®äžã§èšå®å€ã調æŽããŠãã圢ãšããŸãã æ€èšŒã§èšå®å€ããã¥ãŒãã³ã°ãã äžèšã®åœ¢ã§äžæŠèšå®ããRPUãé©åãã©ãããå®éã®å©çšã·ãŒã³ãæ³å®ããŠã¯ãšãªãå®è¡ããŠã¿ãããšã§ãèšå®å€ã®åŠ¥åœæ§ã倿ããŸãã RPUå€ããã¥ãŒãã³ã°ããæã«ã¯ã以äž2ç¹ããã€ã³ããšããŠãã§ãã¯ãããšè¯ãã§ãã ComputeCapacityã¡ããªã¯ã¹ ã¯ãšãªå®è¡ãããšæ§ã
ãªã¡ããªã¯ã¹ãååŸã§ããŸããããã®äžã®[ComputeCapacity]ã¡ããªã¯ã¹ãCloudWatchã§ç¢ºèªããããšã§ãã¯ãšãªå®è¡æã«äœ¿çšãããŠããRPUãåãããŸãã ã¡ããªã¯ã¹ã®å€ãããŒã¹å®¹éã®RPUããæå€§å®¹éã®RPUã«ã¹ã±ãŒã«ã¢ããããæå€§å®¹éã«è¿ãæéãå€ãå Žåã¯ãããŒã¹å®¹éãè¶³ããŠããªãããšå€æããææã«ãªããŸãã ãã ããã¯ãšãªã«ã€ããŠã¯åäžã®ã¯ãšãªããã®è² è·å¢å ã«å¿ããRPUã¹ã±ãŒã«ã¢ããã¯ãããªãããã åæå®è¡ã¯ãšãªã®ã¿ãã¹ã±ãŒã«ã¢ããã®å¯Ÿè±¡ ã§ããããšã念é ã«ãããŠããããšãå¿
èŠã§ãã ã¯ãšãªå®è¡æé 以äžã®æ¹æ³ã§ã¯ãšãªå®è¡æéã確èªãã æ³å®å
ã®å®è¡æéã§ããã ãè©äŸ¡ããæ¹æ³ãæå¹ã§ãã SYS_QUERY_HISTORYãã¥ãŒ Redshiftå
ã§SQLãå®è¡ããã¥ãŒã衚瀺ãããã¯ãšãªå®è¡ã«é¢ãã詳现æ
å ±ã確èªããæ¹æ³ã äŸãã°ãelapsed_timeãã衚瀺ããããšãã¯ãšãªã®å®è¡æã«æ¶è²»ããåèšæéãããããŸãã elapsed_timeãïŒã¯ãšãªã®å®è¡ãæ¶è²»ããåèšæéïŒãã€ã¯ãç§ïŒã ç£æ»ãã° ç£æ»ãã°ãæå¹ã«ããã¯ãšãªå®è¡æéã«é¢ããæ
å ±ã確èªããæ¹æ³ã QueryDurationãïŒã¯ãšãªãå®äºãããŸã§ã®å¹³åæéïŒãã€ã¯ãç§ïŒã QueryRuntimeBreakdownãïŒã¯ãšãªã¹ããŒãžããšã®ãã¯ãšãªãå®è¡ãããåèšæéïŒããªç§ïŒã ãŸãšã ã³ã³ãã¥ãŒãã£ã³ã°ãã£ãã·ãã£ã®èãæ¹ãçè§£ããŠãããã©ãŒãã³ã¹çã«ãã³ã¹ãçã«ãæå¹ã«äœ¿çšã§ãããšè¯ãã§ããã æåŸãŸã§èªãã§ããã ãããããšãããããŸããïŒ ãã®èšäºãçããã®ã圹ã«ç«ãŠãã°å¹žãã§ãã
ããã«ã¡ã¯ã2024幎床å
¥ç€Ÿã®ç§èã§ãïŒ 2025幎ã®1æ14æ¥ãæã¡ãŸããŠãçŽïŒã¶æã®ã¯ã©ãŠã人æç ä¿®ãçµäºããããŸããã ã¯ã©ãŠãã¯å©çšããŠãããã©ã”ã¯ã©ãŠã人æç ä¿®”ã£ãŠäžäœäœïŒãšçåã«æã£ãŠããããªãã«åããŠã¯ã©ãŠã人æç ä¿®ãšã¯äœãããã®å
·äœçãªå
容ããããŠç ä¿®ã«ãã£ãŠäœãåŸãããšãã§ããã®ãèšèŒããŠãããŸãïŒ ã¯ã©ãŠã人æç ä¿®ã®èæ¯ã»ç®ç è¿å¹Žã®æ¥éãªããžã¿ã«åã¯ãåžå Žã瀟äŒã®å€åãæ¿åãããŠããã顧客ã®DXæšé²ãæ¯æŽããããã«ã¯ãã¯ã©ãŠããã€ãã£ããªç¥èãšã¢ãžã£ã€ã«ãªéçºã¹ã¿ã€ã«ãåããã峿Šåãšãªã人æãäžå¯æ¬ ã§ãã ããããçµéšè±å¯ãªã¯ã©ãŠããšã³ãžãã¢ã¯äžè¶³ããŠãããè²æãæ¥åãšãªã£ãŠããŸããç¹ã«ãã¢ããªã±ãŒã·ã§ã³éçºãšã€ã³ãã©éçšãåæ¹ã®ç¥èãšã¹ãã«ãå
Œãåããã ãã«ã¹ã¿ãã¯äººæ ãã®è²æã¯å«ç·ã®èª²é¡ã§ãã ãã®èæ¯ãããSCã·ã¹ãã äºæ¥æ¬éšã§ã¯æ°äººè²æããã°ã©ã ãšããŠã¯ã©ãŠã人æç ä¿®ã宿œããŠããŸããæ¬ç ä¿®ã®ç®çã¯ãå°æ¥çãªãã«ã¹ã¿ãã¯äººæè²æãèŠéã«å
¥ããã¯ã©ãŠãåºç€æè¡ã®ç¿åŸãã¢ãžã£ã€ã«éçºææ³ã®å®è·µãéããŠãã¯ã©ãŠããã€ãã£ããªéçºã¹ã¿ã€ã«ãæ©æã«çµéšãããããšã§ãã æè¡ã¹ã¿ã㯠ãã«ã¹ã¿ãã¯ãç®çãšããæè¡ã¹ã¿ãã¯ã¯AWSãåºæ¬ã«ä»¥äžã®ããã«æ§æãããŠããŸããïŒ Javaã¢ããªã±ãŒã·ã§ã³ SpringBoot IaC ã¯ã©ãŠãïŒAWS CloudFormationïŒ ã³ã³ããïŒDocker/Amazon ECR/Amazon ECSïŒ CI / CD ã€ãã¥ãŒã¿ãã«ã€ã³ãã©ã¹ãã©ã¯ã㣠ãã«ã/ãããã€èªååïŒAWS CodePipelineïŒ ã¹ããŒãã¬ã¹ïŒAmazon ElastiCacheïŒ è² è·åæ£ / åé·å ããŒããã©ã³ãµãŒïŒElastic Load Balancing ALBïŒ ç£èŠ / éç¥ ç£èŠïŒAmazon CloudWatch AlarmïŒ éç¥ïŒAmazon SNSïŒ ç ä¿®å
容 CNCF Cloud Native Trail Map ãããŒã¹ã«æ§æããLesson0ïœLesson9ãŸã§ã®å
š10ã¬ãã¹ã³ã®ã«ãªãã¥ã©ã ã§ãã¯ã©ãŠããã€ãã£ãã®åºç€ããå¿çšãŸã§ãç¶²çŸ
çã«åŠç¿ããŠããŸããïŒ åLessonã®ããŒãã¯ä»¥äžã®ããã«ãªã£ãŠããŸããç ä¿®ã¯ãïŒäººïŒããŒã ã®èšïŒããŒã ã§é²ããããŠããããŒã å
ã ãã§ãªãåããŒã éã§ååããŠç ä¿®ã«åãçµãã ããšã§å
šããŒã ãæéå
ã«ãã¹ãŠã®Lessonãçµããããšãã§ããŸããïŒ Lesson Theme Lesson 0 Preparation Lesson 1 Introduction Lesson 2 IaC Level 1 Lesson 3 IaC Level 2 Lesson 4 Redundancy Lesson 5 Containerization and Orchestration Lesson 6 CI/CD Lesson 7 Observability Lesson 8 Operations Automation Lesson 9 Disaster Recovery å
šLessonãçµäºãããšä»¥äžã®ãããªæ§æå³ã«ãªããŸãã ãã®äžé£ã®ã¬ãã¹ã³ã§ã¯ãSpring BootãçšããWebã¢ããªã±ãŒã·ã§ã³ãAWSã¯ã©ãŠãäžã§æ§ç¯ããCI/CDãã€ãã©ã€ã³ã«ãã èªåããã〠㚠ç£èŠæ©èœ ãåããã å
ç¢ãªã·ã¹ãã ã®å®çŸãç®æããŸãã Lesson0ã§ã¯ãSpring Bootã»AWSã»Gitãªã©éçºã«å¿
èŠãªããŒã«ã®äœ¿ãæ¹ãåŠç¿ããå§ãŸããæåŸã® Lesson 9 ã§ã¯ãçœå®³ãªã©ã«åããŠãã·ã¹ãã ãããå
ç¢ã«ããããã®ä»çµã¿ãäœããŸãããå
·äœçã«ã¯ãLesson9ã§ã¯DNS Failoverãå®çŸããããšã§æ±äº¬ãªãŒãžã§ã³ã§é害ãçºçããå Žåã«åããWebã¢ããªã±ãŒã·ã§ã³ãèªåçã«å¥ã®ãªãŒãžã§ã³(ããŒãžãã¢åéš)ã«åãæ¿ããŠãéçãªãšã©ãŒç»é¢ã衚瀺ããä»çµã¿ãæ§ç¯ããŸããã ãã®ããã«ããã®ç ä¿®ãéããŠãWebã¢ããªã±ãŒã·ã§ã³ã® éçº ãã éçš ããã㊠çœå®³å¯Ÿç ãŸã§ãäžé£ã®æµããåŠã¶ããšãã§ãããšæããŸãïŒ ç ä¿®ãçµããæ°äººãã¡ã®å£° Kãã åœããåã®ããšã ãã³ãã¥ãã±ãŒã·ã§ã³ãå¯ã«åãããšã倧åã ãšããããšãå宿ããããŸããåé¡ãçºçããéã«åå ã®åãåããè¡ããªãããã©ãã«ã·ã¥ãŒãã£ã³ã°ãè¡ãã¹ãã«ãèº«ã«æã¿ä»ãããšæã£ãŠããã®ã§ä»åŸã®æ¥åã«æŽ»ãããŠããããïŒ Sãã æš©éã®ç®¡çã«é¢ããŠãå¿
èŠæäœéã®ããªã·ãŒãã¢ã¿ããããããšãç°¡åãªããã§ãšãŠãé£ããã£ããå¿
èŠä»¥äžã®ããªã·ãŒãä»äžããŠã€ãã€ã楜ãããã¡ã ããäžèŠãªããªã·ãŒãç¡ãã確èªãåãããŒã«ã䜿ããŸãããªãããšãæèããŠæ¥åã«èšã¿ããã Tãã ãšã©ãŒçºçæã«ç»é¢å
±æããªããããã¢ããã°ã©ãã³ã°ã§ããçµéšã¯ãããè¯ãã£ããšæãããä»åŸã®æ¡ä»¶ã§ã¯ç ä¿®ãéããŠèº«ã«çãããæç¢ºãªäœæ¥å
å®¹å ±åã®å®æœãããŒã ã¡ã³ããŒã«å¯ŸããŠå¿ãããŠããããïŒ Oãã ç ä¿®ãéããŠäžçªå¿èåã身ã«ã€ãããšæããŸãããéçºäžïŒã€ãšã©ãŒã解決ãããå¥ã®ãšããã§ãŸããšã©ãŒããšã©ãŒäžæ§ã«ãªã£ãŠããŸãããšããã£ããã©ããã«è² ããæåŸãŸã§ããéãããŸãããä»åŸã®æ¥åã«ããšã©ãŒäžå³ã«è² ããªãå¿ã§æã¿ããïŒ çµããã« 3ã¶æéã®ã¯ã©ãŠã人æç ä¿®ã¯ãç§ã«ãšã£ãŠå€§ããªçµéšã§ãããåæã«å€§ããªæé·ã®æ©äŒãšãªããŸãããå³ãå·Šãåãããªãç¶æ
ããã¹ã¿ãŒãããŸããããCNCF Cloud Native Trail MapãããŒã¹ãšããäœç³»çãªã«ãªãã¥ã©ã ããããŠããŒã ã¡ã³ããŒãè¬åž«ã®æ¹ã
ã®ãµããŒãã®ãããã§ãã¯ã©ãŠããã€ãã£ãéçºã®åºç€ããã£ãããšç¯ãããšãã§ããŸããã ç ä¿®ãéããŠç¹ã«å°è±¡ã«æ®ã£ãŠããã®ã¯ãå®è·µçãªèª²é¡ãéããŠã座åŠã ãã§ã¯åŸãããªããªã¢ã«ãªçµéšãç©ãããšãã§ããç¹ã§ãããšã©ãŒã«ééããæã®åå ç©¶æããã©ãã«ã·ã¥ãŒãã£ã³ã°ãããŒã ã§ã®ååäœæ¥ãªã©ãå®éã®éçºçŸå Žã§çŽé¢ããã§ããã課é¡ã«åãçµãããšã§ãåé¡è§£æ±ºèœåãã³ãã¥ãã±ãŒã·ã§ã³èœåãåäžãããããšãã§ããŸããããŸããKãããè¿°ã¹ãŠããããã«ãããŒã ã¡ã³ããŒãšå¯ã«ã³ãã¥ãã±ãŒã·ã§ã³ãåããªãã課é¡ã«åãçµãéèŠæ§ãæ¹ããŠèªèããŸããã æåŸã«ããã®ç ä¿®ã«é¢ãã£ãŠãã ãã£ãå
šãŠã®æ¹ã
ã«æè¬ç³ãäžããŸããããããšãããããŸããïŒ
AWS System Manager (SSM) ã® Patch Manager æ©èœãå©çšãããšãOS ãããé©çšãèªååã§ããããã§ãã ããã䟿å©ã ãšæã£ãã®ã§ãèšå®æé ããŸãšããŠã¿ãŸããã ã¢ãŒããã¯ã㣠ä»åã¯ãäžå³ã®æ§æã§å®è£
ããŠã¿ãŸããã Systems Managerãšã¯ã ãªã³ãã¬ãã¹ã§ããã«ãã¯ã©ãŠãç°å¢ã§ããAWS å
ã®ããŒããåºç¯å²ã«ããã£ãŠäžå
çã«è¡šç€ºã管çãããã³éçšã§ããŸããçµ±åã³ã³ãœãŒã«ãšã¯ã¹ããªãšã³ã¹ã®ãªãªãŒã¹ã«ãããSystems Manager ã§ã¯ AWS ã¢ã«ãŠã³ããšãªãŒãžã§ã³å
šäœã«ããã£ãŠãã䜿çšããããŒãã¿ã¹ã¯ãå®äºã§ããããŸããŸãªããŒã«ãçµ±åãããŠããŸãã AWS Systems Manager ãšã¯ – AWS Systems Manager Patch Managerãšã¯ã ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãšã¢ããªã±ãŒã·ã§ã³ã®äž¡æ¹ã«ããããé©çšããããšãã§ããŸãã AWS Systems Manager Patch Manager – AWS Systems Manager èšå®æé ä»åã¯ãä»¥äžæé ã§OSãWindows2022ãã®EC2ã«ãæ¯æç¬¬4æææ¥ã®9:00ã«ãããé©çšããæé ããŸãšããŸããã 1.ãããããŒã¹ã©ã€ã³ã®äœæ 2.ãããã°ã«ãŒãã®äœæ 3.ã¡ã³ããã³ã¹ãŠã£ã³ããŠã®äœæ 4.ã¿ãŒã²ããã®ç»é² 5.Run Commandã¿ã¹ã¯ã®ç»é² ïŒïŒãããããŒã¹ã©ã€ã³ã®äœæ AWS System Managerã®å·Šã¡ãã¥ãŒãããããããŒãžã£ãŒããã¯ãªãã¯ããããããããŒã¹ã©ã€ã³ã>ããããããŒã¹ã©ã€ã³ãäœæããããã¯ãªãã¯ããŸãã âŒããããããŒã¹ã©ã€ã³ã®è©³çް ãååãæ¬ã¯ãä»»æã®ãããããŒã¹ã©ã€ã³åãå
¥åããŸãã ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãæ¬ã¯ããããé©çšå¯Ÿè±¡ã®ã€ã³ã¹ã¿ã³ã¹ã®OSãéžæããŸãã ä»åã¯ãwindowsãéžæããŸããã âŒããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®æ¿èªã«ãŒã« ã補åãæ¬ã¯ããããé©çšå¯Ÿè±¡ã®ã€ã³ã¹ã¿ã³ã¹ã®OSã€ã¡ãŒãžãéžæããŸãã ãåé¡ãæ¬ã¯ãCriticalUpdatesãããSecurityUpdatesããéžæããŸãã ãéèŠåºŠãæ¬ã¯ãCriticalãããImportantããéžæããŸãã ãã³ã³ãã©ã€ã¢ã³ã¹ã¬ããŒããæ¬ã¯ããé倧ããéžæããŸãã ãã®ã»ãã¯ããã©ã«ãã®ãŸãŸã«ããŸãã 以äžã®æ¬ã¯ããã©ã«ãã®ãŸãŸã«ããããããããŒã¹ã©ã€ã³ã®äœæããã¯ãªãã¯ããŸãã âŒã¢ããªã±ãŒã·ã§ã³ã®æ¿èªã«ãŒã« âŒãããã®äŸå€ âŒã¿ã°ã®ç®¡ç ïŒïŒãããã°ã«ãŒãã®äœæ äœæãããããããŒã¹ã©ã€ã³ã®IDãã¯ãªãã¯ãããã¢ã¯ã·ã§ã³ã>ããããã°ã«ãŒãã®å€æŽããã¯ãªãã¯ããŸãã ããããã°ã«ãŒããæ¬ã«ä»»æã®ãããã°ã«ãŒãåãå
¥åããã远å ããã¯ãªãã¯ããŸãã å
¥åãããããã°ã«ãŒãåã远å ãããããšã確èªåŸããéããããã¯ãªãã¯ããŸãã ïŒïŒã¡ã³ããã³ã¹ãŠã£ã³ããŠã®äœæ AWS System Managerã®å·Šã¡ãã¥ãŒãã¡ã³ããã³ã¹ãŠã£ã³ããŠããã¯ãªãã¯ãããã¡ã³ããã³ã¹ãŠã£ã³ããŠã®äœæããã¯ãªãã¯ããŸãã âŒãã¡ã³ããã³ã¹ãŠã£ã³ããŠã®è©³çްã®å
¥å ãååãæ¬ã¯ãä»»æã®ã¡ã³ããã³ã¹ãŠã£ã³ããŠåãå
¥åããŸãã ãã®ã»ãã¯ããã©ã«ãã®ãŸãŸã«ããŸãã âŒãã¹ã±ãžã¥ãŒã« ãæ¬¡ã§æå®ãæ¬ã¯ããCRON/Rate åŒããéžæããå®è¡ãããæé垯ãcronã§èšèŒããŸãã â»ä»åã¯ç¬¬4æææ¥ã®9æã«å®è¡ããããã®ã§ãcron(00 09 ? * MON#4 *)ã§ç»é²ããŠã¿ãŸãã ãæéãæ¬ã¯ãã3ãæéãéžæããŸãã ãã¿ã¹ã¯ã®éå§ã忢ãããæ¬ã¯ãã0ããéžæããŸãã ãã¹ã±ãžã¥ãŒã«ã®ã¿ã€ã ãŸãŒã³ãæ¬ã¯ãä»»æã®ã¿ã€ã ãŸãŒã³ãéžæããŸãã â»ä»åã¯ã(GMT+09:00) Asia/TokyoããéžæããŸããã ãã®ã»ãã¯ããã©ã«ãã®ãŸãŸã«ããŸãã âŒãã¹ã±ãžã¥ãŒã« ããã©ã«ãã®ãŸãŸã«ãããã¡ã³ããã³ã¹ãŠã£ã³ããŠã®äœæããã¯ãªãã¯ããŸãã ïŒïŒã¿ãŒã²ããã®ç»é² äœæããã¡ã³ããã³ã¹ãŠã£ã³ããŠã®IDãã¯ãªãã¯ãããã¢ã¯ã·ã§ã³ã>ãã¿ãŒã²ããã®ç»é²ããã¯ãªãã¯ããŸãã âŒãMaintenance window target details ãTarget nameãæ¬ã¯ãä»»æã®ã¿ãŒã²ããåãå
¥åããŸãã ãã®ã»ãã¯ããã©ã«ãã®ãŸãŸã«ããŸãã âŒãã¿ãŒã²ãã ãã¿ãŒã²ããã®éžæãæ¬ã¯ããã€ã³ã¹ã¿ã³ã¹ã¿ã°ãæå®ããéžæããŸãã ãã€ã³ã¹ã¿ã³ã¹ã¿ã°ãæå®ãæ¬ã¯ããããé©çšå¯Ÿè±¡ã®ã€ã³ã¹ã¿ã³ã¹ã«ã¢ã¿ããããŠããä»»æã®ã¿ã°ãå
¥åãããAddããã¯ãªãã¯ããŸãã å
¥åããã¿ã°ã远å ãããããšã確èªåŸããRegister targetããã¯ãªãã¯ããŸãã ïŒïŒRun Commandã¿ã¹ã¯ã®ç»é² äœæããã¡ã³ããã³ã¹ãŠã£ã³ããŠã®IDãã¯ãªãã¯ãããã¢ã¯ã·ã§ã³ã>ãRun Commandã¿ã¹ã¯ã®ç»é²ããã¯ãªãã¯ããŸãã âŒãã¡ã³ããã³ã¹ãŠã£ã³ããŠã¿ã¹ã¯ã®è©³çް ãååãæ¬ã¯ãä»»æã®ã¡ã³ããã³ã¹ãŠã£ã³ããŠã¿ã¹ã¯åãå
¥åããŸãã ãã®ã»ãã¯ããã©ã«ãã®ãŸãŸã«ããŸãã âŒãã³ãã³ãããã¥ã¡ã³ã ãããã¥ã¡ã³ããæ¬ã¯ããAWS-RunPatchBaselineããéžæããŸãã ãã®ã»ãã¯ããã©ã«ãã®ãŸãŸã«ããŸãã âŒãã¿ãŒã²ãã ãç»é²æžã¿ã¿ãŒã²ããã°ã«ãŒãã®éžæããéžæããã4.ã¿ãŒã²ããã®ç»é²ãã§èšå®ããã¿ãŒã²ãããéžæããŸãã âŒãã¬ãŒãå¶åŸ¡ ãåæå®è¡æ°ãæ¬ã¯ãã1ãã¿ãŒã²ãããéžæããŸãã ããšã©ãŒã®ãããå€ãæ¬ã¯ãã1ããšã©ãŒãéžæããŸãã âŒãIAM ãµãŒãã¹ããŒã« ãããé©çšçšã®IAMããŒã«ãéžæããŸãã âŒãåºåãªãã·ã§ã³ ãCloudWatch outputããéžæããä»»æã®ãã°ã°ã«ãŒãåãå
¥åããŸãã â»ãããé©çšã®å®è¡çµæãCloudWatch logsã«åºåãããŸãã âŒãSNSéç¥ ããã©ã«ãã®ãŸãŸã«ããŸãã âŒããã©ã¡ãŒã¿ ãOperationãæ¬ã¯ããInstallããéžæããŸãã ãSnapshot Idãæ¬ã¯ãã {{WINDOW_EXECUTION_ID}} ããå
¥åããŸãã ãã®ã»ãã¯ããã©ã«ãã®ãŸãŸã«ããŸãã âŒãCloudWatch alarm ããã©ã«ãã®ãŸãŸã«ããŸãã ãã¹ãŠã®é
ç®ãèšå®åŸããRun Commandã¿ã¹ã¯ã®ç»é²ããã¯ãªãã¯ããŸãã ãããå®è¡çµæç¢ºèª ãããé©çšçµæã¯ä»¥äžã®æ¹æ³ã§ç¢ºèªããããšãã§ããŸãã â ãã¡ã³ããã³ã¹ãŠã£ã³ããŠã>ãå±¥æŽã â¡CloudWatch logsã«åºåããèšå®ãããå Žåã¯ã ããã°ã°ã«ãŒãã>ããã°ã°ã«ãŒãåã>ããã°ã¹ããªãŒã ã ãŸãšã ä»åã¯ãWindowsã®ãããé©çšãèšå®ãããšãããŸã§ããŸãšããŠã¿ãŸããã é©çšçµæãSNSã§éç¥ãããæ¹æ³ãããã¿ãããªã®ã§ã次ã®èšäºã§ã玹ä»ããŸãã ãããé©çšä»¥å€ã«ãSSMã®æ©èœã§ããããã§ãããã ãšæã£ãã®ã§ãããå°ã調ã¹ãŠã¿ãããšæããŸãã
ããã«ã¡ã¯ãåšå²¡ã§ãã ç§ã¯12æãŸã§AWSã®ç ä¿®ãåããŠããŸããã ä»ã§ã¯æ¡ä»¶ã«å
¥ããç§ã®ç€ŸäŒäººç掻ãå§ãŸã£ãæ°ãããŸãã ãããç§ãæ±ãã®ã¯AWSã§ã¯ãªãããªããš Azure ã å¿ãå
¥ãæ¿ããŠé 匵ããŸãïŒ ã¯ããã« ç§ãä»åãçµãã§ããã®ã¯ãã¢ããªæ©èœã®æ°èŠéçºãšæ¢åã·ã¹ãã ãæ¹ä¿®ã Azureäžãžç§»èšããæ¡ä»¶ã§ãã Azureäžã«VMãã¹ãã¬ãŒãžããããã¯ãŒã¯çã
ãæ§ç¯ããŠããŸãã ãããã®ãµãŒãã¹ã¯æ¬çªç°å¢ãšããŠæ±æ¥æ¬ãªãŒãžã§ã³ã çœå¯Ÿç°å¢ ãšããŠè¥¿æ¥æ¬ãªãŒãžã§ã³ã§æ§æããŸãã ç§ã¯ãã® çœå¯Ÿç°å¢ ãæ
åœããŠãããŸãã ç§ãèå³ãæã£ããµãŒãã¹ã¯ Azure Spring Apps ã§ãã ãªã³ã©ã€ã³Webã¢ããªã±ãŒã·ã§ã³ãå®è¡ããçšéã§äœ¿ããããµãŒãã¹ã«ãªããŸãã å®ã¯ãã®Azure Spring Appsã è¥¿æ¥æ¬ãªãŒãžã§ã³ã§éå¯Ÿå¿ ãªã®ã§ãïŒ ä»£ããã« æ±åã¢ãžã¢ãªãŒãžã§ã³ ã«äœæããŸãã®ã§ãåå¿é²ãšããŠèšäºã«ãŸãšããŸãã çœå¯Ÿç°å¢ãšã¯ æ¬çªç°å¢é害ã«ããã·ã¹ãã ç¶ç¶è² è·ã®éã«çšŒåããç°å¢ã æ¬çªç°å¢ãæ§ç¯ãããæ±äº¬ãªãŒãžã§ã³ã® å€§èŠæš¡é害æ ã«ãããŠã è¥¿æ¥æ¬ã»æ±åã¢ãžã¢ãªãŒãžã§ã³ã§ã·ã¹ãã ãæ§ç¯ããŸãã Azure Spring Apps Azure Spring Appsãšã¯ ã³ãŒãã倿Žããã«ãSpring Bootã¢ããªã±ãŒã·ã§ã³ãAzureã«ãããã€ã§ããPaaSã®ãµãŒãã¹ã ç§ã®ç°å¢ã§Hello World衚瀺ãããŠã¿ãŸãã åèïŒ ã¯ã€ãã¯ã¹ã¿ãŒã – åããŠã®ã¢ããªã±ãŒã·ã§ã³ã Azure Spring Apps ã«ãããã€ãã | Microsoft Learn 察å¿ãªãŒãžã§ã³ å
¬åŒããã¥ã¡ã³ãèŠãŸãããããã¯ãè¥¿æ¥æ¬ãªãŒãžã§ã³ãªãã£ãã§ãã Azure Spring Apps ã®ä¿¡é Œæ§ | Microsoft Learn è©Šçš Microsoft Learnã«æ²¿ã£ãŠãAzure Spring Appsã§ã¢ããªããããã€ããŠã¿ãããšæããŸãã Azure Spring Appsã®äœæ AzureããŒã¿ã«äžã§ãè¥¿æ¥æ¬ãªãŒãžã§ã³ããªãããšç¢ºèª ã¢ããªãããã〠ãã©ãŠã¶ããHello Worldã«ã¢ã¯ã»ã¹ã§ããããšç¢ºèª æ¡ä»¶ã§ã¯ã¡ãããšããã·ã¹ãã ã«ã¢ã¯ã»ã¹ã§ããããã«ãªããšèãããšãèžãé«ãŸããŸãã æ³šæ å
¬åŒããã¥ã¡ã³ãã«ã 廿¢ ã®ãç¥ããããããŸããã Azure Container Apps ãžã®ç§»è¡ãæšå¥šãããŠããŸããã ãã¡ãã䜿ãããšãªã£ããããŸãèšäºã«ããããšæããŸãã Azure Spring Apps ã®æäŸçµäºã®ãç¥ãã | Microsoft Learn ãããã« TechHarmonyã«ã¯Azureã®èšäºãAWSãšæ¯èŒããŠå°ãªããšæããŸããã ç§ãããããæžããŠAzureã®èšäºãå¢ããããšæããŸãã
SCSKã®çã§ãã7åç®ã®æçš¿ã§ãã ä»åã¯å°ãã¿ã»ã»ã®ã€ããã ã£ãã®ã§ããããã€ãå çããŠããããããªãã®åéã«ãªã£ãŠããŸããŸãããå
å®¹ã¯æ£çŽã¿ã€ãã«ããå€§äœæ³åä»ããšããã ãšã¯æãã®ã§ããããäºæ¿ãã ããã ã¢ãŒããã¯ãã£æŠèŠ ä»åã¯ã¿ã€ãã«éã AWS AppSync ãš AWS Lambda ãã¡ã€ã³ã§ãããå°ãã ã Amazon Redshift ã話ã«åºãŠããŸãã èæ¯ ã»ãŒæ¯å説æããŠãããããããŸããããæ¬ã¢ããªã±ãŒã·ã§ã³ã®äž»ç®çïŒæ©èœïŒã¯ããŒã¿ããŒã¹/DWH ã®ããŒãã«ããŒã¿ã¡ã³ããã³ã¹ã§ããæ¬ã¢ãŒããã¯ãã£æ§æäžãã¢ããªã±ãŒã·ã§ã³ãš Redshift ã®éã§ããŒãã«ããŒã¿ã®èªã¿æžããããå Žå㯠AppSync åã³ Lambda ãä»ããããã察象ããŒãã«ã®ããŒã¿ãµã€ãºæ¬¡ç¬¬ã§ AppSync ããã㯠Lambda ã®ãã€ããŒããµã€ãºã«å¶çŽãåããå¯èœæ§ããããŸãã AppSync ã¯ãã¬ã¹ãã³ã¹/ã¬ã¹ãã³ã¹å
±ã«æå€§ãã€ããŒããµã€ãºã 5MB ã§ãã å³å¯ã«ã¯ãè©äŸ¡ããããããã³ã°ãã³ãã¬ãŒãã®æå€§ãµã€ãºã 5MB ãšããè§£éãæ£ããããã§ããäžèš URL ã«ããããevaluated resolver, function, or handler templateããšãã衚çŸã§ããã AWS AppSync endpoints and quotas - AWS General Reference The following are the service endpoints and service quotas for this service. To connect programmatically to an AWS servi... docs.aws.amazon.com Lambda ã¯ãåæåŒã³åºãã«ãããæå€§ãã€ããŒããµã€ãºã¯ãªã¯ãšã¹ã/ã¬ã¹ãã³ã¹å
±ã« 6MB ã§ãã Lambda quotas - AWS Lambda Maximum sizes, limits, and quotas for Lambda functions and API requests. docs.aws.amazon.com ãã£ãŠãä»åã®ã¢ãŒããã¯ãã£ã«ãããŠãAppSync API å®è¡æã®å
¥åºåããŒã¿ãµã€ãºã¯ãããã 5MB æªæºã«æããå¿
èŠããããŸãã ãªãããã€ã¬ã¯ã Lambda ãªãŸã«ãã䜿çšããå Žåã¯ãæå€§ãã€ããŒããµã€ãºã Lambda ã®å€ã«æºæ ããããã§ããïŒïŒæå€§ 6MBïŒãã ãAmplify ã§ @function ãã£ã¬ã¯ãã£ãã䜿çšã㊠Lambda ã query ãªã mutation ã«çŽä»ããå Žåã¯ããããã³ã°ãã³ãã¬ãŒãã䜿çšããéåžžã® Lambda ãªãŸã«ãã«ãªãããã§ããgen2 ã§ããã°ãªãã·ã§ã³çã§å¯Ÿå¿ããŠããããããã§ããããã»ã»ïŒ ä»åã¯ãã€ã¬ã¯ã Lambda ãªãŸã«ãã®äœ¿çšãå¿
é ãšãªããããªèŠä»¶ã¯ãªãã£ãããã䜿çšããŠããŸããã ダイレクト Lambda リゾルバー (VTL) を使用した VTL マッピングテンプレートの無効化 - AWS AppSync ãã€ã¬ã¯ã Lambda ãªãŸã«ããŒã䜿çšã㊠VTL ãã³ãã¬ãŒãã®ããã€ãã¹ããæ¹æ³ã«ã€ããŠèª¬æããŸãã docs.aws.amazon.com ãã¡ãããã¢ãŒããã¯ãã£èšèšæã«ã¯ãã®ç¹ã¯èæ
®ã«å
¥ããŠããã以äž2ç¹ããåœé¢ã¯ç¹ã«å¯ŸçããªããŠã倧äžå€«ã ãããšèããŠããŸããã æ¬ã¢ããªã±ãŒã·ã§ã³ã«ãããã¡ã³ããã³ã¹å¯Ÿè±¡ã¯ããããããã¹ã¿ããŒãã«ãã§ãããããããŒã¿ãµã€ãºãå°ãã ããã©ã³ã¶ã¯ã·ã§ã³ããŒãã«ãã®ãããªããŒã¿ãµã€ãºã®å€ãããŒãã«ã§ã¯ãªã çŸæç¹ã§äžçªããŒã¿éã®å€§ããããŒãã«ã®ããŒã¿ãµã€ãºã CSV ãã¡ã€ã«åœ¢åŒ ã§ çŽ 800KB ã§ãã ãã€ãä»åŸããŒã¿ãµã€ãºãççºçã«å¢å€§ããå¯èœæ§ãå°ãªã ãšããããéçºäžã«åããŒãã«ã«å¯Ÿãããªã¯ãšã¹ã/ã¬ã¹ãã³ã¹ã®ããŒã¿ãµã€ãºãèšæž¬ããŠã¿ããšããã 3MB çšåºŠã«ãªã£ãŠããŸã£ãŠããããšã倿ããŸãããäžèšã®éããŸã æå€§ãµã€ãºå
ã§ã¯ãããã®ã®ãæ¢ã«ååãè¶
ããŠããŸã£ãŠããããšã«ãªããããæ
ãŠãŠåå ã調ã¹ãããšã«ãªããŸããã ããŒã¿ãµã€ãºå·®ç°ã®åå äœæ
ãã®ãããªããŒã¿ãµã€ãºã®å·®ç°ãçããŠããŸã£ãã®ãã§ãããåå 㯠AppSync åã³ Lambda ã®å
¥åºåã«ãããããŒãã«ããŒã¿ã®ãã©ãŒãããã«ãããŸãããåœåãAppSync ã®ã¹ããŒãã«ãããããŒãã«ããŒã¿ã¯ã以äžã®ããã« æååã®é
å ãšããŠå®çŸ©ããŠããããã®åœ¢åŒã§AppSync/Lambda ã§å
¥åºåãè¡ã£ãŠããŸããã table_data: [String]! å
·äœçã«ã¯ã以äžã®ãã㪠JSON Lines åœ¢åŒ ã®ããŒã¿ãè¡åäœã§ãªã¹ãã«æ ŒçŽããŠããŸããã {"id":"001","value":"sample_data_1", "create_day":"2025-01-01 00:00:00","update_day":null,"creater_name":"admin","updater_name":"","delete_flg":"N" } {"id":"002","value":"sample_data_2", "create_day":"2025-01-02 00:00:00","update_day":null,"creater_name":"admin","updater_name":"","delete_flg":"N" } {"id":"003","value":"sample_data_3", "create_day":"2025-01-03 00:00:00","update_day":null,"creater_name":"admin","updater_name":"","delete_flg":"N" } 以äžçç±ããããŒã¿ã«ã§äžçªæ¥œã«å®è£
ã§ãããšå€æããããããã®ãããªãã©ãŒãããã§ããŒã¿ãä¿æããŠããèš³ã§ããã»ã» Redshift â Lambda éã®ããŒã¿èªã¿æžãã« COPY / UNLOAD æã䜿çšããŠããããã®SQLæãããã®ãŸãŸäœ¿çšã§ãããã©ãŒãããã§ãããã COPY / UNLOAD æã§ãµããŒããããŠãããã©ãŒããã㯠JSON å«ããŠè€æ°ååšããããJSON ã«ããŠããã°åŸè¿°ããããã«ã¢ããªã±ãŒã·ã§ã³ããã容æã«äœ¿çšã§ãã https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/copy-parameters-data-format.html#copy-json https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_UNLOAD.html ã¢ããªã±ãŒã·ã§ã³åŽã§äœ¿çšããŠããããŒãã«è¡šç€ºçšã®ã©ã€ãã©ãªã«ãããŠãããŒãã«ã®ããŒã¿ã JSON 圢åŒã§ä¿æããå¿
èŠããã JSON Lines圢åŒãã倿ããå¿
èŠã¯ãããã®ã®ãæå°éã®å¯Ÿå¿ã§æžã ããŠãããæ¢ã«ãåããããšæããŸããããããŸã§ é»è²ã¢ã³ããŒã©ã€ã³ ã§ããŒã¯ããéããããŒãã«ããŒã¿ã®ãã©ãŒãããã JSON Lines 圢åŒã§æã€ããã«ããããšãããŒã¿éå¢å€§ã®åå ãšãªã£ãŠããŸãããããŒãã«ããŒã¿ãå圢åŒã§æã€ãšããããšã¯ãåœç¶ãªããå®ããŒã¿ã ãã§ãªã JSON ãã©ãŒãããã§ä»å ãããæ
å ±ïŒååãäžæ¬åŒ§ãããã«ã¯ã©ãŒããªã©ïŒã®ããŒã¿ãåè¡ããšã«å«ãŸããŸããã€ãŸããããŒãã«ã®ããŒã¿éã倧ããã»ã©ãJSON ãã©ãŒãããã§ä»å ãããæ
å ±ãå ããããŒã¿ãµã€ãºãçžå¯Ÿçã«å€§ãããªã£ãŠããŸãããšã«ãªããŸãã å³å¯ã«ã¯ãåæ°ã»ååã®é·ããšãã£ãã¡ã¿æ
å ±ããè¡æ°ã®æ¹ãèŠå ãšããŠããå€ããå ãããã®ãšæããŸããã»ã» ããã§ãæ¹ããŠå¯Ÿè±¡ããŒãã«ã«ãããå®ããŒã¿ä»¥å€ã®ããŒã¿ãµã€ãºãæ¹ããŠèšç®ãããšããã è¡æ°ïŒçŽ 10000 è¡ 1è¡ãããã® JSON ãã©ãŒãããåã®ããŒã¿ãµã€ãºïŒçŽ 220Byte èšç®çµæïŒ210 B * 10000 â 2.2MB ãšããããšã§ãåœç¶ã§ããããŒã¿ãµã€ãºã®å·®ç°åãšã»ãŒäžèŽããçµæãšãªããè£ä»ããåããŠããŸã£ãæ Œå¥œã«ãªããŸãããããšããããå®ããŒã¿ã®çŽ 2.5 åã®ãµã€ãºãšãªã£ãŠããŸã£ãŠãããã§ããããã©ãèããŠããµã€ãºå¹çã¯å£æªã§ãããä»ã®ã¡ã³ããã³ã¹å¯Ÿè±¡ããŒãã«ã«ã€ããŠãåæ§ã®åŸåã«ããããšãèŠãŠåããŸããã®ã§ãæ ¹æ¬çãªå¯Ÿçãè¡ãããšãšããŸããã 解決ç äžæ¹ã§ãJSON (Lines) 圢åŒãã®ãã®ã¯å®è£
é¢ããå€ããããªãã£ãã®ã§ã¡ãã£ãšæ©ãã ã®ã§ãããä»åã®ããã«ããšãããããµã€ãºãå°ããã§ããã°ãããã±ãŒã¹ã§æãè¯ã䜿çšãããææ³ãçšããŠãã£ãã解決ããŸãããããã å§çž® ã§ãã ãšããããšã§ããŸãã¹ããŒãå®çŸ©ãæååã®é
åããæååã«å€æŽããŸããã table_data: String! åŸã¯ãLambda ãš ããŒãã«ããŒã¿ãããåãããæã«ãJSON 圢åŒã®ããŒã¿ããã³ãããŠããå§çž®/å±éããŠããŸãã° OK ã§ãã以äžãLambdaåŽ ã§å§çž®ããããŒãã«ããŒã¿ã Typescript åŽã§å±éããå Žåã®å®è£
äŸã瀺ããŸãã Lambda JSON 圢åŒã®ããŒãã«ããŒã¿ã Lambda åŽã§å§çž®ããäŸã§ãã table_data_json_base64 = base64.b64encode(gzip.compress(json.dumps(table_data_json).encode('utf-8'))).decode('utf-8') å§çž®ãã以äžãlambda ã³ãŒãå
ã§ããŒãã«ããŒã¿ã JSON Lines 圢åŒã§æ±ãå¿
èŠæ§ããªããªã£ããããéåžžã® JSON é
åãšããŠæ±ã£ãŠããŸããtable_data_json ã察象ã®å€æ°ã§ãã Typescript Lambda / AppSync ããåãåã£ãå§çž®ãããããŒãã«ããŒã¿ãå±éããŠãJSON é
åã«å€æããäŸã§ãã const table_datas = JSON.parse(pako.ungzip(Base64.toUint8Array(table_data_json_base64), { to: 'string' })) table_data_json_base64 倿°ã«å§çž®ããŒã¿ãæ ŒçŽãããŠããæ³å®ã§ãããŸããäžèšãµã€ãæ§ã®æ
å ±ãããgzip/ungzip çšã®ã¢ãžã¥ãŒã«ãšã㊠pako ã䜿çšããŠããŸãã zlibã§GZIP圢åŒã§å§çž®ãããæååã®ã¬ã¹ãã³ã¹ããŒã¿ãJavaScriptã§è§£åãã - Qiita Lambdaã§æ§ç¯ãããAPIã§è¿åŽå€ã倧ããããã§ãã€ããŒãã®ããŒã¿ãµã€ãºå¶éïŒ6MB以äžã¯å¶éã«åŒã£ãããïŒã«åŒã£ããã£ãŠããŸããšã®ããšã§ãLambdaåŽã§gzipå§çž®ãããããŒã¿ãããã³ãã§è§£âŠ qiita.com ãããã®å¯Ÿå¿ã«ããã察象ããŒãã«ããŒã¿ã®ãµã€ãºã çŽ 160KB ã«äœæžããããšãã§ããŸãããæå€§ãµã€ãº 5MB ãšæ¯èŒããŠãååã«å°ããããããã®æ¹åŒãæ¡çšããŠè§£æ±ºãšçžæããŸãããJSON 圢åŒã®ããŒã¿ãã©ãŒãããã§ãã以äžã¯ããçšåºŠå§çž®ãå¹ããã®ãšèŠèŸŒãã§ããŸããããããŒã¿ãã®ãã®ã®ç¹æ§ãããæ³å®ä»¥äžã®å§çž®çãšãªããŸããã ãªããããæ ¹æ¬çãªå¯ŸçãšããŠãLambda ã«ããŒãã«ããŒã¿ãå
¥åããïŒïŒã¢ããªã±ãŒã·ã§ã³ããããŒãã«ããŒã¿ãæŽæ°ããïŒå Žåã¯ãå
šããŒãã«ããŒã¿ãæž¡ã㊠truncate + load ããã®ã§ã¯ãªããæŽæ°å·®åã®ã¿ãæž¡ããšããæ¹æ³ããããŸãã ããããã®ã±ãŒã¹ã§ããŒã¿ãµã€ãºãæããããšãå¯èœãªåé¢ãå·®åæŽæ°ãè¡ãããã® SQL æãçæããããžãã¯ãå®è£
ããå¿
èŠããããããå®è£
é£æåºŠã¯äžãããŸãããŸããæŽæ°éã«ãã£ãŠã¯ truncate + load ããåŠçé床ãé
ããªãå¯èœæ§ããããŸããïŒRedshift ã®ããã«ãåæåã§ããŒã¿ãæã€ DWH ã§ã¯ãããã®åŸåã匷ããªããŸãïŒ ä»åã¯ã¡ã³ããã³ã¹å¯Ÿè±¡ããŒãã«ã®ããŒã¿ãµã€ãºãéã¿ãŠãå·®åæŽæ°ãå®è£
ããå¿
èŠã¯ãªããšå€æããŸããã ãŸãšã èšãèš³ããŸããã®ã§ãããCSV 圢åŒãã JSON 圢åŒã®æ¹ãããŒã¿ã«ã§ããŒã¿ãµã€ãºãå¢å€§ããããšèªäœã¯èªèããŠããŸããããã ãå®ããŒã¿ã«åºã¥ã詊ç®ãªã©ã®å®éçãªè£åãã¯ããŠããããäœãšãªã倧äžå€«ã ããçšåºŠã®æèŠã§å®è£
ãåªå
ããŠããŸã£ãŠããã®ãä»åã®æ ¹æ¬åå ã§ãããåçç¹ã§ããããç¹ã«ä»åã¯äºåã«è©Šç®ããããšã容æãªããŒã¿ãµã€ãº/ããŒã¿ãã©ãŒãããã§ãã£ããããå°æŽã§ããã ãªããæ¬èšäºãæžãçµãã£ãåŸã«åããŠç¥ã£ãã®ã§ãããå®ã¯ AppSync åŽã§ API ã¬ã¹ãã³ã¹ã®å§çž®ãè¡ãæ©èœãããããšã«æ°ã¥ããŸãããæ¬ã¢ããªã±ãŒã·ã§ã³ã®å®è£
ã¯å€æŽããªãäºå®ã§ãããå¥ã®æ©äŒã§è©ŠããŠã¿ãŠãè¯ããããããªãã§ããã AWS AppSync でのサーバー側のキャッシュと API ペイロード圧縮の設定 - AWS AppSync AWS AppSync ã®ãµãŒããŒåŽã®ããŒã¿ãã£ãã·ã¥ãšå§çž®æ©èœã«ã€ããŠåŠãã§ãã ããã docs.aws.amazon.com ãã ãå®ã¢ããªã±ãŒã·ã§ã³ã§æ¡çšããå Žåã以äžäžæãæ°ã«ãªããšããã§ã¯ãããŸããã»ã» AWS AppSync ã¯ãã¹ããšãã©ãŒãããŒã¹ã§ãªããžã§ã¯ãã å§çž® ããŸãããŸãã«ãAWS AppSync ãçŸåšã®å®¹éãå«ãããŸããŸãªèŠå ã«åºã¥ããŠãå§çž®ãã¹ãããããããšããããŸãã æ¬èšäºãã©ãªããã®åœ¹ã«ç«ãŠã°å¹žãã§ãã
ããã«ã¡ã¯ãSCSKã®èæšã§ãã æšä»ãéèŠãªã·ã¹ãã ã®BCP察çãšããŠãã«ããªãŒãžã§ã³ã§ã®åé·åãããç®ã«ããŸãã é害ãçœå®³ãçºçããéã®ããŠã³ã¿ã€ã ãæå°å ã ããŒã¿ãè€æ°ã®å Žæã«åæ£ããããšã«ããã·ã¹ãã ã®ä¿¡é Œæ§åäž ãªã©ãç®çãšãããã®æ§æã§ãããAWSäžã§ã©ãå®è£
ããã°ããã®ãæ°ã«ãªããŸããã ãªã®ã§ãä»åã¯AWS Transit GatewayãçšããŠãã«ããªãŒãžã§ã³ã«ãããé«å¯çšæ§æ¹åŒãå®è£
ããŠã¿ãŸãã ã¯ããã« æ¬èšäºã§ã¯ãDRBDã§ã®ããŒã¿ã¬ããªã±ãŒã·ã§ã³ãæ³å®ãããã«ããªãŒãžã§ã³æ§æã«ã€ããŠè§£èª¬ããŸãã DRBDïŒDistributed Replicated Block DeviceïŒã¯ãLinuxã·ã¹ãã ã«ãããã¹ãã¬ãŒãžã¬ãã«ã®ããŒã¿ã¬ããªã±ãŒã·ã§ã³ãœãããŠã§ã¢ã§ãè€æ°ã®ãµãŒããŒéã§ããŒã¿ããªã¢ã«ã¿ã€ã ã«åæããé«å¯çšæ§ãå®çŸããããã«äœ¿çšãããŸãã 第10åãDRBD à LifeKeeperã®é«å¯çšæ§ãªã¢ã«ã¿ã€ã ã¬ããªã±ãŒã·ã§ã³ãæ¢ã ããŒã¿ã®ãªã¢ã«ã¿ã€ã ã¬ããªã±ãŒã·ã§ã³ãå®çŸããDRBDïŒDistributed Replicated Block DeviceïŒãšLifeKeeperã®å¯èœæ§ã«ã€ããŠèª¬æããŸãã blog.usize-tech.com 2024.10.25 ãã«ããªãŒãžã§ã³ã§ã®åé·åãå³ãããã«ãã¯ã©ã¹ã¿ããŒãã¯3å°æ§æãšãã ã¯ã©ã€ã¢ã³ãåã³ããŒãéã®éä¿¡ããå¹ççã«ç®¡çããããã«AWS Transit Gatewayãæ¡çšããŠãããŸãã ã¯ã©ã€ã¢ã³ãéä¿¡ã¯ä»®æ³IPã¢ãã¬ã¹ãã¿ãŒã²ããã«è¡ãããŸãããã®ä»®æ³IPã¢ãã¬ã¹ã¯ãè€æ°ã®æ ç¹ãããŒã¿ã»ã³ã¿ãŒããã®éä¿¡ãäžå
çã«ãã³ããªã³ã°ãã圹å²ãæãããŸãã ãªããæ¬çš¿ã§ã¯äžè¬çãªAWSãµãŒãã¹ïŒEC2ãªã©ïŒã®æ§ç¯æé ãåºæ¬çãªèª¬æã«ã€ããŠã¯å²æããŠããŸãããã®ãããAWSãµãŒãã¹ã®åºæ¬çãªæäœæ¹æ³ã«ã€ããŠã¯ãå¥éAWSã®å
¬åŒããã¥ã¡ã³ããªã©ããåç
§ãã ããã å
šäœæ§æ æ§æèŠçŽ ãšåœ¹å² æ§æèŠçŽ èª¬æ NATã€ã³ã¹ã¿ã³ã¹ (LKDRBD-nat,LKDRBD-nat-2) Elastic IPãèšå®ããPublicãªãµããããã«é
眮ããŸãã ã¯ã©ã¹ã¿ãŒããŒãã¯NATã€ã³ã¹ã¿ã³ã¹çµç±ã§AWSã®APIã䜿ã£ãŠã«ãŒãããŒãã«ãå¶åŸ¡ã®å
å®¹ãæžãæããŸãã AWSã®APIã䜿ãã«ã¯ã€ã³ã¿ãŒãããã«ã¢ã¯ã»ã¹ã§ããããšãåæãšãªããŸãã AWSã®æ°æ©èœã®Private Linkã䜿ãããšã§ã€ã³ã¿ãŒãããã«åºãã«APIãããããããã«ãªããŸããããæ¬èšäºã§ã¯åŸæ¥éãã®NATã€ã³ã¹ã¿ã³ã¹ãäœ¿ãæ¹åŒãåæãšããŠããŸãã èžã¿å°WindowsãµãŒã㌠(LKDRBD-windows) Publicãªãµããããã«é
眮ããŸããã¯ã©ã¹ã¿ãŒããŒãã®èšå®ãã¡ã³ããã³ã¹äœæ¥ã¯å
šãŠèžã¿å°ãµãŒããŒçµç±ã§è¡ããŸãã ãæå
ã®PCããRDPæ¥ç¶ããèžã¿å°WindowsãµãŒããŒãšã¯ã©ã¹ã¿ãŒããŒãéã¯SSHã§éä¿¡ããŸãã ã¯ã©ã¹ã¿ãŒããŒã (LKDRBD-1,LKDRBD-2,LKDRBD-3) ã€ã³ã¿ãŒãããã«ã¢ã¯ã»ã¹ã§ããå¿
èŠãç¡ãã®ã§ãPrivateãªãµããããã«é
眮ããŸãã ä»åã®æ€èšŒç°å¢ã§ã¯ãã¡ã€ã«ã·ã¹ãã ã®åé·åãè¡ã£ãŠããŸãã ä»®æ³IPã¢ãã¬ã¹ æå³çã«VPCå€ã®ãããŒã®IPã¢ãã¬ã¹ïŒ20.1.1.1ïŒãã¯ã©ã€ã¢ã³ãããåç
§ãããããšã§ã«ãŒãããŒãã«ãåç
§ãããŠããã®ã«ãŒãããŒãã«ã«ç»é²ãããŠããã¿ãŒã²ããã®ENIã«ã¢ã¯ã»ã¹ãããŸãã 詳ããã¯éå»ã®èšäºããåç
§ãã ããã 第ïŒåããLifeKeeperãAWSã§ã¯ä»®æ³IPã¢ãã¬ã¹ã䜿ããªãïŒïŒãããããŠè§£æ±ºããïŒïŒ ãªã³ãã¬ãä»®æ³ç°å¢ã§HAã¯ã©ã¹ã¿ãæ§ç¯ããéã¯ä»®æ³IPã¢ãã¬ã¹ã䜿ããŸããããAWSã§ã¯ä»®æ³IPã¢ãã¬ã¹ã®æ©èœãæäŸãããŸããããã®èª²é¡ãLifeKeeperãã©ã®ããã«è§£æ±ºããŠãããã解説ããŸãã blog.usize-tech.com 2023.11.29 ãã§ã€ã«ãªãŒããŒã®éã«ã¯ãAWSã®APIãããã¯ããŠã¿ãŒã²ããã皌åç³»ããåŸ
æ©ç³»ã«ã«ãŒãã£ã³ã°å€æŽããŸãããã®å¶åŸ¡ã«ãããã¯ã©ã€ã¢ã³ãã¯åžžã«çšŒåç³»ã®ã¯ã©ã¹ã¿ãŒããŒãã«ã¢ã¯ã»ã¹ã§ããŸãã NWã®æ§æ åãµãŒãã¹ã®ãã©ã¡ãŒã¿ æ¬ç°å¢ã§å©çšããŠããNWé¢é£ãµãŒãã¹ã®ãã©ã¡ãŒã¿ã玹ä»ããŸãã å
容ãéè€ããããæ±äº¬ãªãŒãžã§ã³ã®ãªãœãŒã¹ã®ã¿ãšããŸãã ã«ãŒãããŒãã« publicãšprivateã§åããŠããŸããã©ã¡ãã倧éªã«æããçµè·¯ã¯åããšãªããŸãã Transit Gateway å¿
èŠã«å¿ããŠãªãã·ã§ã³æ©èœãæå¹åããŸãã ä»åã¯ãDNSãµããŒããã®ã¿æå¹åããŠããŸãã Transit Gatewayã¢ã¿ããã¡ã³ã æ±äº¬åŽã®ã¢ã¿ããã¡ã³ã(tgw-at-tokyo)ã§ã¯æ±äº¬ã®publicãšprivateãµãããããé¢é£ä»ããŠããŸãã Transit Gatewayã«ãŒãããŒãã« ã¢ã¿ããã¡ã³ãããšã«ã«ãŒãããŒãã«ãäœæããŠé¢é£ä»ããã€ã¡ãŒãžã§ãã ã«ãŒãã¢ãã©ã€ã¶ãŒã§ã®çéç¢ºèª ã«ãŒãã¢ãã©ã€ã¶ãŒã䜿ããšç°¡æçã«çé確èªãã§ããŸãã çéã倱æããå Žåã¯åå ãã©ãããç¹å®ããŸãããã ä»®æ³IPã®ã«ãŒãã£ã³ã°ã·ããªãª ä»®æ³IPã¢ãã¬ã¹ã䜿ã£ãã¯ã©ã€ã¢ã³ãéä¿¡çµè·¯ã«é¢ããŠãæ³å®ãããã«ãŒãã£ã³ã°ã·ããªãªã3ãã¿ãŒã³ã玹ä»ããŸãã ã¯ã©ã¹ã¿ãŒããŒãã®çšŒåç¶æ³ã«å¿ããŠAWSåŽã§ã«ãŒãã£ã³ã°ãåãæ¿ããå¿
èŠããããŸãã ããã§ã¯ä»®æ³IPã¢ãã¬ã¹ãã20.1.1.1ããšããæ±äº¬1å·æ©(LKDRBD-1)ããé ã«é害ã«ããããŠã³ããããšä»®å®ããŸãã äŸã§ã¯TGWã¢ã¿ããã¡ã³ãããµãŒããšåããã©ã€ããŒããµããããã«é
眮ããŠããŸããã AWSã®ãã¹ããã©ã¯ãã£ã¹ã¯TGWã¢ã¿ããã¡ã³ãå°çšã®ãµãããããåããããšãæšå¥šãããŠããŸãã Amazon VPC Transit Gateway 設計のベストプラクティス - Amazon VPC Transit Gateway èšèšã®ãã¹ããã©ã¯ãã£ã¹ã«ã€ããŠåŠã¶ã docs.aws.amazon.com æ±äº¬1å·æ©ãçšŒåæ©ã®å Žå åã«ãŒãããŒãã«ã¯ä»¥äžã®ããã«èšå®ããŸãã â»èšå®äžèŠãªã«ãŒãããŒãã«ã¯å²æããŸãã ã»rtb-tokyo éä¿¡å
ã¿ãŒã²ãã 20.1.1.1/32 LKDRBD-1ã®ENI ã»tgw-rtb-tokyo éä¿¡å
ã¿ãŒã²ãã 20.1.1.1/32 tgw-at-tokyo ã»tgw-rtb-tokyo-osaka éä¿¡å
ã¿ãŒã²ãã 20.1.1.1/32 tgw-at-tokyo æ±äº¬2å·æ©ãçšŒåæ©ã®å Žå åã«ãŒãããŒãã«ã¯ä»¥äžã®ããã«èšå®ããŸãã â»èšå®äžèŠãªã«ãŒãããŒãã«ã¯å²æããŸãã ã»rtb-tokyo éä¿¡å
ã¿ãŒã²ãã 20.1.1.1/32 LKDRBD-2ã®ENI ã»tgw-rtb-tokyo éä¿¡å
ã¿ãŒã²ãã 20.1.1.1/32 tgw-at-tokyo ã»tgw-rtb-tokyo-osaka éä¿¡å
ã¿ãŒã²ãã 20.1.1.1/32 tgw-at-tokyo 倧éª1å·æ©ãçšŒåæ©ã®å Žå åã«ãŒãããŒãã«ã¯ä»¥äžã®ããã«èšå®ããŸãã â»èšå®äžèŠãªã«ãŒãããŒãã«ã¯å²æããŸãã ã»rtb-osaka éä¿¡å
ã¿ãŒã²ãã 20.1.1.1/32 LKDRBD-3ã®ENI ã»tgw-rtb-osaka éä¿¡å
ã¿ãŒã²ãã 20.1.1.1/32 tgw-at-osaka ã»tgw-rtb-osaka-tokyo éä¿¡å
ã¿ãŒã²ãã 20.1.1.1/32 tgw-at-osaka ã«ãŒãã£ã³ã°åæ¿ã®å®è£
æ¹é äžè¿°ã®ã«ãŒãã£ã³ã°ã·ããªãªãå®çŸããããã«AWSã®APIã䜿çšããããšã§ã«ãŒãã£ã³ã°ã®åæ¿ãè¡ããŸãã ãã£ããããå®è£
æ¹åŒã¯ä»¥äžãæ³å®ããŠãããå¥èšäºã§ã¹ã¯ãªãããæåã®ã玹ä»ãäºå®ããŠããŸãã â é害ãçºç â¡çšŒåæ©ã«ææ Œããã¯ã©ã¹ã¿ããŒãããã¹ã¯ãªããããã㯠â¢ã¹ã¯ãªããå
ã§ã«ãŒãããŒãã«ãå·®ãæ¿ããŠä»®æ³IPãæ°çšŒåæ©ãŸã§ã«ãŒãã£ã³ã° â£æ°çšŒåæ©ã§ãµãŒãã¹ç¶ç¶ æåŸã« 以äžãé§ãè¶³ã§ãããAWS Transit Gatewayãçšãããã«ããªãŒãžã§ã³æ§æãã§ããããšã«ãªããŸãã æåŸãŸã§ãèªã¿ããã ããããããšãããããŸããã æ¬¡åã¯ã¹ã¯ãªããã«ããã«ãŒãã£ã³ã°åæ¿ã®è©³çްã«ã€ããŠèšäºãæžãããšæããŸãã
å
æ¥åããŠãAWS User NotificationsãšãããµãŒãã¹ãå©çšããŸããã AWSããã®éç¥ãèšå®ã管çããŠããéã«äŸ¿å©ã ãšæããŸããã®ã§ã EC2ã«é¢ããAWS Healthã€ãã³ãã®éç¥ãAWS User Notificationsãå©çšããŠå®è£
ããæ€èšŒå
容ããŸãšããŠã¿ãŸããã æŠèŠ AWS Health ã€ãã³ããšAWS User Notificationsã«ã€ããŠç°¡åã«èª¬æããŸãã 詳现ã«ã€ããŠã¯ãªã³ã¯ããåç
§ãã ããã AWS Health ã€ãã³ã AWS Health ã€ãã³ããšã¯AWS Healthãéä¿¡ããéç¥ã®ããšã§ãAWSã®é害æ
å ±ãã¢ã«ãŠã³ãã«åœ±é¿ãäžããå¯èœæ§ããã倿Žãªã©ã«ã€ããŠéç¥ãè¡ããŸãã とは AWS Health - AWS Health AWS Health Dashboard ãš ã䜿çšããŠã AWS ãªãœãŒã¹ããµãŒãã¹ãã¢ã«ãŠã³ãã®ç¶æ
ãç¶ç¶çã«å¯èŠåããŸã AWS Healthã docs.aws.amazon.com AWS User Notifications AWS User Notificationsã¯ãAWSãµãŒãã¹ããã®éç¥ãäžå
çã«èšå®ããã³ç¢ºèªã§ãããµãŒãã¹ã§ãã AWS ãŠãŒã¶ãŒéç¥ aws.amazon.com æ€èšŒå
容 ä»åã¯ãEC2ã«é¢ããAWS Health ã€ãã³ãã®éç¥ãAWS User Notificationsã§å®è£
ããEã¡ãŒã«ã§éç¥ãåãåã£ãŠã¿ãŸããã äºåç¢ºèª AWS Health APIãå©çšããŠãEC2ã®AWS Health ã€ãã³ãã«é¢ããæ
å ±ã確èªããŸãã ä»åã¯AWS CloudShellã§å®è¡ããŸããAWS Health APIã®è©³çްã¯ä»¥äžãªã³ã¯ãã確èªãã ããã Actions - AWS Health The following actions are supported: docs.aws.amazon.com 以äžãå®è¡ããããšã§ãã©ã®ãããªå
容ã®EC2ã®AWS Health ã€ãã³ããéç¥ãããã®ãã確èªã§ããŸãã åºåçµæã¯2025/1/8æç¹ã®æ
å ±ã§ãããåºåçµæãé·ãããçç¥ããŠããŸãã [cloudshell-user@ip-xx-xx-xx-xx ~]$ aws health describe-event-types --region us-east-1 --filter "services=EC2" --output table ------------------------------------------------------------------------------------------------------- | DescribeEventTypes | +-----------------------------------------------------------------------------------------------------+ || eventTypes || |+---------------------+-----------------------------------------------------------------+-----------+| || category | code | service || |+---------------------+-----------------------------------------------------------------+-----------+| || issue | AWS_EC2_API_ISSUE | EC2 || || accountNotification| AWS_EC2_BILLING_NOTIFICATION | EC2 || || accountNotification| AWS_EC2_BYOIP_ROAS_EXPIRING | EC2 || || accountNotification| AWS_EC2_BYOIP_RPKI_INVALID | EC2 || || accountNotification| AWS_EC2_BYOIP_RPKI_UNKNOWN | EC2 || || issue | AWS_EC2_CAPACITY_BLOCKS_API_ISSUE | EC2 || || issue | AWS_EC2_CAPACITY_BLOCKS_API_LATENCY_ISSUE | EC2 || ã»ã»ã»(äžç¥)ã»ã»ã» || accountNotification| AWS_EC2_SIMPLIFIED_AUTO_RECOVERY_SUCCESS | EC2 || || issue | AWS_EC2_SPOT_API_UNAVAILABILITY | EC2 || || scheduledChange | AWS_EC2_ULTRASERVER_CAPACITY_REDUCED | EC2 || || scheduledChange | AWS_EC2_ULTRASERVER_MAINTENANCE_INITIATED | EC2 || || accountNotification| AWS_EC2_ULTRASERVER_RECOVERY_COMPLETED | EC2 || || issue | AWS_EC2_VPC_API_ISSUE | EC2 || || issue | AWS_EC2_VPC_NETWORK_HEALTH_INTERNET_ISSUE | EC2 || || issue | AWS_EC2_VPC_NETWORK_HEALTH_INTER_AZ_ISSUE | EC2 || || issue | AWS_EC2_VPC_NETWORK_HEALTH_INTRA_AZ_ISSUE | EC2 || |+---------------------+-----------------------------------------------------------------+-----------+| (END) AWS User Notificationsã®èšå® AWS User Notificationsãèšå®ããŠãããŸãã Creating your first notification configuration in AWS User Notifications - AWS User Notifications Get started with User Notifications. docs.aws.amazon.com ä»åã¯ã以äžã®æµãã§èšå®ã宿œããŸãã éç¥èšå® éç¥ããã®èšå® é
ä¿¡ãã£ãã«ã®èšå® AWS User Notificationsã®ãããžã¡ã³ãã³ã³ãœãŒã«ã«ã¯ãç»é¢äžéšã®ä»¥äžããŒã¯ãã¯ãªãã¯ããããšã§é·ç§»ã§ããŸãã 1ïŒéç¥èšå® éç¥ãåãåããããµãŒãã¹ãšã€ãã³ãã«ãŒã«ã®èšå®ãè¡ããŸãã ãéç¥èšå®ãäœæããã¯ãªãã¯ããŸãã ãã¯ã€ãã¯ã»ããã¢ããããšãååãšèª¬æããèšå®ããŸãã ã¯ã€ãã¯ã»ããã¢ãããå©çšããããšã§ãè¿
éã«éç¥èšå®ãäœæããããšãã§ããŸãã ãã€ãã³ãã«ãŒã«ããèšå®ããŸãã ä»åã¯ãEC2ã«é¢ããAWS Health ã€ãã³ãã®éç¥ã®ã¿ãåãåãããã®ã§ãé«åºŠãªãã£ã«ã¿ãŒã§ä»¥äžã®jsonãèšè¿°ããŸããã { "source": [ "aws.health" ], "detail-type": [ "AWS Health Event" ], "detail": { "service": [ "EC2" ] } } ãéçŽèšå®ããšãé
ä¿¡ãã£ãã«ããèšå®ããŸãã éçŽèšå®ã§ã¯éç¥ã®åä¿¡é »åºŠãé
ä¿¡ãã£ãã«ã§ã¯éç¥ã®éä¿¡å
ãå®çŸ©ããŸãã é
ä¿¡ãã£ãã«ã§ã¯ããEã¡ãŒã«ãããAWSã³ã³ãœãŒã«ã¢ãã€ã«ã¢ããªããããã£ãããã£ãã«ããéžæå¯èœã§ãã é
ä¿¡ãã£ãã«ã¯åŸè¿°ã§èšå®ããããã詳现㯠3ïŒé
ä¿¡ãã£ãã«ã®èšå® ãã確èªãã ããã èšå®ãå®äºãããããéç¥èšå®ãäœæããã¯ãªãã¯ããŸãã ã€ãã³ãã«ãŒã«ã®ããªãŒãžã§ã³å¥ã®ã¹ããŒã¿ã¹ãããã¢ã¯ãã£ããã«ãªã£ãŠããŸãã 2ïŒé
ä¿¡ããã®èšå® éä¿¡ããã§ã¯ãéç¥ããŒã¿ã®ä¿åãåŠçããŸãã¯ã¬ããªã±ãŒããããç¹å®ã®ãªãŒãžã§ã³ãéžæããŸãã ä»åã¯ãæ±äº¬ãªãŒãžã§ã³(ap-northeast-1)ãéžæãããä¿åããŠç¶è¡ããã¯ãªãã¯ããŸãã Asia Pacific (Tokyo)ããã¢ã¯ãã£ããã«ãªã£ãŠããããšãããããŸãã 3ïŒé
ä¿¡ãã£ãã«ã®èšå® é
ä¿¡ãã£ãã«ã§ã¯éç¥å
ãèšå®ããŸãã ä»åã¯éç¥å
ã«ã¯Eã¡ãŒã«ãéžæããŸãã ãEã¡ãŒã«ã远å ããã¯ãªãã¯ããŸãã åä¿¡è
ã«ã¡ãŒã«ã¢ãã¬ã¹ãååã«ã¡ãŒã«ã¢ãã¬ã¹ã®ææè
ãããããããªååãèšå®ãããEã¡ãŒã«ã®è¿œå ããã¯ãªãã¯ããŸãã èšå®ããã¡ãŒã«ã¢ãã¬ã¹å®ã«AWSãã以äžã®ãããªã¡ãŒã«ãéä¿¡ãããŸãã å
容ã確èªã®äžããVerify emailããã¯ãªãã¯ããŸãã ãEã¡ãŒã«ãæ€èšŒãããŸããããšè¡šç€ºãããŸãã é
ä¿¡ãã£ãã«ã確èªãããšãå
ã»ã©ç»é²ããã¡ãŒã«ã¢ãã¬ã¹ã®æ€èšŒã¹ããŒã¿ã¹ããã¢ã¯ãã£ããã«ãªã£ãŠããŸãã ç»é²ããé
ä¿¡ãã£ãã«ãéç¥èšå®ã«èšå®ããŸãã éç¥èšå®ã®èšå®ç»é¢ã«ãŠããé
ä¿¡ãã£ãã«ããã¯ãªãã¯ããŸãã 远å ããé
ä¿¡ãã£ãã«ãéžæãããéç¥èšå®ãæŽæ°ããã¯ãªãã¯ããŸãã é
ä¿¡ãã£ãã«ãéç¥èšå®ã«è¿œå ãããŠããŸãã AWS User Notificationsã®èšå®ã¯ä»¥äžã§ãã ãŸãšã ä»åã¯ãAWS Health ã€ãã³ããEã¡ãŒã«ã§éç¥ã§ããããã«èšå®ãŸã§è¡ããŸããã ãã¹ãã®æ¹æ³ã«ã€ããŠãä»åŸãŸãšããããããšæã£ãŠãããŸãã EC2ã®AWS Health ã€ãã³ããEã¡ãŒã«ã§éç¥ã§ããããã«èšå®ããŸãããã UserNotificationsã¯ä»ã«ãCloudWatchãªã©ã«ã察å¿ããŠããã®ã§ãéçšæ©èœå®è£
æã«å€§å€åœ¹ç«ã€ãµãŒãã¹ã ãšæããŸãã çæ§ã®ã圹ã«ç«ã¡ãŸããããå¬ããã§ãã
SCSKã®çã§ãã6åç®ã®æçš¿ã§ãã ä»åãåŒãç¶ãã¢ããªã±ãŒã·ã§ã³ã«ãããæä»å¶åŸ¡ã®è©±é¡ã§ãããããã¢ããªã±ãŒã·ã§ã³åŽã®å®è£
ã«ãã©ãŒã«ã¹ããŠããŸãã ã¯ãã㫠第äžå ã§æŽçããŠããæä»å¶åŸ¡ã®èŠä»¶ã¯ä»¥äžã®éãã§ãã äž»ã«ããŒã¿ããŒã¹/DWH äžã®ããŒãã«ããŒã¿ã®ã¡ã³ããã³ã¹ã宿œããã¢ããªã±ãŒã·ã§ã³ 以äžã®èŠä»¶ã«åºã¥ããã¢ããªã±ãŒã·ã§ã³åŽã§æä»å¶åŸ¡ïŒããã¯ïŒãå®è£
ããŒãã«ããŒã¿ç·šéæã«ãããŒãã«åäœã§ã®æä»å¶åŸ¡ïŒããã¯ïŒãè¡ã å€éšããŒãæã€ããŒãã«ã®ããŒã¿ç·šéæã«ã¯ãå€éšããŒã®åç
§å
ããŒãã«ã«ã€ããŠãåãããŠæä»å¶åŸ¡ïŒããã¯ïŒãè¡ã 察象ããŒãã«ã®ã¹ããŒã¿ã¹ïŒç·šéç¶æ
ïŒã¯ DynamoDB ã§ç®¡çãã ã¹ããŒã¿ã¹ã®é·ç§»ïŒæŽæ°ïŒæã«ãDynamoDBãLambdaãAppSync ãçšããŠæä»å¶åŸ¡ïŒããã¯ïŒãè¡ã ãã2åã®ãšã³ããªã§ã¯äž»ã«4ç¹ç®ã®å
容ã«ã€ããŠèšèŒããŸããããä»åã¯2ç¹ç®ã®å
容ã«ã€ããŠèšèŒããŸãã ä»åã®æ¡ä»¶äºäŸã§ã¯ã2ç¹ç®ã®å
å®¹ãæºããèšèšã»å®è£
ãšããŠãå
·äœçã«ã¯ä»¥äžã®ãããªæ¹åŒãæ¡ããŸããã ããããŒãã«ããŠãŒã¶Aãç·šéäžã®å Žåã ãŠãŒã¶Aã«ã¯ããŒãã«ããŒã¿ã®ç·šéç»é¢ã衚瀺ãã ãã以å€ã®ãŠãŒã¶ã«ã¯ããŒãã«ããŒã¿ã®åç
§ç»é¢ã衚瀺ããïŒç·šéã¯ã§ããªãïŒ ãã®å ŽåãDynamoDB ã§ç®¡çãããŠããããŒãã«ã®ã¹ããŒã¿ã¹ãå
ã«ããŠãŒã¶æ¯ã«ã¢ããªã±ãŒã·ã§ã³åŽã§ç»é¢ãå¶åŸ¡ããããã«ãŒãã£ã³ã°ã倿Žãããããå¿
èŠããããŸãããã£ãŠããã®ã¹ããŒã¿ã¹ãã©ã®ããã«ã¢ããªã±ãŒã·ã§ã³å
ã§æ±ãããéèŠãªãã€ã³ããšãªã£ããããèæ
®ã»å·¥å€«ããç¹ã以äžã«èšèŒããŠãããããšæããŸãã ã¢ãŒããã¯ãã£æŠèŠ ãã¡ããèŒããŠãããŸãã æ¬æçš¿ã§èšåããã®ã¯ã»ãŒã¢ããªã±ãŒã·ã§ã³ïŒNuxt.jsïŒéšåã«ãªããŸãããã¡ããã¡ãã AppSync ã®è©±ãæžããŸãããªããæ¬æçš¿ã§ã¯ Nuxt.jsïŒVueïŒèªäœã®èª¬æã¯å²æããŸãããäºæ¿ãã ããã Amazon DynamoDB ããŒãã«ã®ã¹ããŒã¿ã¹ïŒç·šéç¶æ
ïŒç®¡ç AWS Lambda æä»å¶åŸ¡ãèæ
®ããããŒãã«ã®ã¹ããŒã¿ã¹æŽæ°ããžãã¯ã®å®è£
AWS AppSyncïŒAWS AmplifyïŒ äžèš Lambda ãã¢ããªã±ãŒã·ã§ã³äžããå®è¡ããããã®ã¹ããŒãå®çŸ© ã¢ããªã±ãŒã·ã§ã³ïŒNuxt.jsïŒ ããŒãã«ã®ã¹ããŒã¿ã¹ã«å¿ããç»é¢å¶åŸ¡ ããŒãã«ã®ã¹ããŒã¿ã¹ãã³ã³ããŒãã³ãéã§å
±æãã åé ã®ç¹°ãè¿ãã«ãªããŸãããããŒãã«ã®ã¹ããŒã¿ã¹ïŒç·šéç¶æ
ïŒãããŒã¹ã«ã¢ããªã±ãŒã·ã§ã³åŽã§ã«ãŒãã£ã³ã°ãç»é¢ã®å¶åŸ¡ãè¡ãå¿
èŠããããããåæ
å ±ã¯ã¢ããªã±ãŒã·ã§ã³å
ã®åã³ã³ããŒãã³ãããåç
§ã§ããããšãæãŸããã§ãããã®ãããªä»çµã¿ãã©ã®ããã«å®è£
ãããã¯ãã¬ãŒã ã¯ãŒã¯ã«æ ããŸãããNuxt3 ã®å Žå㯠useState ã䜿çšãããšæ¥œã«å®è£
ã§ããŸãã ãªããããŒãã«ã®ã¹ããŒã¿ã¹æ
å ±ããã¢ããªã±ãŒã·ã§ã³ã®ã©ã€ããµã€ã¯ã«ã«ãããŠé©åãªã¿ã€ãã³ã°ã§åæåããããšãéåžžã«éèŠãªã®ã§ããããã®è©±ã¯ãŸãå¥ã®ãšã³ããªã§è§ŠããããšæããŸããæãããã£ããã€ã³ãã®1ã€ã ã£ãã®ã§ã»ã» å®è£
ã«ããã£ãŠã¯ä»¥äžãµã€ãæ§ã®å
容ããšãŠãåèã«ãªããŸããã Nuxt3å
¥é(第8å) - Nuxt3ã®useStateã§ã³ã³ããŒãã³ãéã§ç¶æ
ãå
±æãã | è±èµããããããŒãµã€ã ååã¯Nuxt3ã§ãã©ã°ã€ã³ãããã«ãŠã§ã¢ã®å°å
¥ã«ã€ããŠèŠãŠããŸãããä»åã¯Nuxt3ãæäŸããç¶æ
管çã«ã€ããŠèŠãŠãããŸããNuxt2ã§ã¯ãã³ã³ããŒãã³ãéã§ç¶æ
ãå
±æããã«ã¯ãNuxt2ã«ãã³ãã«ãããŠããVuexã䜿ãã®ãäžè¬çã§ãã... developer.mamezou-tech.com 以äžå®è£
äŸã§ããcomposable ãšããŠå®è£
ããŠããŸãã import * as custom_queries from "@/src/graphql/customQueries"; import * as models from "@/src/API"; export type TableStatus = { status: models.TableStatus, editor: string, locked_by: string, } export const useTableStatus = () => { // stateã®å®çŸ© const TableStatusDict:Ref<{[key: string]: TableStatus}> = useState('g_TableStatusDict', () => ({})) // stateã®æŽæ°åŠç const updateTableStatusDict = async () => { const client = useNuxtApp().$Amplify.GraphQL.client; const result=await client.graphql({ query: custom_queries.listTablesCustom, }) let master_table_status:{[key: string]: TableStatus} = {} for (let item of result.data.listTableInfos.items) { master_table_status[item.name] = { 'status': item.status, 'editor': item.editor, 'locked_by': item.locked_by, } } TableStatusDict.value = master_table_status; } return { TableStatusDict: readonly(TableStatusDict), updateTableStatusDict: updateTableStatusDict, } } useState() ã§å®çŸ©ãããªããžã§ã¯ã㯠Nuxt3(Vue3) ã«ããã Ref ãšãªããããtypescript å
ã§ã¢ã¯ã»ã¹ããé㯠.value ãä»ããŠã¢ã¯ã»ã¹ããå¿
èŠããããŸãããŸããexport æã¯ readonly ãšããŠèªã¿åãå°çšãšããå
å®¹ã®æŽæ°ã¯å°çšã®ã¡ãœãããupdateTableStatusDictããéããŠã®ã¿å®è¡ããããã«ããŠããŸãã æŽæ°åŠçèªäœã¯ãååã®ãšã³ããªã§å®çŸ©ãã DynamoDB ã®ããŒãã«ã®å
容ã graphql çµç±ã§ååŸããŠããäžã§ãdict 圢åŒã«å€æããŠuseState() ã§å®çŸ©ãããªããžã§ã¯ããæŽæ°ããŠããã ãã§ããã ããŒãã«ã®ã¹ããŒã¿ã¹ãã¢ããªã±ãŒã·ã§ã³åŽã«ãªã¢ã«ã¿ã€ã åæ ãã ããŒãã«ã®ã¹ããŒã¿ã¹ã«ã€ããŠã¯ãªãã¹ããªã¢ã«ã¿ã€ã ã§ã¢ããªã±ãŒã·ã§ã³åŽã«åæ ã§ãããšãŠãŒã¶ããªãã£ã®èгç¹ããã¯æãŸããã®ã§ããããã®ãããªä»çµã¿ãèªåã§çšæããã®ã¯å®è£
é¢ã§ãªããªãããŒãã«ãé«ããšããã§ããããã§ä»åã¯ãAppSync ã® subscription ã䜿çšããããã·ã¥éç¥ã«ãããªã¢ã«ã¿ã€ã æŽæ°ãæ¡çšããŸããããã®ä»çµã¿ã«ããã¹ããŒã¿ã¹ã®åæ åŠçã®å€§å¡ãä»»ããããšãã§ããŠå®è£
ãæ¥œã«ãªã£ãã®ã§ãæ£ã«äžç³äºé³¥ã§ããããã®ä»çµã¿ã䜿ããããæ
ã«ä»å AppSync ã䜿çšãããšèšã£ãŠãéèšã§ã¯ãªããããããŸããã subscription ã«ã€ããŠã¯ãå¹³éãããå·çãããçŽ æŽããããšã³ããªããããŸãã®ã§ãã¡ããåãããŠãåç
§ãã ãããç§èªèº«ã倧ãã«åèã«ãããŠé ããŸããã AWS AppSync ã䜿ã£ãŠ React ã¢ããªããããã¯ããéåæãžã§ãã®çµæãããã·ã¥éç¥ã§åãåã éåæãžã§ããå®è¡ããåŸãçµæãã©ãåãåããïŒãšããã®ã¯éçºè
ãšããŠäœã蟌ã¿ç²æã®ããããŒãã§ããä»å㯠React ã¢ããªãéåæãžã§ããå®è¡ããåŸã«ãAWS AppSync çµç±ã§ãžã§ãå®äºã®ããã·ã¥éç¥ãåãåãä»çµã¿ã玹ä»ããŸãã blog.usize-tech.com 2022.12.01 以äžãschema.graphql ãã¡ã€ã«ã«ãããå®è£
äŸã§ãã type Subscription { onStatusChangeTableWithLock: ResultTableStatus @aws_subscribe(mutations: ["ChangeTableStatusWithLock"]) @aws_api_key @aws_iam } ä»å subscription ãèšå®ãããã®ã¯ãååã®ãšã³ããªã§äœæããã¹ããŒã¿ã¹æŽæ°çšã® mutation (ChangeTableStatusWithLock) ãšãªãã®ã§ãããã3è¡ç®ã®ãmutations:ãã§æå®ãããªã¹ãå
ã§å®çŸ©ããã° OK ã§ãããªã¹ãå
ã«è€æ°ã® mutation ãæå®ããŠãåäžã® subscription ã«å¯Ÿå¿ãããããšãå¯èœã§ãã 以äžå®è£
äŸã§ãããã¡ãã¯ãã¡ã³ããã³ã¹å¯Ÿè±¡ã®ããŒãã«äžèЧã衚瀺ããããã®ã¡ãã¥ãŒçš component å
ã®ã¡ãœãããšããŠå®çŸ©ããŠãããonMounted() ã®ã¿ã€ãã³ã°ã§å®è¡ããããã«ããŠããŸãã const subscribeTableList = async () => { varSubscriptionStatus.value = client .graphql({ query: subscriptions.onStatusChangeTableWithLock }) .subscribe({ next: async (data: any) => { await updateTableStatusDict() await updateTableMenu() }, error: (error: any) => console.warn(error) }); } onMounted(async () => { await updateTableMenu(); await subscribeTableList(); }); ãªãã subscription ã®è¿ãå€ã¯ãmutations:ãã§æå®ãã mutation ãšåäžã§ãªããšãããªãç¹ã«æ³šæããŠãã ããã mutation ãè€æ°æå®ããå Žåãåæ§ã§ãã ãã£ãŠãä»åã®å®è£
ã«ãããŠã¯ã¢ããªã±ãŒã·ã§ã³åŽã§ãã® subscription ã«ããããã·ã¥éç¥ãåãåã£ãåŸã«ã1ã€åã®ã»ã¯ã·ã§ã³ã§èšèŒãããããªããŒãã«ã¹ããŒã¿ã¹æŽæ°çšã®ã¡ãœãããå®è¡ããå¿
èŠããããŸãããã® subscription ã®åœ¹å²ã¯ãããŸã§ããããã®ããŒãã«ã®ã¹ããŒã¿ã¹ã«æŽæ°ããã£ãããšãŸã§ã§ãåããŒãã«ã®ã¹ããŒã¿ã¹ã¯æ¹ããŠååŸããå¿
èŠããããšããããšã§ããã åååã³ä»åã®å®è£
äŸã«ãããæ¹åç¹ããããšãããšããã®è¿ãå€ã§ãã ResultTableStatus ã«ããŒãã«ã¹ããŒã¿ã¹æŽæ°çšã®ã¡ãœããã®è¿ãå€ãšåããããªæ
å ±ãå«ãããã«ããã°ãAppSync API ã®ã³ãŒã«æ°ã1åæžã£ãŠããå¹ççã«ãªã£ããšãããšããã§ããããããã¡ãããã®å Žå㯠composable ã®ä»æ§ã«ã€ããŠãèŠçŽãå¿
èŠããããŸããã ã»ããã¡ãã¥ãŒç»é¢ã«ããŒãã«ã®ã¹ããŒã¿ã¹ã衚瀺ããŠããéœåäžç»é¢ãæŽæ°ããå¿
èŠãããããããã®ããã®é¢æ°ãupdateTableMenu()ããåãããŠå®è¡ããŠããŸããïŒå颿°ã®å
容ã«ã€ããŠã¯ä»åè§ŠããŸããïŒ aws-amplify ã® SSR (Nuxt3ïŒå¯Ÿå¿ æåŸã«ãæ¬çãšã¯å°ãç°ãªã話é¡ã«ãªããŸããè§ŠããŠããããšæããŸãã ä»å㯠Web ã¢ããªã±ãŒã·ã§ã³ãã¬ãŒã ã¯ãŒã¯ãšã㊠Nuxt3 ã䜿çšããŠããé¢ä¿äžãã¬ã³ããªã³ã°ã¢ãŒããšã㊠SSR (Server-Side Rendering) ã䜿çšããŠããŸãããã®ãããå³å¯ã«ã¯å®è£
次第ã§ã¯ãããŸãããaws-amplify ã¢ãžã¥ãŒã«ã®å颿°ãã¯ã©ã€ã¢ã³ããµã€ãã ãã§ãªãããµãŒããµã€ãã§ãå®è¡ããåŸãŸããããããaws-amplify ã¯åå React ã Vue ãªã©ã® SPA (Single-Page Application) ã§äœ¿çšããããšãåæã®ãããNuxt3 (Nuxt.js) ã«ãã㊠SSR 察å¿ãããããã«ã¯å¥éæºåãå¿
èŠãšãªããŸãã ãªããNext.js ã¯äžèš URL ãèŠãéããããŒãžã§ã³çžãã¯ãããã®ã®ãµããŒããããŠããããã§ãã Use Amplify categories APIs from Next.js - Next.js - AWS Amplify Gen 1 Documentation Use Amplify categories APIs from Next.js server-side runtimes. AWS Amplify Documentation docs.amplify.aws å
·äœçã«ã¯ãNuxt3 ã® plugin ã䜿çšããŠãã¯ã©ã€ã¢ã³ããµã€ããšãµãŒããµã€ãã§äœ¿çšãã aws-amplify ã®ã€ã³ã¿ãŒãã§ãŒã¹ïŒé¢æ°ïŒãããããåããŠå®çŸ©ãããããªåœ¢åŒã«ãªããŸãããã ããµãŒããµã€ãã§äœ¿çšã§ããæ©èœã¯éå®ãããŠããããçæãå¿
èŠã§ãã詳现ã¯ä»¥äž URL ãåç
§ãã ããã Use Amplify categories APIs from Nuxt 3 - Next.js - AWS Amplify Gen 1 Documentation Use Amplify categories APIs from Nuxt 3 AWS Amplify Documentation docs.amplify.aws ãªãã1ã€ç®ã®ã»ã¯ã·ã§ã³ã§ç€ºããå®è£
äŸããäžèšã®éã plugin å
ã§åæåãã graphql ã® client ã䜿çšããŠããŸãããã®ãããã³ãŒãå
ã§ aws-amplify ã¢ãžã¥ãŒã« ã import ããŠããŸããããã® composable ã¯å®è£
äžã¯ã©ã€ã¢ã³ããµã€ã/ãµãŒããµã€ãäž¡æ¹ã§å®è¡ããåŸãããããããŸã§èšèŒãããããªå¯Ÿçãå¿
èŠãšãªããŸãã æ¬ä»¶ã¯ã詳现ã«èžã¿èŸŒãããšãããš aws-amplify ã¢ãžã¥ãŒã«ã®åæèšå®ã«ãé¢é£ãã話ã«ãªãããããŸãå¥ã®ãšã³ããªã§æ¹ããŠèª¬æãã圢ã«ãããŠé ãããšæããŸããå
容ãšããŠã¯å
¬åŒ URL ãããçšåºŠãªãã圢ã«ã¯ãªããŸãããã ãŸãšã ãããã®ã»ã¯ã·ã§ã³ã®å
容ãã¢ããªã±ãŒã·ã§ã³ã®èšèšã»å®è£
äžã¯éèŠãªèŠçŽ ã ã£ããšæããŠããŸããç¹ã«ãaws-amplify ã® SSR 察å¿ã«ã€ããŠã¯ã¢ããªã±ãŒã·ã§ã³éçºåœåã«èª¿ã¹ãŠããå
容ãªã®ã§ããã調æ»ã®éçšã§ã¢ããªã±ãŒã·ã§ã³ãã¬ãŒã ã¯ãŒã¯èªäœã®æåã SPA ãšã®å·®ç°ãªã©ãä»ã®éèŠãªç¥èã«ã€ããŠãããçšåºŠç¥ãããšãã§ããã®ã仿¯ãè¿ããšãšãŠãè¯ãã£ãã§ãã 第ååãæžããã¯çŸæç¹ã§ã¯æªå®ã§ãããæžãå Žå㯠Nuxt.js ã«ãããå
·äœçãªã«ãŒãã£ã³ã°ã®å®è£
äŸã«ã€ããŠå¹Ÿã€ãèšèŒããŠã¿ãããšæããŸãã æ¬èšäºã®å
容ãã©ãªããã®åœ¹ã«ç«ãŠã°å¹žãã§ãã
ããã«ã¡ã¯ãåºéã§ãã React ã¢ããªããå®è¡ã§ãã Amazon DynamoDB ãžã®ããŒã¿ã€ã³ããŒãç»é¢ãäœæãããšãã®è©±ã§ãã ã€ã³ãããããããŒã¿éã¯å°ãªãã®ã§ãããããŒã¿ãå å·¥ãããããŒã¿ãã AI ãµãŒãã¹ã䜿çšããŠããã«ããŒã¿ãäœæãããããªããã°ãªããªãã£ãã®ã§ãè£ã§ AWS Step Functions ã¹ããŒããã·ã³ã䜿çšããŸããAWS AppSync ãã Mutation ã§ã€ã³ããŒãããŒã¿ãã¹ããŒããã·ã³ã«æž¡ããéå§ãããä»çµã¿ãäœæããŸãããããã§ AWS AppSync ã® HTTP ãªãŸã«ããšããèšå®ã䜿ããŸããããå°ã工倫ãå¿
èŠãªé¢ããã£ãã®ã§ç޹ä»ããŸãã ã€ãã£ããã® äž»ã«ã以äžã®å³ã® ç·è²ã®ç· ã®éšåã説æããŸãã AWS AppSync ãžã®åœä»€ã¯ Mutation ã«ããŸããããQuery ã§ãåããšæããŸãããã ãããŒã¿ãååŸããã®ãç®çã§ã¯ãªãã£ãã®ã§ Mutation ã«ããŸããã HTTP ãªãŸã«ãããå®è¡ããã¢ã¯ã·ã§ã³ã¯ states:StartExecution ã䜿çšããŸããAWS AppSync ã¯ã¹ããŒããã·ã³ãéå§ããããäžæŠåœ¹ç®ã¯çµäºã§ãã以éãçµæã¯éåæã«éç¥ããã仿§ãšããŸããâ»æ¬èšäºã§ã¯èšåããŸããã AWS AppSync ã«ã¯äž»ã«ããŒã¿ããŒã¹ãšæ¥ç¶ããããã®å°çšãªãŸã«ããçšæãããŠããŸããããã以å€ã® AWS ãµãŒãã¹ãåŒã³åºãã«ã¯ HTTP ãªãŸã«ãã䜿çšããŸããåŒã³åºãã®ã«å¿
èŠãª Sigv4 ãšåŒã°ãã眲åããã»ã¹ãèªåã§å®æœããŠãããŸãã AWS AppSync での HTTP リゾルバーの使用 - AWS AppSync AWS AppSync ã® HTTP ãªãŸã«ããŒã®ãã¥ãŒããªã¢ã«ã docs.aws.amazon.com 以éãå¿
èŠãªèšå®ã玹ä»ããŸãã AWS AppSync ã¹ããŒã äŸãšããŠãstartImportJob ãšãã Mutation ãäœæããdata ãšãã string åã®ããŒã¿ãããåãããç°¡åãªèšå®ã«ããŠããŸãã type ImportData { data: String } type Mutation { startImportJob(data: String!): ImportData } schema { query: Query mutation: Mutation subscription: Subscription } AWS AppSync ããŒã¿ãœãŒã¹ AWS Step Functions ã¹ããŒããã·ã³ãããŒã¿ãœãŒã¹ãšèŠç«ãŠãŠãèšå®ããŸããã¿ã€ã㯠HTTP ã«ããŸãããã®ããŒã¿ãœãŒã¹ã«é¢é£ä»ãã IAM ããŒã«ãå¥éäœæããå¿
èŠããããŸããä»åã¯ãAWS AppSync ã states:StartExecution ãå®è¡ã§ããæš©éããããã°è¯ãã§ãã AWS AppSync ãªãŸã«ã ä»å㯠JavaScript ãªãŸã«ãã䜿çšããŠããŸãã import { util } from '@aws-appsync/utils'; export function request(ctx) { return { method: 'POST', params: { headers: { 'Content-Type': 'application/x-amz-json-1.0', 'x-amz-target': 'AWSStepFunctions.StartExecution' }, body: { 'stateMachineArn': 'arn:aws:states:ap-northeast-1:231376435333:stateMachine:xxxxxxxxxxx', 'input': JSON.stringify({ "data": ctx.args.data, //ã¢ããªããæž¡ãããåŒæ° "username": ctx.identity.claims.email //emailã¢ãã¬ã¹ãIDããŒã¯ã³ããååŸããŠãã }) } }, resourcePath: '/' }; } export function response(ctx) { if (ctx.error) { util.error(ctx.error.message, ctx.error.type); } return { "data": JSON.stringify({ "statusCode": ctx.result.statusCode, //ã¹ããŒããã·ã³ã®å®è¡çµæ "result": JSON.parse(ctx.result.body) //çµæã¡ãã»ãŒãž }) } } ã¹ããŒããã·ã³ã«æž¡ããã©ã¡ãŒã¿ã説æããŸãã headers ã®éšåã¯ãã®ãŸãŸã«ããŸãã body.stateMachineArn ã«ã¯åŒã³åºãããã¹ããŒããã·ã³ã® ARN ãå
¥ããŸãã body.input ã«å
¥ããããŒã¿ãããã®ãŸãŸã¹ããŒããã·ã³ãžã® input ã«ãªããŸãããã ããæ ŒçŽããããŒã¿ã¯ JSON.stringify ã§æåååãã JSON ããŒã¿ã«å€æããå¿
èŠããããŸãã(VTL ã®å Žåã$util.toJson ã䜿çšããŸã) ã¬ã¹ãã³ã¹ã«ã€ããŠèª¬æããŸãã ãããããå®çŸ©ããŠãã data (string å) 倿°ã䜿çšããŠã¢ããªã«çµæãæ»ããŸãããã®ãããæ»ãã®ããŒã¿ã JSON.stringify ã§æåååããŠããŸããAWS Step Functions ããæ»ã£ãŠããçµæã¯ãctx.result ã«å
¥ããŸãããšã©ãŒããããšãctx.result.statusCode ã 200 以å€ã«ãªããŸãããšã©ãŒã®å
容㯠ctx.result.body ã«å
¥ã£ãŠããã®ã§ãããããã JSON ãªããžã§ã¯ãã§ã¯ãªãæåååããã JSON ã§æ ŒçŽãããŠããã®ã§ãctx.result.body ã JSON.parse ããã㊠JSON ãªããžã§ã¯ããšããŠèªã¿åããç¶æ
ã«å€æããŠããŸããããã㊠statusCode ãšããŒãžããã JSON ã stringify ãããŠè¿ãããšããåŠçã«ããŠããŸããåœåããã§çµæãèªã¿åãããšãã§ãããèŠåŽããŸããã ãã®åŒã³åºãæ¹ã¯ã説æã¯éã§ããã以äžã® AWS ããã°ã«æžããŠãããŸããã Invoking AWS Step Functions short- and long-running workflows from AWS AppSync | Amazon Web Services AWS AppSync is a fully managed GraphQL service allowing developers to easily build GraphQL APIs. AWS AppSync lets develo... aws.amazon.com React React ã¢ããªåŽã® GraphQL ã³ãŒããæžããŠãããŸãã import { generateClient } from 'aws-amplify/api'; import gql from 'graphql-tag'; //create AppSync client const client = generateClient(); //ã€ã³ããŒããžã§ãéå§é¢æ° const startImportJob = async (data) => { const mutateImportJob = gql` mutation startImportJob($data: String!) { startImportJob(data: $data) { data } } `; const res = await client.graphql({ query: mutateImportJob, variables: { data: data } }); return JSON.parse(res.data.startImportJob.data); //æåååãããJSONãè¿ãããã®ã§parseããŠãã }; export { startImportJob }; AWS CloudFormation ãã³ãã¬ãŒã æç²ã§ãããé¢é£ããéšåã®ãã³ãã¬ãŒãã貌ã£ãŠãããŸãã詳现ãªèšå®ã¯ãã¡ããã芧ãã ãããAWS Step Functions ã¯çç¥ããŠããŸããæ€èšŒãã AWS AppSync ã Amazon Cognito ãŠãŒã¶ãŒããŒã«ã§èªèšŒããã¿ã€ãã«ãªã£ãŠããã®ã§ããã®èšè¿°ãçŽã蟌ãã§ããŸãã AWSTemplateFormatVersion: 2010-09-09 Description: The CloudFormation template that creates an AppSync API to start a Step Functions state machine and relevant IAM roles. # ------------------------------------------------------------# # Input Parameters # ------------------------------------------------------------# Parameters: SubName: Type: String Description: System sub name that is used for all deployed resources. (e.g. prod or dev) Default: dev MaxLength: 10 MinLength: 1 Resources: # ------------------------------------------------------------# # AppSync # ------------------------------------------------------------# AppSyncApi: Type: AWS::AppSync::GraphQLApi Description: AppSync API for example Properties: Name: !Sub example-${SubName} AuthenticationType: AMAZON_COGNITO_USER_POOLS AdditionalAuthenticationProviders: - AuthenticationType: AWS_IAM UserPoolConfig: UserPoolId: xxxxx //Cognitoã®ãŠãŒã¶ãŒããŒã«ID ãå
¥ãã AwsRegion: !Sub ${AWS::Region} DefaultAction: "ALLOW" IntrospectionConfig: DISABLED LogConfig: CloudWatchLogsRoleArn: !GetAtt AppSyncCloudWatchLogsPushRole.Arn ExcludeVerboseContent: true FieldLogLevel: ALL Visibility: GLOBAL XrayEnabled: true Tags: - Key: Cost Value: !Sub example-${SubName} DependsOn: - AppSyncCloudWatchLogsPushRole AppSyncSchema: Type: AWS::AppSync::GraphQLSchema Properties: ApiId: !GetAtt AppSyncApi.ApiId Definition: | schema { query: Query mutation: Mutation subscription: Subscription } type ImportData { data: String } type Mutation { startImportJob(data: String!): ImportData } DependsOn: - AppSyncApi AppSyncDataSourceStateMachines: Type: AWS::AppSync::DataSource Properties: ApiId: !GetAtt AppSyncApi.ApiId Name: !Sub example${SubName}StateMachines Description: AppSync DataSource to call State Machines. Type: HTTP ServiceRoleArn: !GetAtt AppSyncStepFunctionsRole.Arn HttpConfig: Endpoint: !Sub https://states.${AWS::Region}.amazonaws.com/ AuthorizationConfig: AuthorizationType: AWS_IAM AwsIamConfig: SigningRegion: !Ref AWS::Region SigningServiceName: states DependsOn: - AppSyncApi - AppSyncStepFunctionsRole AppSyncResolverStartImportJob: Type: AWS::AppSync::Resolver Properties: ApiId: !GetAtt AppSyncApi.ApiId TypeName: Mutation FieldName: startImportJob DataSourceName: !GetAtt AppSyncDataSourceStateMachines.Name Kind: UNIT Runtime: Name: APPSYNC_JS RuntimeVersion: 1.0.0 Code: | import { util } from '@aws-appsync/utils'; export function request(ctx) { return { method: 'POST', params: { headers: { 'Content-Type': 'application/x-amz-json-1.0', 'x-amz-target': 'AWSStepFunctions.StartExecution' }, body: { 'stateMachineArn': 'arn:aws:states:ap-northeast-1:231376435333:stateMachine:example-xxxxx', 'input': JSON.stringify({ "data": ctx.args.data, "username": ctx.identity.claims.email }) } }, resourcePath: '/' }; } export function response(ctx) { if (ctx.error) { util.error(ctx.error.message, ctx.error.type); } return { "data": JSON.stringify({ "statusCode": ctx.result.statusCode, "result": JSON.parse(ctx.result.body) }) } } DependsOn: - AppSyncDataSourceStateMachines # ------------------------------------------------------------# # AppSync CloudWatch Invocation Role (IAM) # ------------------------------------------------------------# AppSyncCloudWatchLogsPushRole: Type: AWS::IAM::Role Properties: RoleName: !Sub example-AppSyncCloudWatchLogsPushRole-${SubName} Description: This role allows AppSync to push logs to CloudWatch Logs. AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: - appsync.amazonaws.com Action: - sts:AssumeRole Path: / ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AWSAppSyncPushToCloudWatchLogs # ------------------------------------------------------------# # AppSync Step Functions Invocation Role (IAM) # ------------------------------------------------------------# AppSyncStepFunctionsRole: Type: AWS::IAM::Role Properties: RoleName: !Sub example-AppSyncStepFunctionsRole-${SubName} Description: This role allows AppSync to invoke Step Functions. AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: - appsync.amazonaws.com Action: - sts:AssumeRole Path: / Policies: - PolicyName: !Sub example-AppSyncStepFunctionsPolicy-${SubName} PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: - "states:StartExecution" Resource: - "arn:aws:states:ap-northeast-1:231376435333:stateMachine:example-xxxxx" ãŸãšã ãããã§ããã§ããããïŒ æéã®ãããåŠçã AWS AppSync ã®è£åŽã§ AWS Step Functions ãéåæå®è¡ãããã®ã«æŽ»çšã§ãããšæããŸãããã¡ãããAWS AppSync ã®ã¿ã€ã ã¢ãŠãç¯å²å
ã§çµããããšã確å®ãªåŠçã§ããã°åæåŠçã«ããŠããŸã£ãŠãããã§ãããã æ¬èšäºãçæ§ã®ã圹ã«ç«ãŠãã°å¹žãã§ãã