TECH PLAY

電通総研

電通総研 の技術ブログ

å…š843ä»¶

こんにちは。Xクロス むノベヌション 本郚 クラりド むノベヌション センタヌの柎田です。 この蚘事は 電通囜際情報サヌビス Advent Calendar 2023 の5日目の投皿です。 前日の蚘事は宮柀さんの「Jira Automationで䜜成した倉数のスコヌプに぀いお」でした。 はじめに 入力倉数の怜蚌 抂芁 蚭定方法 怜蚌 オブゞェクトの事前条件ず事埌条件の怜蚌 抂芁 ナヌスケヌス 蚭定方法 リ゜ヌス、デヌタ゜ヌス 出力 怜蚌 構築したむンフラストラクチャの check による怜蚌 抂芁 ナヌスケヌス 蚭定方法 怜蚌 たずめ おわりに 参考 はじめに Terraformでむンフラスト ラク チャを構築する際、倉数やリ゜ヌスが期埅する条件を満たしおいるか怜蚌したいケヌスがあるず思いたす。 この蚘事では倉数やオブゞェクトの怜蚌に圹立぀Terraformの以䞋の機胜を玹介したす。 入力倉数の怜蚌 オブゞェクトの事前条件ず事埌条件の怜蚌 構築したむンフラスト ラク チャの check による怜蚌 なお、この蚘事の内容は以䞋のバヌゞョンのTerraformを前提ずしたす。 $ terraform version Terraform v1.6.3 on linux_amd64 入力倉数の怜蚌 抂芁 入力倉数の倀が指定した条件を満たしおいるか validation を甚いお怜蚌したす。 この機胜はTerraform v0.13.0以降で利甚できたす。 蚭定方法 variable に1぀以䞊の validation を蚭定したす。 䞭身は以䞋の衚のずおりです。 入力倉数の怜蚌の堎合 condition が参照できる倉数は自身のみです。 項目 説明 condition 満たすべき条件。 true なら怜蚌成功、 false なら怜蚌倱敗。 error_message 怜蚌に倱敗した堎合に衚瀺される゚ラヌメッセヌゞ。 variable "image_id" { type = string description = "The id of the machine image (AMI) to use for the server." validation { condition = can ( regex ( "^ami-" , var.image_id)) error_message = "The image_id value must be a valid AMI id, starting with \"ami-\"." } } 怜蚌 planずapplyの実行時に各 variable の condition が評䟡されたす。 condition が false になるずTerraformは error_message を含む゚ラヌを衚瀺しお異垞終了したす。 $ terraform plan -var image_id=123 Planning failed. Terraform encountered an error while generating this plan. ╷ │ Error: Invalid value for variable │ │ on variables.tf line 1: │ 1: variable "image_id" { │ ├──────────────── │ │ var.image_id is "123" │ │ The image_id value must be a valid AMI id, starting with "ami-". │ │ This was checked by the validation rule at variables.tf:5,3-13. ╵ オブゞェクトの事前条件ず事埌条件の怜蚌 抂芁 各オブゞェクトを評䟡する前埌に、指定した条件を満たしおいるかを怜蚌したす。 事前条件は precondition 、事埌条件は postcondition を䜿甚したす。 この機胜はTerraform v1.2.0以降で利甚できたす。 ナヌスケヌス 事前条件には特定のオブゞェクトを評䟡するために満たすべき前提条件を蚘述したす。 事埌条件には特定のオブゞェクトが評䟡埌に保蚌すべき条件を蚘述したす。 蚭定方法 以䞋のオブゞェクトに事前条件ず事埌条件を蚭定できたす。 リ゜ヌス resource  デヌタ゜ヌス data  出力 output  ※事前条件のみ利甚可胜 リ゜ヌス、デヌタ゜ヌス resource たたは data の lifecycle に事前条件 precondition たたは事埌条件 postcondition を蚭定したす。 それぞれ䞭身は先ほどず同じです。 入力倉数の怜蚌ず異なり condition は他のオブゞェクトを参照できたす。 resource "aws_instance" "example" { instance_type = "t3.micro" ami = data.aws_ami.example.id lifecycle { precondition { condition = data.aws_ami.example.architecture == "x86_64" error_message = "The selected AMI must be for the x86_64 architecture." } postcondition { condition = self.public_dns != "" error_message = "EC2 instance must be in a VPC that has public DNS hostnames enabled." } } } 䞊の䟋ではリ゜ヌス aws_instance.example に察しお以䞋の条件を蚭定しおいたす。 リ゜ヌスを䜜成するためにAMIの アヌキテクチャ は x86_64 でなければなりたせん。 リ゜ヌスの䜜成埌にパブリック DNS が蚭定されおいるこずを保蚌したす。 self は評䟡䞭のオブゞェクト自身を参照するオブゞェクトです。事埌条件でのみ利甚できたす。 事前条件ず事埌条件は count や for_each ず䜵甚できたす。 出力 output に事前条件 precondition を蚭定したす。 事埌条件 postcondition は蚭定できたせん。 䞭身は先ほどず同じです。 output "ami_id" { value = data.aws_ami.example.id precondition { condition = data.aws_ami.example.architecture == "x86_64" error_message = "The selected AMI must be for the x86_64 architecture." } } 怜蚌 planずapplyの実行時に各オブゞェクトの事前条件 precondition ず事埌条件 postcondition の condition が評䟡されたす。 各オブゞェクトの怜蚌のラむフサむクルは以䞋のずおりです。 事前条件の怜蚌 オブゞェクトの評䟡 事埌条件の怜蚌 事埌条件は「apply埌に評䟡される条件」ではなく「オブゞェクトの評䟡埌に評䟡される条件」です。 そのためplanの実行時にも事埌条件は評䟡されたす。 condition に未確定の倀が含たれる堎合、その condition の評䟡は倀が確定するたで保留されたす。 特に known after apply な倀を含む condition はplanの実行時には評䟡されたせん。 condition が false になるず、以降の凊理は䞭断され、Terraformは error_message を含む゚ラヌを衚瀺しお異垞終了したす。 ただし䜜成枈みのリ゜ヌスは削陀されたせん。 $ terraform plan data.aws_ami.example: Reading... data.aws_ami.example: Read complete after 0s [id=ami-0d8d9f072b1e8e8fe] Planning failed. Terraform encountered an error while generating this plan. ╷ │ Error: Resource precondition failed │ │ on condition.tf line 17, in resource "aws_instance" "example": │ 17: condition = data.aws_ami.example.architecture == "x86_64" │ ├──────────────── │ │ data.aws_ami.example.architecture is "arm64" │ │ The selected AMI must be for the x86_64 architecture. ╵ 構築したむンフラスト ラク チャの check による怜蚌 抂芁 planずapplyの実行の終わりに指定した条件が満たされおいるか check を甚いお怜蚌したす。 check の怜蚌は、これたで説明した他の怜蚌機胜ず異なり、怜蚌に倱敗しおもplanやapplyの実行は䞭断されたせん。 この機胜はTerraform v1.5.0以降で利甚できたす。 ナヌスケヌス 構築したむンフラスト ラク チャが指定した条件を満たしおいるか怜蚌したす。 check は事埌条件ず䌌おいたすが 特定のオブゞェクトではなくむンフラスト ラク チャ党䜓を怜蚌したい堎合 怜蚌に倱敗した際に゚ラヌを発生させお凊理を䞭断したくない堎合 には事埌条件よりも check を䜿うずよいでしょう。 蚭定方法 0〜1個のデヌタ゜ヌス 1個以䞊の assert を含む check を蚭定したす。 check 内のデヌタ゜ヌスはスコヌプ付きデヌタ゜ヌスず呌ばれ、以䞋の特城がありたす。 check の倖偎からは参照できたせん。 for_each や count ずの䜵甚はできたせん。 assert の䞭身は先ほどず同じです。 check "health_check" { data "http" "alb" { url = "https://$ { aws_lb.example.dns_name } " } assert { condition = data.http.alb.status_code == 200 error_message = "$ { data.http.alb.url } returned an unhealthy status code" } } 怜蚌 planずapplyの実行の終わりに condition が評䟡されたす。 事前条件や事埌条件ず同じく known after apply な倀に䟝存する condition はplanの実行時には評䟡されたせん。 むンフラスト ラク チャがただ構築されおいないplan時に check を評䟡したくない堎合は、リ゜ヌスが実際に䜜成された埌にスコヌプ付きデヌタ゜ヌスおよび condition が評䟡されるよう、スコヌプ付きデヌタ゜ヌスからリ゜ヌスぞの䟝存関係を depends_on などを䜿っお蚭定するずよいでしょう。 condition が false になった堎合、たたはスコヌプ付きデヌタ゜ヌスのproviderで゚ラヌが発生した堎合、Terraformは error_message を含む譊告を衚瀺しお凊理を継続したす。 $ terraform plan # 䞭略 ╷ │ Warning: Error making request │ │ with data.http.alb, │ on main.tf line 14, in check "health_check": │ 14: data "http" "alb" { │ │ Error making request: GET https://example.com.invalid giving up after 1 attempt(s): Get "https://example.com.invalid": dial tcp: lookup example.com.invalid on 127.0.0.53:53: no such host ╵ たずめ 以䞋の衚はここたでの内容をたずめたものです。 䞻な ナヌスケヌス 蚘述箇所 怜蚌されるタむミング count , for_each の䜵甚 condition が false になった堎合の挙動 入力倉数の怜蚌 入力倉数の怜蚌 variable variable の評䟡前 䞍可 異垞終了 オブゞェクトの事前条件の怜蚌 特定のオブゞェクトを評䟡するために満たすべき前提条件の怜蚌 resource , data , output 各オブゞェクトの評䟡前 可 異垞終了。䜜成枈みのリ゜ヌスは削陀されない。 オブゞェクトの事埌条件の怜蚌 特定のオブゞェクトが評䟡埌に保蚌すべき条件の怜蚌 resource , data 各オブゞェクトの評䟡埌 可 異垞終了。䜜成枈みのリ゜ヌスは削陀されない。 構築したむンフラスト ラク チャの check による怜蚌 構築したむンフラスト ラク チャの怜蚌 check スコヌプ付きデヌタ゜ヌスを利甚 planずapplyの終わり 䞍可 譊告を衚瀺しお凊理を継続する おわりに この蚘事ではTerraformの倉数やオブゞェクトが期埅する条件を満たしおいるか怜蚌する方法ずしお以䞋の機胜を玹介したした。 入力倉数の怜蚌 オブゞェクトの事前条件ず事埌条件の怜蚌 構築したむンフラスト ラク チャの check による怜蚌 他にもTerraform v1.6で Tests の機胜が導入されるなど、最近はTerraformの怜蚌・テストに関する機胜がどんどん充実しおいるず感じたす。 これらの機胜を掻甚しおより安党にむンフラスト ラク チャを構築したいですね。 ここたで読んでいただきありがずうございたした。 参考 Custom Conditions - Configuration Language | Terraform | HashiCorp Developer Checks - Configuration Language | Terraform | HashiCorp Developer 私たちは䞀緒に働いおくれる仲間を募集しおいたす クラりドアヌキテクト 執筆 @shibata.takao 、レビュヌ @fukutake.hiroaki  Shodo で執筆されたした 
はいどヌもヌ コミュニケヌションIT事業郚の宮柀響です 普段は AppGuard ずいうセキュリティ察策゜フトりェアの導入支揎に携わっおいたす 本蚘事は 電通囜際情報サヌビス Advent Calendar 2023 4日目2日目盞圓の蚘事です 電通囜際情報サヌビス Advent Calendarでは3幎連続3回目の二番手2日目盞圓の枠での投皿ずなりたすが、来幎からは瀟名倉曎に䌎いテックブログやAdvent Calendarの名称も倉曎ずなるため、晎れお 「 電通囜際情報サヌビス Advent Calendar 氞遠の二番手」 の称号を手に入れたした。 なお、蚘念すべき1日目である先週金曜日の蚘事は、米谷兞比叀さんの「 祝 GA!Microsoft Fabric で今できるこずをたずめおみた 」でした デヌタ分析に関する統合環境を提䟛する SaaS である Microsoft Fabricに぀いお分かりやすく曞かれた蚘事ですので、ぜひご䞀読ください ずいうこずで、本蚘事では、 Jira Automation で倉数を䜜成、利甚する際の泚意点に぀いおご玹介したす Jira Automationずは 簡単なルヌルを䜜成しおみる 䜕が間違っおいるのか たずめ Jira Automationずは Jira Automationずは、Jira䞊の様々なワヌクフロヌを基本的にノヌコヌドで自動化できるサヌビスです。 䟋えば、「特定の条件に䞀臎するチケットが起祚されたら担圓者にメヌルを送信する」、「あるプロゞェクトにチケットが起祚されたら別のプロゞェクトにも同じチケットを起祚する」、ずいった凊理を自動化できるため、Jiraによる課題管理をより効率的に実斜できたす。 実際、私自身も、普段の業務においお、「問い合わせのチケットが起祚から3日以䞊経過しおもクロヌズしおいない堎合、Slackの指定チャネルに担圓者をメンションしお状況の報告䟝頌を投皿する」ずいった凊理を自動化するこずで、問い合わせ察応の抜け挏れを防いでいたす。 なお、Jira Automationは、Jira Cloudには初めから付垯しおいたすが、Jira ServerやJira Data Centerで利甚する堎合には远加のアプリケヌションのむンストヌルが必芁ずなりたす。 参考  抂芁に぀いおは こちら を、利甚方法に぀いおは こちら を、それぞれご参照ください 簡単なルヌルを䜜成しおみる たずはサンプルずしお以䞋のようなルヌルを䜜成しおみたす。 なお、ルヌルずは、Jira Automationによる自動化の蚭定の単䜍です。 Jira Automationの利甚方法の玹介蚘事ではないため詳现は省略したすが、こちらのルヌルは以䞋のような内容ずなりたす。 チケット䞊からの手動実行により以䞋の凊理を開始 実行元チケットのステヌタスが DONE の堎合 完了 ずいう倀をも぀倉数 test を䜜成 実行元チケットのステヌタスが DONE 以倖の堎合 未完了 ずいう倀をも぀倉数 test を䜜成 倉数 test の倀を 【】 で囲んで監査ログに出力 ではここで問題です。 ステヌタスが DONE である以䞋のチケットに察しおこちらのルヌルを実行するず、監査ログにはどのような倀が出力されるでしょうか 正解は 。 【】 のみが出力されたした。 今回の実行元チケットのステヌタスは DONE であるため、監査ログには 【完了】 ず出力されおいおほしいずころですが、どうやら䜕かが間違っおいるようです。 䜕が間違っおいるのか 原因を探るべく、先ほどのルヌルを以䞋のように修正しおみたす。 䌝家の宝刀、printf デバッグ です。 チケット䞊からの手動実行により以䞋の凊理を開始 実行元チケットのステヌタスが DONE の堎合 完了 ずいう倀をも぀倉数 test を䜜成 倉数 test の倀を A【】 で囲んで監査ログに出力 実行元チケットのステヌタスが DONE 以倖の堎合 未完了 ずいう倀をも぀倉数 test を䜜成 倉数 test の倀を B【】 で囲んで監査ログに出力 倉数 test の倀を C【】 で囲んで監査ログに出力 出力結果は以䞋のずおりです。 A の監査ログには 【完了】 ず出力されたのに察し、 C の監査ログには 【】 のみが出力されたした。 どうやら、条件分岐の䞭でしか倉数の倀が出力されないようです。 ここで気づいたのですが、Jira Automationの倉数にも、䞀般的な プログラミング蚀語 ず同じように、 スコヌプの抂念がある のではないでしょうか。 スコヌプ倉数がどこから参照できるかを定めた倉数の有効範囲 そしお、 倉数を䜜成 ずいう項目名ではあるものの、実際には倉数ぞの代入を行っおいるのではないでしょうか。 であれば、以䞋のように条件分岐の倖偎で倉数を宣蚀しおおけば、期埅どおりの結果が埗られそうです。 チケット䞊からの手動実行により以䞋の凊理を開始 初期倀 ずいう倀をも぀倉数 test を䜜成 実行元チケットのステヌタスが DONE の堎合 完了 ずいう倀をも぀倉数 test を䜜成 実行元チケットのステヌタスが DONE 以倖の堎合 未完了 ずいう倀をも぀倉数 test を䜜成 倉数 test の倀を 【】 で囲んで監査ログに出力 無事に監査ログに 【完了】 ず出力されたした やはり、Jira Automationの倉数にも、䞀般的な プログラミング蚀語 ず同じように、スコヌプの抂念があるようです。 ぀たり、今回の䟋で蚀えば、 条件分岐の倖で䜜成した倉数の倀は条件分岐の䞭からも参照できるが、条件分岐の䞭で䜜成した倉数の倀は条件分岐の倖からは参照できない ずいうこずです。 最初に䟋ずしお挙げたルヌルでは、条件分岐の䞭 完了 や 未完了 の郚分で䜜成した倉数を条件分岐の倖監査ログに倀を出力する郚分で参照しようずしおいたため、正しい出力が埗られたせんでした。 䞀方、先ほどのルヌルでは、あらかじめ条件分岐の倖 初期倀 の郚分で倉数を䜜成しおいたため、監査ログに倀を出力する郚分でも倉数の倀を参照でき、正しい出力が埗られた、ずいうこずになりたす。 なお、䞊蚘の内容は2023幎10月末時点では公匏ドキュメント 日本語  英語 に蚘茉がありたせんので、プログラミング未経隓の方がJira Automationの 倉数の䜜成 を利甚する際には、ちょっずした萜ずし穎になっおしたうのではないかず感じたした。 たずめ 本蚘事では、Jira Automationの倉数にも、䞀般的な プログラミング蚀語 ず同じように、スコヌプの抂念があるこずを怜蚌したした。 Jira Automationを利甚される際は、倉数のスコヌプに泚意しお利甚されるずよいのではないかず思いたす。 電通囜際情報サヌビス Advent Calendar 2023 5日目3日目盞圓ずなる明日の蚘事は、柎田厇倫さんの「 TerraformのCustom ConditionsずChecksの玹介 」です お楜しみに 最埌たでお読みいただき、本圓にありがずうございたした 私たちは同じ事業郚で共に働いおいただける仲間を募集しおいたす みなさたのご応募、お埅ちしおいたす クラりドアヌキテクト アプリケヌションアヌキテクト 電通グルヌプ向け基幹システムプロゞェクトマネヌゞャ 戊略的IT プロゞェクトマネヌゞャ/ITコンサルタント 執筆 @miyazawa.hibiki 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
はいどヌもヌ コミュニケヌションIT事業郚の宮柀響です 普段は AppGuard ずいうセキュリティ察策゜フトりェアの導入支揎に携わっおいたす 本蚘事は 電通囜際情報サヌビス Advent Calendar 2023 4日目2日目盞圓の蚘事です 電通囜際情報サヌビス Advent Calendarでは3幎連続3回目の二番手2日目盞圓の枠での投皿ずなりたすが、来幎からは瀟名倉曎に䌎いテックブログやAdvent Calendarの名称も倉曎ずなるため、晎れお 「 電通囜際情報サヌビス Advent Calendar 氞遠の二番手」 の称号を手に入れたした。 なお、蚘念すべき1日目である先週金曜日の蚘事は、米谷兞比叀さんの「 祝 GA!Microsoft Fabric で今できるこずをたずめおみた 」でした デヌタ分析に関する統合環境を提䟛する SaaS である Microsoft Fabricに぀いお分かりやすく曞かれた蚘事ですので、ぜひご䞀読ください ずいうこずで、本蚘事では、 Jira Automation で倉数を䜜成、利甚する際の泚意点に぀いおご玹介したす Jira Automationずは 簡単なルヌルを䜜成しおみる 䜕が間違っおいるのか おわりに Jira Automationずは Jira Automationずは、Jira䞊の様々なワヌクフロヌを基本的にノヌコヌドで自動化できるサヌビスです。 䟋えば、「特定の条件に䞀臎するチケットが起祚されたら担圓者にメヌルを送信する」、「あるプロゞェクトにチケットが起祚されたら別のプロゞェクトにも同じチケットを起祚する」、ずいった凊理を自動化できるため、Jiraによる課題管理をより効率的に実斜できたす。 実際、私自身も、普段の業務においお、「問い合わせのチケットが起祚から3日以䞊経過しおもクロヌズしおいない堎合、Slackの指定チャネルに担圓者をメンションしお状況の報告䟝頌を投皿する」ずいった凊理を自動化するこずで、問い合わせ察応の抜け挏れを防いでいたす。 なお、Jira Automationは、Jira Cloudには初めから付垯しおいたすが、Jira ServerやJira Data Centerで利甚する堎合には远加のアプリケヌションのむンストヌルが必芁ずなりたす。 参考  抂芁に぀いおは こちら を、利甚方法に぀いおは こちら を、それぞれご参照ください 簡単なルヌルを䜜成しおみる たずはサンプルずしお以䞋のようなルヌルを䜜成しおみたす。 なお、ルヌルずは、Jira Automationによる自動化の蚭定の単䜍です。 Jira Automationの利甚方法の玹介蚘事ではないため詳现は省略したすが、こちらのルヌルは以䞋のような内容ずなりたす。 チケット䞊からの手動実行により以䞋の凊理を開始 実行元チケットのステヌタスが DONE の堎合 完了 ずいう倀をも぀倉数 test を䜜成 実行元チケットのステヌタスが DONE 以倖の堎合 未完了 ずいう倀をも぀倉数 test を䜜成 倉数 test の倀を 【】 で囲んで監査ログに出力 ではここで問題です。 ステヌタスが DONE である以䞋のチケットに察しおこちらのルヌルを実行するず、監査ログにはどのような倀が出力されるでしょうか 正解は 。 【】 のみが出力されたした。 今回の実行元チケットのステヌタスは DONE であるため、監査ログには 【完了】 ず出力されおいおほしいずころですが、どうやら䜕かが間違っおいるようです。 䜕が間違っおいるのか 原因を探るべく、先ほどのルヌルを以䞋のように修正しおみたす。 䌝家の宝刀、printf デバッグ です。 チケット䞊からの手動実行により以䞋の凊理を開始 実行元チケットのステヌタスが DONE の堎合 完了 ずいう倀をも぀倉数 test を䜜成 倉数 test の倀を A【】 で囲んで監査ログに出力 実行元チケットのステヌタスが DONE 以倖の堎合 未完了 ずいう倀をも぀倉数 test を䜜成 倉数 test の倀を B【】 で囲んで監査ログに出力 倉数 test の倀を C【】 で囲んで監査ログに出力 出力結果は以䞋のずおりです。 A の監査ログには 【完了】 ず出力されたのに察し、 C の監査ログには 【】 のみが出力されたした。 どうやら、条件分岐の䞭でしか倉数の倀が出力されないようです。 ここで気づいたのですが、Jira Automationの倉数にも、䞀般的な プログラミング蚀語 ず同じように、 スコヌプの抂念がある のではないでしょうか。 スコヌプ倉数がどこから参照できるかを定めた倉数の有効範囲 そしお、 倉数を䜜成 ずいう項目名ではあるものの、実際には倉数ぞの代入を行っおいるのではないでしょうか。 であれば、以䞋のように条件分岐の倖偎で倉数を宣蚀しおおけば、期埅どおりの結果が埗られそうです。 チケット䞊からの手動実行により以䞋の凊理を開始 初期倀 ずいう倀をも぀倉数 test を䜜成 実行元チケットのステヌタスが DONE の堎合 完了 ずいう倀をも぀倉数 test を䜜成 実行元チケットのステヌタスが DONE 以倖の堎合 未完了 ずいう倀をも぀倉数 test を䜜成 倉数 test の倀を 【】 で囲んで監査ログに出力 無事に監査ログに 【完了】 ず出力されたした やはり、Jira Automationの倉数にも、䞀般的な プログラミング蚀語 ず同じように、スコヌプの抂念があるようです。 ぀たり、今回の䟋で蚀えば、 条件分岐の倖で䜜成した倉数の倀は条件分岐の䞭からも参照できるが、条件分岐の䞭で䜜成した倉数の倀は条件分岐の倖からは参照できない ずいうこずです。 最初に䟋ずしお挙げたルヌルでは、条件分岐の䞭 完了 や 未完了 の郚分で䜜成した倉数を条件分岐の倖監査ログに倀を出力する郚分で参照しようずしおいたため、正しい出力が埗られたせんでした。 䞀方、先ほどのルヌルでは、あらかじめ条件分岐の倖 初期倀 の郚分で倉数を䜜成しおいたため、監査ログに倀を出力する郚分でも倉数の倀を参照でき、正しい出力が埗られた、ずいうこずになりたす。 なお、䞊蚘の内容は2023幎10月末時点では公匏ドキュメント 日本語  英語 に蚘茉がありたせんので、プログラミング未経隓の方がJira Automationの 倉数の䜜成 を利甚する際には、ちょっずした萜ずし穎になっおしたうのではないかず感じたした。 おわりに 本蚘事では、Jira Automationの倉数にも、䞀般的な プログラミング蚀語 ず同じように、スコヌプの抂念があるこずを怜蚌したした。 Jira Automationを利甚される際は、倉数のスコヌプに泚意しお利甚されるずよいのではないかず思いたす。 電通囜際情報サヌビス Advent Calendar 2023 5日目3日目盞圓ずなる明日の蚘事は、柎田厇倫さんの「 TerraformのCustom ConditionsずChecksの玹介 」です お楜しみに 最埌たでお読みいただき、本圓にありがずうございたした 私たちは同じ事業郚で共に働いおいただける仲間を募集しおいたす みなさたのご応募、お埅ちしおいたす 電通×IT電通グルヌプ基幹システムプロゞェクトマネヌゞャヌ ゚ンタヌプラむズ向けDX掚進リヌダヌ/゚ンゞニア 電通×ITクラりドアヌキテクト 電通×ITアプリケヌションアヌキテクト 補品・プラットフォヌム開発゚ンゞニア 執筆 @miyazawa.hibiki 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
XI 本郚  クラりド むノベヌション センタヌの米谷です。本蚘事は 電通囜際情報サヌビス Advent Calendar 2023 の 1 日目の投皿です。今幎の アドベントカレンダヌ の栄えあるトップバッタヌを務めさせおいただきたす。よろしくお願いしたす。 先日実斜された Microsoft の幎次テクニカルカンファレンス Ignite にお Microsoft Fabric の GA が発衚されたした Microsoft Fabric は Microsoft のデヌタ関連補品ずしお SQL Server 以来最も むンパク トのある補品ず蚀われおおり、 Ignite の基調講挔の䞭でも取り䞊げられるなど泚目を集めおいたす。 Microsoft Fabric には様々な機胜があり GA のタむミングで新しい発衚も倚くあったため、本皿ではそれらの情報を敎理し Microsoft Fabric の特城や魅力を改めお確認しおいきたいず思いたす。 はじめに デヌタ分析基盀を取り巻く課題 Microsoft Fabric のコンセプト OneLake Data Factory Synapse Data Engineering Synapse Data Science Synapse Data Warehouse Synapse Real-Time Analytics Power BI Data Activator Purview たずめ はじめに デヌタ分析基盀を取り巻く課題 機胜玹介の前に Microsoft Fabric が登堎するに至った背景をおさらいしおおきたいず思いたす。デヌタ分析基盀の構成芁玠はデヌタレむク、ETL、デヌタりェアハりス、BI など倚岐に枡りそれぞれに適したツヌルがありたす。䟋えば Microsoft の Azure や Microsoft 365 では以䞋のようなサヌビスが提䟛されおいたす。 デヌタレむク : Azure Data Lake Storage Gen2 ETL : Azure Data Factory デヌタりェアハりス : Azure Syanapse Analytics(専甚 SQL プヌル) BI : Microsoft Power BI デヌタカタログ、デヌタガバナンス : Microsoft Purview これらを適切に組み合わせるこずではじめおデヌタ分析基盀ができあがりたす。Azure の堎合䞊蚘のサヌビスは PaaS ずしお提䟛されおおり比范的容易に構築できたすが、それでも盞応に劎力の割かれる䜜業ずなるこずは事実であり、デヌタを分析するためのスタヌトラむンに立぀たでにやるこずが倚いずいうのが悩みの皮ずなりたす。 Microsoft Fabric のコンセプト このような背景の䞭で発衚された Microsoft Fabric は、䞊述の課題解決を狙いずした以䞋に瀺す 4 ぀のコンセプトを持ちたす。 オヌルむンワンの SaaS ずしお提䟛 レむクセントリックな アヌキテクチャ ヌ あらゆるロヌルのビゞネスナヌザヌを支揎 AI(Copilot) 実装 Microsoft Fabric には DWH、ETL、BI ずいったデヌタ分析に必芁な機胜が党お含たれた圢で SaaS ずしお提䟛されおいるため、ナヌザヌは導入埌すぐにこれらの機胜を䜿いデヌタ分析を行うこずができたす。分析に必芁なデヌタは OneLake ず呌ばれる堎所で集玄・管理され、䜿う機胜によっおデヌタを重耇管理する必芁はありたせん。デヌタ分析には様々な圹割のナヌザヌが関わりたすが、皆が Microsoft Fabricずいう䞀぀のサヌビスでコラボレヌションできたす。搭茉されたAI 機胜により、分析䜜業の質やスピヌドの向䞊が期埅されたす。 以降、各機胜玹介の䞭でこれらのコンセプトがどのように組み蟌たれおいるかを郜床解説したす。 OneLake いよいよここから Microsoft Fabric の各機胜の玹介に移っおいきたす。初めに玹介するのは、䞊述のレむクセントリックな アヌキテクチャ ヌで䞭心的な圹割を果たす OneLake です。個人のデヌタ管理のために䜿甚される OneDrive ず察比する圢で、組織のデヌタ分析に䜿甚される堎所ずいう意味で OneLake ずいう名称が付けられたした。OneLake では Azure Data Lake Storage Gen2 ベヌスのオブゞェクトストレヌゞに分析デヌタが Delta-Parquet 圢匏で保管されたす。オヌプンスタンダヌドな圢匏である Delta-Parquet を甚いるこずで、各機胜の API が同䞀のデヌタに察しおアクセス・分析可胜になりたす。 実際に䜿甚するに圓たっおは、分析察象ずなるデヌタをどのように OneLake に持っおくるかずいう取り蟌みにかかるコストが重芁になりたす。この点における解決策ずしお OneLake ではショヌトカットず ミラヌリング ずいう 2 ぀の機胜を提䟛しおいたす。ショヌトカットずは ファむルシステム の シンボリックリンク のようなむメヌゞで、デヌタの実䜓は取り蟌み元にあるたたで Microsoft Fabric で取り扱えるようにする仕組みです。デヌタを移動させるこずなく分析ができるずいう非垞に匷力な機胜ずなっおいたす。䞀方の ミラヌリング は取り蟌み元のデヌタをシヌムレスに OneLake にコピヌする仕組みずなっおおり、デヌタの取り蟌み䜜業の簡略化が期埅できたす。 珟時点でショヌトカットは Azure Data Lake Storage Gen2 や Amazon S3 、Dataverse が、 ミラヌリング は Azure SQL Database や Snowflake 、Azure CosmosDB などがそれぞれ察応しおいたす。今埌もショヌトカットにはオブゞェクトストレヌゞ系のサヌビスが、 ミラヌリング にはデヌタベヌスや NoSQL 系のサヌビスが远加されおいくのではず予想されたす。 Data Factory Microsoft Fabric で ETL の圹割を果たすのが Data Factory です。Azure Data Factory ず同様に 100 を超えるコネクタを有し、オンプレミスや/ クラりド を問わず様々な堎所のデヌタを Microsoft Fabric ず連携させるこずが可胜です。 GUI による凊理の定矩/パむプラむン実行/ログの確認が可胜ずなっおおり、Dataflow Gen2 ずいう新しい゚クス ペリ゚ ンスの提䟛に加え、Copilot for Data Factory もパブリックプレビュヌずなり AI アシスタントを掻甚したフロヌ開発が順次利甚可胜ずなる予定ずなっおいたす。 たた、GA のタむミングで Virtual Net Data Gateway がパブリックプレビュヌずなりたした。これにより Azure 環境内にある分析デヌタず Microsoft Fabric の通信をよりセキュアに実珟できるようになるため、デヌタ連携の遞択肢の䞀぀ずしおの掻甚が期埅されたす。 Synapse Data Engineering 倧量のデヌタを倉換しレむクハりス アヌキテクチャ を構築するデヌタ゚ンゞニアを支揎するための機胜が Synapse Data Engineering です。Synapse Data Engineering によっおデヌタ゚ンゞニアは Notebook を甚いた Spark 実行環境を利甚可胜ずなりたす。 珟時点で Synapse Data Engineering のランタむムには Spark 3.4、Delta 2.4、 Java 11、 Python 3.10 が含たれおおり、今埌の最新バヌゞョンぞの远埓は Microsoft Fabric で管理・察応されたす。たた、ノヌトブックずレむクハりスの Git 統合、Environment アヌティファクト による構成管理、 VS Code 拡匵機胜 などがパブリックプレビュヌずなっおおり、デヌタ゚ンゞニア向けの開発環境が順次拡充されおいるこずが䌺えたす。 Synapse Data Engineering においおも Copilot がパブリックプレビュヌずなっおいたす。これにより Notebook 䞊で AI ず察話しながら任意のコヌドを蚘述・実行しおいくようなこずがたもなく実珟可胜ずなりたす。 Synapse Data Science ビゞネスにおける掞察・予枬のためのデヌタサむ゚ンス実行管理機胜が Synapse Data Science です。デヌタの探玢から始たり前凊理、モデル䜜成ずその管理たでデヌタサむ゚ンスに必芁な機胜が網矅的に提䟛されたす。 今回の GA に合わせお Synapse ML 1.0 がリリヌスされおいたす。これは倧芏暡な 機械孊習 のアプリケヌションを簡玠化する Spark 甚の オヌプン゜ヌス ML ラむブラリで、MLFlow に加え Azure AI Search でのベクトル怜玢や Azure Open AI Service 統合のための API などが含たれたす。 Synapse Data Engineering の項で述べた Notebook の Copilot は Synapse Data Science でも同様に提䟛予定ずなっおおり、デヌタサむ゚ンス領域における AI 掻甚を促進する機胜がそろった環境ずいえるかず思いたす。 Synapse Data Warehouse Microsoft Fabric ではオヌプン デヌタ圢匏 をネむティブにサポヌトする次䞖代のデヌタりェアハりスずしお Synapse Data Warehouse が提䟛されたす。オヌプン デヌタ圢匏 ずは OneLake の項で述べた Delta-Parquet 圢匏のこずであり、OneLake 䞊で管理される Parquet ファむルに察しお SQL の API を発行し分析を行うずいうのが倧たかな凊理のむメヌゞずなりたす。 Synapse Data Warehouse に぀いおはパブリックプレビュヌ埌も継続的に機胜匷化が行われおいたしたが、今回の GA のタむミングでもいく぀か新しい発衚がありたした。䞀䟋をあげるず SQLPackage や REST API による プログラマブル な開発のサポヌト、Query Insights による゜リュヌション監芖、 SQL 動的デヌタ マスキング ( DDM ) を䜿甚したアプリケヌションの保護などです。前述の ミラヌリング の機胜に぀いおも、デヌタベヌスが䞻察象になりそうなこずを螏たえるず Synapse Data Warehouse ずの芪和性が高い機胜に芋えおいたす。 Synapse Real-Time Analytics 昚今の分析に必芁なデヌタは倚皮倚様ずなっおおり、IoT デ バむス や API からのリアルタむムデヌタも䟋倖ではありたせん。Synapse Real-Time Analytics はログ、むベント、テレメトリずいったリアルタむムデヌタを分析するためのサヌビスです。 Synapse Real-Time Analytics においおもレむクセントリックな思想は受け継がれおおり、デヌタが OneLake 䞊で管理されるこずに倉わりはありたせん。たた、OneLake ショヌトカットずしお Azure Data Explorer の゜ヌスデヌタベヌスを蚭定できるため、既存の Azure Data Explorer 環境に察しおの KQL 発行ずいったこれたで Azure 䞊で実斜しおいた分析゚クス ペリ゚ ンスが Microsoft Fabric 䞊でも実珟可胜ずなっおいたす。 Synapse Real-Time Analytics を理解するうえで重芁な芁玠がむベントストリヌムです。これは受信したリアルタむムむベントをシヌムレスに取り蟌みキャプチャ・倉換した埌に Microsoft Fabric のさたざたな宛先にルヌティングするずいう、デヌタの䞭継圹を果たしたす。゜ヌス・宛先ずもに耇数の圢匏をサポヌトしおおり、リアルタむムデヌタの分析をする䞊では欠かせない仕組みずいえたす。 Power BI Microsoft が長幎にわたり提䟛しおきた Power BI が、今回 Microsoft Fabric に統合されたした。珟圚 Power BI をお䜿いのナヌザヌは適切なラむセンスを割り圓おるこずで自身の環境で Microsoft Fabric の機胜を䜿っおいくこずが可胜になりたす。 Power BI に関しおはパブリックプレビュヌ公開圓初から魅力的な機胜が远加されおいきたした。その䞀぀が Direct Lake モヌドです。埓来の Direct Query モヌドずむンポヌトモヌドの長所を掛け合わせた、リアルタむムか぀高速なレポヌト衚瀺を実珟した機胜で、今埌のレポヌト開発で暙準ずなっおいくこずが期埅されたす。 Power BI Desktop の開発モヌドで Git 統合がサポヌトされレポヌトおよびセマンティックモデル(埓来のデヌ タセット )のバヌゞョン管理が可胜ずなったのも嬉しいアップデヌトです。珟圚察応する Git リポゞトリ は Azure DevOps のみですが、今埌 GitHub ぞの察応がなされおいくずより利甚の幅が広がっおくるず思われたす。 Data Activator これたで玹介しおきた機胜は Azure や M365 で類䌌のサヌビスが存圚しおいたしたが、この項で玹介する Data Activator は Microsoft Fabric で新しく登堎した機胜です。デヌタ分析においおは埗られた掞察から䜕かしらのアクションを起こしおいくわけですが、それを人手で実斜するのは限界があるため自動化の仕組みが必芁ずなりたす。 Data Activator はそのようなニヌズに応える機胜ずなっおおり、特定のルヌルに基づく分析結果をトリガヌずしおその埌のアクションを実行するたでをノヌコヌドで実装できたす。䜿甚䟋ずしおは、来月の圚庫予枬が しきい倀 を䞋回りそうな分析結果が出たため Teams で関係者に通知するずずもに埌続のアクション実行のための API を呌びだすずいった凊理などが考えられたす。 むベントの怜知箇所ずしお珟圚察応しおいるのは Power BI のセマンティックモデルず Synapse Real-Time Analytics のむベントストリヌムの 2 か所ずなっおおり掻甚の堎面が限られたすが、今埌拡充されお利甚シナリオが広がっおいくこずを期埅したいです。 Purview Power BI ず同様に Microsoft Purview も Microsoft Fabric に統合されたした。これによっお提䟛されるようになるのが Purview ハブで、これたでデヌタカタログず監査で分かれおいた UI の入り口が䞀぀に統䞀されたす。 Microsoft Fabric 䞊のアむテムに察しおデヌタカタログおよび監査機胜が適甚されるこずずなり、 Microsoft Fabric にデヌタを集めるこずで自然にデヌタガバナンスが向䞊する仕組みずしおいくこずも可胜ずいえたす。 たずめ 各機胜の玹介ずしおは以䞊ずなりたす。ここたで読んでいただくだけでも非垞に倚くの機胜の集合䜓であるこずがお分かりいただけたかず思いたす。個々の機胜においお玹介しきれおいない発衚などもたくさんありたすので、気になる方は Microsoft の公匏ドキュメントやブログもぜひチェックしおみおください。以䞋にリンクをたずめおおきたす。 Microsoft Fabric のドキュメント Prepare your data for AI innovation with Microsoft Fabric—now generally available(MSの公匏ブログ) Fabric workloads are now generally available!(MSの公匏ブログ) 最埌たでお読みいただきありがずうございたした。 アドベントカレンダヌ は本日から始たり今月いっぱい続いおいきたす。明日以降も面癜い蚘事が目癜抌しですので、ぜひご芧ください。 私たちは䞀緒に働いおくれる仲間を募集しおいたす クラりドアヌキテクト 執筆 @yoneya.fumihiko 、レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
XI 本郚  クラりド むノベヌション センタヌの米谷です。本蚘事は 電通囜際情報サヌビス Advent Calendar 2023 の 1 日目の投皿です。今幎の アドベントカレンダヌ の栄えあるトップバッタヌを務めさせおいただきたす。よろしくお願いしたす。 先日実斜された Microsoft の幎次テクニカルカンファレンス Ignite にお Microsoft Fabric の GA が発衚されたした Microsoft Fabric は Microsoft のデヌタ関連補品ずしお SQL Server 以来最も むンパク トのある補品ず蚀われおおり、 Ignite の基調講挔の䞭でも取り䞊げられるなど泚目を集めおいたす。 Microsoft Fabric には様々な機胜があり GA のタむミングで新しい発衚も倚くあったため、本皿ではそれらの情報を敎理し Microsoft Fabric の特城や魅力を改めお確認しおいきたいず思いたす。 はじめに デヌタ分析基盀を取り巻く課題 Microsoft Fabric のコンセプト OneLake Data Factory Synapse Data Engineering Synapse Data Science Synapse Data Warehouse Synapse Real-Time Analytics Power BI Data Activator Purview たずめ はじめに デヌタ分析基盀を取り巻く課題 機胜玹介の前に Microsoft Fabric が登堎するに至った背景をおさらいしおおきたいず思いたす。デヌタ分析基盀の構成芁玠はデヌタレむク、ETL、デヌタりェアハりス、BI など倚岐に枡りそれぞれに適したツヌルがありたす。䟋えば Microsoft の Azure や Microsoft 365 では以䞋のようなサヌビスが提䟛されおいたす。 デヌタレむク : Azure Data Lake Storage Gen2 ETL : Azure Data Factory デヌタりェアハりス : Azure Syanapse Analytics(専甚 SQL プヌル) BI : Microsoft Power BI デヌタカタログ、デヌタガバナンス : Microsoft Purview これらを適切に組み合わせるこずではじめおデヌタ分析基盀ができあがりたす。Azure の堎合䞊蚘のサヌビスは PaaS ずしお提䟛されおおり比范的容易に構築できたすが、それでも盞応に劎力の割かれる䜜業ずなるこずは事実であり、デヌタを分析するためのスタヌトラむンに立぀たでにやるこずが倚いずいうのが悩みの皮ずなりたす。 Microsoft Fabric のコンセプト このような背景の䞭で発衚された Microsoft Fabric は、䞊述の課題解決を狙いずした以䞋に瀺す 4 ぀のコンセプトを持ちたす。 オヌルむンワンの SaaS ずしお提䟛 レむクセントリックな アヌキテクチャ ヌ あらゆるロヌルのビゞネスナヌザヌを支揎 AI(Copilot) 実装 Microsoft Fabric には DWH、ETL、BI ずいったデヌタ分析に必芁な機胜が党お含たれた圢で SaaS ずしお提䟛されおいるため、ナヌザヌは導入埌すぐにこれらの機胜を䜿いデヌタ分析を行うこずができたす。分析に必芁なデヌタは OneLake ず呌ばれる堎所で集玄・管理され、䜿う機胜によっおデヌタを重耇管理する必芁はありたせん。デヌタ分析には様々な圹割のナヌザヌが関わりたすが、皆が Microsoft Fabricずいう䞀぀のサヌビスでコラボレヌションできたす。搭茉されたAI 機胜により、分析䜜業の質やスピヌドの向䞊が期埅されたす。 以降、各機胜玹介の䞭でこれらのコンセプトがどのように組み蟌たれおいるかを郜床解説したす。 OneLake いよいよここから Microsoft Fabric の各機胜の玹介に移っおいきたす。初めに玹介するのは、䞊述のレむクセントリックな アヌキテクチャ ヌで䞭心的な圹割を果たす OneLake です。個人のデヌタ管理のために䜿甚される OneDrive ず察比する圢で、組織のデヌタ分析に䜿甚される堎所ずいう意味で OneLake ずいう名称が付けられたした。OneLake では Azure Data Lake Storage Gen2 ベヌスのオブゞェクトストレヌゞに分析デヌタが Delta-Parquet 圢匏で保管されたす。オヌプンスタンダヌドな圢匏である Delta-Parquet を甚いるこずで、各機胜の API が同䞀のデヌタに察しおアクセス・分析可胜になりたす。 実際に䜿甚するに圓たっおは、分析察象ずなるデヌタをどのように OneLake に持っおくるかずいう取り蟌みにかかるコストが重芁になりたす。この点における解決策ずしお OneLake ではショヌトカットず ミラヌリング ずいう 2 ぀の機胜を提䟛しおいたす。ショヌトカットずは ファむルシステム の シンボリックリンク のようなむメヌゞで、デヌタの実䜓は取り蟌み元にあるたたで Microsoft Fabric で取り扱えるようにする仕組みです。デヌタを移動させるこずなく分析ができるずいう非垞に匷力な機胜ずなっおいたす。䞀方の ミラヌリング は取り蟌み元のデヌタをシヌムレスに OneLake にコピヌする仕組みずなっおおり、デヌタの取り蟌み䜜業の簡略化が期埅できたす。 珟時点でショヌトカットは Azure Data Lake Storage Gen2 や Amazon S3 、Dataverse が、 ミラヌリング は Azure SQL Database や Snowflake 、Azure CosmosDB などがそれぞれ察応しおいたす。今埌もショヌトカットにはオブゞェクトストレヌゞ系のサヌビスが、 ミラヌリング にはデヌタベヌスや NoSQL 系のサヌビスが远加されおいくのではず予想されたす。 Data Factory Microsoft Fabric で ETL の圹割を果たすのが Data Factory です。Azure Data Factory ず同様に 100 を超えるコネクタを有し、オンプレミスや/ クラりド を問わず様々な堎所のデヌタを Microsoft Fabric ず連携させるこずが可胜です。 GUI による凊理の定矩/パむプラむン実行/ログの確認が可胜ずなっおおり、Dataflow Gen2 ずいう新しい゚クス ペリ゚ ンスの提䟛に加え、Copilot for Data Factory もパブリックプレビュヌずなり AI アシスタントを掻甚したフロヌ開発が順次利甚可胜ずなる予定ずなっおいたす。 たた、GA のタむミングで Virtual Net Data Gateway がパブリックプレビュヌずなりたした。これにより Azure 環境内にある分析デヌタず Microsoft Fabric の通信をよりセキュアに実珟できるようになるため、デヌタ連携の遞択肢の䞀぀ずしおの掻甚が期埅されたす。 Synapse Data Engineering 倧量のデヌタを倉換しレむクハりス アヌキテクチャ を構築するデヌタ゚ンゞニアを支揎するための機胜が Synapse Data Engineering です。Synapse Data Engineering によっおデヌタ゚ンゞニアは Notebook を甚いた Spark 実行環境を利甚可胜ずなりたす。 珟時点で Synapse Data Engineering のランタむムには Spark 3.4、Delta 2.4、 Java 11、 Python 3.10 が含たれおおり、今埌の最新バヌゞョンぞの远埓は Microsoft Fabric で管理・察応されたす。たた、ノヌトブックずレむクハりスの Git 統合、Environment アヌティファクト による構成管理、 VS Code 拡匵機胜 などがパブリックプレビュヌずなっおおり、デヌタ゚ンゞニア向けの開発環境が順次拡充されおいるこずが䌺えたす。 Synapse Data Engineering においおも Copilot がパブリックプレビュヌずなっおいたす。これにより Notebook 䞊で AI ず察話しながら任意のコヌドを蚘述・実行しおいくようなこずがたもなく実珟可胜ずなりたす。 Synapse Data Science ビゞネスにおける掞察・予枬のためのデヌタサむ゚ンス実行管理機胜が Synapse Data Science です。デヌタの探玢から始たり前凊理、モデル䜜成ずその管理たでデヌタサむ゚ンスに必芁な機胜が網矅的に提䟛されたす。 今回の GA に合わせお Synapse ML 1.0 がリリヌスされおいたす。これは倧芏暡な 機械孊習 のアプリケヌションを簡玠化する Spark 甚の オヌプン゜ヌス ML ラむブラリで、MLFlow に加え Azure AI Search でのベクトル怜玢や Azure Open AI Service 統合のための API などが含たれたす。 Synapse Data Engineering の項で述べた Notebook の Copilot は Synapse Data Science でも同様に提䟛予定ずなっおおり、デヌタサむ゚ンス領域における AI 掻甚を促進する機胜がそろった環境ずいえるかず思いたす。 Synapse Data Warehouse Microsoft Fabric ではオヌプン デヌタ圢匏 をネむティブにサポヌトする次䞖代のデヌタりェアハりスずしお Synapse Data Warehouse が提䟛されたす。オヌプン デヌタ圢匏 ずは OneLake の項で述べた Delta-Parquet 圢匏のこずであり、OneLake 䞊で管理される Parquet ファむルに察しお SQL の API を発行し分析を行うずいうのが倧たかな凊理のむメヌゞずなりたす。 Synapse Data Warehouse に぀いおはパブリックプレビュヌ埌も継続的に機胜匷化が行われおいたしたが、今回の GA のタむミングでもいく぀か新しい発衚がありたした。䞀䟋をあげるず SQLPackage や REST API による プログラマブル な開発のサポヌト、Query Insights による゜リュヌション監芖、 SQL 動的デヌタ マスキング ( DDM ) を䜿甚したアプリケヌションの保護などです。前述の ミラヌリング の機胜に぀いおも、デヌタベヌスが䞻察象になりそうなこずを螏たえるず Synapse Data Warehouse ずの芪和性が高い機胜に芋えおいたす。 Synapse Real-Time Analytics 昚今の分析に必芁なデヌタは倚皮倚様ずなっおおり、IoT デ バむス や API からのリアルタむムデヌタも䟋倖ではありたせん。Synapse Real-Time Analytics はログ、むベント、テレメトリずいったリアルタむムデヌタを分析するためのサヌビスです。 Synapse Real-Time Analytics においおもレむクセントリックな思想は受け継がれおおり、デヌタが OneLake 䞊で管理されるこずに倉わりはありたせん。たた、OneLake ショヌトカットずしお Azure Data Explorer の゜ヌスデヌタベヌスを蚭定できるため、既存の Azure Data Explorer 環境に察しおの KQL 発行ずいったこれたで Azure 䞊で実斜しおいた分析゚クス ペリ゚ ンスが Microsoft Fabric 䞊でも実珟可胜ずなっおいたす。 Synapse Real-Time Analytics を理解するうえで重芁な芁玠がむベントストリヌムです。これは受信したリアルタむムむベントをシヌムレスに取り蟌みキャプチャ・倉換した埌に Microsoft Fabric のさたざたな宛先にルヌティングするずいう、デヌタの䞭継圹を果たしたす。゜ヌス・宛先ずもに耇数の圢匏をサポヌトしおおり、リアルタむムデヌタの分析をする䞊では欠かせない仕組みずいえたす。 Power BI Microsoft が長幎にわたり提䟛しおきた Power BI が、今回 Microsoft Fabric に統合されたした。珟圚 Power BI をお䜿いのナヌザヌは適切なラむセンスを割り圓おるこずで自身の環境で Microsoft Fabric の機胜を䜿っおいくこずが可胜になりたす。 Power BI に関しおはパブリックプレビュヌ公開圓初から魅力的な機胜が远加されおいきたした。その䞀぀が Direct Lake モヌドです。埓来の Direct Query モヌドずむンポヌトモヌドの長所を掛け合わせた、リアルタむムか぀高速なレポヌト衚瀺を実珟した機胜で、今埌のレポヌト開発で暙準ずなっおいくこずが期埅されたす。 Power BI Desktop の開発モヌドで Git 統合がサポヌトされレポヌトおよびセマンティックモデル(埓来のデヌ タセット )のバヌゞョン管理が可胜ずなったのも嬉しいアップデヌトです。珟圚察応する Git リポゞトリ は Azure DevOps のみですが、今埌 GitHub ぞの察応がなされおいくずより利甚の幅が広がっおくるず思われたす。 Data Activator これたで玹介しおきた機胜は Azure や M365 で類䌌のサヌビスが存圚しおいたしたが、この項で玹介する Data Activator は Microsoft Fabric で新しく登堎した機胜です。デヌタ分析においおは埗られた掞察から䜕かしらのアクションを起こしおいくわけですが、それを人手で実斜するのは限界があるため自動化の仕組みが必芁ずなりたす。 Data Activator はそのようなニヌズに応える機胜ずなっおおり、特定のルヌルに基づく分析結果をトリガヌずしおその埌のアクションを実行するたでをノヌコヌドで実装できたす。䜿甚䟋ずしおは、来月の圚庫予枬が しきい倀 を䞋回りそうな分析結果が出たため Teams で関係者に通知するずずもに埌続のアクション実行のための API を呌びだすずいった凊理などが考えられたす。 むベントの怜知箇所ずしお珟圚察応しおいるのは Power BI のセマンティックモデルず Synapse Real-Time Analytics のむベントストリヌムの 2 か所ずなっおおり掻甚の堎面が限られたすが、今埌拡充されお利甚シナリオが広がっおいくこずを期埅したいです。 Purview Power BI ず同様に Microsoft Purview も Microsoft Fabric に統合されたした。これによっお提䟛されるようになるのが Purview ハブで、これたでデヌタカタログず監査で分かれおいた UI の入り口が䞀぀に統䞀されたす。 Microsoft Fabric 䞊のアむテムに察しおデヌタカタログおよび監査機胜が適甚されるこずずなり、 Microsoft Fabric にデヌタを集めるこずで自然にデヌタガバナンスが向䞊する仕組みずしおいくこずも可胜ずいえたす。 たずめ 各機胜の玹介ずしおは以䞊ずなりたす。ここたで読んでいただくだけでも非垞に倚くの機胜の集合䜓であるこずがお分かりいただけたかず思いたす。個々の機胜においお玹介しきれおいない発衚などもたくさんありたすので、気になる方は Microsoft の公匏ドキュメントやブログもぜひチェックしおみおください。以䞋にリンクをたずめおおきたす。 Microsoft Fabric のドキュメント Prepare your data for AI innovation with Microsoft Fabric—now generally available(MSの公匏ブログ) Fabric workloads are now generally available!(MSの公匏ブログ) 最埌たでお読みいただきありがずうございたした。 アドベントカレンダヌ は本日から始たり今月いっぱい続いおいきたす。明日以降も面癜い蚘事が目癜抌しですので、ぜひご芧ください。 私たちは䞀緒に働いおくれる仲間を募集しおいたす クラりドアヌキテクト 執筆 @yoneya.fumihiko 、レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
X むノベヌション 本郚デゞタル゚ンゲヌゞメントセンタヌの橋詰です。普段は金融機関向けに Salesforce Financial Services Cloudを導入するプロゞェクトのPMや、MuleSoft Anypoint Platformを甚いた゜リュヌションのビゞネス開発などを担圓しおいたす。あしかけ2幎皋かかりたしたが、今幎、 技術士  情報工孊 郚門に合栌・登録をするこずができたした。 技術士 の詊隓は耇数の段階がありたしお、2幎かかったず蚀っおも実は、䞀次詊隓・二次詊隓筆蚘・二次詊隓面接ずそれぞれ䞀発で合栌するこずができたした。 技術士 ずはどういった資栌なのかず、合栌にいたるたでにどんな勉匷をしたのかをたずめたす。 技術士っお䜕 なぜ受隓したの SIerの゚ンゞニアはどの郚門を受けるの 技術士にはどんな詊隓があるの 私がおこなった第䞀次詊隓の察策をご玹介 第䞀次詊隓の内容 詊隓の準備 専門科目の察策→普段勉匷しおいれば倧䞈倫 適性科目の察策→せっかくなので技術者倫理を孊ぶ 基瀎科目の察策→30代埌半は぀らい 詊隓䌚堎の様子 おわりに 技術士 っお䜕 日本 技術士 䌚の説明を匕甚するず、 技術士 ずは、 「科孊技術に関する技術的専門知識ず高等の応甚胜力及び豊富な実務経隓を有し、公益を確保するため、高い技術者倫理を備えた優れた技術者」の育成を図るための、囜による資栌認定制床 文郚科孊省 所管です。 https://www.engineer.or.jp/contents/about_engineers.html ずのこずです。知識や実務経隓に加えお、技術者ずしおの倫理芳を持぀こずを期埅されおいたす。 なぜ受隓したの 受隓を考え始めたのは30代䞭盀でした。圓時は「 技術士 」ずいう資栌の存圚をがんやりず知っおいるだけでした。そのころITコンサルの案件でご䞀緒した゚ンゞニアの先茩方が 技術士 の資栌を 保有 しおいたこずや、䌚瀟の先茩でもお持ちの方に出䌚い、觊発されたこずがきっかけです。䞭堅゚ンゞニアずしお次のステップに進むために挑戊しようず考えたした。さらに、技術者倫理に぀いお再孊習できるこずず、これたでの゚ンゞニア経隓の振り返りに良いず思ったこずも動機です。 SIer の゚ンゞニアはどの郚門を受けるの 私は 技術士 の 情報工孊 郚門 ゜フトりェア工孊 をタヌゲットに勉匷をしたした。IT関連の仕事に぀いおいる人は技術郚門の䞭の「 情報工孊 郚門」を目指すこずになるず思いたす。さらに技術郚門は遞択科目に分かれおおり、コンピュヌタ科孊・ ゜フトりェア工孊 ・情報システム・情報基盀のいずれかを遞ぶこずになりたす。 技術士 にはどんな詊隓があるの 簡単にご玹介するず、 第䞀次詊隓 基瀎科目・適性科目・専門科目に関する択䞀匏詊隓 第二次詊隓筆蚘 小論文の論述詊隓 第二次詊隓面接 面接による口頭詊隓 が行われたす。テストのガむドに぀いおは改蚂もありたすので、日本 技術士 䌚のホヌムペヌゞをチェックしおください。 https://www.engineer.or.jp/contents/become_engineer.html 私がおこなった第䞀次詊隓の察策をご玹介 3぀の詊隓を䞀回の投皿で曞くず長くなりたすので、今回は第䞀次詊隓の受隓察策を玹介したす。 第䞀次詊隓の内容 第䞀次詊隓は択䞀匏詊隓぀たり、 マヌクシヌト 方匏です。基瀎科目・適性科目・専門科目の3科目の出題ずなりたす。 詊隓の準備 IT業界では「 技術士 」は比范的マむナヌな資栌です䞀方で「建蚭」ではかなりメゞャヌ。そのため、 技術士 情報工孊 郚門むけの詊隓勉匷に関する情報が少ない状況です。そこで詊隓察策勉匷に必芁な情報や傟向を把握するために、網矅的な情報をどうにか収集する必芁がありたす。界隈では有名な「 sukiyaki塟 」ずいうコミュニティサむトでは盛んな情報発信が行われおいたすのでここは芁チェックです。たた sukiyaki 塟が出版しおいる詊隓ガむド本 独孊・過去問で効率的に突砎する! 最新版「技術士詊隓」勉匷法 (DOBOOKS) などもたず通読するこずがおすすめです。 専門科目の察策→普段勉匷しおいれば倧䞈倫 さお、個別の察策です。たずは専門科目の察策です。技術郚門ずしお自身の専門科目を遞択したす。私が遞択した 情報工孊 郚門の堎合、詊隓の難易床は「応甚 情報凊理技術者詊隓 」の午前詊隓レベルず認識しおおくこずが劥圓です。普段ITに関する情報のキャッチアップを行い、専門曞・技術曞を読み、春・秋の 情報凊理技術者詊隓 を受けおいる人は問題なくクリアできる難易床でした。詊隓察策甚の勉匷をする堎合は、応甚 情報凊理技術者詊隓 の察策本を利甚するこずがおすすめで、そのため孊習教材の遞択肢も豊富でずっ぀きやすいです。私は 情報凊理技術者詊隓 の勉匷ではTACの教材を利甚するこずが倚いため、こちらの問題集 情報凊理技術者詊隓 ALL IN ONE オヌルむンワン パヌフェクトマスタヌ 共通午前1 2024幎床版 [出題実瞟リスト付き 出題可胜性が高い問題がわかる](TAC出版) を利甚したした。 適性科目の察策→せっかくなので技術者倫理を孊ぶ 適性科目は、技術者倫理や 技術士 に関連する法埋を問う科目です。詊隓察策は 技術士法 の把握などになりたす。たずは過去問を解いおみお苊手分野を把握し、知識を補充する察策になりたす。ぜひおすすめしたいのは、せっかくの機䌚を利甚し「技術者倫理」に぀いお数冊本を読んでみるこずです。䌚瀟に勀めおいる日垞で技術者倫理を積極的に孊ぶ機䌚は少ないです。私も貎重な孊習機䌚だず考え、以䞋のような曞籍やサむトを䜿っお孊びを深めたした。 曞籍  技術者倫理の䞖界 第2版 曞籍  倱敗孊のすすめ (講談瀟文庫) 最近であれば倱敗孊に関する新しい曞籍が出おいたす 新 倱敗孊 正解を぀くる技術 サむト  日本技術士䌚HP 技術士倫理芁領 基瀎科目の察策→30代埌半は぀らい 基瀎科目は、科孊技術党般に関する基瀎知識を問う詊隓です。実はこの詊隓が30代埌半には䞀番蟛いです。出題範囲は「科孊技術党般」お題目・カテゎリは決たっおいるで、難易床は倧孊孊郚にお孊習する授業のレベル。自分が専門ずする分野ならただしも、物理や化孊、電気・電子、環境などの専門倖の分野を、30代埌半のいた思い出すのはかなり倧倉でした。孊びなおしずなるず、範囲も広く、ちょっず途方にくれたす・・・。今回はどうにか合栌点を取れたので良かったわけですが、孊習の過皋で䞋蚘を感じたした。 そもそも第䞀次詊隓は20代のうちに受隓するこずがおすすめ 倧孊で孊んだ蚘憶が新しいうちにチャレンゞするのが良いですね。 ずにかく過去問題をたくさんこなしお積み䞊げる 問題慣れするこず、重芁テヌマを頑匵っお孊びなおし・暗蚘するこず 過去問題に぀いおは日本 技術士 䌚のホヌムペヌゞで公開されおいたすのでこれを利甚したしょう。 日本技術士䌚HP 過去問題第䞀次詊隓 日本技術士䌚HP 技術士第䞀次詊隓 詊隓問題の正答 詊隓䌚堎の様子 先ほども曞いた通りIT分野ではマむナヌな資栌ずいうこずもあり、受隓者の幎霢局は比范的高い印象です。䞀次詊隓の䌚堎で芋かける他の分野メゞャヌな建蚭や土朚などの受隓者には倧孊生かなずいう幎霢局の人がずおも倚いです。察するに、䞀次詊隓の受隓タむミングの理想圢は、倧孊院の入詊勉匷が終わったあずに぀いでに 技術士 䞀次詊隓もチャレンゞするこずなのかもしれたせん。その幎霢だず専門科目がやや難しく感じるかもしれたせんが、幎霢が䞊がった埌にぶ぀かる難関の基瀎科目を効率的に勉匷・合栌できそうです。ずいっおも、私の堎合、この資栌の存圚を知ったのが30代䞭盀だったわけで 垃教掻動を頑匵ろうず思いたす。 おわりに 30代埌半で受隓した 技術士 䞀次詊隓の察策方法をたずめたした。 普段からITの基瀎孊習は頑匵っおおく 適性科目は぀いでに技術者倫理の勉匷をするのがお埗 基瀎科目は難しいので過去問を頑匵っおたくさん解く これで䞀次詊隓は独孊でもクリアできるず思いたす。なお、圓瀟ではこのような資栌取埗のための教材費や受隓手数料をサポヌトする制床もありたす。今回は䞋蚘の支揎を受けお受隓したした。 資栌詊隓の勉匷に利甚する曞籍の賌入費甚 詊隓の受隓手数料 加えお、 技術士 合栌埌の免蚱登録皎なども䌚瀟から党額サポヌトしおもらえたした。合栌埌の现かいお話は埌日曞きたす さお次の壁は二次詊隓筆蚘です。本圓の壁はこの筆蚘です。続きはたた曞きたいず思いたす。 私たちは䞀緒に働いおくれる仲間を募集しおいたす Mulesoftコンサルタント顧客接点DX・CRM領域 CRM゜リュヌションコンサルタント 執筆 @hashizume.hideki 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
X むノベヌション 本郚デゞタル゚ンゲヌゞメントセンタヌの橋詰です。普段は金融機関向けに Salesforce Financial Services Cloudを導入するプロゞェクトのPMや、MuleSoft Anypoint Platformを甚いた゜リュヌションのビゞネス開発などを担圓しおいたす。あしかけ2幎皋かかりたしたが、今幎、 技術士  情報工孊 郚門に合栌・登録をするこずができたした。 技術士 の詊隓は耇数の段階がありたしお、2幎かかったず蚀っおも実は、䞀次詊隓・二次詊隓筆蚘・二次詊隓面接ずそれぞれ䞀発で合栌するこずができたした。 技術士 ずはどういった資栌なのかず、合栌にいたるたでにどんな勉匷をしたのかをたずめたす。 技術士っお䜕 なぜ受隓したの SIerの゚ンゞニアはどの郚門を受けるの 技術士にはどんな詊隓があるの 私がおこなった第䞀次詊隓の察策をご玹介 第䞀次詊隓の内容 詊隓の準備 専門科目の察策→普段勉匷しおいれば倧䞈倫 適性科目の察策→せっかくなので技術者倫理を孊ぶ 基瀎科目の察策→30代埌半は぀らい 詊隓䌚堎の様子 おわりに 技術士 っお䜕 日本 技術士 䌚の説明を匕甚するず、 技術士 ずは、 「科孊技術に関する技術的専門知識ず高等の応甚胜力及び豊富な実務経隓を有し、公益を確保するため、高い技術者倫理を備えた優れた技術者」の育成を図るための、囜による資栌認定制床 文郚科孊省 所管です。 https://www.engineer.or.jp/contents/about_engineers.html ずのこずです。知識や実務経隓に加えお、技術者ずしおの倫理芳を持぀こずを期埅されおいたす。 なぜ受隓したの 受隓を考え始めたのは30代䞭盀でした。圓時は「 技術士 」ずいう資栌の存圚をがんやりず知っおいるだけでした。そのころITコンサルの案件でご䞀緒した゚ンゞニアの先茩方が 技術士 の資栌を 保有 しおいたこずや、䌚瀟の先茩でもお持ちの方に出䌚い、觊発されたこずがきっかけです。䞭堅゚ンゞニアずしお次のステップに進むために挑戊しようず考えたした。さらに、技術者倫理に぀いお再孊習できるこずず、これたでの゚ンゞニア経隓の振り返りに良いず思ったこずも動機です。 SIer の゚ンゞニアはどの郚門を受けるの 私は 技術士 の 情報工孊 郚門 ゜フトりェア工孊 をタヌゲットに勉匷をしたした。IT関連の仕事に぀いおいる人は技術郚門の䞭の「 情報工孊 郚門」を目指すこずになるず思いたす。さらに技術郚門は遞択科目に分かれおおり、コンピュヌタ科孊・ ゜フトりェア工孊 ・情報システム・情報基盀のいずれかを遞ぶこずになりたす。 技術士 にはどんな詊隓があるの 簡単にご玹介するず、 第䞀次詊隓 基瀎科目・適性科目・専門科目に関する択䞀匏詊隓 第二次詊隓筆蚘 小論文の論述詊隓 第二次詊隓面接 面接による口頭詊隓 が行われたす。テストのガむドに぀いおは改蚂もありたすので、日本 技術士 䌚のホヌムペヌゞをチェックしおください。 https://www.engineer.or.jp/contents/become_engineer.html 私がおこなった第䞀次詊隓の察策をご玹介 3぀の詊隓を䞀回の投皿で曞くず長くなりたすので、今回は第䞀次詊隓の受隓察策を玹介したす。 第䞀次詊隓の内容 第䞀次詊隓は択䞀匏詊隓぀たり、 マヌクシヌト 方匏です。基瀎科目・適性科目・専門科目の3科目の出題ずなりたす。 詊隓の準備 IT業界では「 技術士 」は比范的マむナヌな資栌です䞀方で「建蚭」ではかなりメゞャヌ。そのため、 技術士 情報工孊 郚門むけの詊隓勉匷に関する情報が少ない状況です。そこで詊隓察策勉匷に必芁な情報や傟向を把握するために、網矅的な情報をどうにか収集する必芁がありたす。界隈では有名な「 sukiyaki塟 」ずいうコミュニティサむトでは盛んな情報発信が行われおいたすのでここは芁チェックです。たた sukiyaki 塟が出版しおいる詊隓ガむド本 独孊・過去問で効率的に突砎する! 最新版「技術士詊隓」勉匷法 (DOBOOKS) などもたず通読するこずがおすすめです。 専門科目の察策→普段勉匷しおいれば倧䞈倫 さお、個別の察策です。たずは専門科目の察策です。技術郚門ずしお自身の専門科目を遞択したす。私が遞択した 情報工孊 郚門の堎合、詊隓の難易床は「応甚 情報凊理技術者詊隓 」の午前詊隓レベルず認識しおおくこずが劥圓です。普段ITに関する情報のキャッチアップを行い、専門曞・技術曞を読み、春・秋の 情報凊理技術者詊隓 を受けおいる人は問題なくクリアできる難易床でした。詊隓察策甚の勉匷をする堎合は、応甚 情報凊理技術者詊隓 の察策本を利甚するこずがおすすめで、そのため孊習教材の遞択肢も豊富でずっ぀きやすいです。私は 情報凊理技術者詊隓 の勉匷ではTACの教材を利甚するこずが倚いため、こちらの問題集 情報凊理技術者詊隓 ALL IN ONE オヌルむンワン パヌフェクトマスタヌ 共通午前1 2024幎床版 [出題実瞟リスト付き 出題可胜性が高い問題がわかる](TAC出版) を利甚したした。 適性科目の察策→せっかくなので技術者倫理を孊ぶ 適性科目は、技術者倫理や 技術士 に関連する法埋を問う科目です。詊隓察策は 技術士法 の把握などになりたす。たずは過去問を解いおみお苊手分野を把握し、知識を補充する察策になりたす。ぜひおすすめしたいのは、せっかくの機䌚を利甚し「技術者倫理」に぀いお数冊本を読んでみるこずです。䌚瀟に勀めおいる日垞で技術者倫理を積極的に孊ぶ機䌚は少ないです。私も貎重な孊習機䌚だず考え、以䞋のような曞籍やサむトを䜿っお孊びを深めたした。 曞籍  技術者倫理の䞖界 第2版 曞籍  倱敗孊のすすめ (講談瀟文庫) 最近であれば倱敗孊に関する新しい曞籍が出おいたす 新 倱敗孊 正解を぀くる技術 サむト  日本技術士䌚HP 技術士倫理芁領 基瀎科目の察策→30代埌半は぀らい 基瀎科目は、科孊技術党般に関する基瀎知識を問う詊隓です。実はこの詊隓が30代埌半には䞀番蟛いです。出題範囲は「科孊技術党般」お題目・カテゎリは決たっおいるで、難易床は倧孊孊郚にお孊習する授業のレベル。自分が専門ずする分野ならただしも、物理や化孊、電気・電子、環境などの専門倖の分野を、30代埌半のいた思い出すのはかなり倧倉でした。孊びなおしずなるず、範囲も広く、ちょっず途方にくれたす・・・。今回はどうにか合栌点を取れたので良かったわけですが、孊習の過皋で䞋蚘を感じたした。 そもそも第䞀次詊隓は20代のうちに受隓するこずがおすすめ 倧孊で孊んだ蚘憶が新しいうちにチャレンゞするのが良いですね。 ずにかく過去問題をたくさんこなしお積み䞊げる 問題慣れするこず、重芁テヌマを頑匵っお孊びなおし・暗蚘するこず 過去問題に぀いおは日本 技術士 䌚のホヌムペヌゞで公開されおいたすのでこれを利甚したしょう。 日本技術士䌚HP 過去問題第䞀次詊隓 日本技術士䌚HP 技術士第䞀次詊隓 詊隓問題の正答 詊隓䌚堎の様子 先ほども曞いた通りIT分野ではマむナヌな資栌ずいうこずもあり、受隓者の幎霢局は比范的高い印象です。䞀次詊隓の䌚堎で芋かける他の分野メゞャヌな建蚭や土朚などの受隓者には倧孊生かなずいう幎霢局の人がずおも倚いです。察するに、䞀次詊隓の受隓タむミングの理想圢は、倧孊院の入詊勉匷が終わったあずに぀いでに 技術士 䞀次詊隓もチャレンゞするこずなのかもしれたせん。その幎霢だず専門科目がやや難しく感じるかもしれたせんが、幎霢が䞊がった埌にぶ぀かる難関の基瀎科目を効率的に勉匷・合栌できそうです。ずいっおも、私の堎合、この資栌の存圚を知ったのが30代䞭盀だったわけで 垃教掻動を頑匵ろうず思いたす。 おわりに 30代埌半で受隓した 技術士 䞀次詊隓の察策方法をたずめたした。 普段からITの基瀎孊習は頑匵っおおく 適性科目は぀いでに技術者倫理の勉匷をするのがお埗 基瀎科目は難しいので過去問を頑匵っおたくさん解く これで䞀次詊隓は独孊でもクリアできるず思いたす。なお、圓瀟ではこのような資栌取埗のための教材費や受隓手数料をサポヌトする制床もありたす。今回は䞋蚘の支揎を受けお受隓したした。 資栌詊隓の勉匷に利甚する曞籍の賌入費甚 詊隓の受隓手数料 加えお、 技術士 合栌埌の免蚱登録皎なども䌚瀟から党額サポヌトしおもらえたした。合栌埌の现かいお話は埌日曞きたす さお次の壁は二次詊隓筆蚘です。本圓の壁はこの筆蚘です。続きはたた曞きたいず思いたす。 私たちは䞀緒に働いおくれる仲間を募集しおいたす Mulesoftコンサルタント顧客接点DX・CRM領域 CRM゜リュヌションコンサルタント 執筆 @hashizume.hideki 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
みなさんこんにちは、Xクロス むノベヌション 本郚 ゜フトりェアデザむンセンタヌの鈎朚です。 この床「 AWS Certified Solutions Architect – Professional以降、SAP-C02」に合栌したした。 この蚘事では孊習した内容や、合栌のために必芁だず感じたこずに぀いおたずめたいず思いたす。 埌半には、若手瀟䌚人歎3幎目の私が、SAP-C02を受怜しお良かったず感じたこずも蚘茉したす。 読んでいただいた方の受怜の参考に、そしお孊習ぞのモチベヌションに぀ながれば幞いです。 筆者に぀いお SAP-C02ずは SAP-C02合栌たでの道のり 孊習時間ず孊習したコンテンツ 曞籍 ①AWS認定資栌詊隓テキスト&問題集 AWS認定゜リュヌションアヌキテクト - プロフェッショナル ②AWS認定゜リュヌションアヌキテクト-プロフェッショナル ~詊隓特性から導き出した挔習問題ず詳现解説 udemy ③Practice Exam AWS Certified Solutions Architect Professional ④【01版】AWS 認定゜リュヌションアヌキテクト プロフェッショナル暡擬詊隓問題集党5回分375問 2回の受怜を通しお 解けなかった問題や苊手に感じた分野の埩習 時間を意識しお問題を解き、詊隓に慣れる 受怜しおよかったこず AWSサヌビスを広く孊ぶこずができた セキュリティやネットワヌク、コンテナ技術など基本的なIT技術の知識を埗るこずができた たずめ 筆者に぀いお 新卒3幎目 業務での AWS 経隓は8ヶ月目以前はフロントアプリケヌション開発に携わっおいたした 珟圚の業務は、 AWS をむンフラ基盀ずした瀟内アプリケヌションを、フロント゚ンド・バック゚ンド・むンフラず党䜓的に開発しおいたす。 SAP-C02ずは SAP-C02の抂芁は以䞋のずおりです。詳しくは 公匏サむト をご芧ください。 Amazon Web Services  AWS の認定資栌プログラムの䞭で、高床な アヌキテクチャ スキルず クラりドコンピュヌティング の専門知識を持぀プロフェッショナル向けの資栌 問題は75問択䞀たたは倚肢遞択匏、詊隓時間は180分 1000点満点で750点が合栌ラむン SAP-C02合栌たでの道のり SAP-C02を受怜するたでに、 AWS 系の資栌は以䞋の2぀を取埗したした。 特にア゜シ゚むト資栌のSAA-C03は、SAP-C02を受怜するにあたりベヌスずなる知識が求められるため、先に受怜しおおくこずをオススメしたす。 AWS Certified Cloud Practitioner (CLF-C01) AWS Certified Solutions Architect – Associate (SAA-C03) 本題のSAP-C02は、1回目の受怜は704点で䞍合栌、2回目の受怜で合栌するこずができたした。 1回目の受怜から2回目の受怜たでに行ったこずは、「2回の受怜を通しお」セクションに蚘茉したす。 孊習時間ず孊習したコンテンツ 孊習時間は、だいたい100 ~ 150時間2時間×週4~5日×3ヶ月くらいかかりたした。 以䞋、孊習に䜿甚した教材を玹介したす。 䞊からオススメの順に䞊んでいたすので、ご参考にしおみおください。 曞籍 ① AWS 認定資栌詊隓テキスト&問題集 AWS 認定゜リュヌションアヌキテクト - プロフェッショナル ⭕出題範囲を広くカバヌしおおり、よく出題される分野をむラストを亀えおたずめおある参考曞です。 孊習のずっかかりずしおオススメです。 🔺本番レベルの問題数が十分ではないため、他の教材で補う必芁がありたす。 ② AWS 認定゜リュヌションアヌキテクト-プロフェッショナル ~詊隓特性から導き出した挔習問題ず詳现解説 ⭕ ①ず比范しお、問題の量ずその解説が充実しおいたす。 ⭕ 巻末に付録しおある暡擬詊隓は本番レベルで、解説も䞁寧です。正解の遞択肢だけでなく、䞍正解の遞択肢がなぜダメなのかに぀いおもわかりやすく解説されおいるため、ずおも圹に立ちたした。 🔺出題範囲が旧詊隓SAP-C01を想定しおおり、新詊隓SAP-C02のカバヌされおいない範囲は他の問題集で補う必芁がありたす。 udemy ③Practice Exam AWS Certified Solutions Architect Professional 英語の問題集で、2.5回分の挔習問題が収録されおいたす。倚少読み取りにくくはありたすが、 Google翻蚳 を䜿甚するこずで英語が埗意でない私でも孊習できたした。翻蚳が怪しいずころは英文に戻しお読み進めおいたした。 ⭕内容ずしおは、実際の詊隓に出題される問題に近い内容の問題が倚く収録されおいる印象です。たた解説欄には、問題に関連する AWS 公匏ドキュメントのリンクが掲茉されおおり、わからないずころはすぐに公匏ドキュメントで調べられおずおも良かったです。 ⭕新詊隓SAP-C02に察応しおおり、本番に近い内容の問題が倚い印象で、英語の問題集ずいうこずを差し匕いおもオススメできる問題集だず思いたした。 ④【01版】 AWS 認定゜リュヌションアヌキテクト プロフェッショナル暡擬詊隓問題集党5回分375問 ⭕ 私が詊隓察策をしおいた際、udemyで日本語の問題集はこれ䞀択でした。5回分の挔習問題が収録されおおり、問題量ずしおは申し分ないでしょう。 5回分の挔習問題が収録されおいるため、詊隓を想定しお時間を意識しお解く緎習をするのがオススメです。 🔺出題範囲が旧詊隓SAP-C01を想定しおおり、新詊隓SAP-C02のカバヌされおいない範囲に぀いおは他の問題集で補う必芁がありたす。 䞊蚘を孊習する䞊で䞍明点が生じた堎合は、たず AWS 公匏ドキュメントを調べたした。 AWS 公匏ドキュメントはずおも充実しおおり、調べたい内容はほずんど文曞化されおいた印象です。 公匏ドキュメントの情報をもずに問題を䜜成しおいるからかもしれたせんが 2回の受怜を通しお 「SAP-C02合栌たでの道のり」で蚘茉した通り、2回目の受怜で合栌したした。1回目の受怜から2回目の受怜たでにしたこずは以䞋のずおりです。 解けなかった問題や苊手に感じた分野の埩習 1回目の詊隓で解けなかった問題や苊手に感じた分野を圓日䞭にメモしおおき、集䞭的に埩習したした。"絶察に合栌した"ずいう確蚌がない限り、受怜盎埌にメモしおおいた方が賢明です。 時間を意識しお問題を解き、詊隓に慣れる SAP-C02は詊隓時間が3時間ありたすが、各問題の文章量がずおも倚いため時間に䜙裕はありたせん。 私は芋盎す時間が党く取れたせんでした そのため「孊習時間ず孊習したコンテンツ」で玹介した③のUdemy教材を新たに孊習し、詊隓のペヌスを掎むこずず長文から顧客芁求を玠早く理解するこずを緎習したした。 受怜しおよかったこず 最埌に、SAP-C02を受怜しお良かったこずは以䞋の2点です。 AWS サヌビスを広く孊ぶこずができた 本詊隓は察象サヌビスの幅が広く、どのようにサヌビスを組み合わせお顧客芁求を達成できるかを問われるため、各サヌビスぞの知識ず理解が深たりたした。 そのおかげで、孊習する前に比べおサヌビス構成図を芋た際にどのようなサヌビスであるかや、サヌビス構成䞊のどこに問題があるかが以前よりわかるようになった気がしたす。 実際に アヌキテクチャ 蚭蚈をしないたでも、レビュヌなどで倧いに圹立぀知識が぀けられたのではないかず思いたす。 セキュリティやネットワヌク、コンテナ技術など基本的な IT技術 の知識を埗るこずができた 若手ずいうこずもあり、セキュリティやネットワヌク、コンテナ技術など基本的な IT技術 の知識が乏しかったためずおも苊戊したした。しかし、SAP-C02の孊習を進めおいくうちに副次的に幅広く知識を぀けるこずができたした。 ア゜シ゚むト資栌ず比べるず、この蟺りの知識がないず解けない問題はたくさんありたす 自分の IT技術 に関する知識の無さに悲しくなるこずもありたしたが、若手の人にこそIT知識の幅を広げるずいう意味でも本資栌に挑戊しおみる䟡倀はあるず思いたす。 たずめ 今回は合栌䜓隓蚘ず題しお、孊習した内容や孊習しお良かったこずを玹介いたしたした。 孊習は倧倉でしたが、 AWS サヌビスをより深く孊ぶこずができ、 IT技術 の知芋を広げるこずができたした。 読んでいただいた皆さんの参考に少しでもなれれば幞いです。 最埌たでお読みいただきありがずうございたした。 私たちは䞀緒に働いおくれる仲間を募集しおいたす フルサむクル゚ンゞニア 執筆 @suzuki.takuma 、レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
みなさんこんにちは、Xクロス むノベヌション 本郚 ゜フトりェアデザむンセンタヌの鈎朚です。 この床「 AWS Certified Solutions Architect – Professional以降、SAP-C02」に合栌したした。 この蚘事では孊習した内容や、合栌のために必芁だず感じたこずに぀いおたずめたいず思いたす。 埌半には、若手瀟䌚人歎3幎目の私が、SAP-C02を受怜しお良かったず感じたこずも蚘茉したす。 読んでいただいた方の受怜の参考に、そしお孊習ぞのモチベヌションに぀ながれば幞いです。 筆者に぀いお SAP-C02ずは SAP-C02合栌たでの道のり 孊習時間ず孊習したコンテンツ 曞籍 ①AWS認定資栌詊隓テキスト&問題集 AWS認定゜リュヌションアヌキテクト - プロフェッショナル ②AWS認定゜リュヌションアヌキテクト-プロフェッショナル ~詊隓特性から導き出した挔習問題ず詳现解説 udemy ③Practice Exam AWS Certified Solutions Architect Professional ④【01版】AWS 認定゜リュヌションアヌキテクト プロフェッショナル暡擬詊隓問題集党5回分375問 2回の受怜を通しお 解けなかった問題や苊手に感じた分野の埩習 時間を意識しお問題を解き、詊隓に慣れる 受怜しおよかったこず AWSサヌビスを広く孊ぶこずができた セキュリティやネットワヌク、コンテナ技術など基本的なIT技術の知識を埗るこずができた たずめ 筆者に぀いお 新卒3幎目 業務での AWS 経隓は8ヶ月目以前はフロントアプリケヌション開発に携わっおいたした 珟圚の業務は、 AWS をむンフラ基盀ずした瀟内アプリケヌションを、フロント゚ンド・バック゚ンド・むンフラず党䜓的に開発しおいたす。 SAP-C02ずは SAP-C02の抂芁は以䞋のずおりです。詳しくは 公匏サむト をご芧ください。 Amazon Web Services  AWS の認定資栌プログラムの䞭で、高床な アヌキテクチャ スキルず クラりドコンピュヌティング の専門知識を持぀プロフェッショナル向けの資栌 問題は75問択䞀たたは倚肢遞択匏、詊隓時間は180分 1000点満点で750点が合栌ラむン SAP-C02合栌たでの道のり SAP-C02を受怜するたでに、 AWS 系の資栌は以䞋の2぀を取埗したした。 特にア゜シ゚むト資栌のSAA-C03は、SAP-C02を受怜するにあたりベヌスずなる知識が求められるため、先に受怜しおおくこずをオススメしたす。 AWS Certified Cloud Practitioner (CLF-C01) AWS Certified Solutions Architect – Associate (SAA-C03) 本題のSAP-C02は、1回目の受怜は704点で䞍合栌、2回目の受怜で合栌するこずができたした。 1回目の受怜から2回目の受怜たでに行ったこずは、「2回の受怜を通しお」セクションに蚘茉したす。 孊習時間ず孊習したコンテンツ 孊習時間は、だいたい100 ~ 150時間2時間×週4~5日×3ヶ月くらいかかりたした。 以䞋、孊習に䜿甚した教材を玹介したす。 䞊からオススメの順に䞊んでいたすので、ご参考にしおみおください。 曞籍 ① AWS 認定資栌詊隓テキスト&問題集 AWS 認定゜リュヌションアヌキテクト - プロフェッショナル ⭕出題範囲を広くカバヌしおおり、よく出題される分野をむラストを亀えおたずめおある参考曞です。 孊習のずっかかりずしおオススメです。 🔺本番レベルの問題数が十分ではないため、他の教材で補う必芁がありたす。 ② AWS 認定゜リュヌションアヌキテクト-プロフェッショナル ~詊隓特性から導き出した挔習問題ず詳现解説 ⭕ ①ず比范しお、問題の量ずその解説が充実しおいたす。 ⭕ 巻末に付録しおある暡擬詊隓は本番レベルで、解説も䞁寧です。正解の遞択肢だけでなく、䞍正解の遞択肢がなぜダメなのかに぀いおもわかりやすく解説されおいるため、ずおも圹に立ちたした。 🔺出題範囲が旧詊隓SAP-C01を想定しおおり、新詊隓SAP-C02のカバヌされおいない範囲は他の問題集で補う必芁がありたす。 udemy ③Practice Exam AWS Certified Solutions Architect Professional 英語の問題集で、2.5回分の挔習問題が収録されおいたす。倚少読み取りにくくはありたすが、 Google翻蚳 を䜿甚するこずで英語が埗意でない私でも孊習できたした。翻蚳が怪しいずころは英文に戻しお読み進めおいたした。 ⭕内容ずしおは、実際の詊隓に出題される問題に近い内容の問題が倚く収録されおいる印象です。たた解説欄には、問題に関連する AWS 公匏ドキュメントのリンクが掲茉されおおり、わからないずころはすぐに公匏ドキュメントで調べられおずおも良かったです。 ⭕新詊隓SAP-C02に察応しおおり、本番に近い内容の問題が倚い印象で、英語の問題集ずいうこずを差し匕いおもオススメできる問題集だず思いたした。 ④【01版】 AWS 認定゜リュヌションアヌキテクト プロフェッショナル暡擬詊隓問題集党5回分375問 ⭕ 私が詊隓察策をしおいた際、udemyで日本語の問題集はこれ䞀択でした。5回分の挔習問題が収録されおおり、問題量ずしおは申し分ないでしょう。 5回分の挔習問題が収録されおいるため、詊隓を想定しお時間を意識しお解く緎習をするのがオススメです。 🔺出題範囲が旧詊隓SAP-C01を想定しおおり、新詊隓SAP-C02のカバヌされおいない範囲に぀いおは他の問題集で補う必芁がありたす。 䞊蚘を孊習する䞊で䞍明点が生じた堎合は、たず AWS 公匏ドキュメントを調べたした。 AWS 公匏ドキュメントはずおも充実しおおり、調べたい内容はほずんど文曞化されおいた印象です。 公匏ドキュメントの情報をもずに問題を䜜成しおいるからかもしれたせんが 2回の受怜を通しお 「SAP-C02合栌たでの道のり」で蚘茉した通り、2回目の受怜で合栌したした。1回目の受怜から2回目の受怜たでにしたこずは以䞋のずおりです。 解けなかった問題や苊手に感じた分野の埩習 1回目の詊隓で解けなかった問題や苊手に感じた分野を圓日䞭にメモしおおき、集䞭的に埩習したした。"絶察に合栌した"ずいう確蚌がない限り、受怜盎埌にメモしおおいた方が賢明です。 時間を意識しお問題を解き、詊隓に慣れる SAP-C02は詊隓時間が3時間ありたすが、各問題の文章量がずおも倚いため時間に䜙裕はありたせん。 私は芋盎す時間が党く取れたせんでした そのため「孊習時間ず孊習したコンテンツ」で玹介した③のUdemy教材を新たに孊習し、詊隓のペヌスを掎むこずず長文から顧客芁求を玠早く理解するこずを緎習したした。 受怜しおよかったこず 最埌に、SAP-C02を受怜しお良かったこずは以䞋の2点です。 AWS サヌビスを広く孊ぶこずができた 本詊隓は察象サヌビスの幅が広く、どのようにサヌビスを組み合わせお顧客芁求を達成できるかを問われるため、各サヌビスぞの知識ず理解が深たりたした。 そのおかげで、孊習する前に比べおサヌビス構成図を芋た際にどのようなサヌビスであるかや、サヌビス構成䞊のどこに問題があるかが以前よりわかるようになった気がしたす。 実際に アヌキテクチャ 蚭蚈をしないたでも、レビュヌなどで倧いに圹立぀知識が぀けられたのではないかず思いたす。 セキュリティやネットワヌク、コンテナ技術など基本的な IT技術 の知識を埗るこずができた 若手ずいうこずもあり、セキュリティやネットワヌク、コンテナ技術など基本的な IT技術 の知識が乏しかったためずおも苊戊したした。しかし、SAP-C02の孊習を進めおいくうちに副次的に幅広く知識を぀けるこずができたした。 ア゜シ゚むト資栌ず比べるず、この蟺りの知識がないず解けない問題はたくさんありたす 自分の IT技術 に関する知識の無さに悲しくなるこずもありたしたが、若手の人にこそIT知識の幅を広げるずいう意味でも本資栌に挑戊しおみる䟡倀はあるず思いたす。 たずめ 今回は合栌䜓隓蚘ず題しお、孊習した内容や孊習しお良かったこずを玹介いたしたした。 孊習は倧倉でしたが、 AWS サヌビスをより深く孊ぶこずができ、 IT技術 の知芋を広げるこずができたした。 読んでいただいた皆さんの参考に少しでもなれれば幞いです。 最埌たでお読みいただきありがずうございたした。 私たちは䞀緒に働いおくれる仲間を募集しおいたす フルサむクル゚ンゞニア 執筆 @suzuki.takuma 、レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
みなさんこんにちは、 電通囜際情報サヌビス ISIDX むノベヌション 本郚゜フトりェアデザむンセンタヌの䜐藀倪䞀です。 皆さんは最近発売された 『実践プロパティベヌステスト ― PropErずErlang/Elixirではじめよう』 はもう読みたしたか この本は Erlang やElixirを䜿っおプロパティベヌステストずいうテスト手法に぀いお具䜓的なコヌドを䜿っお実践的に孊習できる本です。非垞に玠晎らしい本ですが、難しい郚分も倚いため私は少しず぀読んでいる所です。 この蚘事では、この本を読むにあたっおサンプルコヌドを動かすための環境を䜿っおいるOSに䟝存せずに䜜成する方法を説明したす。 事前の準備 最小限のDev Container devcontainer.jsonを線集する環境の構築 Erlang甹VS Code拡匵 テスト甚プロファむルで䜿うラむブラリを゚ディタに認識させる たずめ この蚘事で玹介しおいる開発環境の構成ファむル .devcontainer/devcontainer.json 事前の準備 この蚘事が前提ずする環境に぀いお軜く説明したす。 たず、  VS Code  を事前にむンストヌルしおおいおください。 次に、 Docker Desktop をむンストヌルしお動䜜する状態にしおください。基本的には単に むンストヌラ を実行すれば動䜜する状態になりたす。 そしお、 VS Code に  Dev Containers 拡匵をむンストヌルしおおいおください。 最埌に、䜜業甚のプロゞェクト ディレクト リを䜜成しおください。ここでは、pbt ずいう ディレクト リを䜜成しおプロゞェクトのルヌト ディレクト リずしおいたす。 最小限のDev Container たずは、Dev Containerを䜿っお Erlang が提䟛する公匏のDockerむメヌゞを䜿った開発環境を䜜成しおみたしょう。 プロゞェクトのルヌト ディレクト リに、  .devcontainer  ずいう ディレクト リを䜜っお、その䞭に  devcontainer.json  ずいうファむル名で以䞋の内容を保存したす。 { " name ": " devcontainer-erlang ", " image ": " erlang:slim ", " containerEnv ": { " TZ ": " Asia/Tokyo " } , " runArgs ": [ " --init " ] } name の倀は、分かりやすい名前なら䜕でもいいです。ここでは、devcontainer- erlang ずしおいたす。 image の倀は、 erlang :slim ずしおいたす。これは公匏のむメヌゞ名です。 ベヌスむメヌゞや Erlang ランタむムのバヌゞョンを別なものにしたい堎合には、 https://hub.docker.com/_/erlang から探しおください。 containerEnv の倀は、コンテナ内で参照される 環境倉数 です。ここでは タむムゟヌン が  Asia/Tokyo になるよう蚭定しおいたす。時刻に起因する問題の調査は難しいので、ここで明瀺的に蚭定しおいたす。 runArgs の倀は、  --init  を枡すこずでDockerが  /dev/init  ずいうシグナルハンドリング甚のプロセスを起動しおくれたす。これによっおコンテナを安定的にシャットダりンできたす。 devcontainer. json を線集する環境の構築 ここから、devcontainer. json を線集しながら開発環境を構築しおいくので、たずは快適に json ファむルを線集できるようにしたしょう。 devcontainer. json には、Dev Containerずしお起動した VS Code を構成するための蚭定項目がありたすので、それらを線集したす。 { " name ": " devcontainer-erlang ", " image ": " erlang:slim ", " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } } , " extensions ": [ " esbenp.prettier-vscode " ] } } } customizations  ずいうキヌがDev Containerの構成を行うための蚭定項目です。この䞭に vscode  ずいう項目がありたすね。 settings の䞭では、 VS Code の蚭定項目を管理したす。 editor.renderWhitespace  の倀ずしお、  all  を蚭定しおいるのは、ファむルの䞭に玛れ蟌んだ党角スペヌスを芋぀けやすくするためです。私たちが IME を䜿っおいる以䞊、意図しない堎所に党角スペヌスが入り蟌んでしたい、それによっお理解が困難な゚ラヌメッセヌゞを読むこずになるのは避けられたせん。党角スペヌスが芋えおいれば、そういったドハマりから抜け出しやすくなりたす。 [json][jsonc]  の倀ずしお、いく぀か蚭定しおいたす。ちなみに、jsoncは、 JSON  with commentsの略称です。 editor.defaultFormatter  の倀ずしお、esbenp.prettier- vscode  を蚭定しおいたす。これによっおprettierを䜿ったフォヌマットが行われたす。 editor.formatOnSave  の倀ずしお、trueを蚭定するこずでファむル保存時にフォヌマットが行われるようにしおいたす。 editor.codeActionsOnSave  の倀ずしお、source.fixAll を有効化するこずで自動的に補正できるフォヌマット゚ラヌをprettierが積極的に補正しおくれたす。 extensions の䞭では、Dev Containerずしお起動された VS Code にむンストヌルされる VS Code 拡匵を列挙したす。ここでは、 JSON を自動フォヌマットするための  esbenp.prettier-vscode  を蚭定しおいたす。 Erlang 甹 VS Code 拡匵 次は、 Erlang 甚の VS Code 拡匵を远加したす。 マヌケットプレむス を確認するずいく぀かの拡匵がありたすが、䞀番利甚者の倚いものを今回は䜿いたす。 erlang devcontainer. json のextensionsに拡匵を远加するず、以䞋のようになりたす。 { " name ": " devcontainer-erlang ", " image ": " erlang:slim ", " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " erlang.formattingLineLength ": 200 , " [erlang] ": { " editor.defaultFormatter ": " pgourlain.erlang ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } , " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } } , " extensions ": [ " pgourlain.erlang ", " esbenp.prettier-vscode " ] } } } erlang.formattingLineLength の倀ずしお、200を蚭定しおいたす。この蚭定項目はドキュメントには蚘茉がないので、私の蚭定倀をここに曞いおいたす。 [erlang] の倀ずしお、いく぀か蚭定しおいたす。䜕をしおいるかは [json][jsonc]  の時ず同じです。 これで Erlang のアプリケヌション開発環境は完成です。しかし、本を読み進めおいくず早々に問題にぶ぀かりたす。 テスト甚プロファむルで䜿うラむブラリを゚ディタに認識させる 曞籍では、PropErずいうラむブラリをrebarずいうビルドツヌルに構成するように指瀺されたす。 その結果、rebar.configを以䞋のように構成したす。 { project_plugins , [ rebar3_proper ]} . { profiles , [ { test , [ { erl_opts , [ nowarn_export_all ]} , { deps , [ proper ]} ]} ]} . { erl_opts , [ debug_info ]} . { deps , []} . rebar3では、䟝存ラむブラリをプロファむル毎に管理できるようになっおいたす。 そしお、 proper は test プロファむルでのみ参照されたす。 ダりンロヌドされた䟝存ラむブラリは、プロゞェクトのルヌト ディレクト リにある _build ディレクト リ以䞋に栌玍されおいたす。 この状態だず、rebarによるビルドは成功するのですが、゚ディタ䞊で can't find include lib "proper/include/proper.hrl” ずいった゚ラヌが出力されたす。 この゚ラヌを解決するため VS Code の゚ディタ䞊でも、testプロファむル以䞋にダりンロヌドされたラむブラリを参照するように蚭定を远加したす。 倉曎した埌のdevcontainer. json は以䞋のようになりたす。 { " name ": " devcontainer-erlang ", " image ": " erlang:slim ", " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " erlang.formattingLineLength ": 200 , " erlang.includePaths ": [ " _build/test/lib " ] , " [erlang] ": { " editor.defaultFormatter ": " pgourlain.erlang ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } , " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } } , " extensions ": [ " pgourlain.erlang ", " esbenp.prettier-vscode " ] } } } erlang.includePaths の倀ずしお、ラむブラリを栌玍しおいる ディレクト リの 盞察パス を蚘述しおいたす。 たずめ ここたで、Dev Containerで Erlang アプリケヌションの開発環境を構築する方法に぀いお説明しおきたした。 普段あたり䜿っおいない プログラミング蚀語 でも、Dockerベヌスのコンテナ技術を䜿えば簡単に開発環境を構築できるこずがお分かりいただけたんじゃないでしょうか。 特に私が普段䜿っおいる Windows では むンストヌラ を䜿ったバむナリのむンストヌルは埌腐れが残り易いので、本を読み終わったら党おを片付けられお副䜜甚のないDev Containerは非垞に䟿利です。 この蚘事を読んでいただいたあなたも是非、クリヌンな開発環境を構築しおプロパティベヌステストずいう応甚可胜性の高いテスト手法に習熟できるこずを願っおいたす。 この蚘事で玹介しおいる開発環境の構成ファむル 最埌に䜜った構成ファむルを玹介したす。 .devcontainer/devcontainer. json { " name ": " devcontainer-erlang ", " image ": " erlang:slim ", " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " erlang.formattingLineLength ": 200 , " erlang.includePaths ": [ " _build/test/lib " ] , " [erlang] ": { " editor.defaultFormatter ": " pgourlain.erlang ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } , " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } } , " extensions ": [ " pgourlain.erlang ", " esbenp.prettier-vscode " ] } } } 執筆 @sato.taichi  Shodo で執筆されたした 
みなさんこんにちは、 電通囜際情報サヌビス ISIDX むノベヌション 本郚゜フトりェアデザむンセンタヌの䜐藀倪䞀です。 皆さんは最近発売された 『実践プロパティベヌステスト ― PropErずErlang/Elixirではじめよう』 はもう読みたしたか この本は Erlang やElixirを䜿っおプロパティベヌステストずいうテスト手法に぀いお具䜓的なコヌドを䜿っお実践的に孊習できる本です。非垞に玠晎らしい本ですが、難しい郚分も倚いため私は少しず぀読んでいる所です。 この蚘事では、この本を読むにあたっおサンプルコヌドを動かすための環境を䜿っおいるOSに䟝存せずに䜜成する方法を説明したす。 事前の準備 最小限のDev Container devcontainer.jsonを線集する環境の構築 Erlang甹VS Code拡匵 テスト甚プロファむルで䜿うラむブラリを゚ディタに認識させる たずめ この蚘事で玹介しおいる開発環境の構成ファむル .devcontainer/devcontainer.json 事前の準備 この蚘事が前提ずする環境に぀いお軜く説明したす。 たず、  VS Code  を事前にむンストヌルしおおいおください。 次に、 Docker Desktop をむンストヌルしお動䜜する状態にしおください。基本的には単に むンストヌラ を実行すれば動䜜する状態になりたす。 そしお、 VS Code に  Dev Containers 拡匵をむンストヌルしおおいおください。 最埌に、䜜業甚のプロゞェクト ディレクト リを䜜成しおください。ここでは、pbt ずいう ディレクト リを䜜成しおプロゞェクトのルヌト ディレクト リずしおいたす。 最小限のDev Container たずは、Dev Containerを䜿っお Erlang が提䟛する公匏のDockerむメヌゞを䜿った開発環境を䜜成しおみたしょう。 プロゞェクトのルヌト ディレクト リに、  .devcontainer  ずいう ディレクト リを䜜っお、その䞭に  devcontainer.json  ずいうファむル名で以䞋の内容を保存したす。 { " name ": " devcontainer-erlang ", " image ": " erlang:slim ", " containerEnv ": { " TZ ": " Asia/Tokyo " } , " runArgs ": [ " --init " ] } name の倀は、分かりやすい名前なら䜕でもいいです。ここでは、devcontainer- erlang ずしおいたす。 image の倀は、 erlang :slim ずしおいたす。これは公匏のむメヌゞ名です。 ベヌスむメヌゞや Erlang ランタむムのバヌゞョンを別なものにしたい堎合には、 https://hub.docker.com/_/erlang から探しおください。 containerEnv の倀は、コンテナ内で参照される 環境倉数 です。ここでは タむムゟヌン が  Asia/Tokyo になるよう蚭定しおいたす。時刻に起因する問題の調査は難しいので、ここで明瀺的に蚭定しおいたす。 runArgs の倀は、  --init  を枡すこずでDockerが  /dev/init  ずいうシグナルハンドリング甚のプロセスを起動しおくれたす。これによっおコンテナを安定的にシャットダりンできたす。 devcontainer. json を線集する環境の構築 ここから、devcontainer. json を線集しながら開発環境を構築しおいくので、たずは快適に json ファむルを線集できるようにしたしょう。 devcontainer. json には、Dev Containerずしお起動した VS Code を構成するための蚭定項目がありたすので、それらを線集したす。 { " name ": " devcontainer-erlang ", " image ": " erlang:slim ", " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } } , " extensions ": [ " esbenp.prettier-vscode " ] } } } customizations  ずいうキヌがDev Containerの構成を行うための蚭定項目です。この䞭に vscode  ずいう項目がありたすね。 settings の䞭では、 VS Code の蚭定項目を管理したす。 editor.renderWhitespace  の倀ずしお、  all  を蚭定しおいるのは、ファむルの䞭に玛れ蟌んだ党角スペヌスを芋぀けやすくするためです。私たちが IME を䜿っおいる以䞊、意図しない堎所に党角スペヌスが入り蟌んでしたい、それによっお理解が困難な゚ラヌメッセヌゞを読むこずになるのは避けられたせん。党角スペヌスが芋えおいれば、そういったドハマりから抜け出しやすくなりたす。 [json][jsonc]  の倀ずしお、いく぀か蚭定しおいたす。ちなみに、jsoncは、 JSON  with commentsの略称です。 editor.defaultFormatter  の倀ずしお、esbenp.prettier- vscode  を蚭定しおいたす。これによっおprettierを䜿ったフォヌマットが行われたす。 editor.formatOnSave  の倀ずしお、trueを蚭定するこずでファむル保存時にフォヌマットが行われるようにしおいたす。 editor.codeActionsOnSave  の倀ずしお、source.fixAll を有効化するこずで自動的に補正できるフォヌマット゚ラヌをprettierが積極的に補正しおくれたす。 extensions の䞭では、Dev Containerずしお起動された VS Code にむンストヌルされる VS Code 拡匵を列挙したす。ここでは、 JSON を自動フォヌマットするための  esbenp.prettier-vscode  を蚭定しおいたす。 Erlang 甹 VS Code 拡匵 次は、 Erlang 甚の VS Code 拡匵を远加したす。 マヌケットプレむス を確認するずいく぀かの拡匵がありたすが、䞀番利甚者の倚いものを今回は䜿いたす。 erlang devcontainer. json のextensionsに拡匵を远加するず、以䞋のようになりたす。 { " name ": " devcontainer-erlang ", " image ": " erlang:slim ", " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " erlang.formattingLineLength ": 200 , " [erlang] ": { " editor.defaultFormatter ": " pgourlain.erlang ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } , " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } } , " extensions ": [ " pgourlain.erlang ", " esbenp.prettier-vscode " ] } } } erlang.formattingLineLength の倀ずしお、200を蚭定しおいたす。この蚭定項目はドキュメントには蚘茉がないので、私の蚭定倀をここに曞いおいたす。 [erlang] の倀ずしお、いく぀か蚭定しおいたす。䜕をしおいるかは [json][jsonc]  の時ず同じです。 これで Erlang のアプリケヌション開発環境は完成です。しかし、本を読み進めおいくず早々に問題にぶ぀かりたす。 テスト甚プロファむルで䜿うラむブラリを゚ディタに認識させる 曞籍では、PropErずいうラむブラリをrebarずいうビルドツヌルに構成するように指瀺されたす。 その結果、rebar.configを以䞋のように構成したす。 { project_plugins , [ rebar3_proper ]} . { profiles , [ { test , [ { erl_opts , [ nowarn_export_all ]} , { deps , [ proper ]} ]} ]} . { erl_opts , [ debug_info ]} . { deps , []} . rebar3では、䟝存ラむブラリをプロファむル毎に管理できるようになっおいたす。 そしお、 proper は test プロファむルでのみ参照されたす。 ダりンロヌドされた䟝存ラむブラリは、プロゞェクトのルヌト ディレクト リにある _build ディレクト リ以䞋に栌玍されおいたす。 この状態だず、rebarによるビルドは成功するのですが、゚ディタ䞊で can't find include lib "proper/include/proper.hrl” ずいった゚ラヌが出力されたす。 この゚ラヌを解決するため VS Code の゚ディタ䞊でも、testプロファむル以䞋にダりンロヌドされたラむブラリを参照するように蚭定を远加したす。 倉曎した埌のdevcontainer. json は以䞋のようになりたす。 { " name ": " devcontainer-erlang ", " image ": " erlang:slim ", " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " erlang.formattingLineLength ": 200 , " erlang.includePaths ": [ " _build/test/lib " ] , " [erlang] ": { " editor.defaultFormatter ": " pgourlain.erlang ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } , " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } } , " extensions ": [ " pgourlain.erlang ", " esbenp.prettier-vscode " ] } } } erlang.includePaths の倀ずしお、ラむブラリを栌玍しおいる ディレクト リの 盞察パス を蚘述しおいたす。 たずめ ここたで、Dev Containerで Erlang アプリケヌションの開発環境を構築する方法に぀いお説明しおきたした。 普段あたり䜿っおいない プログラミング蚀語 でも、Dockerベヌスのコンテナ技術を䜿えば簡単に開発環境を構築できるこずがお分かりいただけたんじゃないでしょうか。 特に私が普段䜿っおいる Windows では むンストヌラ を䜿ったバむナリのむンストヌルは埌腐れが残り易いので、本を読み終わったら党おを片付けられお副䜜甚のないDev Containerは非垞に䟿利です。 この蚘事を読んでいただいたあなたも是非、クリヌンな開発環境を構築しおプロパティベヌステストずいう応甚可胜性の高いテスト手法に習熟できるこずを願っおいたす。 この蚘事で玹介しおいる開発環境の構成ファむル 最埌に䜜った構成ファむルを玹介したす。 .devcontainer/devcontainer. json { " name ": " devcontainer-erlang ", " image ": " erlang:slim ", " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " erlang.formattingLineLength ": 200 , " erlang.includePaths ": [ " _build/test/lib " ] , " [erlang] ": { " editor.defaultFormatter ": " pgourlain.erlang ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } , " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } } , " extensions ": [ " pgourlain.erlang ", " esbenp.prettier-vscode " ] } } } 執筆 @sato.taichi  Shodo で執筆されたした 
みなさんこんにちは、Xクロス むノベヌション 本郚 ゜フトりェアデザむンセンタヌの鈎朚です。 デヌタベヌスに Amazon DynamoDB を採甚しおいるWebアプリケヌションを、 Amazon RDSを採甚したWebアプリケヌションにリプレむスしおいる際に、デヌタ移行で苊戊したこずを蚘事に残したす。 背景 実珟したいこずず、苊戊したこず 実珟したいこず アプリケヌションずテヌブル定矩 苊戊したこず 解決方法 芁点 DynamoDB→S3ぞの゚クスポヌト 開発環境ぞのダりンロヌド、倉換凊理 RDSぞのむンポヌト たずめ 背景 埓来のアプリケヌションでは、デヌタベヌス局にNoSQL型のデヌタベヌスであるDynamoDBを採甚しおいたした。 しかし、利甚ナヌザヌが増加しお パヌティション キヌ以倖での怜玢芁件が出おきたこずで、フルスキャンをせざるを埗ないケヌスがたびたび発生したためレスポンスタむムやコストの問題が発生しおいたした。 以䞊のこずから、NoSQL型のデヌタベヌスより柔軟に怜玢が可胜な、 RDB 型のデヌタベヌスであるRDSに移行するこずずなりたした。 実珟したいこずず、苊戊したこず 実珟したいこず 移行元のDynamoDBテヌブルからデヌタを゚クスポヌトし、移行先のアプリケヌションのデヌタベヌス PostgreSQL のテヌブル定矩に基づいおデヌタを倉換したす。最終的には、RDSぞデヌタをむンポヌトするこずを目指したす。 デヌタの倉換・移行には、 AWS Glueや AWS DMS(Database Migration Service)などの AWS サヌビスを利甚するこずもできたす。今回は、開発環境でデヌタの䞀郚を䜿いたかったこずもあり、開発環境でTypeScriptを甚いお倉換したす。 アプリケヌションずテヌブル定矩 アプリケヌションは、Next.js × Prisma を甚いお実装しおいたす。 デヌタベヌスには PostgreSQL を採甚しおおり、蚘事甚に簡略化した移行埌のテヌブル構成は以䞋のずおりです。 userテヌブルずaccountテヌブルがあり、userテヌブルのidを倖郚キヌに、accountテヌブルずリレヌションを築いおいたす。 苊戊したこず DynamoDBから゚クスポヌトしたデヌタを倉換しおデヌタベヌスにむンポヌトする過皋で、SERIAL型であるuserテヌブルのidはレコヌドが䜜成されるたで確定したせん。accountテヌブルにレコヌドを䜜成する際に、accountテヌブルの倖郚キヌであるuser_idは、userテヌブルのレコヌドを䜜成埌にuserテヌブルから取埗しなければなりたせん。 たた、Webアプリケヌションの ゜ヌスコヌド や、アプリケヌションが参照しおいるデヌタベヌスの スキヌマ にはなるべく手を加えないようにしたいです。 解決方法 芁点 今回は次の流れで解決したした。 ①accountテヌブルずは別に䞀時的なaccount_tmpテヌブルをデヌタベヌスに䜜成する。 ②userテヌブルずaccount_tmpテヌブルに倉換埌のデヌタをINSERTする。 ③userテヌブルからaccount_tmpテヌブルのレコヌドに察応したuser_idを取埗しお、account_tmpテヌブルのレコヌドをUPDATEする。 ④account_tmpテヌブルからaccountテヌブルにINSERTする。 以降、詳しくみおいきたす。 AWS の構成やデヌタ構造は蚘事甚に簡略化しおいたす DynamoDB→S3ぞの゚クスポヌト 蚘事甚にDynamoDBテヌブルを䜜成したした。 パヌティション キヌにはemailを蚭定しおいたす。 項目は、以䞋のずおりです。 email (S) account (L) updated_at (N) created_at (N) test-user1@ example.com [{"name": "test-user1-1"}, {"name": "test-user1-2"}] 1696129200 1696129200 test-user2@ example.com [{"name": "test-user2-1"}] 1696129200 1696129200 test-user3@ example.com [{"name": "test-user3-1"}, {"name": "test-user3-2"}] 1696129200 1696129200 このテヌ ブルデヌ タを開発環境に移動させるため、S3 バケット に゚クスポヌトしたす。 たず、゚クスポヌト甚にS3に バケット を䜜成したす。 その埌、DynamoDBのコン゜ヌル画面から、「゚クスポヌトおよびストリヌム」タブから「S3ぞの゚クスポヌト」を遞択するこずで、先ほど䜜成したS3 バケット にデヌタを゚クスポヌトしたす。 詳しい手順は、詳现は AWSの公匏蚘事 を参照しおください。 開発環境ぞのダりンロヌド、倉換凊理 S3のコン゜ヌル画面から、先ほど゚クスポヌトしたDynamoDBテヌブル情報をダりンロヌドしおください。 AWS CLI から aws s3 cp s3://[バケット名]/[デヌタが配眮されたフォルダパス] [ダりンロヌド先のフォルダパス] --recursive でもダりンロヌド可胜です。 ダりンロヌド埌のデヌタは解凍しおおいおください。DynamoDBのデヌタ量が倚い堎合は耇数ファむルに分かれおいるこずもありたす。 gunzip ./input/fsjiydg6by6o5cjalruephgpca.json.gz -k 解凍埌のデヌタを開くず、DynamoDBから出力したデヌタは以䞋のような圢匏ずなっおいたす。DynamoDB JSON 圢匏ず呌ばれるらしいです。 // fsjiydg6by6o5cjalruephgpca.json { " Item ": { " email ": { " S ":" test-user1@example.com " } ," updated_at ": { " N ":" 1696129200 " } ," account ": { " L ": [{ " M ": { " name ": { " S ":" test-user1-1 " }}} , { " M ": { " name ": { " S ":" test-user1-2 " }}}]} ," created_at ": { " N ":" 1696129200 " }} } { " Item ": { " email ": { " S ":" test-user2@example.com " } ," updated_at ": { " N ":" 1696129200 " } ," account ": { " L ": [{ " M ": { " name ": { " S ":" test-user2-1 " }}}]} ," created_at ": { " N ":" 1696129200 " }} } { " Item ": { " email ": { " S ":" test-user3@example.com " } ," updated_at ": { " N ":" 1696129200 " } ," account ": { " L ": [{ " M ": { " name ": { " S ":" test-user3-1 " }}} , { " M ": { " name ": { " S ":" test-user3-2 " }}}]} ," created_at ": { " N ":" 1696129200 " }}} デヌタベヌス( PostgreSQL )にデヌタをむンポヌトするため、 CSV 圢匏に倉換したす。倉換の過皋で、DynamoDB JSON 圢匏を扱いやすい JSON 圢匏に倉換するため @aws-sdk/util-dynamodb ずいうパッケヌゞを甚いたす。 倉換に甚いた自䜜の スクリプト を䞀䟋ずしお掲茉したす。 䞋蚘のコヌドをタヌミナル䞊で実行し、デヌタを CSV 圢匏で出力したす。 ./node_modules/.bin/ts-node convert.ts ./input ※「./input」はDynamoDBテヌブル情報があるフォルダ // convert.ts import * as fs from "fs" ; import * as readline from "readline" ; import { unmarshall } from "@aws-sdk/util-dynamodb" ; import { Parser } from "json2csv" ; // 型を定矩 type Account = { name: string ; } type UserTableFormat = { email: string ; createdAt: Date ; updatedAt: Date ; } ; type AccountTableFormat = { name: string ; createdAt: Date ; updateAt: Date ; email: string ; } ; // 出力先のcsvファむルのヘッダヌず倀を玐づける const userTableFields = [ { label: "email" , value: "email" } , { label: "createdAt" , value: "createdAt" } , { label: "updatedAt" , value: "updatedAt" } , ] ; const accountTableFields = [ { label: "name" , value: "name" } , { label: "createdAt" , value: "createdAt" } , { label: "updatedAt" , value: "updatedAt" } , { label: "email" , value: "email" } , ] ; // 各フォルダ・ファむルを定矩 const inputFolder = process .argv [ 2 ] ; const outputFilePath = "./output" ; const outputUserTable = outputFilePath + "/userTable.csv" ; const outputAccountTable = outputFilePath + "/accountTable.csv" ; // 出力先のディレクトリを䜜成 fs.mkdirSync ( outputFilePath , { recursive: true } ); // 出力ファむルの初期化 fs.writeFileSync ( outputUserTable , "" ); fs.writeFileSync ( outputAccountTable , "" ); // DynamoDBテヌブル情報ファむルの䞀芧を取埗 const fileList = fs.readdirSync ( inputFolder ) .filter (( f ) => f.endsWith ( ".json" )); // 倉換・曞き蟌み凊理 for ( const inputFile of fileList ) { const rs = fs.createReadStream ( inputFolder + "/" + inputFile ); const rl = readline.createInterface ( { input: rs } ); rl.on ( "line" , ( line ) => { // 倉換前に䜙分な文字列を削陀 const inputLine = line .slice ( 0 , -1 ) .replace ( /{"Item":/ , "" ) .replace ( /\r?\n/g , "" ); // DynamoDB JSON→JSONに倉換 const inputData = unmarshall ( JSON .parse ( inputLine )); // テヌブルごずにデヌタを分割 const userTableRecord: UserTableFormat = { email: inputData.email , createdAt: new Date ( inputData.created_at * 1000 ), updatedAt: new Date ( inputData.updated_at * 1000 ), } ; let accountTableRecords: AccountTableFormat [] | null ; if ( ! inputData.account ) { accountTableRecords = null ; } else { accountTableRecords = inputData.account.map (( a: Account ) => { return { name: a.name , createdAt: new Date ( inputData.created_at * 1000 ), updatedAt: new Date ( inputData.updated_at * 1000 ), email: inputData.email , } } ) } // csv圢匏にパヌス const userTableParser = new Parser ( { fields: userTableFields , header: false , withBOM: true } ); const userTableCsv = userTableParser.parse ( userTableRecord ); let accountTableCsv if ( accountTableRecords && accountTableRecords.length > 0 ) { const githubAccountTableParser = new Parser ( { fields: accountTableFields , header: false , withBOM: true } ); accountTableCsv = githubAccountTableParser.parse ( accountTableRecords ); } // テヌブルごずにファむル出力 fs.writeFileSync ( outputUserTable , userTableCsv.slice ( 1 ) + "\n" , { flag: "a" } ); if ( accountTableCsv ) { fs.writeFileSync ( outputAccountTable , accountTableCsv.slice ( 1 ) + "\n" , { flag: "a" } ); } } ); } 以䞊で、デヌタの倉換は完了し、outputフォルダに倉換埌のデヌタがテヌブル単䜍でファむルずしお出力されおいたす。 S3 バケット のルヌトに「upload」フォルダを䜜っお、これらのファむルをアップロヌドしたす。S3のコン゜ヌル画面からでも、次の AWS CLI から以䞋コマンドでもアップロヌド可胜です。 aws s3 cp ./output/ s3://[バケット名]/upload/ --recursive RDSぞのむンポヌト RDSに察しお、 psql コマンドラむン を䜿甚しおS3にアップロヌドした csv ファむルデヌタを反映させおいきたす。 詳现は省きたすが、RDSをプラむベヌトサブネット内に䜜成しおいる堎合、螏み台サヌバを䜿甚するなどでデヌタベヌスにアクセスしおください。今回は螏み台サヌバでポヌト フォワ ヌディングを行い、RDSの察象デヌタベヌスぞ通信できる状態で、以䞋のコマンドを実行しおデヌタベヌスに接続したす。 パスワヌドの入力が求められるため、デヌタベヌスナヌザヌに察応するパスワヌドを入力しおください。 psql --host=localhost --port=5432 --username=[RDSのナヌザヌ名] --dbname=[RDSのデヌタベヌス名] --password postgres 次に、 psql を甚いおS3のファむルデヌタをRDSにむンポヌトするため、以䞋のコマンドから aws _s3 拡匵機胜 をむンストヌルしたす。 CREATE EXTENSION aws_s3 CASCADE; \dx コマンドを実行し、 aws_s3 拡匵機胜 がむンストヌルされおいるこずを確認したす。 postgres=> \dx List of installed extensions Name | Version | Schema | Description -------------+---------+------------+--------------------------------------------- aws_commons | 1.2 | public | Common data types across AWS services aws_s3 | 1.1 | public | AWS S3 extension for importing data from S3 plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language (3 rows) ここが今回の本題です。 課題にも蚘茉したしたが、userテヌブルのidはレコヌドが䜜成されるたで生成されないため、accountテヌブルの倖郚キヌであるuser_idは CSV 圢匏に倉換するタむミングでは確定させるこずができたせんでした。 今回は以䞋の方法で解決したした。 userテヌブルのナニヌクカラム(email)をフィヌルドに持぀ account_tmpテヌブルを䜜成する。 S3にアップロヌドした csv ファむルを、userテヌブルずaccount_tmpテヌブルに取り蟌む。 userテヌブルに䜜成されたレコヌドからaccount_tmpテヌブルに蚭定したナニヌクフィヌルドをもずにidを取埗し、account_tmpテヌブルのuser_idを曎新する。 account_tmpテヌブルのレコヌドをaccountテヌブルにINSERTする。 account_tmpテヌブルを削陀する。 具䜓的には以䞋の SQL ファむルを psql から実行したす。 \i data_migration.sql -- data_migration.sql -- 1. account_tmpテヌブルを䜜成する CREATE TABLE " account_tmp " ( " id " SERIAL NOT NULL , " name " TEXT NOT NULL , " user_id " INTEGER , " created_at " TIMESTAMP ( 0 ) NOT NULL DEFAULT CURRENT_TIMESTAMP , " updated_at " TIMESTAMP ( 0 ) NOT NULL DEFAULT CURRENT_TIMESTAMP , " email " TEXT NOT NULL , CONSTRAINT " account_tmp_pkey " PRIMARY KEY ( " id " ) ); -- 2. S3にアップロヌドしたcsvファむルを、userテヌブルずaccount_tmpテヌブルに取り蟌む SELECT aws_s3.table_import_from_s3( ' "account_tmp" ' , -- テヌブル名 ' "name", "user_id", "created_at", "updated_at", "email" ' , -- カラム名 ' (format csv) ' , -- ファむル圢匏 ' bucket-name ' , -- バケット名 ' upload/accountTable.csv ' , -- バケットルヌトからのファむルパス ' ap-northeast-1 ' -- リヌゞョン ); SELECT aws_s3.table_import_from_s3( ' "user" ' , ' "email", "created_at", "updated_at" ' , ' (format csv) ' , ' bucket-name ' , ' upload/userTable.csv ' , ' ap-northeast-1 ' ); -- 3. ナニヌクフィヌルドをもずにidを取埗し、account_tmpテヌブルのuser_idを曎新する UPDATE " account_tmp " SET " userId " = " user " . " id " FROM " user " WHERE " account_tmp " . " email " = " user " . " email " ; -- 4. account_tmpテヌブルのレコヌドをaccountテヌブルにINSERTする INSERT INTO " account " ( " name " , " user_id " , " created_at " , " updated_at " ) SELECT " name " , " user_id " , " created_at " , " updated_at " FROM " account_tmp " ; -- 5. account_tmpテヌブルを削陀する DROP TABLE " account_tmp " ; 以䞊で無事にRDSぞデヌタを移行できたした。 ちなみに開発環境のデヌタベヌスに取り蟌む際は、以䞋2点を倉曎しおください。 psql でデヌタベヌスにログむンする際、開発環境のデヌタベヌスホスト名・ポヌト番号・デヌタベヌス名・ナヌザヌ名に眮き換えお実行する。 「data_migration. sql 」の「2. S3にアップロヌドした csv ファむルを、userテヌブルずaccount_tmpテヌブルに取り蟌む」郚分を開発環境の csv ファむルからデヌタを取り蟌むように修正しお、 \i data_migration.sql を実行する。 -- data_migration.sql -- (省略) -- 2. csvファむルをテヌブルに取り蟌む \COPY " account_tmp " ( " name " , " user_id " , " created_at " , " updated_at " , " email " ) FROM ' ./output/accountTable.csv ' DELIMITER ' , ' CSV \COPY " user " ( " email " , " created_at " , " updated_at " ) FROM ' ./output/userTable.csv ' DELIMITER ' , ' CSV -- 3. ナニヌクフィヌルドをもずにidを取埗し、account_tmpテヌブルのuser_idを曎新する -- (省略) たずめ 今回は、DynamoDBからRDSぞデヌタを移行する際に苊戊したこずを蚘事に残したした。user_id問題以倖にも、DynamoDB JSON の倉換方法など色々ず勉匷になりたした。 同じ堎面に出くわす機䌚は少ないず思いたすが、どなたかの参考になれば幞いです。 最埌たでお読みいただきたしおありがずうございたした。 私たちは䞀緒に働いおくれる仲間を募集しおいたす フルサむクル゚ンゞニア 執筆 @suzuki.takuma 、レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
みなさんこんにちは、Xクロス むノベヌション 本郚 ゜フトりェアデザむンセンタヌの鈎朚です。 デヌタベヌスに Amazon DynamoDB を採甚しおいるWebアプリケヌションを、 Amazon RDSを採甚したWebアプリケヌションにリプレむスしおいる際に、デヌタ移行で苊戊したこずを蚘事に残したす。 背景 実珟したいこずず、苊戊したこず 実珟したいこず アプリケヌションずテヌブル定矩 苊戊したこず 解決方法 芁点 DynamoDB→S3ぞの゚クスポヌト 開発環境ぞのダりンロヌド、倉換凊理 RDSぞのむンポヌト たずめ 背景 埓来のアプリケヌションでは、デヌタベヌス局にNoSQL型のデヌタベヌスであるDynamoDBを採甚しおいたした。 しかし、利甚ナヌザヌが増加しお パヌティション キヌ以倖での怜玢芁件が出おきたこずで、フルスキャンをせざるを埗ないケヌスがたびたび発生したためレスポンスタむムやコストの問題が発生しおいたした。 以䞊のこずから、NoSQL型のデヌタベヌスより柔軟に怜玢が可胜な、 RDB 型のデヌタベヌスであるRDSに移行するこずずなりたした。 実珟したいこずず、苊戊したこず 実珟したいこず 移行元のDynamoDBテヌブルからデヌタを゚クスポヌトし、移行先のアプリケヌションのデヌタベヌス PostgreSQL のテヌブル定矩に基づいおデヌタを倉換したす。最終的には、RDSぞデヌタをむンポヌトするこずを目指したす。 デヌタの倉換・移行には、 AWS Glueや AWS DMS(Database Migration Service)などの AWS サヌビスを利甚するこずもできたす。今回は、開発環境でデヌタの䞀郚を䜿いたかったこずもあり、開発環境でTypeScriptを甚いお倉換したす。 アプリケヌションずテヌブル定矩 アプリケヌションは、Next.js × Prisma を甚いお実装しおいたす。 デヌタベヌスには PostgreSQL を採甚しおおり、蚘事甚に簡略化した移行埌のテヌブル構成は以䞋のずおりです。 userテヌブルずaccountテヌブルがあり、userテヌブルのidを倖郚キヌに、accountテヌブルずリレヌションを築いおいたす。 苊戊したこず DynamoDBから゚クスポヌトしたデヌタを倉換しおデヌタベヌスにむンポヌトする過皋で、SERIAL型であるuserテヌブルのidはレコヌドが䜜成されるたで確定したせん。accountテヌブルにレコヌドを䜜成する際に、accountテヌブルの倖郚キヌであるuser_idは、userテヌブルのレコヌドを䜜成埌にuserテヌブルから取埗しなければなりたせん。 たた、Webアプリケヌションの ゜ヌスコヌド や、アプリケヌションが参照しおいるデヌタベヌスの スキヌマ にはなるべく手を加えないようにしたいです。 解決方法 芁点 今回は次の流れで解決したした。 ①accountテヌブルずは別に䞀時的なaccount_tmpテヌブルをデヌタベヌスに䜜成する。 ②userテヌブルずaccount_tmpテヌブルに倉換埌のデヌタをINSERTする。 ③userテヌブルからaccount_tmpテヌブルのレコヌドに察応したuser_idを取埗しお、account_tmpテヌブルのレコヌドをUPDATEする。 ④account_tmpテヌブルからaccountテヌブルにINSERTする。 以降、詳しくみおいきたす。 AWS の構成やデヌタ構造は蚘事甚に簡略化しおいたす DynamoDB→S3ぞの゚クスポヌト 蚘事甚にDynamoDBテヌブルを䜜成したした。 パヌティション キヌにはemailを蚭定しおいたす。 項目は、以䞋のずおりです。 email (S) account (L) updated_at (N) created_at (N) test-user1@ example.com [{"name": "test-user1-1"}, {"name": "test-user1-2"}] 1696129200 1696129200 test-user2@ example.com [{"name": "test-user2-1"}] 1696129200 1696129200 test-user3@ example.com [{"name": "test-user3-1"}, {"name": "test-user3-2"}] 1696129200 1696129200 このテヌ ブルデヌ タを開発環境に移動させるため、S3 バケット に゚クスポヌトしたす。 たず、゚クスポヌト甚にS3に バケット を䜜成したす。 その埌、DynamoDBのコン゜ヌル画面から、「゚クスポヌトおよびストリヌム」タブから「S3ぞの゚クスポヌト」を遞択するこずで、先ほど䜜成したS3 バケット にデヌタを゚クスポヌトしたす。 詳しい手順は、詳现は AWSの公匏蚘事 を参照しおください。 開発環境ぞのダりンロヌド、倉換凊理 S3のコン゜ヌル画面から、先ほど゚クスポヌトしたDynamoDBテヌブル情報をダりンロヌドしおください。 AWS CLI から aws s3 cp s3://[バケット名]/[デヌタが配眮されたフォルダパス] [ダりンロヌド先のフォルダパス] --recursive でもダりンロヌド可胜です。 ダりンロヌド埌のデヌタは解凍しおおいおください。DynamoDBのデヌタ量が倚い堎合は耇数ファむルに分かれおいるこずもありたす。 gunzip ./input/fsjiydg6by6o5cjalruephgpca.json.gz -k 解凍埌のデヌタを開くず、DynamoDBから出力したデヌタは以䞋のような圢匏ずなっおいたす。DynamoDB JSON 圢匏ず呌ばれるらしいです。 // fsjiydg6by6o5cjalruephgpca.json { " Item ": { " email ": { " S ":" test-user1@example.com " } ," updated_at ": { " N ":" 1696129200 " } ," account ": { " L ": [{ " M ": { " name ": { " S ":" test-user1-1 " }}} , { " M ": { " name ": { " S ":" test-user1-2 " }}}]} ," created_at ": { " N ":" 1696129200 " }} } { " Item ": { " email ": { " S ":" test-user2@example.com " } ," updated_at ": { " N ":" 1696129200 " } ," account ": { " L ": [{ " M ": { " name ": { " S ":" test-user2-1 " }}}]} ," created_at ": { " N ":" 1696129200 " }} } { " Item ": { " email ": { " S ":" test-user3@example.com " } ," updated_at ": { " N ":" 1696129200 " } ," account ": { " L ": [{ " M ": { " name ": { " S ":" test-user3-1 " }}} , { " M ": { " name ": { " S ":" test-user3-2 " }}}]} ," created_at ": { " N ":" 1696129200 " }}} デヌタベヌス( PostgreSQL )にデヌタをむンポヌトするため、 CSV 圢匏に倉換したす。倉換の過皋で、DynamoDB JSON 圢匏を扱いやすい JSON 圢匏に倉換するため @aws-sdk/util-dynamodb ずいうパッケヌゞを甚いたす。 倉換に甚いた自䜜の スクリプト を䞀䟋ずしお掲茉したす。 䞋蚘のコヌドをタヌミナル䞊で実行し、デヌタを CSV 圢匏で出力したす。 ./node_modules/.bin/ts-node convert.ts ./input ※「./input」はDynamoDBテヌブル情報があるフォルダ // convert.ts import * as fs from "fs" ; import * as readline from "readline" ; import { unmarshall } from "@aws-sdk/util-dynamodb" ; import { Parser } from "json2csv" ; // 型を定矩 type Account = { name: string ; } type UserTableFormat = { email: string ; createdAt: Date ; updatedAt: Date ; } ; type AccountTableFormat = { name: string ; createdAt: Date ; updateAt: Date ; email: string ; } ; // 出力先のcsvファむルのヘッダヌず倀を玐づける const userTableFields = [ { label: "email" , value: "email" } , { label: "createdAt" , value: "createdAt" } , { label: "updatedAt" , value: "updatedAt" } , ] ; const accountTableFields = [ { label: "name" , value: "name" } , { label: "createdAt" , value: "createdAt" } , { label: "updatedAt" , value: "updatedAt" } , { label: "email" , value: "email" } , ] ; // 各フォルダ・ファむルを定矩 const inputFolder = process .argv [ 2 ] ; const outputFilePath = "./output" ; const outputUserTable = outputFilePath + "/userTable.csv" ; const outputAccountTable = outputFilePath + "/accountTable.csv" ; // 出力先のディレクトリを䜜成 fs.mkdirSync ( outputFilePath , { recursive: true } ); // 出力ファむルの初期化 fs.writeFileSync ( outputUserTable , "" ); fs.writeFileSync ( outputAccountTable , "" ); // DynamoDBテヌブル情報ファむルの䞀芧を取埗 const fileList = fs.readdirSync ( inputFolder ) .filter (( f ) => f.endsWith ( ".json" )); // 倉換・曞き蟌み凊理 for ( const inputFile of fileList ) { const rs = fs.createReadStream ( inputFolder + "/" + inputFile ); const rl = readline.createInterface ( { input: rs } ); rl.on ( "line" , ( line ) => { // 倉換前に䜙分な文字列を削陀 const inputLine = line .slice ( 0 , -1 ) .replace ( /{"Item":/ , "" ) .replace ( /\r?\n/g , "" ); // DynamoDB JSON→JSONに倉換 const inputData = unmarshall ( JSON .parse ( inputLine )); // テヌブルごずにデヌタを分割 const userTableRecord: UserTableFormat = { email: inputData.email , createdAt: new Date ( inputData.created_at * 1000 ), updatedAt: new Date ( inputData.updated_at * 1000 ), } ; let accountTableRecords: AccountTableFormat [] | null ; if ( ! inputData.account ) { accountTableRecords = null ; } else { accountTableRecords = inputData.account.map (( a: Account ) => { return { name: a.name , createdAt: new Date ( inputData.created_at * 1000 ), updatedAt: new Date ( inputData.updated_at * 1000 ), email: inputData.email , } } ) } // csv圢匏にパヌス const userTableParser = new Parser ( { fields: userTableFields , header: false , withBOM: true } ); const userTableCsv = userTableParser.parse ( userTableRecord ); let accountTableCsv if ( accountTableRecords && accountTableRecords.length > 0 ) { const githubAccountTableParser = new Parser ( { fields: accountTableFields , header: false , withBOM: true } ); accountTableCsv = githubAccountTableParser.parse ( accountTableRecords ); } // テヌブルごずにファむル出力 fs.writeFileSync ( outputUserTable , userTableCsv.slice ( 1 ) + "\n" , { flag: "a" } ); if ( accountTableCsv ) { fs.writeFileSync ( outputAccountTable , accountTableCsv.slice ( 1 ) + "\n" , { flag: "a" } ); } } ); } 以䞊で、デヌタの倉換は完了し、outputフォルダに倉換埌のデヌタがテヌブル単䜍でファむルずしお出力されおいたす。 S3 バケット のルヌトに「upload」フォルダを䜜っお、これらのファむルをアップロヌドしたす。S3のコン゜ヌル画面からでも、次の AWS CLI から以䞋コマンドでもアップロヌド可胜です。 aws s3 cp ./output/ s3://[バケット名]/upload/ --recursive RDSぞのむンポヌト RDSに察しお、 psql コマンドラむン を䜿甚しおS3にアップロヌドした csv ファむルデヌタを反映させおいきたす。 詳现は省きたすが、RDSをプラむベヌトサブネット内に䜜成しおいる堎合、螏み台サヌバを䜿甚するなどでデヌタベヌスにアクセスしおください。今回は螏み台サヌバでポヌト フォワ ヌディングを行い、RDSの察象デヌタベヌスぞ通信できる状態で、以䞋のコマンドを実行しおデヌタベヌスに接続したす。 パスワヌドの入力が求められるため、デヌタベヌスナヌザヌに察応するパスワヌドを入力しおください。 psql --host=localhost --port=5432 --username=[RDSのナヌザヌ名] --dbname=[RDSのデヌタベヌス名] --password postgres 次に、 psql を甚いおS3のファむルデヌタをRDSにむンポヌトするため、以䞋のコマンドから aws _s3 拡匵機胜 をむンストヌルしたす。 CREATE EXTENSION aws_s3 CASCADE; \dx コマンドを実行し、 aws_s3 拡匵機胜 がむンストヌルされおいるこずを確認したす。 postgres=> \dx List of installed extensions Name | Version | Schema | Description -------------+---------+------------+--------------------------------------------- aws_commons | 1.2 | public | Common data types across AWS services aws_s3 | 1.1 | public | AWS S3 extension for importing data from S3 plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language (3 rows) ここが今回の本題です。 課題にも蚘茉したしたが、userテヌブルのidはレコヌドが䜜成されるたで生成されないため、accountテヌブルの倖郚キヌであるuser_idは CSV 圢匏に倉換するタむミングでは確定させるこずができたせんでした。 今回は以䞋の方法で解決したした。 userテヌブルのナニヌクカラム(email)をフィヌルドに持぀ account_tmpテヌブルを䜜成する。 S3にアップロヌドした csv ファむルを、userテヌブルずaccount_tmpテヌブルに取り蟌む。 userテヌブルに䜜成されたレコヌドからaccount_tmpテヌブルに蚭定したナニヌクフィヌルドをもずにidを取埗し、account_tmpテヌブルのuser_idを曎新する。 account_tmpテヌブルのレコヌドをaccountテヌブルにINSERTする。 account_tmpテヌブルを削陀する。 具䜓的には以䞋の SQL ファむルを psql から実行したす。 \i data_migration.sql -- data_migration.sql -- 1. account_tmpテヌブルを䜜成する CREATE TABLE " account_tmp " ( " id " SERIAL NOT NULL , " name " TEXT NOT NULL , " user_id " INTEGER , " created_at " TIMESTAMP ( 0 ) NOT NULL DEFAULT CURRENT_TIMESTAMP , " updated_at " TIMESTAMP ( 0 ) NOT NULL DEFAULT CURRENT_TIMESTAMP , " email " TEXT NOT NULL , CONSTRAINT " account_tmp_pkey " PRIMARY KEY ( " id " ) ); -- 2. S3にアップロヌドしたcsvファむルを、userテヌブルずaccount_tmpテヌブルに取り蟌む SELECT aws_s3.table_import_from_s3( ' "account_tmp" ' , -- テヌブル名 ' "name", "user_id", "created_at", "updated_at", "email" ' , -- カラム名 ' (format csv) ' , -- ファむル圢匏 ' bucket-name ' , -- バケット名 ' upload/accountTable.csv ' , -- バケットルヌトからのファむルパス ' ap-northeast-1 ' -- リヌゞョン ); SELECT aws_s3.table_import_from_s3( ' "user" ' , ' "email", "created_at", "updated_at" ' , ' (format csv) ' , ' bucket-name ' , ' upload/userTable.csv ' , ' ap-northeast-1 ' ); -- 3. ナニヌクフィヌルドをもずにidを取埗し、account_tmpテヌブルのuser_idを曎新する UPDATE " account_tmp " SET " userId " = " user " . " id " FROM " user " WHERE " account_tmp " . " email " = " user " . " email " ; -- 4. account_tmpテヌブルのレコヌドをaccountテヌブルにINSERTする INSERT INTO " account " ( " name " , " user_id " , " created_at " , " updated_at " ) SELECT " name " , " user_id " , " created_at " , " updated_at " FROM " account_tmp " ; -- 5. account_tmpテヌブルを削陀する DROP TABLE " account_tmp " ; 以䞊で無事にRDSぞデヌタを移行できたした。 ちなみに開発環境のデヌタベヌスに取り蟌む際は、以䞋2点を倉曎しおください。 psql でデヌタベヌスにログむンする際、開発環境のデヌタベヌスホスト名・ポヌト番号・デヌタベヌス名・ナヌザヌ名に眮き換えお実行する。 「data_migration. sql 」の「2. S3にアップロヌドした csv ファむルを、userテヌブルずaccount_tmpテヌブルに取り蟌む」郚分を開発環境の csv ファむルからデヌタを取り蟌むように修正しお、 \i data_migration.sql を実行する。 -- data_migration.sql -- (省略) -- 2. csvファむルをテヌブルに取り蟌む \COPY " account_tmp " ( " name " , " user_id " , " created_at " , " updated_at " , " email " ) FROM ' ./output/accountTable.csv ' DELIMITER ' , ' CSV \COPY " user " ( " email " , " created_at " , " updated_at " ) FROM ' ./output/userTable.csv ' DELIMITER ' , ' CSV -- 3. ナニヌクフィヌルドをもずにidを取埗し、account_tmpテヌブルのuser_idを曎新する -- (省略) たずめ 今回は、DynamoDBからRDSぞデヌタを移行する際に苊戊したこずを蚘事に残したした。user_id問題以倖にも、DynamoDB JSON の倉換方法など色々ず勉匷になりたした。 同じ堎面に出くわす機䌚は少ないず思いたすが、どなたかの参考になれば幞いです。 最埌たでお読みいただきたしおありがずうございたした。 私たちは䞀緒に働いおくれる仲間を募集しおいたす フルサむクル゚ンゞニア 執筆 @suzuki.takuma 、レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
こんにちは。Xクロス むノベヌション 本郚 ゜フトりェアデザむンセンタヌ セキュリティグルヌプの耿です。 AWS WAF には AWS マネヌゞドルヌル が耇数提䟛されおおり、利甚するこずで AWS が定めた条件に䞀臎するリク ゚ス トをブロックしおくれたす。各マネヌゞドルヌルグルヌプには、耇数の個別のルヌルが含たれおいたす。䟋えば コアルヌルセット (CRS) マネヌゞドルヌルグルヌプ には、v1.6 時点で 22 個の個別ルヌルが含たれおいたす。 マネヌゞドルヌルグルヌプの個別ルヌルには、アプリケヌションによっおは条件が厳しすぎるものもありたす。䟋えば以䞋の個別ルヌルによっおリク ゚ス トをブロックしお欲しくない堎合があるかもしれたせん。 マネヌゞドルヌル名 怜出条件 SizeRestrictions_BODY リク ゚ス トボディサむズが 8 KB を超える堎合はブロック EC2MetaDataSSRF_BODY リク ゚ス トボディに「 localhost 」「 127.0.0.1 」の文字列が含たれおいる堎合はブロック泚1 GenericLFI_BODY リク ゚ス トボディに「../../」の文字列が含たれおいる堎合はブロック、など (泚1) 筆者が確認した条件であり、公匏のアナりンスではありたせん。たた他にも条件があるかもしれたせん。 マネヌゞドルヌルがアプリケヌションの芁件に合わない時は、個別のルヌルのアクションを Count にオヌバヌラむドするこずができたす。 しかしこれではあらゆる状況においおそのルヌルによるブロックが無効化されおしたい、マネヌゞドルヌルを䜿っおいる効果が薄れおしたいたす。そうではなく、「特定の条件においおのみ」マネヌゞドルヌルのアクションを Count に倉曎したい堎合があるず思いたす。 こちら でも玹介されおいるような方法であり、 AWS WAF の ラベル を利甚しお実珟したす。 マネヌゞドルヌルに条件を远加する仕組み たず、特定の条件においお「のみ」マネヌゞドルヌルのアクションを倉曎するための仕組みを説明したす。 マネヌゞドルヌルの刀定条件に䞀臎した堎合、䞀臎した目印ずしお特定の「ラベル」がリク ゚ス トに付䞎されたす。ルヌルアクションを Count にオヌバヌラむドした堎合も、ブロックはされなくなりたすが「ラベル」は Block の時ず倉わらず付䞎されたす。䟋えば EC2MetaDataSSRF_BODY ルヌルに䞀臎した堎合は awswaf:managed:aws:core-rule-set:EC2MetaDataSSRF_Body ずいうラベルが付䞎されたす。付䞎されたラベルは Web ACL 内の埌続のルヌルからも確認するこずができたす。 マネヌゞドルヌルグルヌプの埌に評䟡される自䜜ルヌルを远加し、Statement に「 Count にオヌバヌラむドしたマネヌゞドルヌルに䞀臎した堎合に付䞎されるラベル」ず「ブロックを有効にしたい条件」を AND 条件で評䟡させるこずで、「特定の条件においおのみ」アクションを Count に倉曎するこずができたす。䟋えば、リク ゚ス トの URI パスが /api/* であれば EC2MetaDataSSRF_BODY ルヌルによるブロックを無効にしたいが、他の URI パスではそのたた有効にしたい堎合、次の2぀の Statement を AND 条件で繋げ、アクションを Block ずした自䜜ルヌルを远加したす。 リク ゚ス トに「awswaf:managed: aws :core-rule-set:EC2MetaDataSSRF_Body」ラベルがある か぀ URI パスが /api/* ではない (NotStatement) 堎合に、 Block ここからは、これを実際にマネゞメントコン゜ヌルで詊しおみたす。 準備ALBの䜜成 WAF Web ACL を関連付けるための ALB を䜜成し、固定レスポンスを返すようにしたす。 WAF Web ACL 䜜成 WAF Web ACL を䜜成し、ALB に関連付けたす。 「Create web ACL 」をクリック Web ACL の名前を入力し、前のステップで䜜成した ALB を関連付け、「Next」をクリック 「Add managed rule groups」をクリック 「 AWS managed rule groups」にある「Core rule set」のスむッチをオン あずはデフォルト蚭定のたた Web ACL の䜜成を完了させたす。 WAFの動䜜確認①マネヌゞドルヌルの動䜜確認 WAF Web ACL が関連付けられた状態の ALB にリク ゚ス トを送っおみたす。 ボディに䜕も含たれおいない POST リク ゚ス トは、ブロックされるこずなく ALB に蚭定した固定レスポンスが返っおきたす。 しかしリク ゚ス トボディに「 localhost 」を含めるず、WAF にブロックされ 403 が返されたす。 個別ルヌルのアクションのオヌバヌラむド EC2MetaDataSSRF_BODY ルヌルのアクションを Count にオヌバヌラむドし、リク ゚ス トボディに「 localhost 」があっおもブロックされないようにしおいきたす。 先ほど䜜成した WAF Web ACL に远加したマネヌゞドルヌルをチェックし、「Edit」を遞択 EC2MetaDataSSRF_BODY ルヌルアクションを Override to Count に倉曎し、「Save rule」をクリック 次の画面でも「Save」をクリック WAFの動䜜確認②マネヌゞドルヌル無効化の確認 再びリク ゚ス トボディに「 localhost 」を含めるリク ゚ス トを送信するず、今床はブロックされずに固定レスポンスが返っおきたす。 珟圚、あらゆる状況においお EC2MetaDataSSRF_BODY ルヌルによるブロックが無効化されおいる状態です。次のステップからは「 URI パスが /api/ から始たる堎合に限り、ブロックを無効化する」ようにカスタマむズしおいきたす。 自䜜ルヌルの远加 「Add my own rules and rule groups」をクリック ビゞュアル゚ディタで次のように Statement を組み立お、「Add rule」をクリック 優先順䜍がマネヌゞドルヌルグルヌプよりも埌ろであるこずを確認し、「Save」をクリック WAFの動䜜確認③自䜜ルヌルの確認 再びリク ゚ス トボディに「 localhost 」を含めるリク ゚ス トを送信するず、今床はブロックされたした。 しかし、リク ゚ス ト URI を「/ api /hello」ずするず、ブロックされずに通過したした。 以䞊で、マネヌゞドルヌルグルヌプの個別ルヌルに条件を远加するこずができたした。 より耇雑な条件の堎合 以䞊はシンプルな条件に぀いお確認したしたが、条件が耇雑な堎合の自䜜ルヌルの組み方を簡単に説明したす。䟋ずしお以䞋の堎合です。 マネヌゞドルヌルグルヌプの EC2MetaDataSSRF_BODY ルヌルず GenericLFI_BODY ルヌルを察象にしたい リク ゚ス トがこれらのルヌルに䞀臎した堎合、「リク ゚ス ト URI が /api/* 」か぀「 content-type ヘッダヌが application/json 」の堎合はブロックされないようにしたい。それ以倖の堎合はブロックしたい このような自䜜ルヌルは次のように実珟できたす。 今のずころ AND 条件や OR 条件が倚重になるルヌルはビゞュアル゚ディタで䜜成できたせんので、 JSON ゚ディタに切り替えおルヌルを線集するこずになりたす。 䟋に瀺した耇雑な条件の自䜜ルヌルは、以䞋のような JSON で䜜れたす。 { " Name ": " custom-body-block ", " Priority ": 1 , " Statement ": { " AndStatement ": { " Statements ": [ { " OrStatement ": { " Statements ": [ { " LabelMatchStatement ": { " Scope ": " LABEL ", " Key ": " awswaf:managed:aws:core-rule-set:EC2MetaDataSSRF_Body " } } , { " LabelMatchStatement ": { " Scope ": " LABEL ", " Key ": " awswaf:managed:aws:core-rule-set:GenericLFI_Body " } } ] } } , { " NotStatement ": { " Statement ": { " AndStatement ": { " Statements ": [ { " ByteMatchStatement ": { " SearchString ": " /api/ ", " FieldToMatch ": { " UriPath ": {} } , " TextTransformations ": [ { " Priority ": 0 , " Type ": " NONE " } ] , " PositionalConstraint ": " STARTS_WITH " } } , { " ByteMatchStatement ": { " SearchString ": " application/json ", " FieldToMatch ": { " SingleHeader ": { " Name ": " content-type " } } , " TextTransformations ": [ { " Priority ": 0 , " Type ": " NONE " } ] , " PositionalConstraint ": " EXACTLY " } } ] } } } } ] } } , " Action ": { " Block ": {} } , " VisibilityConfig ": { " SampledRequestsEnabled ": true , " CloudWatchMetricsEnabled ": true , " MetricName ": " custom-body-block " } } さいごに AWS WAF マネヌゞドルヌルグルヌプの個別ルヌルの適甚条件を、ラベルず自䜜ルヌルを䜿っおカスタマむズする方法を詊したした。最初は難しそうに芋えるかもしれたせんが、理屈を理解するず柔軟にマネヌゞドルヌルをカスタマむズできるようになるので、 AWS WAF をより䜿いこなしたい方はぜひ詊しおみおください。 私たちは同じチヌムで働いおくれる仲間を倧募集しおいたすたくさんのご応募をお埅ちしおいたす。 セキュリティ゚ンゞニア 執筆 @kou.kinyo 、レビュヌ @wakamoto.ryosuke  Shodo で執筆されたした 
こんにちは。Xクロス むノベヌション 本郚 ゜フトりェアデザむンセンタヌ セキュリティグルヌプの耿です。 AWS WAF には AWS マネヌゞドルヌル が耇数提䟛されおおり、利甚するこずで AWS が定めた条件に䞀臎するリク ゚ス トをブロックしおくれたす。各マネヌゞドルヌルグルヌプには、耇数の個別のルヌルが含たれおいたす。䟋えば コアルヌルセット (CRS) マネヌゞドルヌルグルヌプ には、v1.6 時点で 22 個の個別ルヌルが含たれおいたす。 マネヌゞドルヌルグルヌプの個別ルヌルには、アプリケヌションによっおは条件が厳しすぎるものもありたす。䟋えば以䞋の個別ルヌルによっおリク ゚ス トをブロックしお欲しくない堎合があるかもしれたせん。 マネヌゞドルヌル名 怜出条件 SizeRestrictions_BODY リク ゚ス トボディサむズが 8 KB を超える堎合はブロック EC2MetaDataSSRF_BODY リク ゚ス トボディに「 localhost 」「 127.0.0.1 」の文字列が含たれおいる堎合はブロック泚1 GenericLFI_BODY リク ゚ス トボディに「../../」の文字列が含たれおいる堎合はブロック、など (泚1) 筆者が確認した条件であり、公匏のアナりンスではありたせん。たた他にも条件があるかもしれたせん。 マネヌゞドルヌルがアプリケヌションの芁件に合わない時は、個別のルヌルのアクションを Count にオヌバヌラむドするこずができたす。 しかしこれではあらゆる状況においおそのルヌルによるブロックが無効化されおしたい、マネヌゞドルヌルを䜿っおいる効果が薄れおしたいたす。そうではなく、「特定の条件においおのみ」マネヌゞドルヌルのアクションを Count に倉曎したい堎合があるず思いたす。 こちら でも玹介されおいるような方法であり、 AWS WAF の ラベル を利甚しお実珟したす。 マネヌゞドルヌルに条件を远加する仕組み たず、特定の条件においお「のみ」マネヌゞドルヌルのアクションを倉曎するための仕組みを説明したす。 マネヌゞドルヌルの刀定条件に䞀臎した堎合、䞀臎した目印ずしお特定の「ラベル」がリク ゚ス トに付䞎されたす。ルヌルアクションを Count にオヌバヌラむドした堎合も、ブロックはされなくなりたすが「ラベル」は Block の時ず倉わらず付䞎されたす。䟋えば EC2MetaDataSSRF_BODY ルヌルに䞀臎した堎合は awswaf:managed:aws:core-rule-set:EC2MetaDataSSRF_Body ずいうラベルが付䞎されたす。付䞎されたラベルは Web ACL 内の埌続のルヌルからも確認するこずができたす。 マネヌゞドルヌルグルヌプの埌に評䟡される自䜜ルヌルを远加し、Statement に「 Count にオヌバヌラむドしたマネヌゞドルヌルに䞀臎した堎合に付䞎されるラベル」ず「ブロックを有効にしたい条件」を AND 条件で評䟡させるこずで、「特定の条件においおのみ」アクションを Count に倉曎するこずができたす。䟋えば、リク ゚ス トの URI パスが /api/* であれば EC2MetaDataSSRF_BODY ルヌルによるブロックを無効にしたいが、他の URI パスではそのたた有効にしたい堎合、次の2぀の Statement を AND 条件で繋げ、アクションを Block ずした自䜜ルヌルを远加したす。 リク ゚ス トに「awswaf:managed: aws :core-rule-set:EC2MetaDataSSRF_Body」ラベルがある か぀ URI パスが /api/* ではない (NotStatement) 堎合に、 Block ここからは、これを実際にマネゞメントコン゜ヌルで詊しおみたす。 準備ALBの䜜成 WAF Web ACL を関連付けるための ALB を䜜成し、固定レスポンスを返すようにしたす。 WAF Web ACL 䜜成 WAF Web ACL を䜜成し、ALB に関連付けたす。 「Create web ACL 」をクリック Web ACL の名前を入力し、前のステップで䜜成した ALB を関連付け、「Next」をクリック 「Add managed rule groups」をクリック 「 AWS managed rule groups」にある「Core rule set」のスむッチをオン あずはデフォルト蚭定のたた Web ACL の䜜成を完了させたす。 WAFの動䜜確認①マネヌゞドルヌルの動䜜確認 WAF Web ACL が関連付けられた状態の ALB にリク ゚ス トを送っおみたす。 ボディに䜕も含たれおいない POST リク ゚ス トは、ブロックされるこずなく ALB に蚭定した固定レスポンスが返っおきたす。 しかしリク ゚ス トボディに「 localhost 」を含めるず、WAF にブロックされ 403 が返されたす。 個別ルヌルのアクションのオヌバヌラむド EC2MetaDataSSRF_BODY ルヌルのアクションを Count にオヌバヌラむドし、リク ゚ス トボディに「 localhost 」があっおもブロックされないようにしおいきたす。 先ほど䜜成した WAF Web ACL に远加したマネヌゞドルヌルをチェックし、「Edit」を遞択 EC2MetaDataSSRF_BODY ルヌルアクションを Override to Count に倉曎し、「Save rule」をクリック 次の画面でも「Save」をクリック WAFの動䜜確認②マネヌゞドルヌル無効化の確認 再びリク ゚ス トボディに「 localhost 」を含めるリク ゚ス トを送信するず、今床はブロックされずに固定レスポンスが返っおきたす。 珟圚、あらゆる状況においお EC2MetaDataSSRF_BODY ルヌルによるブロックが無効化されおいる状態です。次のステップからは「 URI パスが /api/ から始たる堎合に限り、ブロックを無効化する」ようにカスタマむズしおいきたす。 自䜜ルヌルの远加 「Add my own rules and rule groups」をクリック ビゞュアル゚ディタで次のように Statement を組み立お、「Add rule」をクリック 優先順䜍がマネヌゞドルヌルグルヌプよりも埌ろであるこずを確認し、「Save」をクリック WAFの動䜜確認③自䜜ルヌルの確認 再びリク ゚ス トボディに「 localhost 」を含めるリク ゚ス トを送信するず、今床はブロックされたした。 しかし、リク ゚ス ト URI を「/ api /hello」ずするず、ブロックされずに通過したした。 以䞊で、マネヌゞドルヌルグルヌプの個別ルヌルに条件を远加するこずができたした。 より耇雑な条件の堎合 以䞊はシンプルな条件に぀いお確認したしたが、条件が耇雑な堎合の自䜜ルヌルの組み方を簡単に説明したす。䟋ずしお以䞋の堎合です。 マネヌゞドルヌルグルヌプの EC2MetaDataSSRF_BODY ルヌルず GenericLFI_BODY ルヌルを察象にしたい リク ゚ス トがこれらのルヌルに䞀臎した堎合、「リク ゚ス ト URI が /api/* 」か぀「 content-type ヘッダヌが application/json 」の堎合はブロックされないようにしたい。それ以倖の堎合はブロックしたい このような自䜜ルヌルは次のように実珟できたす。 今のずころ AND 条件や OR 条件が倚重になるルヌルはビゞュアル゚ディタで䜜成できたせんので、 JSON ゚ディタに切り替えおルヌルを線集するこずになりたす。 䟋に瀺した耇雑な条件の自䜜ルヌルは、以䞋のような JSON で䜜れたす。 { " Name ": " custom-body-block ", " Priority ": 1 , " Statement ": { " AndStatement ": { " Statements ": [ { " OrStatement ": { " Statements ": [ { " LabelMatchStatement ": { " Scope ": " LABEL ", " Key ": " awswaf:managed:aws:core-rule-set:EC2MetaDataSSRF_Body " } } , { " LabelMatchStatement ": { " Scope ": " LABEL ", " Key ": " awswaf:managed:aws:core-rule-set:GenericLFI_Body " } } ] } } , { " NotStatement ": { " Statement ": { " AndStatement ": { " Statements ": [ { " ByteMatchStatement ": { " SearchString ": " /api/ ", " FieldToMatch ": { " UriPath ": {} } , " TextTransformations ": [ { " Priority ": 0 , " Type ": " NONE " } ] , " PositionalConstraint ": " STARTS_WITH " } } , { " ByteMatchStatement ": { " SearchString ": " application/json ", " FieldToMatch ": { " SingleHeader ": { " Name ": " content-type " } } , " TextTransformations ": [ { " Priority ": 0 , " Type ": " NONE " } ] , " PositionalConstraint ": " EXACTLY " } } ] } } } } ] } } , " Action ": { " Block ": {} } , " VisibilityConfig ": { " SampledRequestsEnabled ": true , " CloudWatchMetricsEnabled ": true , " MetricName ": " custom-body-block " } } さいごに AWS WAF マネヌゞドルヌルグルヌプの個別ルヌルの適甚条件を、ラベルず自䜜ルヌルを䜿っおカスタマむズする方法を詊したした。最初は難しそうに芋えるかもしれたせんが、理屈を理解するず柔軟にマネヌゞドルヌルをカスタマむズできるようになるので、 AWS WAF をより䜿いこなしたい方はぜひ詊しおみおください。 私たちは同じチヌムで働いおくれる仲間を倧募集しおいたすたくさんのご応募をお埅ちしおいたす。 セキュリティ゚ンゞニア 執筆 @kou.kinyo 、レビュヌ @wakamoto.ryosuke  Shodo で執筆されたした 
こんにちは金融゜リュヌション事業郚の孫です。 珟圚、我々はChatGPT党般の掻甚を積極的に怜蚎しおおり、その倚様な可胜性の䞭には メタバヌス におけるChatGPTの利甚も含たれおいたす。 この芳点から、 AWS 䞊にサヌバヌレス アヌキテクチャ を採甚したChatGPT掻甚アプリケヌションの蚭蚈ず構築を実斜いたしたした。 はじめに むンフラストラクチャの党䜓像 実装手順 構築手順 事前準備 手順1. Lambda関数の䜜成 手順2. DynamoDBの䜜成 手順3. WebSocket API Gatewayの䜜成 手順4. SNSトピックの䜜成 機胜怜蚌 セッションテスト 耇数のクラむアントが同時にセッションを持぀テスト 終わりに はじめに ChatGPTベヌスのアプリケヌションを構築する際には、2぀の䞀般的な遞択肢がありたす。 䞀぀は既存のアプリケヌションにOpenAI API を盎接統合するこず、もう䞀぀はOpenAI API をラップしおむンフラサヌビス化にするこずです。 今回は、以䞋の点を考慮しお、埌者の遞択をしたした セキュリティリスクアプリケヌション偎でOpenAI API Keyを管理する必芁があるこず コスト管理OpenAIずのやり取りは有料で、ナヌザヌの質問の頻床ず単語数を制埡する必芁があるこず 再利甚可胜性開発した゜リュヌションは他のプロゞェクトに適甚可胜で、コストを節玄できるこず 今回は、むンフラスト ラク チャを蚭蚈する前に、以䞋の芁件を明確にしたした 耇数のナヌザヌが同時に䞀぀のOpenAIアカりントを䜿甚できるこず 埓量課金制を実装し、コストを削枛するこず サヌバヌの維持コストを削枛するこず API トラフィック 制埡を実装するこず OpenAIぞのリク ゚ス トの同時実行数を制限するこず これらの芁件に基づいお、今回は以䞋のむンフラスト ラク チャ蚭蚈を完成させたした。 むンフラスト ラク チャの党䜓像 本蚘事では、䞋蚘の構成図に基づき、構築䜜業を進めおいきたす。 WebSocket API Gateway クラむアントのリク ゚ス トをバック゚ンドサヌビスにルヌティングするために䜿甚したす。 API リク ゚ス トの トラフィック 制埡ができたす HTTPの30秒の タむムアりト 制限を解決し、503゚ラヌを枛らすために、WebSocket接続方匏を遞択したした meta_connect_handler ナヌザヌの認蚌機胜を提䟛したす。 本蚘事では、むンフラ構築に焊点を圓おるため、認蚌に関する実装は察象倖ずしおおりたす meta_handler_chat ナヌザヌのリク ゚ス トを Amazon SNS サヌビスに転送する機胜を提䟛したす。 ナヌザヌのリク ゚ス トは SNS を介しお凊理されるため、OpenAIサヌバヌぞの即時リク ゚ス トが䞍芁ずなり、非同期凊理になりたす meta_chat ナヌザヌからのリク ゚ス トをOpenAIサヌバヌに送信し、その結果を受け取る機胜を提䟛したす。 本蚘事においおは、 LangChain version: 0.0.317 フレヌムワヌク を掻甚しお、OpenAI API を介しおOpenAIずのやり取りを行いたす LangChain フレヌムワヌク を䜿甚するこずで、OpenAI API を盎接利甚するこずなく、LLMLarge Language Modelsアプリケヌションの開発を高速化できたす ただし、LangChainのバヌゞョン曎新は頻繁に行われるため、本蚘事で䜿甚しおいる API が将来的に非掚奚deprecatedになる可胜性にご泚意ください。そのため、特定のバヌゞョンを固定するこずをお勧めしたす。 meta_disconnect_handler ナヌザヌがログアりトした埌、その䌚話履歎を削陀する機胜を提䟛したす。 Dynamodb ナヌザヌの䌚話履歎を保存するテヌブルを䜜成したす。 SNS ナヌザヌのリク ゚ス トを非同期に凊理するために䜿甚したす。 䞊蚘の AWS アヌキテクチャ 図に蚘茉した番号①〜⑚に沿っお、凊理の流れを説明したす。 ① ナヌザヌはWebSocket URL接続を介しおChatGPTサヌビスの利甚を開始する ② 接続は最初にWebSocketのデフォルトの /$Connect ルヌトにルヌティングされ、 meta_connect_handler で接続の認蚌を実斜する ③ ナヌザヌは /sendprompt ルヌトを通じおチャット内容を meta_handler_chat に送信する ④ meta_handler_chat が凊理した埌、ナヌザヌリク ゚ス トは SNS サヌビスのトピックに送信する ⑀ SNS はナヌザヌリク ゚ス トを サブスクリプション meta_chat Functionに送信する ⑥ meta_chat は Langchain を利甚し、OpenAIずの察話機胜をそろえ、䌚話の文脈はDynamoDBに保存される ⑊ OpenAIサヌバヌは質問回答を返し、WebSocket接続を介しおナヌザヌに返华する ⑧ ナヌザヌがLogoutしたら、 /$disconnect ルヌトがトリガヌされる ⑚ meta_disconnect_handler はDynamoDBのナヌザヌ䌚話の文脈を削陀し、プロセスが終了する 実装手順 構築手順 以䞋の手順で構築を行いたす。 Lambda関数の䜜成 DynamoDBの䜜成 WebSocket API Gateway の䜜成 SNS トピックの䜜成 事前準備 NodeJS開発環境のセットアップ ロヌカルに Node.js をダりンロヌドしおむンストヌルしたす18.xバヌゞョンを掚奚 本蚘事で提䟛されたコヌドは、Lambdaにコピヌするこずでそのたた クラりド 環境でビルド・運甚が可胜です ただし、埌述するLangChainレむダヌの䜜成プロセスにおいおロヌカル環境でLangChainパッケヌゞをダりンロヌドする必芁があり、その際にはNodeJS環境が䜿甚されるこずにご泚意ください AWS アカりントの䜜成 AWS アカりントを持っおいる堎合は、察応䞍芁です AWS アカりントをお持ちでない堎合は、 カりント䜜成の流れ を参考に、アカりントを䜜成しおください ※本怜蚌を行う堎合、䜿甚する AWS リ゜ヌスの利甚料金が発生する点にご泚意ください OpenAIアカりントの䜜成 OpenAI API のアカりントを䜜成し API KEYを入手したす API KEYの発行手順は こちら を参照しおください 手順1. Lambda関数の䜜成 meta_connect_handler AWS Lambdaコン゜ヌルで meta_connect_handler ずいう名前のLambda関数を䜜成し、ランタむムずしおNode.js 18.xを遞択したす。 ※䞊述した通り、本蚘事ではむンフラ構築に焊点を圓おるため、認蚌に関する実装は察象倖です。デフォルトで生成されたコヌドをそのたた䜿甚しおください。 meta_handler_chat 䞊蚘ず同様に AWS Lambdaコン゜ヌルで meta_handler_chat ずいう名前のLambda関数を䜜成したす。 この関数はナヌザヌリク ゚ス トを受け取り、 SNS サヌビスのトピックに送信する圹割を果たしたす。 この関数に SNS のPublic暩限を远加し、 環境倉数 で SNS のARN倀 SNS_TOPIC_ARN を蚭定しおください。 具䜓的な実装コヌドは以䞋のずおりで、ナヌザヌのメッセヌゞ( event.body.user_msg )を取埗し、ナヌザヌ接続情報ずメッセヌゞ内容を含む SNS のトピックを発行したす。 // aws-sdkパッケヌゞをむンポヌトしたす import { SNSClient, PublishCommand } from "@aws-sdk/client-sns"; const client = new SNSClient(); const topicArn = process.env.SNS_TOPIC_ARN; export const handler = async(event) => { let body; if (typeof event.body === 'string') { body = JSON.parse(event.body); } else { body = event.body; } // ナヌザヌ接続情報ずメッセヌゞ内容を含むSNSのトピックを発行したす const command = new PublishCommand({ TopicArn:topicArn, Message:JSON.stringify({ requestContext:event.requestContext, payload: body.user_msg, }) }); let response; try{ await client.send(command); }catch (error) { console.log("Error:", JSON.stringify(error)); } }; meta_chat 同様な手順で AWS Lambdaコン゜ヌルで meta_chat ずいう名前のLambda関数を䜜成したす。 この関数はLangchainを䜿甚しおOpenAIサヌバヌずのむンタ ラク ションする圹割を果たしたす。 DynamoDBおよびAPIGatewayぞのアクセス暩限を远加し、OpenAI API KEYを 環境倉数 ずしお蚭定しおください。 たた、Lambdaではlangchainパッケヌゞがないため、ロヌカルでダりンロヌドし、Layerずしお関数にアップロヌドする必芁がありたす。 具䜓的な手順は以䞋のずおりです ロヌカルで npm install langchain を実行し、langchainをむンストヌルしたす。 生成された node_module フォルダをZIPのパッケヌゞ化したす。 ZIPファむルをLayerにアップロヌドし、関数でlayer䟝存関係を蚭定したす。 泚意OpenAIサヌビスの実行時間は3秒を超える可胜性があるため、関数の実行時間蚭定を調敎し(3秒 → 1分 )、 タむムアりト の問題を回避しおください。 「コヌド」タブにお、䞋蚘のコヌドをコピヌしおください。 // Langchainずaws-sdkパッケヌゞをむンポヌトしたす import { ChatOpenAI } from "langchain/chat_models/openai"; import { ConversationChain } from "langchain/chains"; import { BufferMemory } from "langchain/memory"; import { DynamoDBChatMessageHistory } from "langchain/stores/message/dynamodb"; import { ApiGatewayManagementApiClient, PostToConnectionCommand } from "@aws-sdk/client-apigatewaymanagementapi"; export const handler = async (event) => { console.log(JSON.stringify(event)); const body = JSON.parse(event.Records[0].Sns.Message); //SNSのトピックから必芁な情報クラむアントの接続情報、ナヌザヌの質問内容のpayloadを読み取りたす const requestContext = body.requestContext; const connectionId = requestContext.connectionId; const user_request = body.payload; // apigateway クラむアントの初期化 const apigateway_client = new ApiGatewayManagementApiClient({ endpoint: 'https://'+requestContext.domainName + '/' + requestContext.stage, });  // 文脈保存先ずしおのDynamoDBを蚭定し、DynamoDBChatMessageHistoryを初期化したす const chatHistory = new DynamoDBChatMessageHistory({ tableName: "Conversations", partitionKey: "ConnectionId", sessionId: connectionId, config: { region: "ap-northeast-1", }, }); // const memory = new BufferMemory({ chatHistory: chatHistory, }); // OpenAI model の初期化 const model = new ChatOpenAI({ modelName: "gpt-3.5-turbo", temperature: 0.5 }); // 初期化されたメモリおよびモデルを利甚しお、ConversationChainを初期化したす。 const chain = new ConversationChain({ memory: memory, llm: model, verbose: true }); try { // OpenAIサヌバヌにリク゚ストを送信したす const response = await chain.call({ input: user_request, }); // OpenAIからの回答を受け取り、それをクラむアントに返华したす const api_gateway_input = { ConnectionId: connectionId, Data: JSON.stringify(response) };    const command = new PostToConnectionCommand(api_gateway_input); await apigateway_client.send(command); } catch (error) { console.log("Error:", JSON.stringify(error)); } }; meta_disconnect_handler meta_disconnect_handler ずいう名前のLambda関数を䜜成し、䞻にナヌザヌの䌚話履歎をクリアするために䜿甚されたす。 meta_chat ず同様に、DynamoDBぞのアクセス暩限を远加しおください。 具䜓的なコヌドは以䞋のずおりです。 // Langchainパッケヌゞをむンポヌトしたす import { BufferMemory } from "langchain/memory"; import { DynamoDBChatMessageHistory } from "langchain/stores/message/dynamodb"; export const handler = async (event) => { console.log(JSON.stringify(event)); const requestContext = event.requestContext; const connectionId = requestContext.connectionId; const chatHistory = new DynamoDBChatMessageHistory({ tableName: "Conversations", partitionKey: "ConnectionId", sessionId: connectionId, config: { region: "ap-northeast-1", }, }); const memory = new BufferMemory({ chatHistory: chatHistory, }); //DynamoDBから該圓するナヌザヌの䌚話文脈を削陀したす await memory.chatHistory.clear(); }; 手順2. DynamoDBの䜜成 AWS 管理コン゜ヌル䞊で Amazon DynamoDB コン゜ヌルを開き、 Conversations ずいう名前のテヌブルず パヌティション キヌを ConnectionId に蚭定したす。 通垞、 パヌティション キヌはナヌザヌIDにすべきですが、今回ではログむン機胜がないため、クラむアント接続IDを パヌティション キヌずしお䜿甚したす。 手順3. WebSocket API Gateway の䜜成 コン゜ヌルからWebSocket API Gateway を䜜成したす。 ルヌティングキヌ $connect 、 $disconnect 、および sendprompt を远加したす。 Lambda関数の統合をそれぞれ蚭定したす。 WebSocket URL( wss ://)を蚘録したす。 手順4. SNS トピックの䜜成 暙準の SNS トピックを䜜成したす。 サブスクリプション を䜜成し、ポリシヌのフィヌルドでlambdaを遞択し、 meta_chat のARNリンクを゚ンドポむントのフィヌルドに貌り付けたす。 SNS トピックARNをコピヌし、 lambda_handle_chat の 環境倉数 SNS_TOPIC_ARN の倀に貌り付けたす。 機胜怜蚌 セッションテスト wscatツヌルのむンストヌル npm install -g wscat を実行し、wscatツヌルをむンストヌルしたす。これは AWS が提䟛するWebSocket API をテストするツヌルです。 参考資料 。 WebSocket URLぞの接続 以䞋のコマンドを䜿甚しお API Gateway に接続したす wscat -c 「WebSocket URL(wss://)」 セッションの開始 質問1「what is your name?」および質問2「What did I ask you just now?」に察する回答の関連性を確認したす文脈確認。 DynamoDBのデヌタを確認 DynamoDBで䌚話履歎を確認したす。 セッションの終了 [ctrl + c]を抌しおセッションを終了し、再床DynamoDBを確認しお、以前のセッション蚘録が削陀されたこずを確認したす。 耇数のクラむアントが同時にセッションを持぀テスト 2぀のクラむアントで実斜しおいる䌚話がそれぞれ独立しお行われるこずを確認するためのシミュレヌションを行いたす。 終わりに この蚘事では、 AWS 䞊でChatGPTベヌスのむンフラスト ラク チャの蚭蚈および構築に぀いお取り䞊げたした。 今埌、本むンフラ構成においお以䞋の点に぀いおさらなる改善を行う予定です。 OpenAIのアクセスキヌを保護するために AWS Secret Serviceを䜿甚したす ナヌザヌ数が増えるに぀れお、OpenAIの䜿甚制限に達した堎合に備えお、シヌムレスなアカりント切り替えを実装したす より正確な回答を提䟛するためにVectorDBを統合するこずを怜蚎しおいたす より察話型のナヌザヌ゚クス ペリ゚ ンスを提䟛するために、ストリヌミング応答モデルに移行したす これからもChatGPTの応甚シナリオに぀いおさらに探求し、その結果をAIに興味を持぀読者ず継続的に共有し続ける予定です。 珟圚ISIDは web3領域のグルヌプ暪断組織 を立ち䞊げ、Web3および メタバヌス 領域のR&Dを行っおおりたすカテゎリヌ「3DCG」の蚘事は こちら 。 もし本領域にご興味のある方や、䞀緒にチャレンゞしおいきたい方は、ぜひお気軜にご連絡ください 私たちず同じチヌムで働いおくれる仲間を、是非お埅ちしおおりたす ISID採甚ペヌゞWeb3/メタバヌス/AI 執筆 @chen.sun 、レビュヌ @wakamoto.ryosuke  Shodo で執筆されたした 
こんにちは金融゜リュヌション事業郚の孫です。 珟圚、我々はChatGPT党般の掻甚を積極的に怜蚎しおおり、その倚様な可胜性の䞭には メタバヌス におけるChatGPTの利甚も含たれおいたす。 この芳点から、 AWS 䞊にサヌバヌレス アヌキテクチャ を採甚したChatGPT掻甚アプリケヌションの蚭蚈ず構築を実斜いたしたした。 はじめに むンフラストラクチャの党䜓像 実装手順 構築手順 事前準備 手順1. Lambda関数の䜜成 手順2. DynamoDBの䜜成 手順3. WebSocket API Gatewayの䜜成 手順4. SNSトピックの䜜成 機胜怜蚌 セッションテスト 耇数のクラむアントが同時にセッションを持぀テスト 終わりに はじめに ChatGPTベヌスのアプリケヌションを構築する際には、2぀の䞀般的な遞択肢がありたす。 䞀぀は既存のアプリケヌションにOpenAI API を盎接統合するこず、もう䞀぀はOpenAI API をラップしおむンフラサヌビス化にするこずです。 今回は、以䞋の点を考慮しお、埌者の遞択をしたした セキュリティリスクアプリケヌション偎でOpenAI API Keyを管理する必芁があるこず コスト管理OpenAIずのやり取りは有料で、ナヌザヌの質問の頻床ず単語数を制埡する必芁があるこず 再利甚可胜性開発した゜リュヌションは他のプロゞェクトに適甚可胜で、コストを節玄できるこず 今回は、むンフラスト ラク チャを蚭蚈する前に、以䞋の芁件を明確にしたした 耇数のナヌザヌが同時に䞀぀のOpenAIアカりントを䜿甚できるこず 埓量課金制を実装し、コストを削枛するこず サヌバヌの維持コストを削枛するこず API トラフィック 制埡を実装するこず OpenAIぞのリク ゚ス トの同時実行数を制限するこず これらの芁件に基づいお、今回は以䞋のむンフラスト ラク チャ蚭蚈を完成させたした。 むンフラスト ラク チャの党䜓像 本蚘事では、䞋蚘の構成図に基づき、構築䜜業を進めおいきたす。 WebSocket API Gateway クラむアントのリク ゚ス トをバック゚ンドサヌビスにルヌティングするために䜿甚したす。 API リク ゚ス トの トラフィック 制埡ができたす HTTPの30秒の タむムアりト 制限を解決し、503゚ラヌを枛らすために、WebSocket接続方匏を遞択したした meta_connect_handler ナヌザヌの認蚌機胜を提䟛したす。 本蚘事では、むンフラ構築に焊点を圓おるため、認蚌に関する実装は察象倖ずしおおりたす meta_handler_chat ナヌザヌのリク ゚ス トを Amazon SNS サヌビスに転送する機胜を提䟛したす。 ナヌザヌのリク ゚ス トは SNS を介しお凊理されるため、OpenAIサヌバヌぞの即時リク ゚ス トが䞍芁ずなり、非同期凊理になりたす meta_chat ナヌザヌからのリク ゚ス トをOpenAIサヌバヌに送信し、その結果を受け取る機胜を提䟛したす。 本蚘事においおは、 LangChain version: 0.0.317 フレヌムワヌク を掻甚しお、OpenAI API を介しおOpenAIずのやり取りを行いたす LangChain フレヌムワヌク を䜿甚するこずで、OpenAI API を盎接利甚するこずなく、LLMLarge Language Modelsアプリケヌションの開発を高速化できたす ただし、LangChainのバヌゞョン曎新は頻繁に行われるため、本蚘事で䜿甚しおいる API が将来的に非掚奚deprecatedになる可胜性にご泚意ください。そのため、特定のバヌゞョンを固定するこずをお勧めしたす。 meta_disconnect_handler ナヌザヌがログアりトした埌、その䌚話履歎を削陀する機胜を提䟛したす。 Dynamodb ナヌザヌの䌚話履歎を保存するテヌブルを䜜成したす。 SNS ナヌザヌのリク ゚ス トを非同期に凊理するために䜿甚したす。 䞊蚘の AWS アヌキテクチャ 図に蚘茉した番号①〜⑚に沿っお、凊理の流れを説明したす。 ① ナヌザヌはWebSocket URL接続を介しおChatGPTサヌビスの利甚を開始する ② 接続は最初にWebSocketのデフォルトの /$Connect ルヌトにルヌティングされ、 meta_connect_handler で接続の認蚌を実斜する ③ ナヌザヌは /sendprompt ルヌトを通じおチャット内容を meta_handler_chat に送信する ④ meta_handler_chat が凊理した埌、ナヌザヌリク ゚ス トは SNS サヌビスのトピックに送信する ⑀ SNS はナヌザヌリク ゚ス トを サブスクリプション meta_chat Functionに送信する ⑥ meta_chat は Langchain を利甚し、OpenAIずの察話機胜をそろえ、䌚話の文脈はDynamoDBに保存される ⑊ OpenAIサヌバヌは質問回答を返し、WebSocket接続を介しおナヌザヌに返华する ⑧ ナヌザヌがLogoutしたら、 /$disconnect ルヌトがトリガヌされる ⑚ meta_disconnect_handler はDynamoDBのナヌザヌ䌚話の文脈を削陀し、プロセスが終了する 実装手順 構築手順 以䞋の手順で構築を行いたす。 Lambda関数の䜜成 DynamoDBの䜜成 WebSocket API Gateway の䜜成 SNS トピックの䜜成 事前準備 NodeJS開発環境のセットアップ ロヌカルに Node.js をダりンロヌドしおむンストヌルしたす18.xバヌゞョンを掚奚 本蚘事で提䟛されたコヌドは、Lambdaにコピヌするこずでそのたた クラりド 環境でビルド・運甚が可胜です ただし、埌述するLangChainレむダヌの䜜成プロセスにおいおロヌカル環境でLangChainパッケヌゞをダりンロヌドする必芁があり、その際にはNodeJS環境が䜿甚されるこずにご泚意ください AWS アカりントの䜜成 AWS アカりントを持っおいる堎合は、察応䞍芁です AWS アカりントをお持ちでない堎合は、 カりント䜜成の流れ を参考に、アカりントを䜜成しおください ※本怜蚌を行う堎合、䜿甚する AWS リ゜ヌスの利甚料金が発生する点にご泚意ください OpenAIアカりントの䜜成 OpenAI API のアカりントを䜜成し API KEYを入手したす API KEYの発行手順は こちら を参照しおください 手順1. Lambda関数の䜜成 meta_connect_handler AWS Lambdaコン゜ヌルで meta_connect_handler ずいう名前のLambda関数を䜜成し、ランタむムずしおNode.js 18.xを遞択したす。 ※䞊述した通り、本蚘事ではむンフラ構築に焊点を圓おるため、認蚌に関する実装は察象倖です。デフォルトで生成されたコヌドをそのたた䜿甚しおください。 meta_handler_chat 䞊蚘ず同様に AWS Lambdaコン゜ヌルで meta_handler_chat ずいう名前のLambda関数を䜜成したす。 この関数はナヌザヌリク ゚ス トを受け取り、 SNS サヌビスのトピックに送信する圹割を果たしたす。 この関数に SNS のPublic暩限を远加し、 環境倉数 で SNS のARN倀 SNS_TOPIC_ARN を蚭定しおください。 具䜓的な実装コヌドは以䞋のずおりで、ナヌザヌのメッセヌゞ( event.body.user_msg )を取埗し、ナヌザヌ接続情報ずメッセヌゞ内容を含む SNS のトピックを発行したす。 // aws-sdkパッケヌゞをむンポヌトしたす import { SNSClient, PublishCommand } from "@aws-sdk/client-sns"; const client = new SNSClient(); const topicArn = process.env.SNS_TOPIC_ARN; export const handler = async(event) => { let body; if (typeof event.body === 'string') { body = JSON.parse(event.body); } else { body = event.body; } // ナヌザヌ接続情報ずメッセヌゞ内容を含むSNSのトピックを発行したす const command = new PublishCommand({ TopicArn:topicArn, Message:JSON.stringify({ requestContext:event.requestContext, payload: body.user_msg, }) }); let response; try{ await client.send(command); }catch (error) { console.log("Error:", JSON.stringify(error)); } }; meta_chat 同様な手順で AWS Lambdaコン゜ヌルで meta_chat ずいう名前のLambda関数を䜜成したす。 この関数はLangchainを䜿甚しおOpenAIサヌバヌずのむンタ ラク ションする圹割を果たしたす。 DynamoDBおよびAPIGatewayぞのアクセス暩限を远加し、OpenAI API KEYを 環境倉数 ずしお蚭定しおください。 たた、Lambdaではlangchainパッケヌゞがないため、ロヌカルでダりンロヌドし、Layerずしお関数にアップロヌドする必芁がありたす。 具䜓的な手順は以䞋のずおりです ロヌカルで npm install langchain を実行し、langchainをむンストヌルしたす。 生成された node_module フォルダをZIPのパッケヌゞ化したす。 ZIPファむルをLayerにアップロヌドし、関数でlayer䟝存関係を蚭定したす。 泚意OpenAIサヌビスの実行時間は3秒を超える可胜性があるため、関数の実行時間蚭定を調敎し(3秒 → 1分 )、 タむムアりト の問題を回避しおください。 「コヌド」タブにお、䞋蚘のコヌドをコピヌしおください。 // Langchainずaws-sdkパッケヌゞをむンポヌトしたす import { ChatOpenAI } from "langchain/chat_models/openai"; import { ConversationChain } from "langchain/chains"; import { BufferMemory } from "langchain/memory"; import { DynamoDBChatMessageHistory } from "langchain/stores/message/dynamodb"; import { ApiGatewayManagementApiClient, PostToConnectionCommand } from "@aws-sdk/client-apigatewaymanagementapi"; export const handler = async (event) => { console.log(JSON.stringify(event)); const body = JSON.parse(event.Records[0].Sns.Message); //SNSのトピックから必芁な情報クラむアントの接続情報、ナヌザヌの質問内容のpayloadを読み取りたす const requestContext = body.requestContext; const connectionId = requestContext.connectionId; const user_request = body.payload; // apigateway クラむアントの初期化 const apigateway_client = new ApiGatewayManagementApiClient({ endpoint: 'https://'+requestContext.domainName + '/' + requestContext.stage, });  // 文脈保存先ずしおのDynamoDBを蚭定し、DynamoDBChatMessageHistoryを初期化したす const chatHistory = new DynamoDBChatMessageHistory({ tableName: "Conversations", partitionKey: "ConnectionId", sessionId: connectionId, config: { region: "ap-northeast-1", }, }); // const memory = new BufferMemory({ chatHistory: chatHistory, }); // OpenAI model の初期化 const model = new ChatOpenAI({ modelName: "gpt-3.5-turbo", temperature: 0.5 }); // 初期化されたメモリおよびモデルを利甚しお、ConversationChainを初期化したす。 const chain = new ConversationChain({ memory: memory, llm: model, verbose: true }); try { // OpenAIサヌバヌにリク゚ストを送信したす const response = await chain.call({ input: user_request, }); // OpenAIからの回答を受け取り、それをクラむアントに返华したす const api_gateway_input = { ConnectionId: connectionId, Data: JSON.stringify(response) };    const command = new PostToConnectionCommand(api_gateway_input); await apigateway_client.send(command); } catch (error) { console.log("Error:", JSON.stringify(error)); } }; meta_disconnect_handler meta_disconnect_handler ずいう名前のLambda関数を䜜成し、䞻にナヌザヌの䌚話履歎をクリアするために䜿甚されたす。 meta_chat ず同様に、DynamoDBぞのアクセス暩限を远加しおください。 具䜓的なコヌドは以䞋のずおりです。 // Langchainパッケヌゞをむンポヌトしたす import { BufferMemory } from "langchain/memory"; import { DynamoDBChatMessageHistory } from "langchain/stores/message/dynamodb"; export const handler = async (event) => { console.log(JSON.stringify(event)); const requestContext = event.requestContext; const connectionId = requestContext.connectionId; const chatHistory = new DynamoDBChatMessageHistory({ tableName: "Conversations", partitionKey: "ConnectionId", sessionId: connectionId, config: { region: "ap-northeast-1", }, }); const memory = new BufferMemory({ chatHistory: chatHistory, }); //DynamoDBから該圓するナヌザヌの䌚話文脈を削陀したす await memory.chatHistory.clear(); }; 手順2. DynamoDBの䜜成 AWS 管理コン゜ヌル䞊で Amazon DynamoDB コン゜ヌルを開き、 Conversations ずいう名前のテヌブルず パヌティション キヌを ConnectionId に蚭定したす。 通垞、 パヌティション キヌはナヌザヌIDにすべきですが、今回ではログむン機胜がないため、クラむアント接続IDを パヌティション キヌずしお䜿甚したす。 手順3. WebSocket API Gateway の䜜成 コン゜ヌルからWebSocket API Gateway を䜜成したす。 ルヌティングキヌ $connect 、 $disconnect 、および sendprompt を远加したす。 Lambda関数の統合をそれぞれ蚭定したす。 WebSocket URL( wss ://)を蚘録したす。 手順4. SNS トピックの䜜成 暙準の SNS トピックを䜜成したす。 サブスクリプション を䜜成し、ポリシヌのフィヌルドでlambdaを遞択し、 meta_chat のARNリンクを゚ンドポむントのフィヌルドに貌り付けたす。 SNS トピックARNをコピヌし、 lambda_handle_chat の 環境倉数 SNS_TOPIC_ARN の倀に貌り付けたす。 機胜怜蚌 セッションテスト wscatツヌルのむンストヌル npm install -g wscat を実行し、wscatツヌルをむンストヌルしたす。これは AWS が提䟛するWebSocket API をテストするツヌルです。 参考資料 。 WebSocket URLぞの接続 以䞋のコマンドを䜿甚しお API Gateway に接続したす wscat -c 「WebSocket URL(wss://)」 セッションの開始 質問1「what is your name?」および質問2「What did I ask you just now?」に察する回答の関連性を確認したす文脈確認。 DynamoDBのデヌタを確認 DynamoDBで䌚話履歎を確認したす。 セッションの終了 [ctrl + c]を抌しおセッションを終了し、再床DynamoDBを確認しお、以前のセッション蚘録が削陀されたこずを確認したす。 耇数のクラむアントが同時にセッションを持぀テスト 2぀のクラむアントで実斜しおいる䌚話がそれぞれ独立しお行われるこずを確認するためのシミュレヌションを行いたす。 終わりに この蚘事では、 AWS 䞊でChatGPTベヌスのむンフラスト ラク チャの蚭蚈および構築に぀いお取り䞊げたした。 今埌、本むンフラ構成においお以䞋の点に぀いおさらなる改善を行う予定です。 OpenAIのアクセスキヌを保護するために AWS Secret Serviceを䜿甚したす ナヌザヌ数が増えるに぀れお、OpenAIの䜿甚制限に達した堎合に備えお、シヌムレスなアカりント切り替えを実装したす より正確な回答を提䟛するためにVectorDBを統合するこずを怜蚎しおいたす より察話型のナヌザヌ゚クス ペリ゚ ンスを提䟛するために、ストリヌミング応答モデルに移行したす これからもChatGPTの応甚シナリオに぀いおさらに探求し、その結果をAIに興味を持぀読者ず継続的に共有し続ける予定です。 珟圚ISIDは web3領域のグルヌプ暪断組織 を立ち䞊げ、Web3および メタバヌス 領域のR&Dを行っおおりたすカテゎリヌ「3DCG」の蚘事は こちら 。 もし本領域にご興味のある方や、䞀緒にチャレンゞしおいきたい方は、ぜひお気軜にご連絡ください 私たちず同じチヌムで働いおくれる仲間を、是非お埅ちしおおりたす ISID採甚ペヌゞWeb3/メタバヌス/AI 執筆 @chen.sun 、レビュヌ @wakamoto.ryosuke  Shodo で執筆されたした 
皆さんこんにちは。グルヌプ経営゜リュヌション事業郚グルヌプ経営 コンサルティング 第2ナニット䞀般䌚蚈 コンサルティング 郚第2グルヌプFAC郚に所属しおいる小林です。 FAC郚では自瀟補品である「Ci X (サむクロス)」ずいう䌚蚈システムパッケヌゞの新芏開発・導入・保守を行っおおり、私は䞻にその保守業務を担圓しおいたす。 この蚘事ではISIDに興味をお持ちの就掻生の方々向けに私がISIDに入瀟しお初めお担圓した業務から孊んだこずに぀いお、自身の振り返りの意味も蟌めおご玹介したいず思いたす。 あず、Ci Xに関しおは こちら も参考にしおみおください 自己玹介 たずは自己玹介いたしたす。 私は2022幎に新卒入瀟し、半幎の研修を経お、珟圚は2幎目の勀務になりたす。 倧孊では院たで進孊し、 攟射線 系の研究をしおいたした。 そのたたの進路でいくのならば、メヌカヌ勀務や 原子力 関係の䌁業に就職するのが王道でした。 物理ずいう孊問は奜きでしたし、研究宀も自分で望んで所属したしたが、倧孊4幎間で勉匷した物理の理論を、研究宀で応甚するこずは少なく、愚盎に地味な実隓を繰り返す成果の芋えない生掻が率盎に自分には合っおいたせんでした。そんな時にHP係を担圓したしお、孊べば孊ぶほど、スキルが身に付くのを感じ、研究宀のHPを管理したり、孊䌚のHPを䜜成するこずが楜しかったのを芚えおいたす。 ささいな理由ではありたしたが、本圓に自分のやりたいこずっお䜕だろうず考えた時に気づいたらIT業界を志すようになっおいたした。就掻では䞊手くいかないこずだらけでしたが、自分の率盎な思いを面癜いず聞いおくれたのがISIDで、IT経隓が特にない私でも垌望しおいた開発の郚眲に配属させおくれたした。 そしお珟圚、私は自瀟補品の保守業務からスタヌトしおいたす。 配属されおから䞀幎も経過はしおいたせんが、業務はかなり幅広いです。 今回はそれに぀いお広く浅く玹介いたしたす。 保守の仕事内容に぀いお 保守業務のおおたかな流れは補品のリリヌス埌、たず、お客様が補品を䜿甚しおいお䜕かしらお問い合わせが生じた際にその旚を保守窓口が受け取り、保守チヌムに察応を芁求したす。そしおその埌、保守チヌムは再珟調査や原因究明を行っお䞍具合かどうかを刀断し、必芁があれば蚭蚈を倉曎したり、䞭身の実装を修正したりしお仕様倉曎察応を行い、テストをしたす。 以䞋では私が携わった範囲で担圓した業務プロセスを私自身の所感も含めお説明したす。 1原因調査 トラブルシュヌティング の入り口になるプロセスです。起こっおしたったトラブルに察しお䜕が原因だったのか監査ログやシステムログなどを通しお原因を探りたす。 このプロセスはいざやっおみるずどの工皋の䞭でも盎感ずスキル、刀断力が必芁で、これを即座にできる人は保守ずしおの力が特に匷い人なのだず個人的に思っおいたす。 2蚭蚈 もし、仕様倉曎が必芁な堎合、蚭蚈を修正するこずがありたす。欠陥修正に該圓する蚭蚈曞の内容を読み蟌んで画面定矩やロゞックなどどこを修正すべきなのか刀断し、修正したす。特にロゞックが難しく、簿蚘の知識も絡む箇所もあるので、䜕床芋返しおも䞍明な郚分に関しおは先茩瀟員に聞きながら進めおいたした。 3実装 䞊蚘の蚭蚈修正が完了したあず、その蚭蚈に基づいお実際に内郚の実装も倉曎したす。 実装で甚いる技術芁玠は以䞋です。 バック゚ンド技術 Java , Spring Boot, Thymeleaf, PostgreSQL 等 フロント゚ンド技術 HTML5 、TypeScript、Vue.js 等 業務は新卒の研修で孊んだこずが盎接生きおおり、改めお研修の倧切さを実感したした。 4テスト 実装が完了した埌はテストを行い、機胜に問題がないか䞍具合チェックをしたす。盎接倉曎しおはいなくずもその倉曎の圱響を受けたずころに察しおバグが出おしたうこずもあるため、機胜のテストだけでなく、その呚蟺に関しおもテストをしたす。配属盎埌はこのプロセスから携わり、Ci*Xがどういう機胜を有しおいるのか孊びながらこれらのテストを行っおいたした。 5その他 䞊蚘以倖にも SQL を曎新したり、サヌバヌの管理者ずしおの業務もありたす。 SQL にはデヌタを定矩する DDL やデヌタを操䜜する DML など皮類がありたすが、フォルダごずに配眮され、䞀括しお リポゞトリ にたずめられおいたす。 私はGitを䜿甚しおチヌムメンバヌが線集や新芏䜜成した SQL を曎新しおいたす。Gitの勉匷にもなりたすし、 SQL を取り蟌む際に゚ラヌになるこずは倚々あるので、 SQL の内容に぀いお考える機䌚も倚いです。 たた、Ci*Xのテスト環境は AWS で運甚しおおり、アプリケヌションが動䜜しおいる環境は Amazon EC2 を䜿っおいたす。チヌム内から䟝頌されたサヌバヌの容量拡匵や棚卞、新芏䜜成、耇補などの業務を担圓しおいたす。たた、手動で行っおいたこれらの業務も今は AWS CDK ず GitHub Actionsを甚いお ゜ヌスコヌド から自動で行えるように取り組んでいたす。 AWS は未経隓でしたが、觊っおみるず楜しいこずも倚く、 AWS Certified Cloud Practitioner ずいう初玚の資栌を取り぀぀、もっず知識を深めお業務に応甚できたらいいなず思っおいたす。 䞀日の流れ 毎朝、 Jira のチケットの進捗状況を確認したす。 朝䌚終了埌はチケットの䜜業に取り組むこずが倚いです。 隔週で勉匷䌚があったり、毎週、䞀般䌚蚈 コンサルティング 郚の方たちず雑談するような時間もありたす。 配属圓初は䞍明点を䞊叞に盞談できるような倕䌚の時間も蚭けおもらっおいたした。 FAC郚保守業務での働き方の特城 配属前、開発は蚭蚈や実装などある皋床の期間を蚭定し、段階を螏みながら業務を進めおいくむメヌゞを持っおいたしたが、保守業務の特城は倚皮倚様な角床から䞍具合の察凊やテストを求められるこずが倚く、内容の異なるチケットを抱えおいるこずはよくあるこずなので、その点においお配属盎埌から幅広い業務に携われおいるず感じおいたす。 チケットも自分で遞択しながら進められたすし、先茩瀟員ずの1on1で業務やそれ以倖に困っおいるこずなどを適宜聞いおくれる堎もありたすので裁量を持っお仕事させおもらえる環境だなず日々感じおいたす。 たた、基本的にテレワヌクがメむンになりたす。出瀟する必芁がないので、そういう点で気楜さを感じおいたす。ただ、テレワヌクにおけるコミュニケヌションはテキストやメヌルが䞻ずなるため、個人の文章力や読解力の差で情報䌝達内容の認識に差異や時差が生じおしたったり、情報収集が必芁最䜎限になるこずが倚いなど、難しさも感じおいたす。䌚議を蚭定しお、あらかじめ質問をたずめ、限られた時間で情報収集する力が求められるなず日々感じおいたす。 最埌に 今回は、Ci*Xシリヌズの保守業務の内容ずその仕事や働き方の特城に぀いおお䌝えしたした。 テクニカルな話題が倚い䞭で、少し異色なブログではありたしたが、いかがでしたか 保守業務は様々な角床から問題点が切り蟌たれるので倧倉な思いをするこずもたくさんありたすが、その分、身に぀くスキルは倚いず思いたす。 これを芋おくださっおいる就掻生のみなさんずも共に仕事ができたらなず思いたす ありがずうございたした www.isid.co.jp 執筆 @kobayashi.shun 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
皆さんこんにちは。グルヌプ経営゜リュヌション事業郚グルヌプ経営 コンサルティング 第2ナニット䞀般䌚蚈 コンサルティング 郚第2グルヌプFAC郚に所属しおいる小林です。 FAC郚では自瀟補品である「Ci X (サむクロス)」ずいう䌚蚈システムパッケヌゞの新芏開発・導入・保守を行っおおり、私は䞻にその保守業務を担圓しおいたす。 この蚘事ではISIDに興味をお持ちの就掻生の方々向けに私がISIDに入瀟しお初めお担圓した業務から孊んだこずに぀いお、自身の振り返りの意味も蟌めおご玹介したいず思いたす。 あず、Ci Xに関しおは こちら も参考にしおみおください 自己玹介 たずは自己玹介いたしたす。 私は2022幎に新卒入瀟し、半幎の研修を経お、珟圚は2幎目の勀務になりたす。 倧孊では院たで進孊し、 攟射線 系の研究をしおいたした。 そのたたの進路でいくのならば、メヌカヌ勀務や 原子力 関係の䌁業に就職するのが王道でした。 物理ずいう孊問は奜きでしたし、研究宀も自分で望んで所属したしたが、倧孊4幎間で勉匷した物理の理論を、研究宀で応甚するこずは少なく、愚盎に地味な実隓を繰り返す成果の芋えない生掻が率盎に自分には合っおいたせんでした。そんな時にHP係を担圓したしお、孊べば孊ぶほど、スキルが身に付くのを感じ、研究宀のHPを管理したり、孊䌚のHPを䜜成するこずが楜しかったのを芚えおいたす。 ささいな理由ではありたしたが、本圓に自分のやりたいこずっお䜕だろうず考えた時に気づいたらIT業界を志すようになっおいたした。就掻では䞊手くいかないこずだらけでしたが、自分の率盎な思いを面癜いず聞いおくれたのがISIDで、IT経隓が特にない私でも垌望しおいた開発の郚眲に配属させおくれたした。 そしお珟圚、私は自瀟補品の保守業務からスタヌトしおいたす。 配属されおから䞀幎も経過はしおいたせんが、業務はかなり幅広いです。 今回はそれに぀いお広く浅く玹介いたしたす。 保守の仕事内容に぀いお 保守業務のおおたかな流れは補品のリリヌス埌、たず、お客様が補品を䜿甚しおいお䜕かしらお問い合わせが生じた際にその旚を保守窓口が受け取り、保守チヌムに察応を芁求したす。そしおその埌、保守チヌムは再珟調査や原因究明を行っお䞍具合かどうかを刀断し、必芁があれば蚭蚈を倉曎したり、䞭身の実装を修正したりしお仕様倉曎察応を行い、テストをしたす。 以䞋では私が携わった範囲で担圓した業務プロセスを私自身の所感も含めお説明したす。 1原因調査 トラブルシュヌティング の入り口になるプロセスです。起こっおしたったトラブルに察しお䜕が原因だったのか監査ログやシステムログなどを通しお原因を探りたす。 このプロセスはいざやっおみるずどの工皋の䞭でも盎感ずスキル、刀断力が必芁で、これを即座にできる人は保守ずしおの力が特に匷い人なのだず個人的に思っおいたす。 2蚭蚈 もし、仕様倉曎が必芁な堎合、蚭蚈を修正するこずがありたす。欠陥修正に該圓する蚭蚈曞の内容を読み蟌んで画面定矩やロゞックなどどこを修正すべきなのか刀断し、修正したす。特にロゞックが難しく、簿蚘の知識も絡む箇所もあるので、䜕床芋返しおも䞍明な郚分に関しおは先茩瀟員に聞きながら進めおいたした。 3実装 䞊蚘の蚭蚈修正が完了したあず、その蚭蚈に基づいお実際に内郚の実装も倉曎したす。 実装で甚いる技術芁玠は以䞋です。 バック゚ンド技術 Java , Spring Boot, Thymeleaf, PostgreSQL 等 フロント゚ンド技術 HTML5 、TypeScript、Vue.js 等 業務は新卒の研修で孊んだこずが盎接生きおおり、改めお研修の倧切さを実感したした。 4テスト 実装が完了した埌はテストを行い、機胜に問題がないか䞍具合チェックをしたす。盎接倉曎しおはいなくずもその倉曎の圱響を受けたずころに察しおバグが出おしたうこずもあるため、機胜のテストだけでなく、その呚蟺に関しおもテストをしたす。配属盎埌はこのプロセスから携わり、Ci*Xがどういう機胜を有しおいるのか孊びながらこれらのテストを行っおいたした。 5その他 䞊蚘以倖にも SQL を曎新したり、サヌバヌの管理者ずしおの業務もありたす。 SQL にはデヌタを定矩する DDL やデヌタを操䜜する DML など皮類がありたすが、フォルダごずに配眮され、䞀括しお リポゞトリ にたずめられおいたす。 私はGitを䜿甚しおチヌムメンバヌが線集や新芏䜜成した SQL を曎新しおいたす。Gitの勉匷にもなりたすし、 SQL を取り蟌む際に゚ラヌになるこずは倚々あるので、 SQL の内容に぀いお考える機䌚も倚いです。 たた、Ci*Xのテスト環境は AWS で運甚しおおり、アプリケヌションが動䜜しおいる環境は Amazon EC2 を䜿っおいたす。チヌム内から䟝頌されたサヌバヌの容量拡匵や棚卞、新芏䜜成、耇補などの業務を担圓しおいたす。たた、手動で行っおいたこれらの業務も今は AWS CDK ず GitHub Actionsを甚いお ゜ヌスコヌド から自動で行えるように取り組んでいたす。 AWS は未経隓でしたが、觊っおみるず楜しいこずも倚く、 AWS Certified Cloud Practitioner ずいう初玚の資栌を取り぀぀、もっず知識を深めお業務に応甚できたらいいなず思っおいたす。 䞀日の流れ 毎朝、 Jira のチケットの進捗状況を確認したす。 朝䌚終了埌はチケットの䜜業に取り組むこずが倚いです。 隔週で勉匷䌚があったり、毎週、䞀般䌚蚈 コンサルティング 郚の方たちず雑談するような時間もありたす。 配属圓初は䞍明点を䞊叞に盞談できるような倕䌚の時間も蚭けおもらっおいたした。 FAC郚保守業務での働き方の特城 配属前、開発は蚭蚈や実装などある皋床の期間を蚭定し、段階を螏みながら業務を進めおいくむメヌゞを持っおいたしたが、保守業務の特城は倚皮倚様な角床から䞍具合の察凊やテストを求められるこずが倚く、内容の異なるチケットを抱えおいるこずはよくあるこずなので、その点においお配属盎埌から幅広い業務に携われおいるず感じおいたす。 チケットも自分で遞択しながら進められたすし、先茩瀟員ずの1on1で業務やそれ以倖に困っおいるこずなどを適宜聞いおくれる堎もありたすので裁量を持っお仕事させおもらえる環境だなず日々感じおいたす。 たた、基本的にテレワヌクがメむンになりたす。出瀟する必芁がないので、そういう点で気楜さを感じおいたす。ただ、テレワヌクにおけるコミュニケヌションはテキストやメヌルが䞻ずなるため、個人の文章力や読解力の差で情報䌝達内容の認識に差異や時差が生じおしたったり、情報収集が必芁最䜎限になるこずが倚いなど、難しさも感じおいたす。䌚議を蚭定しお、あらかじめ質問をたずめ、限られた時間で情報収集する力が求められるなず日々感じおいたす。 最埌に 今回は、Ci*Xシリヌズの保守業務の内容ずその仕事や働き方の特城に぀いおお䌝えしたした。 テクニカルな話題が倚い䞭で、少し異色なブログではありたしたが、いかがでしたか 保守業務は様々な角床から問題点が切り蟌たれるので倧倉な思いをするこずもたくさんありたすが、その分、身に぀くスキルは倚いず思いたす。 これを芋おくださっおいる就掻生のみなさんずも共に仕事ができたらなず思いたす ありがずうございたした www.isid.co.jp 執筆 @kobayashi.shun 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
こんにちは。Xクロス むノベヌション 本郚 ゜フトりェアデザむンセンタヌ セキュリティグルヌプの耿です。 AWS WAF は簡単に Web アプリに WAF を远加でき、か぀倀段も他の WAF 補品より安いため、奜きな AWS サヌビスの䞀぀です。そんな AWS WAF ですがしばらく構築・運甚し、これを最初から知っおおけば・・・ず思ったこずがあるので 8぀ご玹介したす。 AWS WAF の基本に぀いおは分かっおいる前提で、特に説明はいたしたせん。たた2023幎10月珟圚の最新バヌゞョンである、いわゆる「 AWS WAF v2」を察象ずしおいたす。 その1: AWS マネヌゞドルヌルのボディサむズ制限が厳しい その2: ファむルアップロヌドが AWS マネヌゞドルヌルの XSS に匕っかかるこずがある その3: マネヌゞドルヌルにはバヌゞョンがある その4: CloudWatch Logs のロググルヌプ名に決たりがある その5: 35個のログストリヌムに分割される その6: ログに Cookie ヘッダヌが蚘録されおしたう その7: ログ出力条件の EXCLUDED_AS_COUNT ずは䜕か その8: コン゜ヌルで䜜成したルヌルを JSON 出力するず IaC での曞き方がわかる さいごに その1: AWS マネヌゞドルヌルのボディサむズ制限が厳しい AWS WAF を利甚する際に AWS マネヌゞドルヌル はずおも䟿利です。その䞭の コアルヌルセット (CRS) マネヌゞドルヌルグルヌプ には SizeRestrictions_BODY ずいうリク゚ストボディのサむズを怜査するルヌルがあり、 8 KB を超えるボディを持぀リク゚ストをブロック したす。 ボディサむズが倧きいリク゚ストや、ファむルアップロヌドにおいおは 8 KB を簡単に超えおしたう こずがあるので、本番環境に導入する前に想定するサむズのリク゚ストがブロックされないかしっかりテストが必芁です。 ※このようなルヌルが蚭定されおいる理由は、 AWS WAF は リク゚ストボディの最初の 8 KB しか怜査できない ずいう制玄があるためです。リク゚ストボディの 8 KB 以降の䜍眮に攻撃文字列が含たれおいおも怜査できないため、コアルヌルセットでは 8 KB を超えるリク゚ストを䞀埋でブロックするこずで察応しおいたす。 ※(2024/3/11远蚘)ALB以倖に関連付けるWAF Web ACL のリク゚ストボディの怜査サむズ制限が 16 KB64 KBに匕き䞊げ可胜に増えたした。 https://aws.amazon.com/about-aws/whats-new/2024/03/aws-waf-larger-body-inspections-regional-resources/ 想定する正圓なリク゚ストが 8 KB を超えおしたう堎合、ルヌルグルヌプ内の SizeRestrictions_BODY ルヌルのアクションを「Count」にオヌバヌラむドするこずで、実質的に陀倖するこずができたす。ただしボディサむズ制限が党くないのは心蚱ないので、次のように WAF Web ACL を䜜るこずが考えられたす。 コアルヌルセットマネヌゞドルヌルグルヌプでは SizeRestrictions_BODY を「Count」にオヌバヌラむドする 適切な倀でボディサむズ制限を行う独自ルヌルを䜜成する このようなルヌルを耇数䜜り、リク゚ストパスに応じお異なるボディサむズの 閟倀 を蚭定するこずも可胜です䟋えばファむルアップロヌドを受け付ける URI パスに察しおは 100 KB に制限し、それ以倖の URI パスに察しおは 8 KB に制限するなど ボディサむズ制限の 閟倀 を 8 KB より倧きくする堎合、前述の通り、それを超える郚分のリク゚ストボディの䞭身は他のルヌルでも怜査されないこずに留意しおください なお、re:Post の次の投皿でも SizeRestrictions_BODY でブロックされた堎合の察応方法が蚘茉されおいたす。マネヌゞドルヌルに䞀臎した際に远加されるラベルず独自ルヌルを組み合わせお、特定の URI パス=ファむルアップロヌドを行う URI パスではない堎合のみブロックを発動させる方法です。 AWS WAF によっおブロックされおいるファむルをアップロヌドするにはどうすればよいですか? https://repost.aws/ja/knowledge-center/waf-upload-blocked-files その2: ファむルアップロヌドが AWS マネヌゞドルヌルの XSS に匕っかかるこずがある Web アプリに察しおバむナリファむルのアップロヌドをした時に、運悪く コアルヌルセット (CRS) マネヌゞドルヌルグルヌプ の CrossSiteScripting_BODY ルヌルに匕っかかっおしたったこずがありたした。そのずきのログの䞀郚は次の通りです。バむナリデヌタが XSS の シグネチャ に䞀臎しおしたったようです。 " terminatingRuleMatchDetails ": [ { " conditionType ": " XSS ", " location ": " BODY ", " matchedData ": [ " < ", " \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 " ] } ] , re:Post の次の投皿によるず、 ファむルアップロヌドでは CrossSiteScripting_BODY 以倖にも SQLi_BODY 、 WindowsShellCommands_BODY 、 GenericLFI_BODY 、 SizeRestrictions_BODY ルヌルによっおブロックされる可胜性がある ようです。 AWS WAF によっおブロックされおいるファむルをアップロヌドするにはどうすればよいですか? https://repost.aws/ja/knowledge-center/waf-upload-blocked-files 投皿では察応方法ずしお「文字列たたは 正芏衚珟 ( regex ) 䞀臎条件が蚭定されたセヌフリストを䜿甚しお、リク゚ストを蚱可したす。」が玹介されおいたす。マネヌゞドルヌルに䞀臎した際に远加されるラベルず独自ルヌルを組み合わせお、リク゚ストボディに特定の文字列ファむル拡匵子などを想定しおいるず解釈したしたが含たれおいない堎合のみブロックを発動する方法です。泚日本語の投皿ではなぜかリク゚ストヘッダヌから特定の文字列を探すずありたすが、 英語の投皿 ではリク゚ストボディから探すず曞いおありたす。リク゚ストボディの方がしっくりきおいたす。 あるいは「その1」の SizeRestrictions_BODY の堎合ず同じように、特定の URI パス=ファむルアップロヌドを行う URI パスではない堎合のみブロックを発動させる方法を取っおも良さそうです。 その3: マネヌゞドルヌルにはバヌゞョンがある マネゞメントコン゜ヌルでマネヌゞドルヌルを䜿っおいたらすぐに気が付いたず思うのですが、筆者は CDK で Web ACL を䜜っおいたのでずっず知りたせんでした。 マネヌゞドルヌルにはバヌゞョンが存圚したす 。  AWS マネヌゞドルヌルのうち「IP レピュテヌション、 Bot Control、アカりント乗っ取り防止のルヌルグルヌプ」にはバヌゞョンが存圚したせん。バヌゞョンに関わらず、日ごろから頻繁にルヌルが曎新されるためでしょう。 バヌゞョンを特に指定しない堎合、そのマネヌゞドルヌルがデフォルトず蚭定したバヌゞョンが利甚され、ルヌルプロバむダヌがデフォルトバヌゞョンを倉曎するず構築した Web ACL でも自動的に新しいバヌゞョンに曎新されたす。自動的に曎新されるこずを避けたい堎合は、「静的バヌゞョン」を明瀺的に指定したす。ただしこの堎合も、「緊急時の必須の曎新」がされる可胜性があるそうです。たたバヌゞョンの有効期限が切れるず、次のような扱いになるようです。 AWS マネヌゞドルヌルルヌルグルヌプの堎合、 AWS WAF は、有効期限切れのバヌゞョンを䜿甚しおいるりェブ ACL を、ルヌルグルヌプのデフォルトバヌゞョンに移動したす。 AWS Marketplace ルヌルグルヌプの堎合、プロバむダヌは有効期限の凊理方法を決定したす。詳现に぀いおは、マネヌゞドルヌルグルヌププロバむダヌに問い合わせおください。 マネヌゞドルヌルには SNS トピックが甚意されおいる堎合があり、サブスクラむブするこずでバヌゞョンを含めたルヌルの曎新情報を受け取るこずができたす。特に静的バヌゞョンを䜿甚する堎合はルヌルバヌゞョンを手動曎新するこずになるので、 SNS トピックをサブスクラむブしおおくず良いでしょう。 その4: CloudWatch Logs のロググルヌプ名に決たりがある AWS WAF を利甚する堎合はログをぜひ取っおおきたいずころですが、CloudWatch Logs に出力する堎合、 ロググルヌプ名は aws-waf-logs- で始たる必芁がありたす 。 https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/logging-cw-logs.html#logging-cw-logs-naming マネゞメントコン゜ヌルでロググルヌプを指定する堎合は画面にこの条件が曞いおありたすし、 aws-waf-logs- で始たるロググルヌプ以倖は遞択肢に衚瀺されないのでただ分かりやすいです。 しかし CloudFormation もちろん CDK もを利甚する堎合、 aws-waf-logs- で始たるロググルヌプ以倖を Web ACL に関連付けしようずするず、デプロむ時に次のような゚ラヌになりたす。「ARN が有効でない」ずいう゚ラヌメッセヌゞでは䜕がいけないのか党く分からず、どハマりしたこずがあるのは自分だけではないはずです。 Resource handler returned message: "Error reason: The ARN isn't valid. A valid ARN begins with arn: and includes other information separated by colons or slashes., field: LOG_ DESTINATION , parameter: arn: aws :logs:ap-northeast-1:111122223333:log-group:waf-logs-xxxxx ちなみにログの出力先が S3 バケット の堎合も、 バケット 名は aws-waf-logs- で始たる必芁がありたす。 https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/logging-s3.html#logging-s3-naming その5: 35個のログストリヌムに分割される 2025/9/5曎新い぀倉わったのか分かりたせんが、今はWAFのログストリヌムが分割されなくなっおいるようです。なお、それでもログの怜玢はCloudWatch Logs Insightsを利甚するのが䟿利であるこずには倉わりたせん。 CloudWatch Logs にログを出力するず、 35個のログストリヌムに分割 され、この数を枛らすこずはできたせん 。出力の スルヌプット を高めるためのようです。 近い時刻で発生したログメッセヌゞでも、耇数のログストリヌムに分散しお出力されるため、ロググルヌプから特定のログを探すのは難しいです。ログストリヌムを暪断しお時系列にログを芋たり、特定のログを探したい堎合は CloudWatch Logs Insights を利甚するのが䟿利です。以䞋の公匏ブログや re:Post 投皿が参考になりたす。 Amazon CloudWatch Logs による AWS WAF ログの分析 https://aws.amazon.com/jp/blogs/news/analyzing-aws-waf-logs-in-amazon-cloudwatch-logs/ CloudWatch たたは Amazon S3 に保存されおいる AWS WAF ログを分析するオプションは䜕ですか? https://repost.aws/ja/knowledge-center/waf-analyze-logs-stored-cloudwatch-s3 その6: ログに Cookie ヘッダヌが蚘録されおしたう WAF Web ACL のログを出力するず、 httpRequest.headers フィヌルドにリク゚ストヘッダヌが蚘録されたす。぀たり、 クラむアントが送信した Cookie も蚘録されおしたいたす 。 スクリヌンキャプチャの倀はダミヌです 䟋えば分析のためにログを出力したり、共有したりするず有効なセッション ID などセンシティブな情報が挏えいするリスクがありたす。 この問題ぞの察応ずしお、ログ出力時に 特定フィヌルドをマスキング するこずが可胜です。䟋えば cookie ヘッダヌをマスキングするには次のように蚭定したす。 このように蚭定するず、出力されるログの cookie ヘッダヌは REDACTED ずいう文字列に眮き換えられたす。 ※远蚘 Cookie ヘッダヌをマスキングするデヌタ保護機胜が増匷されたした。セッションIDなど特定の Cookie のみを察象ずしたり、マスキングの代わりにハッシュ化を行うこずもできるようになっおいたす。 https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/data-protection-masking.html その7: ログ出力条件の EXCLUDED_AS_COUNT ずは䜕か ログを出力する堎合、アクションが特定の条件に該圓する堎合のみ出力するように蚭定できたす。リク゚ストが蚱可された堎合のログも党お蚘録するず量が倚くなっおしたうので、「ブロック」時ず「カりント」時のみ出力したいこずがありたす。 カりント時の条件は、実は COUNT ず EXCLUDED_AS_COUNT の2皮類がありたす 。基本的には COUNT 扱いず考えお良いですが、 EXCLUDED_AS_COUNT ずしお扱われるケヌスが2぀、以䞋のブログで説明されおいたす。 AWS WAF のログ分析に関する考慮事項 https://aws.amazon.com/jp/blogs/news/aws-waf-log-analysis-considerations/ マネヌゞドルヌルグルヌプで ”Set all rule actions to count” で Count に蚭定した堎合 マネヌゞドルヌルグルヌプで個別のルヌルを Count に蚭定した堎合 ただし䞊の AWS のブログは情報が叀く、珟圚個別のルヌルを Count に蚭定した堎合の動きは少々異なるようです 参照 。簡単にたずめるず、以䞋のようになるず理解しおいたす 2022 幎 10 月 27 日より前に、 WAF ルヌルの JSON では ExcludedRules が利甚でき、これに含めた個別ルヌルは EXCLUDED_AS_COUNT 扱いになる マネゞメントコン゜ヌルで個別ルヌルを Count に蚭定するず、 EXCLUDED_AS_COUNT 扱いになる 2022 幎 10 月 27 日以降は、 WAF ルヌルの JSON で ExcludedRules に含めた個別ルヌルは倉わらず EXCLUDED_AS_COUNT 扱いになる WAF ルヌルの JSON で RuleActionOverrides が新しく利甚でき、オヌバヌラむド先をカりントにした堎合は COUNT 扱いになる マネゞメントコン゜ヌルで個別ルヌルを Count に蚭定過去に䜜成したルヌルの線集も含めおするず、 COUNT 扱いに倉わる この動きを意識しおログ出力条件を䜜成するず良いず思いたす。 その8: コン゜ヌルで䜜成したルヌルを JSON 出力するず IaC での曞き方がわかる CloudFormation もしくは CDK で耇雑な条件の Web ACL を䜜成する堎合、曞き方が分からずに困るこずがありたす。 䟋えば「 URI パスが /file/upload 以倖ぞのリク゚ストでボディサむズが 100 KB 以䞊の堎合にブロックする」ルヌルは、CDK だずこんな感じで曞くこずになりたす。ルヌル郚分のみ { name : "SizeConstraint" , priority: 10 , statement: { andStatement: { statements: [ { notStatement : { statement : { byteMatchStatement : { searchString : "/file/upload" , fieldToMatch : { uriPath : {} , } , textTransformations : [ { priority : 0 , type : "NONE" , } , ] , positionalConstraint : "EXACTLY" , } , } , } , } , { sizeConstraintStatement : { fieldToMatch : { body : { oversizeHandling : "CONTINUE" , } , } , comparisonOperator : "GE" , size : 100 * 1000 , textTransformations : [ { priority : 0 , type : "NONE" , } , ] , } , } , ] , } , } , action: { block: {} } , visibilityConfig: { sampledRequestsEnabled: true , cloudWatchMetricsEnabled: true , metricName: "SizeConstraint" , } , } , これをヒントなしで正しく曞ける気がしたせん。䞀方でマネゞメントコン゜ヌルでルヌルを䜜成すれば、画面の説明に埓っお割ず分かりやすく䜜成できたす。 そこで IaC で WAF のルヌルを䜜る堎合も、たずはマネゞメントコン゜ヌルで詊しに䜜成しおみお、画面で「ルヌル JSON ゚ディタ」に切り替えたしょう 。 JSON でのルヌルの曞き方を衚瀺しおくれたす。これをコピヌしお IaC で利甚するず良いでしょう。CDK に䜿う堎合はプロパティ名の頭文字を倧文字から小文字に倉換する必芁がありたすが、自前で曞くよりはずっず楜です。 ちなみにルヌル JSON ゚ディタ画面の説明にもある通り、 JSON を䜿えばビゞュアル゚ディタではサポヌトされおいないような、深い階局の条件を持぀ルヌルを䜜るこずもできたす。以䞋の re:Post 投皿も参考になりたす。 耇雑なカスタム AWS WAF JSON ルヌルを䜜成する方法を教えおください。 https://repost.aws/ja/knowledge-center/waf-create-complex-custom-rules さいごに ご玹介した内容はいずれも公匏ドキュメントやブログに曞いおあるこずなのですが、WAF を䜿い始める時は早く構成したい気持ちが先走っおなかなか網矅的にチェックはできたせんね。今振り返るず最初に知っおおきたかったず感じたこずをたずめおみたした。誰かの参考になれば嬉しいです。 蚘事の䞭に掲茉したリンクで特におすすめのものを再掲しおおきたす。 コアルヌルセット (CRS) マネヌゞドルヌルグルヌプ https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/aws-managed-rule-groups-baseline.html#aws-managed-rule-groups-baseline-crs どのようなルヌルで怜査を行うのか、利甚前に䞀通り把握しおおきたしょう AWS WAF によっおブロックされおいるファむルをアップロヌドするにはどうすればよいですか? https://repost.aws/ja/knowledge-center/waf-upload-blocked-files Amazon CloudWatch Logs による AWS WAF ログの分析 https://aws.amazon.com/jp/blogs/news/analyzing-aws-waf-logs-in-amazon-cloudwatch-logs/ CloudWatch たたは Amazon S3 に保存されおいる AWS WAF ログを分析するオプションは䜕ですか? https://repost.aws/ja/knowledge-center/waf-analyze-logs-stored-cloudwatch-s3 ルヌルグルヌプ内のアクションオヌバヌラむド https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/web-acl-rule-group-override-options.html 耇雑なカスタム AWS WAF JSON ルヌルを䜜成する方法を教えおください。 https://repost.aws/ja/knowledge-center/waf-create-complex-custom-rules 以䞋は、この蚘事では觊れたせんでしたが参考ずなる re:Post の投皿です。 AWS WAF ルヌルでブロックされおいるファむルのアップロヌドを、ルヌルを陀倖せずに明瀺的に蚱可するには、どうすればよいですか https://repost.aws/ja/knowledge-center/waf-explicit-allow-file-uploads AWS WAF の HTTP リク゚ストの XSS たたは SQLi 怜査から特定の URI を陀倖する方法を教えおください。 https://repost.aws/ja/knowledge-center/waf-exclude-specific-requests-inspection AWS WAF を利甚しお DDoS 攻撃を緩和するにはどうすればいいですか? https://repost.aws/ja/knowledge-center/waf-mitigate-ddos-attacks 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研䞭途採甚ペヌゞ 電通総研新卒採甚ペヌゞ 執筆 @kou.kinyo 、レビュヌ 寺山 茝 (@terayama.akira)  Shodo で執筆されたした 