SCSKクラりド゜リュヌションのブログ - TECH PLAY

TECH PLAY

SCSKクラりド゜リュヌション

SCSKクラりド゜リュヌション の技術ブログ

å…š1268ä»¶

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 のタむムアりト範囲内で終わるこずが確実な凊理であれば同期凊理にしおしたっおもよいでしょう。 本蚘事が皆様のお圹に立おれば幞いです。