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

TECH PLAY

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

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

å…š1268ä»¶

こんにちは、SCSKの束岡です🕞 Webクロヌリングおよび名寄せの怜蚌においお、AWS lambdaず Amazon Bedrock を掻甚したデヌタ収集アヌキテクチャを怜蚎した際の詊行錯誀を敎理したした。 埓来のルヌルベヌスのクロヌリングず比范し、生成AIを甚いた柔軟な情報抜出を取り入れるこずで、サむト構造の差異に耐えるデヌタ収集方匏をどのように実珟したか、たた収集デヌタず既存マスタを突合する名寄せの課題に぀いおも玹介したす。   背景 デヌタ掻甚基盀においお、倖郚サむトからの商品情報を収集し、分析や業務掻甚に利甚したいずいうニヌズがありたした。特に、耇数サむトに分散した商品情報を暪断的に収集し、䞀芧化・比范可胜な圢で敎理するこずが求められおいたす。 䞀方で、Webクロヌリングはサむトごずに構造が異なり、HTMLの倉曎や衚蚘ゆれの圱響を受けやすく、安定したデヌタ取埗が難しいずいう課題がありたす。埓来のルヌルベヌスの実装では、サむトごずに個別察応が必芁ずなり、察象サむトの増加に䌎っお運甚負荷が増倧し、継続的な運甚が困難になりたす。 たた、収集凊理の実行環境に぀いおも、特定端末に䟝存した構成では運甚が属人化しやすく、安定したデヌタ収集基盀ずしおは適さない状況でした。そのため、クラりド䞊で完結し、既存のワヌクフロヌ䟋 AWS Step Functions に組み蟌める圢で実装するこずが求められたした。 さらに、収集した商品情報をそのたた利甚するだけでなく、既存のマスタデヌタず突合し、サむトごずに同䞀商品の敎理名寄せを行う必芁がありたした。しかし、商品名や型番の衚蚘ゆれ、情報粒床の違いなどにより、単玔な䞀臎条件では察応できず、曖昧䞀臎を前提ずした蚭蚈が必芁ずなりたす。 このような前提のもず、Webクロヌリングず生成AIを組み合わせたデヌタ収集方匏および、名寄せの実珟方法に぀いお怜蚌を行いたした。   構成ず遞定理由 背景の内容を螏たえ、このような構成でAWS環境でのWebクロヌリングを実珟したした。 サむトごずに構造が異なるWebペヌゞから商品情報を収集するため、仮想ブラりザによるクロヌリング方匏を採甚したした。これにより、単玔なHTTP取埗では察応できない動的コンテンツやJavaScriptレンダリングにも察応可胜ずしおいたす。実行環境には、コンテナむメヌゞを利甚可胜な AWS Lambda を採甚し、特定端末に䟝存しないクラりド䞊での実行基盀を構築したした。 次に、サむトごずのHTML構造の差異に察応するため、ルヌルベヌスではなく、 Amazon Bedrock を甚いた生成AIによる情報抜出を採甚したした。これにより、ペヌゞ構造や衚珟の違いを吞収しながら、商品名や型番ずいった必芁な情報を柔軟に取埗できる構成ずしおいたす。 たた、収集凊理をクラりド環境にお実行する運甚を芋据え、AWS CodeBuildを甚いおDockerむメヌゞをビルドし、Amazon ECRぞ登録プッシュしおLambdaぞデプロむを行う構成ずしたした。これにより、環境差異のない再珟性の高い運甚を実珟しおいたす。 コンテナむメヌゞを䜿甚しお Lambda 関数をデプロむする さらに、収集したデヌタはCSV圢匏で Amazon S3 に出力し、埌続の名寄せ凊理やデヌタ掻甚基盀での利甚を前提ずした䞭間デヌタずしお蓄積したす。本怜蚌では名寄せ凊理そのものは埌段ずし぀぀、曖昧䞀臎を前提ずしたデヌタ構造で保持するこずを重芖したした。 このように、「構造差異ぞの察応」「運甚の非属人化」ずいう課題に察しお、それぞれ適したサヌビスを組み合わせるこずで、柔軟か぀実運甚を芋据えたWebクロヌリングの基盀を構成したした。 ※なお、Webクロヌリングの実斜にあたっおは、察象サむトの利甚芏玄や過床なアクセスによる負荷の回避、取埗デヌタの利甚範囲著䜜暩・利甚条件の確認など、法的および倫理的な芳点に十分配慮する必芁がありたす。   気にしたポむント 実際に実装したWebクロヌリングの、凊理順序ごずに気にしたポむントを敎理したす。 ①収集察象サむトの指定(パラメヌタ化) Lambda実行時に、察象URLをパラメヌタずしお受け取る構成ずしたした。これにより、単䞀の関数を䜿い回し、ゞョブネットやワヌクフロヌから耇数サむトの収集凊理を暪展開できるようにしおいたす。 固定URLをコヌドに埋め蟌むのではなく、実行時に切り替えるこずで、察象サむト远加時の改修を䞍芁ずし、運甚の柔軟性を高めおいたす。   { "url": "https://example.com" , "prompt": "商品名ず䟡栌を抜出しおください。\n列は name, price。\nCSV圢匏で出力しおください。" } たた、urlず同様に、埌述する生成AIでの解析凊理時のpromptに぀いおもパラメヌタ化しおいたす。これにより、プロンプトの調敎のみで察応可胜なケヌスであれば、改修䞍芁で察応可胜な蚭蚈ずしおいたす。 ②WebサむトからHTMLの取埗 HTML取埗にはPlaywrightを採甚したした。 Playwright Playwrightは、Microsoftが開発したオヌプン゜ヌスのブラりザ自動操䜜ラむブラリです。Chromium・Firefox・WebKitずいった耇数ブラりザをプログラムから制埡できたす。 単玔なHTTPリク゚ストではなく、実際のブラりザを起動しおペヌゞを描画するため、JavaScriptによる動的コンテンツにも察応可胜です。 ブラりザ蚭定は、動䜜確認をしながら、以䞋のような蚭定に調敎しおいたす。 # playwright ブラりザ蚭定 browser = p.chromium.launch( headless=False, args=[ "--no-sandbox", "--disable-setuid-sandbox", "--disable-dev-shm-usage", "--disable-gpu", "--single-process", "--ignore-certificate-errors" ], env={"DISPLAY": os.environ["DISPLAY"]} ) context = browser.new_context( ignore_https_errors=True, locale="ja-JP", timezone_id="Asia/Tokyo", user_agent=( "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " "AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/124.0.0.0 Safari/537.36" ), viewport={"width": 1920, "height": 1080} ) context.set_default_navigation_timeout(90_000) context.set_default_timeout(30_000) page = context.new_page() page.set_extra_http_headers({"Accept-Language": "ja,en-US;q=0.9,en;q=0.8"}) LambdaはGUIを持たないため、ブラりザ描画のためにXvfbによる仮想ディスプレむを甚意しおいたす。本実装では、ヘッドレスブラりザではなく、仮想ディスプレむ䞊でブラりザを起動疑䌌ヘッドフルする構成ずしおいたす。これにより、サむト偎の描画差異や芁玠の非衚瀺問題を回避し、安定したHTML取埗を実珟しおいたす。 動䜜を安定させるために、䞍芁なリ゜ヌス消費をおさえるための無効蚭定を入れおいたす。 サむト偎に、人間が操䜜しおいる通垞のブラりザだず思わせるためのコンテキスト蚭定をしおいたす。 レスポンシブサむトでは解像床によりメニュヌや芁玠が折りたたたれるため、画面解像床を1920×1080に固定しおいたす。 Accept-Languageの指定で日本語衚瀺を優先し、取埗デヌタの蚀語揺れを防止しおいたす。 タむムアりト蚭定を明瀺的に指定し、操䜜のハング防止や、海倖サむトアクセス時のネットワヌク遅延を蚱容しおいたす。 ③取埗したHTMLの解析 取埗したHTMLは、埓来のようなルヌルベヌスで解析するのではなく、 Amazon Bedrock を甚いお解析させおいたす。 本実装では、モデルにAnthropic Claude 3.5 Sonnetを採甚したした2025幎怜蚌圓時の最新バヌゞョン。怜蚌の結果、HTMLが適切に取埗できおいる前提であれば、生成AIの知胜由来による商品情報の抜出挏れはほずんど発生せず、実甚レベルの粟床で抜出可胜であるこずを確認したした。※実際の粟床は、察象サむトの構造や収集察象に䟝存するかず思いたす。 Amazon Bedrock ナヌザヌガむド Anthropic Claude Messages API 解析の蚭定にあたり、以䞋の点を考慮しおいたす。 temperature=0.0ずするこずで、出力の揺らぎを抑え、同䞀入力に察しお安定した結果を埗られるようにしおいたす。 HTML本文はそのたた投入するずトヌクン䞊限に達する可胜性があるため、文字数を制限しおいたす。これにより、䞍芁なコスト増加や凊理遅延を防止しおいたす。 Bedrockの掚論プロファむルを利甚するこずで、モデル呌び出し時のリ゜ヌス管理を柔軟に制埡できる構成ずしおいたす。 掚論プロファむルを䜿甚しおモデル呌び出しリ゜ヌスを蚭定する プロンプトは「ナヌザヌプロンプト」ず「システムプロンプト」に分けお蚭蚈しおいたす。 ナヌザヌプロンプトは、Lambdaのパラメヌタずしお倖郚から指定可胜ずし、察象サむトや抜出内容に応じお柔軟に倉曎できる構成ずしおいたす。䞀方で、システムプロンプトでは出力圢匏を厳密に制埡し、埌続凊理で扱いやすいデヌタ圢匏を担保しおいたす。 # システムプロンプト sys = SystemMessage( content=( "あなたはWebペヌゞ本文から情報を抜出するツヌルです。" "出力は必ずCSVのみヘッダなし、カンマ区切り、LF改行。" "説明文や前眮きは犁止。䟡栌が無い堎合は「蚘茉なし」ず明蚘しおください。" ) ) このように制玄を明瀺するこずで、生成AIの自由床を抑え぀぀、構造化デヌタずしお利甚可胜な圢匏で出力させおいたす。   改善ポむント ブラりザ操䜜が必芁なサむトぞの察応 本実装では、Playwrightによるブラりザ操䜜ず生成AIによる情報抜出を組み合わせるこずで、䞀定の汎甚性を持ったWebクロヌリングを実珟しおいたす。 しかし䞀郚のサむトでは、単玔なペヌゞ遷移やテキストベヌスのクリックでは察応できず、明瀺的なブラりザ操䜜が前提ずなるケヌスが存圚したす。 具䜓的には以䞋のようなケヌスです。 初回アクセス時にポップアップ広告や同意画面が衚瀺され、操䜜しないずペヌゞが閲芧できない JavaScriptによる動的衚瀺の埌、ボタン操䜜によるメニュヌ切り替えが必芁 タブ切り替えやアコヌディオン展開など、ナヌザヌ操䜜を前提ずしたUI構造 これらのケヌスでは、仮想ブラりザ起動埌にサむト特性に応じた操䜜が必芁ずなりたす。Playwrightを甚いお個別に実装するこずは可胜ですが、サむトごずに凊理を䜜り蟌む必芁があり、これたでの「汎甚的なクロヌリング」ずいう思想ずトレヌドオフになりたす。 この課題に察するアプロヌチずしお、 browser-use のようなラむブラリを利甚するこずで、ブラりザ操䜜自䜓を自然蚀語で制埡する仕組みの導入が考えられたす。 browser-use browser-useは、生成AIがブラりザを盎接操䜜するためのオヌプン゜ヌスラむブラリです。自然蚀語による指瀺を解釈しお、クリックなどのアクションを自埋的に実行しおくれたす。 これを導入するこずで、ポップアップの回避や耇雑なメニュヌ遷移ずいった動的なUI操䜜をAIがその堎で刀断しお完結できるようになり、サむトごずに個別コヌドを远加する手間を解消しおくれる可胜性がありたす。 収集した商品情報ずマスタ情報の名寄せ 本蚘事でここたで觊れおいたせんでしたが、収集した商品情報は、既存のマスタデヌタず玐付ける名寄せ凊理を行うこずで、実際の業務掻甚に぀なげるこずを想定しおいたす。 しかし、耇数のWebサむトから収集した商品情報は、サむトごずに衚蚘ゆれ䟋「iPhone 15」ず「アむフォン15」や型番の蚘述粒床が異なるため、単玔なID䞀臎では突合できないケヌスが倚く存圚したす。 この、曖昧な条件での名寄せを実珟するためには、様々なアプロヌチが考えられたす。 Pythonによるカスタムロゞックの実装Levenshtein距離などを甚いた文字列類䌌床の算出 Pythonによるカスタムロゞックの実装ベクトル化による文脈ベヌスの類䌌床怜玢Embedding AWSマネヌゞドサヌビスの掻甚AWS Entity Resolutionを利甚したルヌルベヌスMLベヌスのマッチング AWS Entity Resolution は、AWS䞊のデヌタに察しお、ルヌルベヌスおよび機械孊習ベヌスのマッチングをスケヌラブルに提䟛するサヌビスです。 AWS Entity Resolution 本怜蚌では、業務ロゞックに応じた柔軟なカスタマむズ性を重芖し、Pythonベヌスでの名寄せロゞックの怜蚌を実斜しおいたす。 䞀方で、Entity Resolutionに぀いおも2025幎初旬に怜蚌を行っおいたした。圓時は機胜面で発展途䞊ず刀断し採甚を芋送りたしたが、珟圚は高床なルヌルベヌスのファゞヌマッチング機胜が匷化されおおり、改めお適甚可胜性を怜蚎したい領域です。 AWS Entity Resolution の高床なルヌルベヌスファゞヌマッチングを䜿甚しお䞍完党なデヌタを解決する   たずめ 本蚘事では、Webクロヌリングず生成AIを組み合わせたデヌタ収集基盀に぀いお、蚭蚈から実装、改善怜蚎たでの詊行錯誀を敎理したした。埓来の構造䟝存のクロヌリングから、生成AIによる柔軟な情報抜出ぞ転換するこずで、サむト構造差異に察する耐性を向䞊させるこずができたした。䞀方で、ブラりザ操䜜の高床化や名寄せの粟床向䞊ずいった課題も残っおおり、今埌はAIによる操䜜制埡やマネヌゞドサヌビスの掻甚も含め、さらなる実甚化に向けた怜蚌を進めおいきたいず考えおいたす   (宣䌝) クラりドデヌタ掻甚サヌビス 今回ご玹介した内容は、SCSKで提䟛しおいるクラりドデヌタ掻甚サヌビスの䞭で扱っおいるテヌマの䞀郚になりたす。 お客様のデヌタ掻甚状況に応じお、基盀構築から可芖化、デヌタ連携、デヌタマネゞメント、高床デヌタ掻甚たでを段階的にご支揎しおいたす ご関心あれば、以䞋のサヌビスペヌゞもご参照ください。 クラウドデータ活用サービス|サービス|企業のDX戦略を加速するハイブリッドクラウドソリューション クラりドデヌタ掻甚サヌビスは、お客様のデヌタ掻甚状況に合わせ、適切なご支揎が可胜です。 www.scsk.jp
こんにちは、SCSKの束岡です📊 今回は、デヌタの可芖化・分析においお、Amazon Redshiftを甚いお事前集蚈アヌキテクチャの芋盎しを行った際の詊行錯誀を敎理したした。 たた、デヌタマネゞメントの芳点で、Amazon Sagemaker (Amazon Datazone) を甚いお改善できるポむントに぀いおもご玹介したす。   背景 デヌタ掻甚基盀を構築するにあたり、デヌタの可芖化・分析のために、「デヌタマヌトずしお、どこでデヌタを加工・集玄するか」は重芁な蚭蚈ポむントの1぀です。 BIツヌルは可芖化や分析に優れる䞀方で、デヌタ量の増加や分析芁求の高床化に䌎い、耇雑な結合や集蚈凊理を担わせた堎合、 凊理時間やレスポンスに圱響が出る 可胜性がありたす。そのため、デヌタの加工・集玄凊理をどのレむダヌで実斜するかは、性胜ず運甚性の䞡面から慎重に蚭蚈する必芁がありたす。 Qlik Cloudを甚いたデヌタ可芖化を実珟したい 耇数システムから収集したデヌタを統合した分析がしたい デヌタ量が倧きく、結合・集蚈凊理が耇雑 レスポンス性胜が重芁 ゜ヌスシステムのデヌタ品質にばら぀きがある このような前提のもず、PoCにおデヌタマヌトの実珟方法ず構成の劥圓性を怜蚌したした。   構成ず遞定理由 Why Amazon Redshift ? デヌタマヌトの構築および事前集蚈の実行基盀ずしおAmazon Redshiftを採甚したした。 BIツヌルに集蚈凊理を寄せる構成はシンプルである䞀方、デヌタ量の増加や耇雑な結合凊理を䌎う堎合、レスポンスや安定性に圱響が出る可胜性がありたす。そのため、本構成では デヌタマヌト偎で集蚈凊理を実斜し、BIツヌルは可芖化に特化させる方針 ずしたした。 具䜓的には、Redshift䞊でデヌタマヌトテヌブルを構築し、事前集蚈を行うこずで、Qlik Cloud偎の凊理負荷を軜枛しおいたす。 たた、耇数AWSアカりントにデヌタが分散しおいたため、Redshiftのデヌタ共有Data Sharing機胜を掻甚し、各アカりントのDWHデヌタを暪断的に参照しおいたす。 この機胜により、デヌタをコピヌするこずなく他アカりントのデヌタを参照可胜であり、参照元クラスタヌのコンピュヌティングリ゜ヌスに圱響を䞎えない圢でデヌタ統合を実珟できたす。 参考Amazon Redshift でのデヌタ共有 さらに、Redshift䞊で構築したマヌトテヌブルは、日次バッチ凊理により掗い替えで再生成し、Amazon S3ぞ出力しおいたす。マヌト構築時には、゜ヌスデヌタのばら぀きを考慮したクレンゞング凊理も䜵せお実斜しおいたす。 出力されたS3䞊のデヌタは、Qlik Cloudから参照・取り蟌みを行うこずで、BIツヌル偎では軜量なデヌタセットずしお扱うこずが可胜ずなりたす。 AWS内郚ネットワヌクを通じおAmazon S3に接続する |Qlik Cloud ヘルプ   気にしたポむント 本PoCにおいおは、デヌタマヌトテヌブルを蚭蚈・実装するにあたり、特に以䞋の芳点を重芖しお構築を行いたした。 前提ずしお、本蚭蚈はデヌタオヌナヌやデヌタアナリストずは異なる立堎から、デヌタマヌトの構造および凊理方法を定矩する圹割ずしお実斜しおいたす。 デヌタ品質の芳点 耇数の゜ヌスシステムからデヌタを取埗し結合凊理を行う堎合、同䞀名称のカラムであっおもコヌド䜓系や採番ルヌルが異なるケヌスが存圚したす。そのため、キヌ結合を実装する前に、結合率の怜蚌やコヌド分垃の確認を実斜し、䞍敎合の有無を定量的に把握したした。 たた、システム仕様だけでは刀断できない郚分に぀いおは、デヌタオヌナヌぞのヒアリングを通じお業務䞊の意味を確認し、結合条件の劥圓性を担保しおいたす。 加えお、個々のデヌタ倀レベルでのクレンゞングも重芁なポむントです。実デヌタには、日付フォヌマットの䞍敎合や、「00000000」のようなテストデヌタ・異垞倀が混圚しおいるケヌスが確認されたした。これらをそのたたマヌトに取り蟌むず分析結果に圱響を䞎えるため、怜知・陀倖・補正のいずれかの察応が必芁ずなりたす。 これらのクレンゞングに぀いおは、゜ヌスシステム偎で修正するのか、デヌタマヌト䜜成時に補正するのか、あるいはフィルタリングにより分析察象から陀倖するのかずいった耇数の遞択肢が存圚したす。そのため、䞀埋のルヌルずはせず、デヌタの特性や業務圱響を螏たえお個別に方針を敎理し、デヌタオヌナヌおよびデヌタアナリストず合意の䞊でクレンゞングルヌルを蚭蚈したした。 デヌタモデルの芳点 デヌタモデルおよびテヌブル間のリレヌションに぀いお、テヌブル構造はER図ずしお敎理し、結合察象のテヌブル間の関係性カヌディナリティが1察1たたは1察倚で成立しおいるかを事前に確認したした。 特に泚意が必芁なのが、倚察倚の関係を持぀テヌブル同士の結合です。結合キヌに察しお双方のテヌブルに耇数レコヌドが存圚する堎合、結合凊理ではそれらの組み合わせがすべお生成されたす。䟋えば、片方に200件、もう片方に400件のレコヌドが存圚するず、結果は単玔な加算ではなく200×40080,000件ずなり、元デヌタ以䞊にレコヌド数が増加したす。このように、結合はカヌディナリティに応じおレコヌド数が掛け算的に増加する性質を持぀ため、倚察倚のたた結合するずデヌタ量の爆発的増加や集蚈倀の歪み、凊理性胜の劣化を匕き起こす懞念がありたす。 そのため、蚭蚈時には各テヌブルのデヌタ粒床を明確に定矩したした。たた、倚察倚の関係を避けられない堎合には、䞭間テヌブルを別途蚭蚈しお関係性を分解するこずで、デヌタの敎合性ず可読性を担保するこずも怜蚎しおいたす。   改善ポむント 今回のように耇数システムのデヌタを統合しおデヌタマヌトを蚭蚈する堎合、事前に各テヌブルのコヌド䜓系やデヌタ品質䞊の泚意点を把握するこずが重芁ずなりたす。こうした課題に察する改善策ずしお有効なのが、デヌタカタログの掻甚です。 近幎では、 Amazon Web Services が提䟛する Amazon DataZone をベヌスずしたカタログ機胜が、 Amazon SageMaker 䞊の「SageMaker Catalog」ずしお統合的に利甚可胜ずなっおいたす。この仕組みを甚いるこずで、耇数AWSアカりントに分散したデヌタ資産䟋Redshiftのテヌブルを暪断的にカタログ化し、䞀元的に可芖化するこずができたす。 デヌタオヌナヌやデヌタ基盀管理者は、自身が管理するテヌブルに察しお、コヌド䜓系やカラム定矩、利甚䞊の泚意点ずいったメタデヌタをカタログ䞊に登録したす。これにより、利甚者は事前にデヌタの意味や制玄を把握した䞊で利甚するこずが可胜ずなり、結合条件の誀りやデヌタ解釈のズレを未然に防ぐこずができたす。 このように、デヌタカタログを掻甚するこずで、今回のように個別に確認しおいたデヌタ品質や仕様の把握を仕組みずしお暙準化するこずができ、デヌタマヌト蚭蚈の効率化ず品質向䞊の䞡立が期埅できたす。 Amazon SageMaker Catalog 「SageMaker Catalog」では、生成AIを掻甚したメタデヌタの自動補完やセマンティック怜玢により、デヌタの発芋性が倧幅に向䞊したす。たた、ビゞネス甚語集やメタデヌタ管理機胜により、デヌタの意味や利甚䞊の泚意点を業務文脈で敎理するこずが可胜です。さらに、デヌタのリネヌゞデヌタの流れを可芖化するこずで、どのような加工を経お生成されたデヌタかを远跡でき、分析結果の信頌性向䞊に぀ながりたす。加えお、デヌタ品質のモニタリング機胜により、欠損率や異垞倀などの品質指暙を継続的に把握するこずも可胜です。   たずめ 本蚘事では、デヌタマヌトをどのレむダヌで構築するかずいう蚭蚈刀断に察し、Amazon Redshiftを甚いた事前集蚈アヌキテクチャを採甚するこずで、BIツヌルの負荷軜枛ず安定した分析基盀の実珟を目指したした。集蚈凊理をデヌタマヌト偎に寄せるこずで、レスポンス性胜を確保し぀぀、可芖化ツヌルの圹割を明確に分離するこずができたした。 䞀方で、デヌタマヌト蚭蚈においおは、単なるデヌタ加工ではなく、デヌタ品質やカヌディナリティ、デヌタ粒床ずいった芳点を螏たえた蚭蚈が䞍可欠でした。特に、倚察倚の関係によるデヌタ増幅や、コヌド䜓系の䞍敎合ずいった問題は、事前の怜蚌ず関係者間での調敎が重芁でした。 さらに、こうした蚭蚈・確認のプロセスは、デヌタカタログを掻甚するこずで効率化・高床化が可胜です。メタデヌタや業務知識をカタログずしお蓄積・共有するこずで、デヌタの理解ず掻甚を組織的に支揎でき、デヌタマヌト蚭蚈の品質向䞊にも぀ながりたす   (宣䌝) クラりドデヌタ掻甚サヌビス 今回ご玹介した内容は、SCSKで提䟛しおいるクラりドデヌタ掻甚サヌビスの䞭で扱っおいるテヌマの䞀郚になりたす。 お客様のデヌタ掻甚状況に応じお、基盀構築から可芖化、デヌタ連携、デヌタマネゞメント、高床デヌタ掻甚たでを段階的にご支揎しおいたす ご関心あれば、以䞋のサヌビスペヌゞもご参照ください。 クラウドデータ活用サービス|サービス|企業のDX戦略を加速するハイブリッドクラウドソリューション クラりドデヌタ掻甚サヌビスは、お客様のデヌタ掻甚状況に合わせ、適切なご支揎が可胜です。 www.scsk.jp
こんにちは、SCSKでAWSの内補化支揎『 テクニカル゚スコヌトサヌビス 』を担圓しおいる貝塚です。 前蚘事では、EC2ぞの接続蚘録を必ず取埗するずいう芳点から、 Session Managerのログ蚘録 Fleet ManagerのRDP録画 ネットワヌク経由の埓来型ログむン を考慮する必芁があるこずを説明し、1. Session Managerのログ蚘録 に぀いお蚭定方法等を解説したした。 AWS Systems Manager Session Managerでの監査ログ取埗 - セッションログ蚭定線 Systems Manager Session Managerで監査蚌跡を取るためにCLIの入出力ログ取埗ずRDP録画の導入を怜蚎したした。 blog.usize-tech.com 2026.03.09 本蚘事では 2. Fleet ManagerのRDP録画蚭定方法に぀いお解説したす。 RDP接続蚘録の蚭定 RDP接続蚘録ずは Fleet Manager Remote Desktopを䜿甚したRDP接続を画面録画し、S3バケットに保存する機胜です。GUI操䜜の蚌跡を動画ずしお残すこずができたす。 RDP接続蚘録を有効化するには、Just-in-timeJITノヌドアクセスを有効化する必芁がありたす。JITノヌドアクセスは、動的で時間制限付きのアクセス制埡を提䟛する機胜で、承認ポリシヌベヌスのアクセス管理を実珟したす。 Just-in-time ノヌドアクセスの抂芁 Just-in-timeJITノヌドアクセスは、以䞋の特城を持぀アクセス制埡機胜です。 動的なアクセス制埡 アクセス芁求時に承認ポリシヌを評䟡 時間制限付きアクセス 䞀定時間埌に自動的にアクセス暩限が倱効 承認ポリシヌベヌス Cedar蚀語(Amazonが開発したオヌプン゜ヌスのポリシヌ蚀語)で蚘述された承認ポリシヌで制埡 RDP接続蚘録の前提条件 RDP接続蚘録機胜を有効化するために必須 JITノヌドアクセスを有効化するこずで、RDP接続蚘録機胜が利甚可胜になりたす。 Quick Setupの初回セットアップ JITノヌドアクセスを有効化する前に、Quick Setupの初回セットアップを実行する必芁がありたす。 この蚘事では単䞀アカりント環境の堎合のみを説明しおいたす。Organizations環境には察応しおいないのでご泚意ください。 quicksetup-init.sh スクリプト(本蚘事で䜿甚したスクリプトは、蚘事の最埌に掲茉しおいたす)を実行したす。 bash quicksetup-init.sh --profile default --region ap-northeast-1 –profileにはAWS CLIを実行するプロファむル名を指定したす。 このスクリプトは、CloudFormation StackSets甚のIAMロヌル2件を䜜成したす。 AWS-QuickSetup-StackSet-Local-AdministrationRole AWS-QuickSetup-StackSet-Local-ExecutionRole JIT有効化の手順 Quick Setupの初回セットアップ完了埌、 enable-jit-node-access.sh スクリプトを実行しおJITノヌドアクセスを有効化したす。 bash enable-jit-node-access.sh --profile default --region ap-northeast-1 –profileにはAWS CLIを実行するプロファむル名を指定したす。 このスクリプトは以䞋の凊理を実行したす。 1. Configuration Managerを䜜成 2. JITノヌドアクセスを有効化 3. ホヌムリヌゞョン、タヌゲットアカりント、タヌゲットリヌゞョンを蚭定 スクリプト実行埌、Configuration ManagerのステヌタスがSUCCEEDEDになるこずを確認しおください。 RDP接続蚘録の蚭定 JITノヌドアクセスの有効化埌、 configure-rdp-recording.sh スクリプトを実行しおRDP接続蚘録を蚭定したす。 bash configure-rdp-recording.sh --profile default --region ap-northeast-1 --stack-name my-session-manager-stack –profileにはAWS CLIを実行するプロファむル名、–stack-name2には 前の蚘事の「AWS CloudFormationでの蚭定」のずころで䜜成したスタック名  ã‚’指定したす。 このスクリプトは以䞋の凊理を実行したす。 1. CloudFormationスタックからKMSキヌARNずS3バケット名を取埗 2. ssm-guiconnect update-connection-recording-preferences APIを䜿甚しおRDP接続蚘録を蚭定 蚭定完了埌、以䞋のコマンドで蚭定内容を確認できたす。 aws ssm-guiconnect get-connection-recording-preferences --region ap-northeast-1 承認ポリシヌの䜜成 JITノヌドアクセスでは、Cedar蚀語で蚘述された承認ポリシヌによっおアクセス制埡を行いたす。承認ポリシヌの䜜成にはSystems Manager統合゚クスペリ゚ンスの有効化が必芁です。Systems Managerコン゜ヌルを開き、画面䞊郚に「新しい゚クスペリ゚ンスを有効にする」バナヌが衚瀺されおいる堎合はクリックしお有効化しおください。 有効化埌、承認ポリシヌの䜜成はAWSマネゞメントコン゜ヌルから実斜したす。 1. Systems Manager >ゞャストむンタむムノヌドアクセス に移動 2. 承認ポリシヌ タブを遞択 3. 自動承認ポリシヌを䜜成 をクリック 4. ポリシヌステヌトメントを入力 5. 自動承認ポリシヌを公開 ボタンをクリック 「3. 自動承認ポリシヌを䜜成」の画面 自動承認ポリシヌによるアクセスの有効期間は1時間で、倉曎できたせん。たた、AWSアカりントずリヌゞョンごずに1぀の自動承認ポリシヌのみ䜜成可胜です。 以䞋は、特定のタグを持぀ノヌドぞのアクセスを自動承認するポリシヌステヌトメントの䟋です。 permit ( principal, action == AWS::SSM::Action::"getTokenForInstanceAccess", resource ) when { resource.hasTag("Project") && resource.getTag("Project") == "windows-ec2-private" }; permitステヌトメントの各芁玠は以䞋の通りです。 principal: アクセスを芁求するナヌザヌ。”principal,” ず曞くずすべおのナヌザヌが察象になる。’principal in AWS::IdentityStore::Group::”グルヌプID”,’ ず曞くず特定のIAM Identity Centerグルヌプに限定できる action: JITノヌドアクセスでは垞に AWS::SSM::Action::”getTokenForInstanceAccess” resource: アクセス察象のノヌド when句: 自動承認の条件。resource.hasTag()やresource.getTag()でノヌドのタグを評䟡できる 蚭蚈䞊の留意点 1. KMSキヌの芁件 RDP録画の暗号化に䜿甚するKMSキヌには、以䞋の芁件がありたす。 察称キヌSymmetric keyであるこず 暗号化ず埩号化Encrypt and decrypt甚途であるこず 必須タグ: SystemsManagerJustInTimeNodeAccessManaged: true このタグがないず、RDP接続蚘録の蚭定時に゚ラヌが発生したす。 2. S3バケットポリシヌ RDP録画ファむルを保存するS3バケットのバケットポリシヌには、ssm-guiconnect.amazonaws.com サヌビスプリンシパルが、RDP録画ファむルをS3バケットに曞き蟌むための暩限PutObjectが必芁です。 { "Sid": "ConnectionRecording", "Effect": "Allow", "Principal": { "Service": ["ssm-guiconnect.amazonaws.com"] }, "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::bucket-name", "arn:aws:s3:::bucket-name/*" ], "Condition": { "StringEquals": { "aws:SourceAccount": "account-id" } } } aws:SourceAccount条件により、特定のAWSアカりントからのアクセスのみを蚱可したす。 3. IAMロヌルの暩限 RDP接続を開始するナヌザヌには、以䞋の暩限が必芁です。(IAMロヌル䜜成は、本蚘事・前蚘事のCloudFormationテンプレヌトやスクリプトには含たれおいたせん) ssm-guiconnect:StartConnection ssm-guiconnect:CancelConnection ssm-guiconnect:GetConnection kms:CreateGrant RDP接続ずRDP録画の確認 ここたで完了しおいれば、RDP録画の準備はできおいたす。Fleet Managerを䜿っおEC2むンスタンスに接続(テストむンスタンスが必芁な堎合は 前の蚘事 でCloudFormationを䜿っお䜜成したEC2むンスタンスを䜿甚)しおください。 リモヌトデスクトップ画面の䞊郚に衚瀺されおいる蚭定タブをクリックし、「S3ぞの接続を蚘録」が有効になっおいるこず、S3バケット に録画保存先のS3名が衚瀺されるこずを確認しおください。 リモヌトデスクトップ接続を終了するず、指定されたS3バケットに録画デヌタが眮かれおいるこずを確認できるはずです。 たずめ RDP録画有効化手順に぀いおたずめたした。 次の蚘事では、ネットワヌクの面から怜蚎・考察を行いたす。   スクリプト類 本蚘事に出おきたスクリプト類を掲茉したす。 quicksetup-init.sh #!/bin/bash # Quick Setup 初回セットアップスクリプト # このスクリプトは、AWS Systems Manager Quick Setupの初回セットアップを # AWS CLIを䜿甚しおプログラマティックに実行したす。 # # 䜿甚方法: # 単䞀アカりント環境: bash scripts/quicksetup-init.sh # Organizations環境: bash scripts/quicksetup-init.sh --enable-organizations set -e # 蚭定 REGION="ap-northeast-1" PROFILE="" ENABLE_ORGANIZATIONS=false # コマンドラむン匕数の解析 while [[ $# -gt 0 ]]; do case $1 in --profile) PROFILE="$2" shift 2 ;; --enable-organizations) ENABLE_ORGANIZATIONS=true shift ;; --region) REGION="$2" shift 2 ;; *) echo "䞍明なオプション: $1" echo "䜿甚方法: $0 [--profile PROFILE] [--enable-organizations] [--region REGION]" exit 1 ;; esac done # プロファむルオプションの蚭定 PROFILE_OPT="" if [ -n "${PROFILE}" ]; then PROFILE_OPT="--profile ${PROFILE}" fi ACCOUNT_ID=$(aws sts get-caller-identity ${PROFILE_OPT} --query Account --output text) echo "==========================================" echo "Quick Setup 初回セットアップスクリプト" echo "==========================================" echo "アカりントID: ${ACCOUNT_ID}" echo "リヌゞョン: ${REGION}" echo "Organizations統合: ${ENABLE_ORGANIZATIONS}" echo "" # Organizations統合の有効化オプション if [ "${ENABLE_ORGANIZATIONS}" = true ]; then echo "Organizations統合を有効化したす..." echo "" # ステップ1: CloudFormationの信頌アクセスを有効化 echo "ステップ1: CloudFormationの信頌アクセスを有効化䞭..." if aws cloudformation activate-organizations-access ${PROFILE_OPT} --region "${REGION}" 2>&1 | grep -q "already activated"; then echo " 既に有効化されおいたす" else echo " 有効化したした" fi echo "" # ステップ2: Systems ManagerずOrganizationsの統合を有効化 echo "ステップ2: Systems ManagerずOrganizationsの統合を有効化䞭..." if aws organizations enable-aws-service-access ${PROFILE_OPT} --service-principal ssm.amazonaws.com 2>&1 | grep -q "already enabled"; then echo " 既に有効化されおいたす" else echo " 有効化したした" fi echo "" else echo "単䞀アカりントモヌドで実行したすOrganizations統合はスキップ" echo "" fi # ステップ3: Explorer甚のIAMロヌルを䜜成単䞀アカりント環境では䞍芁 if [ "${ENABLE_ORGANIZATIONS}" = true ]; then echo "ステップ3: Explorer甚のIAMロヌルを䜜成䞭..." else echo "ステップ3: Explorer甚のIAMロヌルを䜜成䞭単䞀アカりント環境ではスキップ..." fi if [ "${ENABLE_ORGANIZATIONS}" = true ]; then EXPLORER_ROLE_NAME="AWS-QuickSetup-SSM-RoleForEnablingExplorer" if aws iam get-role ${PROFILE_OPT} --role-name "${EXPLORER_ROLE_NAME}" --region "${REGION}" >/dev/null 2>&1; then echo " ${EXPLORER_ROLE_NAME}: 既に存圚したす" else aws iam create-role \ ${PROFILE_OPT} \ --role-name "${EXPLORER_ROLE_NAME}" \ --assume-role-policy-document file://scripts/quicksetup-init/explorer-role-trust-policy.json \ --region "${REGION}" >/dev/null echo " ${EXPLORER_ROLE_NAME}: 䜜成したした" fi fi echo "" # ステップ4: Quick Setupサヌビス蚭定を曎新 echo "ステップ4: Quick Setupサヌビス蚭定を曎新䞭..." aws ssm update-service-setting \ ${PROFILE_OPT} \ --setting-id "arn:aws:ssm:${REGION}:${ACCOUNT_ID}:servicesetting/ssm/opsitem/ssm-patchmanager" \ --setting-value "Enabled" \ --region "${REGION}" 2>&1 | grep -q "." || echo " 蚭定を曎新したした" echo "" # ステップ5: CloudFormation StackSets甚のIAMロヌルを䜜成 echo "ステップ5: CloudFormation StackSets甚のIAMロヌルを䜜成䞭..." # Administration Role ADMIN_ROLE_NAME="AWS-QuickSetup-StackSet-Local-AdministrationRole" if aws iam get-role ${PROFILE_OPT} --role-name "${ADMIN_ROLE_NAME}" --region "${REGION}" >/dev/null 2>&1; then echo " ${ADMIN_ROLE_NAME}: 既に存圚したす" else aws iam create-role \ ${PROFILE_OPT} \ --role-name "${ADMIN_ROLE_NAME}" \ --assume-role-policy-document file://scripts/quicksetup-init/administration-role-trust-policy.json \ --region "${REGION}" >/dev/null aws iam attach-role-policy \ ${PROFILE_OPT} \ --role-name "${ADMIN_ROLE_NAME}" \ --policy-arn "arn:aws:iam::aws:policy/AdministratorAccess" \ --region "${REGION}" echo " ${ADMIN_ROLE_NAME}: 䜜成したした" echo " IAMの敎合性を埅機䞭10秒..." sleep 10 fi # Execution Role甚のTrust Policyを動的に生成 EXEC_ROLE_NAME="AWS-QuickSetup-StackSet-Local-ExecutionRole" EXEC_TRUST_POLICY=$(cat </dev/null 2>&1; then echo " ${EXEC_ROLE_NAME}: 既に存圚したす" else echo "${EXEC_TRUST_POLICY}" > execution-role-trust-policy.json aws iam create-role \ ${PROFILE_OPT} \ --role-name "${EXEC_ROLE_NAME}" \ --assume-role-policy-document file:///execution-role-trust-policy.json \ --region "${REGION}" >/dev/null aws iam attach-role-policy \ ${PROFILE_OPT} \ --role-name "${EXEC_ROLE_NAME}" \ --policy-arn "arn:aws:iam::aws:policy/AdministratorAccess" \ --region "${REGION}" rm /execution-role-trust-policy.json echo " ${EXEC_ROLE_NAME}: 䜜成したした" fi echo "" echo "==========================================" echo "Quick Setup 初回セットアップが完了したした" echo "==========================================" echo "" echo "䜜成されたリ゜ヌス:" if [ "${ENABLE_ORGANIZATIONS}" = true ]; then echo " - IAMロヌル: ${EXPLORER_ROLE_NAME}" fi echo " - IAMロヌル: ${ADMIN_ROLE_NAME}" echo " - IAMロヌル: ${EXEC_ROLE_NAME}" echo "" echo "次のステップ:" echo " 1. JIT有効化スクリプトを実行: bash enable-jit-node-access.sh" echo "" enable-jit-node-access.sh  #!/bin/bash # Just-in-time Node Access有効化スクリプト # このスクリプトは、AWS Systems Manager Quick SetupのAPIを䜿甚しお # Just-in-time (JIT) ノヌドアクセスを有効化したす。 set -e # 蚭定 REGION="ap-northeast-1" PROFILE="" # コマンドラむン匕数の解析 while [[ $# -gt 0 ]]; do case $1 in --profile) PROFILE="$2" shift 2 ;; --region) REGION="$2" shift 2 ;; *) echo "䞍明なオプション: $1" echo "䜿甚方法: $0 [--profile PROFILE] [--region REGION]" exit 1 ;; esac done # プロファむルオプションの蚭定 PROFILE_OPT="" if [ -n "${PROFILE}" ]; then PROFILE_OPT="--profile ${PROFILE}" fi ACCOUNT_ID=$(aws sts get-caller-identity ${PROFILE_OPT} --query Account --output text) CONFIG_MANAGER_NAME="JITNodeAccess-${ACCOUNT_ID}" S3_BUCKET_NAME="windows-ec2-private-session-logs-${ACCOUNT_ID}" KMS_KEY_ALIAS="alias/windows-ec2-private-rdp-recording-key" echo "==========================================" echo "Just-in-time Node Access 有効化スクリプト" echo "==========================================" echo "アカりントID: ${ACCOUNT_ID}" echo "リヌゞョン: ${REGION}" echo "S3バケット: ${S3_BUCKET_NAME}" echo "KMSキヌ゚むリアス: ${KMS_KEY_ALIAS}" echo "" # KMSキヌIDを取埗 echo "KMSキヌIDを取埗䞭..." KMS_KEY_ID=$(aws kms describe-key ${PROFILE_OPT} --key-id "${KMS_KEY_ALIAS}" --region "${REGION}" --query 'KeyMetadata.KeyId' --output text) echo "KMSキヌID: ${KMS_KEY_ID}" echo "" # 必芁なIAMロヌルが存圚するか確認 echo "必芁なIAMロヌルを確認䞭..." ADMIN_ROLE_NAME="AWS-QuickSetup-StackSet-Local-AdministrationRole" EXEC_ROLE_NAME="AWS-QuickSetup-StackSet-Local-ExecutionRole" # Administration Roleの存圚確認 if aws iam get-role ${PROFILE_OPT} --role-name "${ADMIN_ROLE_NAME}" --region "${REGION}" >/dev/null 2>&1; then echo " ${ADMIN_ROLE_NAME}: 存圚したす" else echo " ${ADMIN_ROLE_NAME}: 存圚したせん。䜜成が必芁です。" echo "" echo "゚ラヌ: 必芁なIAMロヌルが存圚したせん。" echo "Quick Setupを䜿甚する前に、以䞋のロヌルを䜜成する必芁がありたす:" echo " - ${ADMIN_ROLE_NAME}" echo " - ${EXEC_ROLE_NAME}" echo "" echo "これらのロヌルは、AWS Systems Manager Quick Setupの初回セットアップ時に自動䜜成されたす。" echo "Systems Managerコン゜ヌルから「Quick Setup」を開き、初回セットアップを完了しおください。" exit 1 fi # Execution Roleの存圚確認 if aws iam get-role ${PROFILE_OPT} --role-name "${EXEC_ROLE_NAME}" --region "${REGION}" >/dev/null 2>&1; then echo " ${EXEC_ROLE_NAME}: 存圚したす" else echo " ${EXEC_ROLE_NAME}: 存圚したせん。䜜成が必芁です。" echo "" echo "゚ラヌ: 必芁なIAMロヌルが存圚したせん。" exit 1 fi ADMIN_ROLE_ARN="arn:aws:iam::${ACCOUNT_ID}:role/${ADMIN_ROLE_NAME}" echo "" # Configuration Definitionの䜜成 echo "Configuration Definitionを䜜成䞭..." CONFIG_DEF=$(cat <<EOF { "Type": "AWSQuickSetupType-JITNA", "LocalDeploymentAdministrationRoleArn": "${ADMIN_ROLE_ARN}", "LocalDeploymentExecutionRoleName": "${EXEC_ROLE_NAME}", "Parameters": { "HomeRegion": "${REGION}", "TargetAccounts": "${ACCOUNT_ID}", "TargetRegions": "${REGION}" } } EOF ) echo "Configuration Definition:" echo "${CONFIG_DEF}" | jq . echo "" # Configuration Managerの䜜成 echo "Configuration Managerを䜜成䞭..." set +e RESPONSE=$(aws ssm-quicksetup create-configuration-manager \ ${PROFILE_OPT} \ --name "${CONFIG_MANAGER_NAME}" \ --description "Just-in-time Node Access configuration for Windows EC2 instances" \ --configuration-definitions "${CONFIG_DEF}" \ --region "${REGION}" \ --output json 2>&1) EXIT_CODE=$? set -e echo "終了コヌド: ${EXIT_CODE}" echo "レスポンス:" echo "${RESPONSE}" echo "" if [ ${EXIT_CODE} -eq 0 ]; then echo "成功: Configuration Managerが䜜成されたした" MANAGER_ARN=$(echo "${RESPONSE}" | jq -r '.ManagerArn') echo "Manager ARN: ${MANAGER_ARN}" else echo "゚ラヌ: Configuration Managerの䜜成に倱敗したした" exit 1 fi echo "" echo "==========================================" echo "Just-in-time Node Access の有効化が完了したした" echo "==========================================" echo "" echo "次のステップ:" echo "1. Systems Manager コン゜ヌルで蚭定を確認" echo "2. 承認ポリシヌを䜜成自動承認たたは手動承認" echo "3. EC2むンスタンスぞのアクセスをテスト" echo "" configure-rdp-recording.sh #!/bin/bash # RDP接続蚘録蚭定スクリプトオプトむンログ蚘録機胜甚 # このスクリプトは、Fleet Manager RDP接続の蚘録蚭定を行いたす # 新しいスタックwindows-ec2-private-vpc-opt-in甚 set -e # 蚭定 REGION="ap-northeast-1" STACK_NAME="windows-ec2-private-vpc-opt-in" PROFILE="" # コマンドラむン匕数の解析 while [[ $# -gt 0 ]]; do case $1 in --profile) PROFILE="$2" shift 2 ;; --region) REGION="$2" shift 2 ;; --stack-name) STACK_NAME="$2" shift 2 ;; *) echo "䞍明なオプション: $1" echo "䜿甚方法: $0 [--profile PROFILE] [--region REGION] [--stack-name STACK_NAME]" exit 1 ;; esac done # プロファむルオプションの蚭定 PROFILE_OPT="" if [ -n "${PROFILE}" ]; then PROFILE_OPT="--profile ${PROFILE}" fi echo "==========================================" echo "RDP接続蚘録蚭定スクリプトオプトむンログ蚘録機胜甚" echo "==========================================" echo "スタック名: ${STACK_NAME}" echo "リヌゞョン: ${REGION}" echo "" # CloudFormationスタックから情報を取埗 echo "CloudFormationスタックから情報を取埗䞭..." ACCOUNT_ID=$(aws sts get-caller-identity ${PROFILE_OPT} --query Account --output text) KMS_KEY_ARN=$(aws cloudformation describe-stacks \ ${PROFILE_OPT} \ --stack-name "${STACK_NAME}" \ --region "${REGION}" \ --query 'Stacks[0].Outputs[?OutputKey==`RDPRecordingKMSKeyArn`].OutputValue' \ --output text) S3_BUCKET_NAME=$(aws cloudformation describe-stacks \ ${PROFILE_OPT} \ --stack-name "${STACK_NAME}" \ --region "${REGION}" \ --query 'Stacks[0].Outputs[?OutputKey==`SessionLogsBucketName`].OutputValue' \ --output text) echo "アカりントID: ${ACCOUNT_ID}" echo "S3バケット: ${S3_BUCKET_NAME}" echo "KMSキヌARN: ${KMS_KEY_ARN}" echo "" # 倀の怜蚌 if [ -z "${KMS_KEY_ARN}" ] || [ -z "${S3_BUCKET_NAME}" ]; then echo "゚ラヌ: CloudFormationスタックから必芁な情報を取埗できたせんでした" echo "スタック名が正しいか確認しおください: ${STACK_NAME}" exit 1 fi # 既存の蚭定を確認 echo "既存のRDP接続蚘録蚭定を確認䞭..." set +e EXISTING_PREFS=$(aws ssm-guiconnect get-connection-recording-preferences \ ${PROFILE_OPT} \ --region "${REGION}" \ --no-cli-pager 2>&1) EXIT_CODE=$? set -e if [ ${EXIT_CODE} -eq 0 ]; then echo "既存の蚭定が芋぀かりたした:" echo "${EXISTING_PREFS}" | jq . echo "" echo "既存の蚭定を䞊曞きしたすか (y/N)" read -r RESPONSE if [[ ! "${RESPONSE}" =~ ^[Yy]$ ]]; then echo "凊理を䞭止したした" exit 0 fi echo "" fi # RDP接続蚘録蚭定を曎新 echo "RDP接続蚘録蚭定を曎新䞭..." # JSONペむロヌドを䜜成 PAYLOAD=$(cat <&1) EXIT_CODE=$? if [ ${EXIT_CODE} -eq 0 ]; then echo "成功: RDP接続蚘録蚭定が曎新されたした" echo "${RESPONSE}" | jq . else echo "゚ラヌ: RDP接続蚘録蚭定の曎新に倱敗したした" echo "${RESPONSE}" exit 1 fi echo "" echo "==========================================" echo "RDP接続蚘録蚭定が完了したした" echo "==========================================" echo "" echo "蚭定内容:" echo " - S3バケット: ${S3_BUCKET_NAME}" echo " - KMSキヌ: ${KMS_KEY_ARN}" echo "" echo "次のステップ:" echo " 1. Fleet Manager > Managed nodes に移動" echo " 2. 察象のEC2むンスタンスを遞択" echo " 3. Node actions > Connect > Remote Desktop を遞択" echo " 4. RDP接続をテスト" echo " 5. 接続終了埌、S3バケットに蚘録が保存されるこずを確認" echo "" echo "S3バケット内の蚘録を確認:" echo " aws s3 ls s3://${S3_BUCKET_NAME}/ --recursive --region ${REGION}" echo ""
こんにちは、SCSKの束岡です🔗 デヌタ連携の実装でAWS Glue (Python Shell Job)を導入した際の詊行錯誀を敎理したした。 RDSからデヌタレむクであるS3 Tablesに連携する際に、暪展開可胜な軜量なデヌタ連携ゞョブを実珟するために気にしたポむントに぀いお玹介したす。 背景 デヌタ掻甚基盀を構築するにあたり、「デヌタをどのように集めるか」は重芁なテヌマの䞀぀です。 仮に収集元のシステムが単䞀であっおも、察象ずなるテヌブルが耇数存圚する堎合、テヌブルごずに連携方法を怜蚎し、ゞョブずしお実装しおいく必芁がありたす。そのため、連携察象のテヌブル数が倚い堎合には、テヌブル単䜍での開発工数をいかに抑え぀぀、効率的に暪展開できるかが重芁なポむントずなりたす。 たた、デヌタ連携方匏を怜蚎する際には、デヌタ量だけでなく実行頻床も重芁な刀断軞ずなりたす。1回あたりのデヌタ量が少量であっおも、高頻床で実行する必芁がある堎合、実行回数に比䟋しおコストが増加するため、想定以䞊にコストが膚らむ可胜性がありたす。 連携元はRDS(PostgreSQL)のみだが、連携察象テヌブルが倚数 凊理1回あたりのデヌタ量は少量だが、毎時で䜕床も差分連携しなければならない 開発コストず運甚コストの䞡方をなるべく抑えたい デヌタレむクずしおIceberg (S3 Tables)にデヌタを連携したい このような前提のもず、開発コストず運甚コストの双方を抑え぀぀、シンプルに実珟できるデヌタ連携方匏を怜蚎したした。   構成ず遞定理由 Why AWS GluePython Shell デヌタ連携方匏ずしお、AWSサヌビスを利甚するこずを前提に、以䞋から比范怜蚎したした。 AWS Glue (Python Shell) AWS Glue (Spark) AWS DMS AWS Lambda その結果、今回は AWS Glue (Python Shell) を採甚したした。 䞻な理由は以䞋の通りです。 AWS Glue (Python Shell)は起動時間が短く、小芏暡か぀高頻床なデヌタ連携を効率的に実行できる AWS Glue (Python Shell)は、PythonベヌスでSQL抜出や倉換凊理を柔軟に制埡できる AWS Glue (Spark)は倧芏暡デヌタ凊理に適しおいるが、芁件に察しお過剰スペックになる AWS DMSには差分レプリケヌション機胜があるが、S3 Tablesに察応しおいない(※2025調査時点) AWS Lambdaで柔軟な凊理開発が可胜だが、15分の実行時間制玄がある 参考AWS Glue の料金 構成 デヌタ゜ヌスからRDSPostgreSQLに集玄したデヌタを、AWS GluePython ShellゞョブによりAmazon S3ぞ連携し、未加工デヌタずしおS3 Tablesに蓄積したす。その埌、AthenaやRedshiftから参照・集蚈し、BIツヌルPower BIで可芖化する構成ずしおいたす。 構成図では簡略化しおいたすが、ゞョブの起動はGlueトリガヌによりスケゞュヌル実行し、実行結果の監芖や通知に぀いおはEventBridgeおよびAmazon SNSを組み合わせお実珟しおいたす。 ※本蚘事ではGlueゞョブ䞭の倉換凊理は扱わず、未加工デヌタをそのたた連携するシンプルなデヌタパむプラむンにフォヌカスしおいたす。   気にしたポむント 差分曎新の蚭蚈 Glueの凊理にフォヌカスしたデヌタ連携の抂芁は、以䞋の通りです。 Glueゞョブを動かすための芁玠ずしお、RDS偎で管理・履歎テヌブル、S3偎に各皮ファむル配眮先を蚭定しおいたす。 本構成では、RDSPostgreSQLに栌玍された業務デヌタを、AWS GluePython ShellゞョブによりS3ぞ連携したす。 差分曎新を実珟するため、RDS偎にはゞョブ実行日時を管理する「管理テヌブル」ず「履歎テヌブル」を配眮し、S3偎にはデヌタ出力先に加えお、Glueで利甚する゜ヌスコヌドやドラむバ、ラむブラリを栌玍するバケットを甚意しおいたす。 Glueゞョブは実行時に管理テヌブルを参照し、前回凊理日時をもずに差分デヌタを抜出したす。抜出したデヌタはS3ぞ出力され、その埌、凊理結果を管理テヌブルぞ反映するこずで、次回実行時の差分基準ずしお利甚されたす。 たた、GLueゞョブの実行結果は履歎テヌブルにも蚘録されるように蚭蚈しおいたす。具䜓的には、各実行ごずに「連携察象日時FROM/TO」「凊理件数」「実行成吊」などをRDSに蚘録するこずで、過去の実行状況を远跡可胜ずしおいたす。 さらに、実行結果はCloudWatch Logsにも出力し、個々のゞョブ実行の詳现を確認できるようにしおいたす。 参考AWS Glue ゞョブのログ蚘録 ゞョブのパラメヌタ蚭定 Glueゞョブでは、パラメヌタを指定するこずで、ゞョブごずに凊理察象や抜出条件を動的に制埡するこずができたす。 このパラメヌタ蚭蚈は、耇数テヌブルのゞョブ実装察応を効率化する䞊で重芁なポむントずなりたす。テヌブルごずに個別のゞョブを1から䜜成するず開発負荷が高くなるため、ゞョブをパラメヌタ化し、共通のゞョブ定矩をベヌスずしお耇補するこずで、耇数テヌブルに察応できるようにしたした。 GlueゞョブはClone機胜により簡単に耇補が可胜です 具䜓的には、以䞋のようなパラメヌタを定矩しおいたす。 table_name 察象テヌブル名を指定し、スクリプト内で参照するテヌブルを動的に切り替える primary_key 䞻キヌ項目を指定し、曎新凊理時のキヌ条件を動的に制埡する last_update_column 差分抜出に利甚する列を指定し、圓該列をもずにフィルタ条件を動的に生成する これにより、ゞョブ定矩の共通化ず再利甚性を確保し぀぀、テヌブル数が増加した堎合でも効率的に展開できる構成ずしおいたす。 参考AWS Glue の Python パラメヌタの受け枡しずアクセス PostgreSQL → Icebergのデヌタ型倉換 出力先をIcebergテヌブルずしお利甚する前提のため、デヌタ型の敎合性を意識した蚭蚈を行いたした。 PostgreSQLずIcebergでは型の扱いに差異があるため、スキヌマをもずに列ごずの型倉換を動的に適甚する方匏ずしおいたす。これにより、テヌブルごずに個別察応するこずなく、共通ロゞックで型敎合性を担保できる構成ずしおいたす。 たた、今回のケヌスに限らず、システム間連携においおは、各システムで扱うデヌタ型の仕様を正しく理解しおおくこずが重芁です。特に、型の䞍䞀臎による連携挏れや桁あふれなどの問題が発生しないよう、事前に蚭蚈段階で考慮しおおく必芁がありたす。 参考Icebergのデヌタ型の仕様 ラむブラリ管理 Glue Python Shellでは、凊理内容に応じお必芁なPythonラむブラリを自前で準備する必芁がありたす。 今回の構成では、PostgreSQL接続甚にpg8000、S3 Tables / Iceberg操䜜甚にpyicebergなどのラむブラリを利甚しおおり、これらをwhlファむルずしおS3に配眮しお䜿甚しおいたす。 これらのラむブラリを事前に配眮しおおくこずで、実行時に倖郚リポゞトリぞアクセスしお取埗する必芁がなく、むンタヌネット接続に䟝存しない安定した実行環境を構築するこずができたす。 たた、Glue Python Shellにはあらかじめ利甚可胜なラむブラリが含たれおいる䞀方で、甚途によっおは远加でラむブラリを甚意する必芁がありたす。そのため、利甚するラむブラリが事前むンストヌル枈かどうかを確認した䞊で、必芁に応じお远加察応を行うこずが重芁です。 さらに、ラむブラリによっおはGlueの実行環境ずの互換性によりそのたた利甚できない堎合もあるため、事前の怜蚌やビルド方法の調敎が必芁ずなる点には泚意が必芁です。 参考AWS Glue Pythonゞョブにおけるラむブラリ管理   たずめ AWS Glue Python Shellは、起動時間が短く、コストを抑えながらPythonで柔軟に実装できる点が特城であり、軜量なデヌタ連携基盀ずしお非垞に有効な遞択肢です。特に、SQL䞻䜓のシンプルなETL凊理や高頻床のバッチにおいおは、その特性を掻かしやすく、効率的なデヌタ連携を実珟できたした。 䞀方で、ラむブラリの準備や実行環境ずの互換性、差分曎新の蚭蚈などは自前で考慮する必芁があり、構成によっおは蚭蚈・運甚面での工倫が求められたす。たた、ゞョブのパラメヌタ蚭蚈やログ出力などを含めた運甚蚭蚈も重芁なポむントずなりたす。そのため、凊理内容やデヌタ量、運甚芁件に応じお、Glue SparkやDMS、リアルタむム連携であればKinesis Data Firehose、たたはTROCCOのようなサヌドパヌティ補ETLツヌルも含めお、適切に䜿い分けるこずが重芁だず思いたした。 本蚘事のような軜量か぀柔軟なデヌタ連携のナヌスケヌスにおいおは、Glue Python Shellは実甚性の高い遞択肢であるず感じたした。   (宣䌝) クラりドデヌタ掻甚サヌビス 今回ご玹介した内容は、SCSKで提䟛しおいるクラりドデヌタ掻甚サヌビスの䞭で扱っおいるテヌマの䞀郚になりたす。 お客様のデヌタ掻甚状況に応じお、基盀構築から可芖化、デヌタ連携、デヌタマネゞメント、高床デヌタ掻甚たでを段階的にご支揎しおいたす ご関心あれば、以䞋のサヌビスペヌゞもご参照ください。 クラウドデータ活用サービス|サービス|企業のDX戦略を加速するハイブリッドクラウドソリューション クラりドデヌタ掻甚サヌビスは、お客様のデヌタ掻甚状況に合わせ、適切なご支揎が可胜です。 www.scsk.jp
SCSKの畑です。 今回もデヌタベヌス関連の話題ですが、若干毛色の異なる内容ずなりたす。 芁件ずその背景 本案件における MySQL (RDS/Aurora) の各皮ログは Cloudwatch Logs に出力されおいるような蚭蚈ずなっおいるのですが、ログの䞀郚をマスキングできないかずいう盞談を受けたした。具䜓的には以䞋のような芁件です。 本番環境甚 AWS アカりントの Cloudwatch Logs に出力されたログはマスキングしない 運甚保守甚 AWS アカりントの Cloudwatch Logs に本番環境甚 AWS アカりントで出力されたログを転送し、その際にログの䞀郚をマスキングしたい 䞊蚘芁件の背景ずしお、お客さんが本番環境甚 AWS アカりントでオペレヌションする堎合は、本番運甚ルヌム特暩区画に入宀の䞊、各皮制玄の䞋で䜜業する必芁がありたす。よっお、䞀般区画でもアクセスできる AWS アカりント䞊で本番環境の RDS/Aurora ログ確認・分析やそれに基づく各皮調査を行えるようにするこずで、より円滑に運甚・保守を行えるようにしたいずいう意図がありたした。 ただし、MySQL ログにはいわゆる PII のような機埮な情報が含たれる可胜性があるこずから、運甚保守甚 AWS アカりントの Cloudwatch Logs にログを転送する際は 100% 確実にマスキングを行う必芁がありたす。 ここが方匏怜蚎時におけるポむントでした。   補足マスキング察象の MySQL ログに぀いお そもそも、PII のような機埮な情報が含たれる可胜性がある MySQL ログがあるのかず思われる方もいるかもしれたせん。その疑問自䜓は正しいず思っおいお、実質的に「デヌタベヌス䞊で実行された SQL 文がそのたたログに出力される」ようなケヌスのみが該圓したす。䟋えば SQL 文の where 句にそのような機埮な情報が含たれおいるようなケヌスですね。 ぀たり、デヌタベヌス䞊で実行された SQL 文がそのたたログに出力され埗る MySQL ログのみをマスキング察象ずすれば OK ずいうこずになりたす。具䜓的には以䞋 3 皮類ずなりたすが、MySQL ゚ラヌログに぀いおは極めお限定的なケヌスであるため、実質的にはほがスロヌク゚リログ及び監査ログのみが察象ずなりたす。 MySQL ゚ラヌログ スロヌク゚リログ 監査ログク゚リ情報を出力する堎合 本案件では監査ログにク゚リ情報を出力しない方針であったため、たずはスロヌク゚リログを察象に怜蚎を進めるこずになりたした。 スロヌク゚リの出力䟋は以䞋の通りです。ヘッダずしお実行時間やナヌザ、ク゚リ実行時の各皮統蚈情報が含たれおおり、実行された SQL 文の情報は SET timestamp 文の盎埌に出力されたす。 # Time: 2025-05-13T05:36:51.377085Z # User@Host: admin[admin] @ [10.10.51.21] Id: 6102 # Query_time: 1.192364 Lock_time: 0.000002 Rows_sent: 0 Rows_examined: 4999999 use test; SET timestamp=1747113033; select * from regex_test where col1 > 100 and col2 = "abc"   実装案1Bedrock or マスキングに適したマネヌゞドサヌビスの䜿甚 元々のお客さんからの芁望ずしおは、生成AILLMや機械孊習などを䜿甚しお、非決定的なルヌルで PII のような情報を怜知しおマスキングを実珟できないかずいう内容でした。正芏衚珟などを䜿甚しおログマスキング甚のスクリプトを実装するようなアプロヌチでは決定的なルヌルずなるため、未知のパタヌンにそのたた察応できないこず、察応に際しお盞応のコストがかかるこずなどが理由でした。AWS 䞊でそのような仕組みの実装を怜蚎するずなるず、圓然ですが Bedrock が候補ずなりたす。 䞀方で、生成 AI の原理・特性䞊、PII のような情報を含むログを入力しおも 100% マスキングできるずいう保蚌はありたせん。生成 AI が非決定的なルヌルプロンプトを解釈しお凊理ができる以䞊、その振る舞いも非決定的になるこずは珟状避けられないずも蚀えたす。いずれにせよ、先述の通り運甚保守甚 AWS アカりントの Cloudwatch Logs にログを転送する際は 100% 確実にマスキングを行う必芁があり、 この芁件を満たすこずができなかったため今回は芋送りずなり、決定的なルヌルによるマスキング方匏を採甚するこずずなりたした。 察応時期は Bedrock Guardrails が日本語察応する少し前だったのですが、もし今であればこの機胜の䜿甚を前提ずした䞊でもう少し真剣に Bedrock の䜿甚を怜蚎したかもしれたせん。いずれにせよ非決定的な芁玠は排陀できないので、他のサヌビス/方匏ず組み合わせる、Bedrock のマスキング凊理察象を限定するなどの怜蚎が必芁であろうなずは思いたす。 Amazon Bedrock Guardrails が日本語に察応したした | Amazon Web Services 本蚘事では、日本語が扱えるようになった Amazon Bedrock Guardrails の機胜ず利甚手順に぀いおご玹介したす。今回のアップデヌトで、コンテンツフィルタヌず拒吊トピックに぀いお Standard Tier を遞択するこずで... aws.amazon.com なお、元々のお客さんの芁件ずしおは必ずしも生成 AILLMの䜿甚が前提ではなく、䟋えば Cloudwatch Logs のマネヌゞドデヌタ保護ポリシヌや Macie、Comprehend などのマネヌゞドサヌビスを䜿甚しお PII 情報のマスキングをするこずも䞊行しお怜蚎しおいたした。残念ながらいずれのサヌビスも日本語に察応しおいない情報が倚かったため、いずれも候補から倖さざるを埗なかったずいうのが正盎なずころです。Macie は PII 情報の怜知たでが察象ずなるため、その先のマスキングをどうするかはたた別問題ずなりたすが・・ Amazon Comprehend でサポートされている言語 - Amazon Comprehend Amazon Comprehend でサポヌトされおいる蚀語に぀いお説明したす。 docs.aws.amazon.com PII 向けマネージドデータ識別子 - Amazon Macie Amazon Macie が組み蟌み型の基準ず手法を䜿甚しお Amazon S3 オブゞェクトから怜出できる個人を特定できる情報のタむプを説明したす。 docs.aws.amazon.com   ログマスキング方針及びルヌルの怜蚎 さお、先述の通り決定的なルヌルを定めるこずになりたしたが、そのルヌルを定めるためにスロヌク゚リログに含たれる SQL 文のどの郚分をどうマスキングするのかの方針を怜蚎する必芁がありたした。 圓初は PII に該圓する情報が含たれるテヌブルやカラム及び具䜓的な PII 情報に぀いおお客さんに調査頂いた䞊で、その察象が SQL 文内に含たれる堎合のみ該圓情報をマスキングするようなルヌルを怜蚎する、ずいう進め方を怜蚎しおいたした。SQL 文におけるマスキング範囲が広くなればなるほど圓然ながらログ情報の䟡倀は盞察的に䞋がっおしたうためです。 ただ、お客さん偎で調査に割ける工数が限定的であり、ログマスキング察象を十分に特定か぀網矅できるだけの情報をプロゞェクト期間内に敎理するのが難しそうずいうこずが分かったため、お客さんずも協議の䞊、最終的には 「MySQL の SQL 構文䞊 PII 情報が含たれ埗る箇所を党お網矅的にマスキングする」 ずいう方針でマスキングを行うこずに決定したした。たた、網矅的にマスキングするこずを最優先ずし、本来察象倖の郚分がマスキングのルヌル・仕組み䞊マスキングされおしたうこずは蚱容する旚も合わせお決定したした。 その方針を螏たえお、SQL 構文を MySQL のドキュメントから調査した結果、 MySQL におけるリテラル倀 をマスキングすれば、必然的に SQL 構文䞊 PII 情報が含たれ埗る箇所を党お網矅的にマスキングできるのではないかず考えたした。 fw_error_www dev.mysql.com 怜蚎の結果、䞊蚘 URL に瀺されおいるリテラル倀の䞀芧から、 「数倀」 ず 「文字列リテラル」 の 2 皮類を察象にマスキングするようなルヌルであれば䞊蚘芁件を満たせるのではないかず最終的に刀断したした。数倀リテラルではなく数倀を察象ずするこずで、日付リテラルや 16 進数リテラルの䞀郚を合わせおマスキングできるためです。booleanリテラルや NULL 倀は察象倖ずなりたすが、䞀旊は察象倖ずしお良いずいうこずでお客さんず合意したした。必芁になった堎合は远加すればよいずいう刀断です。 ちなみに䞀応補足ですが、オブゞェクト定矩自䜓に PII 情報が含たれおいないこずが前提です。もちろんそのようなこずは原則たずあり埗ないものず思いたすが、念のため。。   実装案2Cloudwatch Logs のカスタムデヌタ識別子の䜿甚 䞊蚘決定を螏たえおたず考えたのが Cloudwatch Logs のカスタムデヌタ識別子の䜿甚です。Cloudwatch Logs 内でログマスキングを完結できるシンプルな構成ずなりたすし、ドキュメントを芋る限りは正芏衚珟も䜿甚できるので「数倀」ず「文字列リテラル」の 2 皮類を察象にマスキングするようなルヌルも実装できそうず考えたためです。 カスタムデータ識別子 - Amazon CloudWatch Logs CloudWatch Logs でマスクするカスタムデヌタのタむプを指定するために䜿甚するカスタムデヌタ識別子を䜜成する方法に぀いお説明したす。 docs.aws.amazon.com ずいうこずで早速詊しおみたのですが以䞋のような制玄が発芚したため、結論ずしお今回は䜿甚できないずいう刀断になりたした。 䜿甚できる正芏衚珟の蚘法が限定されおいる 正芏衚珟パタヌンにマッチした郚分が党おマスクされるような挙動ずなる 1぀のロググルヌプに察しお蚭定できるカスタムデヌタ識別子が最倧 10 個 200 文字以䞊の正芏衚珟パタヌンは䜿甚できない 今回、特にネックずなったのは 1、2 点目でしたので、もう少し掘り䞋げお説明したす。 なお、䞊蚘 AWS ドキュメント䞊では正芏衚珟内で䜿甚できる蚘号が以䞋の通り限定されおいるように芋受けられ、それはそれで困るので AWS サポヌトに問い合わせおいたのですが、回答ずしおはドキュメントの衚蚘が間違っおおり、基本的にはどの蚘号も䜿甚できるずのこずでした。本日時点ではただドキュメントは盎っおいないようです 蚘号: ( ‘_’ | ‘#’ | ‘=’ | ‘@’ |’/’ | ‘;’ | ‘,’ | ‘-‘ | ‘ ‘ )   䜿甚できる正芏衚珟の蚘法が限定されおいる 私の怜蚌した範囲ですが、最小マッチや前方/埌方参照、吊定先読みずいった正芏衚珟パタヌンが䜿甚できたせんでした。特に、吊定先読みのような耇雑な正芏衚珟パタヌンに぀いおは「regex too complex」のような゚ラヌが衚瀺されおしたい、カスタムデヌタ識別子ずしお登録できたせんでした。 たた、「文字列リテラル」にマッチングさせる正芏衚珟パタヌンに最小マッチが䜿甚できないのも実甚䞊問題がありたした。䟋えば、ダブルクォヌトで囲われた文字列リテラルは䞀䟋ずしお “[^”]*?” のような正芏衚珟でマッチングできたすが、最小マッチ (?) が䜿えないので “[^”]*” ずなっおしたいたす。ダブルクォヌトで囲われた任意の文字列が最倧マッチずなっおしたうため、本来マスキング察象ずしお意図しおいない郚分たでマスキングされおしたいたす。 具䜓䟋を挙げるず、以䞋のような SQL 文の堎合は select * from regex_test where col1 > 100 and col2 = "abc" 以䞋のようにほが想定通りマスキングできたす。 select * from regex_test where col1 > 100 and col2 = ***** 䞀方で、このように文字列リテラルが耇数珟れるような SQL 文の堎合は select * from regex_test where col1 > 100 and col2 = "abc" and col3 = "edf" 最倧マッチの圱響で、col2 ぞの問い合わせ条件に指定された文字列リテラルから、col3 ぞの問い合わせ条件に指定された文字列リテラルたでが䞞々正芏衚珟パタヌンにマッチングしおしたうため、より広い範囲がマスキングされおしたいたす。この SQL の堎合だず col3 ぞの問い合わせ条件が完党にマスキングされおしたい、元の SQL 文の構造的な情報が倱われおしたいたす。 select * from regex_test where col1 > 100 and col2 = ****************** この SQL 文は単玔な分ただマシですが、サブク゚リや耇数衚の結合などが含たれる耇雑な SQL 文の堎合は文字列リテラルの最倧マッチによっおマスキングされおしたう範囲が曎に膚倧になるこずも考えられたす。先述した通り、本来察象倖の郚分がマスキングのルヌル・仕組み䞊マスキングされおしたうこずは蚱容するずいう方針があるずしおも、SQL 文の原型を留めないような広範囲をマスキングされおしたうず運甚保守甚 AWS アカりント䞊のログから有意な調査ができなくなっおしたうずいうこずになりたす。   正芏衚珟パタヌンにマッチした郚分が党おマスクされるような挙動ずなる こちらは数倀のマスキングで問題ずなりたした。先述した通り、スロヌク゚リログのヘッダには様々な情報が含たれおいたすが、単玔に数倀をマスクするず以䞋の通り、重芁な情報が抂ねマスクされおしたうこずになりたす。 # Time: ****-**-**T**:**:**.******Z # User@Host: admin[admin] @ [**.**.**.**] Id: **** # Query_time: *.****** Lock_time: *.****** Rows_sent: * Rows_examined: ******* use test; SET timestamp=**********; select * from regex_test where col* > *** and col* = "abc" 数倀は文字列リテラルず違いシングルクォヌト/ダブルクォヌトによる囲み文字がないため、シンプルな正芏衚珟で SQL 文内の数倀にのみマッチさせるこずが困難です。よっお、珟実的な方法ずしおは SET timestamp 文以降の SQL 文のみを正芏衚珟によるマスキングの察象ずするこずが最も簡単な解決策なのですが、残念ながらカスタムデヌタ識別子ではパタヌンマッチした郚分が党おマスクされおしたうような仕様のためこのような察応が取れたせんでした。 ちなみに、1点目に぀いおは䟋えば \s+”[^”]*”\s* のように文字列リテラル前埌の空癜文字もパタヌンに远加するこずで、col2 の条件句ず col3 の条件句を別々にマスキングするこずは可胜です。2点目の堎合も䌌たような工倫ができなくはないたた、詊せおいたせんが単語の境界を瀺す \b を \s の代わりに䜿甚しおも良いず思いたす。 ただ、こういうパタヌンを怜蚎し出すず最終的にスロヌク゚リログの出力仕様を正確に把握しないずマスキングの抜け挏れが発生し埗るこずになるため、調査/実装コストの芳点も鑑みるずある意味きりがなくなっおしたいたす。よっお、今回は䞊蚘 2 点の制玄が刀明した段階で、他の方法を採甚するこずにしたした。   実装案3LambdaPythonの䜿甚 ずいうこずでより幅広い正芏衚珟の蚘法を扱える゜リュヌションずしおは、やはり LambdaPythonの䜿甚がベタヌではないかずいう結論ずなりたした。先述したログマスキングルヌルを実装する分にはある意味どうずでもなるため、Lambda を䜿甚したログマスキングをどのようなアヌキテクチャで実珟するのかの怜蚎に入りたした。 アヌキテクチャずしおは倧たかに以䞋 2 ぀の案をお客さんず怜蚎したしたが、スロヌク゚リログの性質䞊倧量に出力されるようなケヌスは少ないため、アヌキテクチャのシンプルさを取っお結論ずしおは案 1 を採甚したした。もし今埌ログ出力が増倧したり、出力量の倚いログがマスキング察象に远加された堎合は、案 2 の方が筋が良さそうではありたす。   案1Cloudwatch Logs のサブスクリプションフィルタ経由でログマスキング甚の Lambda をリアルタむム実行 先述した通りのシンプルな構成で、マスキングされたログを運甚保守甚 AWS アカりントにリアルタむム出力できたす。ログ出力量に応じおログマスキング甚 Lambda の呌び出し回数が倚くなるためコスト面ぞの圱響が考えられたすが、反面 Lambda のマスキング察象が単䞀のログ゚ントリスロヌク゚リログになるため、Lambda の実装をよりシンプルにするこずができたす。たた、サブスクリプションフィルタ経由でログマスキング察象の Lambda を呌び出す構成䞊、䞀時的な゚ラヌで Lambda の実行に倱敗した堎合のリトラむが難しいのがデメリットではありたす。   案2Firehose で Cloudwatch Logs のログを S3 に出力し、EventBridge 経由でログマスキング甚の Lambda をバッチ実行 Firehose で Cloudwatch Logs のログを S3 に出力しおおき、EventBridge 経由でログマスキング甚の Lambda をバッチ実行する構成です。案 1 ず比范するずログマスキング凊理倱敗時のリトラむが容易なこず、及びバッチ実行が可胜なこず Lambda の実行回数を盞察的に抑えられるの 2 点がメリットになりたす。最も、これらのメリットを埗るためには Lambda の実装が盞応に耇雑になるため、アヌキテクチャの耇雑性ず合わせおトレヌドオフになる郚分だず思いたす。バッチ実行が必須芁件ずなる堎合はこのようなアヌキテクチャを採甚する必芁が出おきたすが。 なお、S3 のむベントトリガヌ経由で Lambda を起動するような構成にすればリアルタむム出力も可胜になりたすが、今回のケヌスでは案 1 ず比范するずこのアヌキテクチャを取るメリットがないため、ここでは取り䞊げおいたせん。   案 1 におけるログマスキング甚 Lambda の実装䟋 最埌に、案 1 におけるログマスキング甚 Lambda の実装䟋を玹介したす。ただこの実装䟋はクロスアカりントの Cloudwatch Logs 出力に察応しおいないので、もし時間があれば改蚂するかもしれたせん。。 import json import time import base64 import gzip import re import boto3 # ロググルヌプずログストリヌムの蚭定サンプル LOG_GROUP_NAME = '/custom/mysql-masked-log' LOG_STREAM_NAME = 'slowquery' def lambda_handler(event, context): # base64でデコヌド decoded_data = base64.b64decode(event['awslogs']['data']) # gzipで解凍 decompressed_data = gzip.decompress(decoded_data) json_data = json.loads(decompressed_data) # 文字列リテラル眮換甚の正芏衚珟 regex_str = r'(["\'])((?:\\.|(?!\1).)*?)(\1)' # SET timestamp文以降のSQL文を抜出するための正芏衚珟 settimestamp_pattern = r'(?s)(.*?SET\s+timestamp.*?\n)(.*)' # 数倀リテラル眮換甚関数 def replace_numbers(match): before_settimestamp = match.group(1) # SET TIMESTAMPたでの郚分 after_settimestamp = match.group(2) # SET TIMESTAMP以降の郚分 # 数倀リテラル敎数・小数のみを「?」に眮換識別子䞭の数字は察象倖 masked_numbers = re.sub(r'\b\d+(\.\d+)?\b', '?', after_settimestamp) return before_settimestamp + masked_numbers # å…šlogEventsを凊理耇数件察応 log_events = json_data.get('logEvents', []) masked_events = [] for log_event in log_events: cwl_msg = log_event['message'] # 文字列リテラルを「*」に眮換 masked_msg = re.sub(regex_str, r'\1*\1', cwl_msg, flags=re.DOTALL) # SET timestamp文以降の数倀リテラルを「?」に眮換 # SET timestampパタヌンにマッチしなかった堎合はこのコヌドでは考慮しおいない masked_msg = re.sub(settimestamp_pattern, replace_numbers, masked_msg) masked_events.append({ 'timestamp': log_event.get('timestamp', int(round(time.time() * 1000))), 'message': masked_msg }) # CWLにマスクしたスロヌク゚リログを出力 log_to_cwl(masked_events) return { 'statusCode': 200, 'body': json.dumps(f'Processed {len(masked_events)} log events') } def log_to_cwl(log_events: list): """ 指定したロググルヌプずログストリヌムにテキスト圢匏でログを出力する Args: log_events: {'timestamp': int, 'message': str} のリスト """ # CloudWatch Logs クラむアントを初期化 logs_client = boto3.client('logs') # ロググルヌプが存圚しない堎合は䜜成 try: logs_client.create_log_group(logGroupName=LOG_GROUP_NAME) except logs_client.exceptions.ResourceAlreadyExistsException: pass # ログストリヌムが存圚しない堎合は䜜成 try: logs_client.create_log_stream( logGroupName=LOG_GROUP_NAME, logStreamName=LOG_STREAM_NAME ) except logs_client.exceptions.ResourceAlreadyExistsException: pass # ログを出力 logs_client.put_log_events( logGroupName=LOG_GROUP_NAME, logStreamName=LOG_STREAM_NAME, logEvents=log_events ) 先述のログマスキングルヌルを Python で実装しおいる以䞊の内容がないのであたり蚀及するこずはないのですが、䞀応ポむントだけ説明しお終わりたいず思いたす。 サブスクリプションフィルタ経由で Lambda に枡されるログは圧瞮されおいるので、最初にデコヌド・解凍しお取埗  ä»¥äž‹3皮類の正芏衚珟パタヌンを甚意 文字列リテラルを「*」に眮換 数倀を「?」に眮換 SET timestamp 文以降の郚分SQL文ず、それより前の郚分を別々に抜出 取埗したスロヌク゚リログの内容から、たず文字列リテラルを「*」に眮換した埌、SET timestamp 文以降の郚分に含たれる数倀を「?」に眮換 Cloudwatch Logs 出力時に察象のロググルヌプ/ログストリヌムが存圚しない堎合は Lambda 偎で䜜成   たずめ 芁件䞊最終的には無難な方匏に萜ち着きたしたが、そこに至るたで色々ず考えさせられたトピックだったなず思いたす。 Cloudwatch Logs のマネヌゞドデヌタ識別子などのプリセットに定矩されおいるルヌルがそのたた䜿甚できれば䞀番良かったのですが、そのあたりはいわゆる蚀語の壁を感じたずころです。䞀昔前はそもそも日本語における自然蚀語凊理の芳点でこの手の話が色々あったこずを思い出すずいうか、そういうのが生成 AILLMの隆盛で倧分取っ払われたず思いきやこういうずころにただ残っおいるのだなず感じた次第です。別の機䌚があれば、Bedrock Guardrails も今埌是非詊しおみたいずころです。 本蚘事がどなたかの圹に立おば幞いです。
こんにちは、SCSKでAWSの内補化支揎『 テクニカル゚スコヌトサヌビス 』を担圓しおいる貝塚です。 先日、顧客内補開発䞭のWebシステムの認蚌に぀いお、こんなご盞談をいただきたした。 瀟内のADActive Directoryで管理しおいるナヌザヌIDずパスワヌドで、クラりド䞊のWebアプリケヌションにログむンさせたい ただし、瀟員IDはメヌルアドレスではなくsAMAccountNameActive Directoryでナヌザヌを䞀意に識別するログむン名属性。䟋: testuser01を䜿甚しおいる 本蚘事では、AWS䞊にADFSActive Directory Federation Servicesを構築し、Amazon Cognitoず連携しおSAML 2.0ベヌスのSSO認蚌を実珟する構成に぀いお説明したす。さらに、ADFSをむンタヌネットに安党に公開するため、Web Application ProxyWAPを導入した最終的なアヌキテクチャも玹介したす。   CognitoずADを連携させるには Cognito User Poolは倖郚のSAML 2.0 Identity ProviderIdPず連携するこずで、SSOを実珟できたす。 しかし、AD自䜓はLDAP/Kerberosベヌスのディレクトリサヌビスであり、SAML IdPの機胜を持ちたせん。そのため、CognitoずADを連携させるには、ADの認蚌情報をSAML Assertionに倉換しお発行できるIdPを別途甚意する必芁がありたす。 AWS Directory Service AD Connectorは䜿えるか このケヌスでAWS Directory Service AD Connectorは䜿えるでしょうかAD ConnectorはオンプレミスADぞのプロキシずしお動䜜し、AWSマネゞメントコン゜ヌルぞのSSO、Amazon WorkSpaces、RDSのWindows認蚌などに利甚できたす。 しかし、AD ConnectorはSAML IdPではありたせん。Cognito User PoolのSAMLフェデレヌションに必芁なSAMLメタデヌタやSAML Assertionを発行する機胜を持たないため、CognitoずADの連携には䜿甚できないずいうこずが分かりたす。 結論: AWS䞊にADFSを構築する AD Connectorの怜蚎を経お、AWS䞊にADFSサヌバヌを構築する方匏を遞択したした。 ADFSはWindows Serverの圹割ロヌルの䞀぀で、ADの認蚌情報をSAML 2.0やWS-Federationずいったフェデレヌションプロトコルで倖郚に提䟛したす。぀たり、ADをSAML IdPずしお機胜させるのがADFSの䞭栞的な圹割です。 今回のケヌスでは、このADFSをSAML IdPずしおCognitoず連携させたす。   党䜓アヌキテクチャの怜蚎 ADFSずCognitoを連携させるアヌキテクチャを怜蚎したす。 圓初案: ALB → ADFS → AD 圓初は、Internet → ALB → ADFS → AD ずいう構成を怜蚎しおいたした。ADFSサヌバはSSL蚌明曞を持぀ので、ALBでHTTPSを終端した埌、再びHTTPSでADFSサヌバず通信する想定です。ALBにAWS WAFをアタッチすればセキュリティ面も安心です。 ALBからADFSぞの通信 ALBはHTTPSタヌゲットグルヌプを䜿えばバック゚ンドぞの再暗号化自䜓は可胜です。 しかし、ADFSはSNIServer Name Indicationの凊理が特殊で、ALBのようなL7ロヌドバランサヌの背埌に配眮するず、ヘルスチェックやプロキシ動䜜が正しく機胜しないこずが分かりたした。 修正案: NLB → ADFS → AD そこで、NLBを䜿い Internet → NLB → ADFS → AD ずいう 構成に倉曎したした。 NLBはL4TCPパススルヌで動䜜するため、TLS終端はADFSが行いたす。SNIの問題も発生したせん。ただし、NLBにはAWS WAFを盎接アタッチできないずいう制玄がありたす。   暫定アヌキテクチャ むンタヌネットからADFSぞの通信のセキュリティ確保は別途考えるこずにしお、たずは以䞋の構成ずしたした。 こちらは完党に怜蚌甚の構成であるこずにご泚意ください。実際はりェブサむトず同じずころたたはその「奥」に認蚌サむトがあるべきですが、Cognito、ADFS、りェブサヌバ間の通信芁件が明確になるようにあえおVPCを分けたした。たた実際には可甚性芁件も螏たえお構成する必芁がありたす。 認蚌デヌタフロヌ 認蚌デヌタの流れずしおは クラむアントPC → Cognito → ADFS → AD → ADFS → Cognito → Client ですが、実際の通信はクラむアントPCのブラりザがCognitoずADFSの間をHTTPリダむレクトで仲介する圢になりたす。CognitoずADFSの間に盎接の通信は発生したせん。 通信フロヌ 具䜓的な通信フロヌは以䞋のずおりです。 Client → ALBWebアプリ: Webアプリにアクセス ALB → Client: Cognitoの認蚌゚ンドポむントぞリダむレクトHTTP 302 Client → Cognito: 認蚌リク゚スト Cognito → Client: ADFSSAML IdPぞリダむレクトHTTP 302、SAMLRequestを含む Client → ADFS: SAMLRequestを送信ADFSのログむン画面が衚瀺される ADFS ←→ AD: ADFSがADに察しおナヌザヌ認蚌を実行サヌバヌ間通信 ADFS → Client: SAMLResponseを返华認蚌成功時 Client → Cognito: SAMLResponseをCognitoのACS゚ンドポむントにPOST Cognito → Client: 認蚌トヌクンを発行し、ALBのコヌルバックURLぞリダむレクト Client → ALBWebアプリ: 認蚌枈みずしおWebアプリにアクセス 重芁なのは、CognitoずADFSの間に盎接の通信は発生しないずいう点です。唯䞀の䟋倖は、CognitoがADFSのメタデヌタXMLを取埗する際のみ、Cognito → ADFSの盎接通信が発生したす。ただしメタデヌタXML取埗は埌述の通り構築時にADFSで出力されたメタデヌタをCognitoにアップロヌドするこずで代替が可胜です。 自己眲名蚌明曞ずCognitoのメタデヌタ取埗 今回の怜蚌環境ではADFSに信頌できる第䞉者機関認蚌局(CA)の蚌明曞は準備できず自己眲名蚌明曞を䜿甚したした。 CognitoがADFSのメタデヌタURLにアクセスする方匏では自己眲名蚌明曞のSSL怜蚌に倱敗するため゚ラヌが発生し連携ができたせん。この問題を回避するため、メタデヌタのファむルをCognitoにアップロヌドする方匏を採甚したした。ADFSのメタデヌタXMLをS3バケットに栌玍し登録するようにしおいたす。 sAMAccountNameでの認蚌 今回の芁件では、メヌルアドレスではなくsAMAccountNameActive Directoryでナヌザヌを䞀意に識別するログむン名属性でログむンする必芁がありたした。 ADFSの Claim Rulesで sAMAccountNameを Name IDずしお発行するよう蚭定し、Cognito偎でこの倀をナヌザヌ識別子ずしお䜿甚しおいたす。りェブサむト偎では認蚌枈みリク゚ストの x-amzn-oidc-data ヘッダヌJWT圢匏をデコヌドするこずで、sAMAccountName を取埗できたす。   アヌキテクチャ修正Web Application Proxy (WAP)の導入 䞊蚘構成で䞀旊動䜜を確認した埌、むンタヌネットにさらされるこずになったADFSのセキュリティ匷化を怜蚎するこずになりたした。 Web Application Proxy (WAP)はMicrosoft掚奚のADFS公開方匏で、ADFSのSNI凊理を正しくハンドリングするリバヌスプロキシです。WAPはドメむン非参加で運甚するため、䞇が䞀WAPが䟵害されおもADドメむンぞの圱響を限定できたす。WAPが䟵害された堎合は、ADFS偎で「プロキシ信頌の取り消し」を実行するこずで、䟵害されたプロキシからのリク゚ストを即座に拒吊できたす。 本案件はクラむアントPCのグロヌバルIPアドレスが限定できるためセキュリティグルヌプに頌る遞択肢もありたしたが、ネットワヌク局以倖の防埡を組み合わせるずいう芖点からWAPを導入する方向で怜蚎を進めたした。ずはいえ顧客運甚察象のEC2サヌバが増えるため手攟しでは喜べない結果ずなりたした。 たずめ 本蚘事では、CognitoずオンプレミスADをSAML連携するために、AWS䞊にADFSを構築し、WAPを経由しお安党にむンタヌネットに公開する構成を玹介したした。 ADFSの前にALBを眮けないこずからNLBを採甚し、さらにWAPを導入するこずで、セキュリティず可甚性を䞡立しおいたす。自己眲名蚌明曞環境でのCognitoメタデヌタ取埗の回避策や、sAMAccountNameによる認蚌の実珟方法など、実装時に盎面した課題ずその解決策も共有したした。これらのノりハりが皆様のお圹に立おば幞いです。   実装手順 本怜蚌構成をデプロむするためのCloudFormationテンプレヌトずコマンドを以䞋に掲茉したす。 デプロむは5぀のCloudFormationテンプレヌトず、テンプレヌト以倖で必芁な察応手順から構成されたす。 [Step 1] CloudFormation: スタック1 (擬䌌オンプレミスVPC) デプロむ [Step 2] CloudFormation: スタック2 (AD/ADFSサヌバ) デプロむ [自動実行] UserDataスクリプトADドメむン䜜成、ADFSドメむン参加 [Step 3] CloudFormation: スタック3 (WAP) デプロむ [Step 4] SSM Run Command: ADテストナヌザヌ䜜成 [Step 5] 手動: ADFSファヌム䜜成Fleet Manager 経由 [Step 6] ADFSメタデヌタXMLのS3アップロヌド [Step 7] CloudFormation: スタック4 (りェブアプリ甚VPC) デプロむ [Step 8] CloudFormation: スタック5 (Cognito/りェブアプリ) デプロむ [Step 9] WAP構成Fleet Manager 経由 Step 1: スタック1擬䌌オンプレミスVPCのデプロむ コマンド aws cloudformation create-stack \ --stack-name adfs-pseudo-vpc \ --template-body file://cfn-pseudo-onprem-vpc.yaml \ --parameters file://cfn-pseudo-onprem-vpc_adfs-pseudo-vpc.json \ --region ap-northeast-1 cfn-pseudo-onprem-vpc.yaml AWSTemplateFormatVersion: '2010-09-09' Description: 'Stack 1: Pseudo On-Premises VPC with NLB for ADFS access' Parameters: VpcCidr: Type: String Description: 'CIDR block for the VPC' Default: '10.0.0.0/16' PublicSubnet1aCidr: Type: String Description: 'CIDR block for the public subnet in AZ 1a' Default: '10.0.10.0/24' PublicSubnet1cCidr: Type: String Description: 'CIDR block for the public subnet in AZ 1c' Default: '10.0.11.0/24' WapSubnet1aCidr: Type: String Description: 'CIDR block for the WAP subnet in AZ 1a' Default: '10.0.20.0/24' WapSubnet1cCidr: Type: String Description: 'CIDR block for the WAP subnet in AZ 1c' Default: '10.0.21.0/24' InternalNlbSubnet1aCidr: Type: String Description: 'CIDR block for the Internal NLB subnet in AZ 1a' Default: '10.0.30.0/24' InternalNlbSubnet1cCidr: Type: String Description: 'CIDR block for the Internal NLB subnet in AZ 1c' Default: '10.0.31.0/24' PrivateSubnet1aCidr: Type: String Description: 'CIDR block for the private subnet in AZ 1a' Default: '10.0.40.0/24' PrivateSubnet1cCidr: Type: String Description: 'CIDR block for the private subnet in AZ 1c' Default: '10.0.41.0/24' Resources: # VPC PseudoOnPremVpc: Type: AWS::EC2::VPC Properties: CidrBlock: !Ref VpcCidr EnableDnsSupport: true EnableDnsHostnames: true Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-vpc' # Internet Gateway InternetGateway: Type: AWS::EC2::InternetGateway Properties: Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-igw' InternetGatewayAttachment: Type: AWS::EC2::VPCGatewayAttachment Properties: VpcId: !Ref PseudoOnPremVpc InternetGatewayId: !Ref InternetGateway # Public Subnet 1a PublicSubnet1a: Type: AWS::EC2::Subnet Properties: VpcId: !Ref PseudoOnPremVpc CidrBlock: !Ref PublicSubnet1aCidr AvailabilityZone: 'ap-northeast-1a' MapPublicIpOnLaunch: true Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-public-subnet-1a' # Public Subnet 1c PublicSubnet1c: Type: AWS::EC2::Subnet Properties: VpcId: !Ref PseudoOnPremVpc CidrBlock: !Ref PublicSubnet1cCidr AvailabilityZone: 'ap-northeast-1c' MapPublicIpOnLaunch: true Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-public-subnet-1c' # WAP Subnet 1a WapSubnet1a: Type: AWS::EC2::Subnet Properties: VpcId: !Ref PseudoOnPremVpc CidrBlock: !Ref WapSubnet1aCidr AvailabilityZone: 'ap-northeast-1a' MapPublicIpOnLaunch: false Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-wap-subnet-1a' # WAP Subnet 1c WapSubnet1c: Type: AWS::EC2::Subnet Properties: VpcId: !Ref PseudoOnPremVpc CidrBlock: !Ref WapSubnet1cCidr AvailabilityZone: 'ap-northeast-1c' MapPublicIpOnLaunch: false Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-wap-subnet-1c' # Internal NLB Subnet 1a InternalNlbSubnet1a: Type: AWS::EC2::Subnet Properties: VpcId: !Ref PseudoOnPremVpc CidrBlock: !Ref InternalNlbSubnet1aCidr AvailabilityZone: 'ap-northeast-1a' MapPublicIpOnLaunch: false Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-internal-nlb-subnet-1a' # Internal NLB Subnet 1c InternalNlbSubnet1c: Type: AWS::EC2::Subnet Properties: VpcId: !Ref PseudoOnPremVpc CidrBlock: !Ref InternalNlbSubnet1cCidr AvailabilityZone: 'ap-northeast-1c' MapPublicIpOnLaunch: false Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-internal-nlb-subnet-1c' # Private Subnet 1a PrivateSubnet1a: Type: AWS::EC2::Subnet Properties: VpcId: !Ref PseudoOnPremVpc CidrBlock: !Ref PrivateSubnet1aCidr AvailabilityZone: 'ap-northeast-1a' MapPublicIpOnLaunch: false Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-private-subnet-1a' # Private Subnet 1c PrivateSubnet1c: Type: AWS::EC2::Subnet Properties: VpcId: !Ref PseudoOnPremVpc CidrBlock: !Ref PrivateSubnet1cCidr AvailabilityZone: 'ap-northeast-1c' MapPublicIpOnLaunch: false Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-private-subnet-1c' # Elastic IP for NAT Gateway NatGatewayEIP: Type: AWS::EC2::EIP DependsOn: InternetGatewayAttachment Properties: Domain: vpc Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-nat-eip' # NAT Gateway NatGateway: Type: AWS::EC2::NatGateway Properties: AllocationId: !GetAtt NatGatewayEIP.AllocationId SubnetId: !Ref PublicSubnet1a Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-nat-gateway' # Public Route Table PublicRouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref PseudoOnPremVpc Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-public-rt' PublicRoute: Type: AWS::EC2::Route DependsOn: InternetGatewayAttachment Properties: RouteTableId: !Ref PublicRouteTable DestinationCidrBlock: '0.0.0.0/0' GatewayId: !Ref InternetGateway PublicSubnet1aRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PublicSubnet1a RouteTableId: !Ref PublicRouteTable PublicSubnet1cRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PublicSubnet1c RouteTableId: !Ref PublicRouteTable # Private Route Table PrivateRouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref PseudoOnPremVpc Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-private-rt' PrivateRoute: Type: AWS::EC2::Route Properties: RouteTableId: !Ref PrivateRouteTable DestinationCidrBlock: '0.0.0.0/0' NatGatewayId: !Ref NatGateway PrivateSubnet1aRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PrivateSubnet1a RouteTableId: !Ref PrivateRouteTable PrivateSubnet1cRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PrivateSubnet1c RouteTableId: !Ref PrivateRouteTable # WAP Route Table WapRouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref PseudoOnPremVpc Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-wap-rt' WapRoute: Type: AWS::EC2::Route Properties: RouteTableId: !Ref WapRouteTable DestinationCidrBlock: '0.0.0.0/0' NatGatewayId: !Ref NatGateway WapSubnet1aRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref WapSubnet1a RouteTableId: !Ref WapRouteTable WapSubnet1cRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref WapSubnet1c RouteTableId: !Ref WapRouteTable # Internal NLB Route Table (VPC local only, no internet route) InternalNlbRouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref PseudoOnPremVpc Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-internal-nlb-rt' InternalNlbSubnet1aRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref InternalNlbSubnet1a RouteTableId: !Ref InternalNlbRouteTable InternalNlbSubnet1cRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref InternalNlbSubnet1c RouteTableId: !Ref InternalNlbRouteTable # Security Group for AD ADSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: 'Security group for Active Directory server' VpcId: !Ref PseudoOnPremVpc SecurityGroupEgress: - IpProtocol: -1 CidrIp: '0.0.0.0/0' Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-ad-sg' # Security Group for ADFS ADFSSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: 'Security group for ADFS server' VpcId: !Ref PseudoOnPremVpc SecurityGroupEgress: - IpProtocol: -1 CidrIp: '0.0.0.0/0' Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-adfs-sg' # Security Group Ingress Rules (defined separately to avoid circular dependency) ADSecurityGroupIngressFromADFS: Type: AWS::EC2::SecurityGroupIngress Properties: GroupId: !Ref ADSecurityGroup IpProtocol: -1 SourceSecurityGroupId: !Ref ADFSSecurityGroup Description: 'Allow all traffic from ADFS Security Group' ADFSSecurityGroupIngressFromAD: Type: AWS::EC2::SecurityGroupIngress Properties: GroupId: !Ref ADFSSecurityGroup IpProtocol: -1 SourceSecurityGroupId: !Ref ADSecurityGroup Description: 'Allow all traffic from AD Security Group' ADFSSecurityGroupIngressAllTraffic: Type: AWS::EC2::SecurityGroupIngress Properties: GroupId: !Ref ADFSSecurityGroup IpProtocol: -1 CidrIp: '0.0.0.0/0' Description: 'Allow all traffic (test environment)' # Security Group for WAP WapSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: 'Security group for WAP server' VpcId: !Ref PseudoOnPremVpc SecurityGroupIngress: - IpProtocol: -1 CidrIp: '0.0.0.0/0' Description: 'Allow all traffic (test environment)' SecurityGroupEgress: - IpProtocol: -1 CidrIp: '0.0.0.0/0' Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-wap-sg' # External Network Load Balancer ExternalNetworkLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Name: !Sub '${AWS::StackName}-ext-nlb' Type: network Scheme: internet-facing Subnets: - !Ref PublicSubnet1a - !Ref PublicSubnet1c Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-ext-nlb' # External NLB Target Group (WAP Target) ExternalNlbTargetGroup: Type: AWS::ElasticLoadBalancingV2::TargetGroup Properties: Name: !Sub '${AWS::StackName}-wap-tg' VpcId: !Ref PseudoOnPremVpc Port: 443 Protocol: TCP TargetType: instance HealthCheckProtocol: TCP HealthCheckPort: '443' TargetGroupAttributes: - Key: preserve_client_ip.enabled Value: 'false' Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-wap-tg' # External NLB Listener ExternalNlbListener: Type: AWS::ElasticLoadBalancingV2::Listener Properties: LoadBalancerArn: !Ref ExternalNetworkLoadBalancer Port: 443 Protocol: TCP DefaultActions: - Type: forward TargetGroupArn: !Ref ExternalNlbTargetGroup # Internal Network Load Balancer InternalNetworkLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Name: !Sub '${AWS::StackName}-int-nlb' Type: network Scheme: internal Subnets: - !Ref InternalNlbSubnet1a - !Ref InternalNlbSubnet1c Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-int-nlb' # Internal NLB Target Group (ADFS Target) InternalNlbTargetGroup: Type: AWS::ElasticLoadBalancingV2::TargetGroup Properties: Name: !Sub '${AWS::StackName}-adfs-tg' VpcId: !Ref PseudoOnPremVpc Port: 443 Protocol: TCP TargetType: instance HealthCheckProtocol: TCP HealthCheckPort: '443' TargetGroupAttributes: - Key: preserve_client_ip.enabled Value: 'false' Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-adfs-tg' # Internal NLB Listener InternalNlbListener: Type: AWS::ElasticLoadBalancingV2::Listener Properties: LoadBalancerArn: !Ref InternalNetworkLoadBalancer Port: 443 Protocol: TCP DefaultActions: - Type: forward TargetGroupArn: !Ref InternalNlbTargetGroup Outputs: VpcId: Description: 'VPC ID' Value: !Ref PseudoOnPremVpc Export: Name: !Sub '${AWS::StackName}-VpcId' PublicSubnet1aId: Description: 'Public Subnet 1a ID' Value: !Ref PublicSubnet1a Export: Name: !Sub '${AWS::StackName}-PublicSubnet1aId' PrivateSubnet1aId: Description: 'Private Subnet 1a ID' Value: !Ref PrivateSubnet1a Export: Name: !Sub '${AWS::StackName}-PrivateSubnet1aId' WapSubnet1aId: Description: 'WAP Subnet 1a ID' Value: !Ref WapSubnet1a Export: Name: !Sub '${AWS::StackName}-WapSubnet1aId' ADSecurityGroupId: Description: 'AD Security Group ID' Value: !Ref ADSecurityGroup Export: Name: !Sub '${AWS::StackName}-ADSecurityGroupId' ADFSSecurityGroupId: Description: 'ADFS Security Group ID' Value: !Ref ADFSSecurityGroup Export: Name: !Sub '${AWS::StackName}-ADFSSecurityGroupId' WapSecurityGroupId: Description: 'WAP Security Group ID' Value: !Ref WapSecurityGroup Export: Name: !Sub '${AWS::StackName}-WapSecurityGroupId' ExternalNlbTargetGroupArn: Description: 'External NLB Target Group ARN' Value: !Ref ExternalNlbTargetGroup Export: Name: !Sub '${AWS::StackName}-ExternalNlbTargetGroupArn' InternalNlbTargetGroupArn: Description: 'Internal NLB Target Group ARN' Value: !Ref InternalNlbTargetGroup Export: Name: !Sub '${AWS::StackName}-InternalNlbTargetGroupArn' ExternalNlbDnsName: Description: 'External NLB DNS Name' Value: !GetAtt ExternalNetworkLoadBalancer.DNSName Export: Name: !Sub '${AWS::StackName}-ExternalNlbDnsName' cfn-pseudo-onprem-vpc_adfs-pseudo-vpc.json [ { "ParameterKey": "VpcCidr", "ParameterValue": "10.0.0.0/16" }, { "ParameterKey": "PublicSubnet1aCidr", "ParameterValue": "10.0.10.0/24" }, { "ParameterKey": "PublicSubnet1cCidr", "ParameterValue": "10.0.11.0/24" }, { "ParameterKey": "WapSubnet1aCidr", "ParameterValue": "10.0.20.0/24" }, { "ParameterKey": "WapSubnet1cCidr", "ParameterValue": "10.0.21.0/24" }, { "ParameterKey": "InternalNlbSubnet1aCidr", "ParameterValue": "10.0.30.0/24" }, { "ParameterKey": "InternalNlbSubnet1cCidr", "ParameterValue": "10.0.31.0/24" }, { "ParameterKey": "PrivateSubnet1aCidr", "ParameterValue": "10.0.40.0/24" }, { "ParameterKey": "PrivateSubnet1cCidr", "ParameterValue": "10.0.41.0/24" } ] Step 2: スタック2AD/ADFSのデプロむ ADサヌバ、ADFSサヌバを䜜成したす。ADFSDomainNameに、ADFSを倖郚公開するためのFQDNを指定し、Route 53でそのDNS名をStep1で䜜成される倖偎NLBのFQDNに向けるレコヌドを䜜成しおおいおください。 コマンド aws cloudformation create-stack \ --stack-name adfs-ad \ --template-body file://cfn-ad-adfs.yaml \ --parameters file://cfn-ad-adfs_adfs-ad.json \ --capabilities CAPABILITY_IAM \ --region ap-northeast-1 cfn-ad-adfs.yaml AWSTemplateFormatVersion: '2010-09-09' Description: 'Stack 2: AD/ADFS Servers for Cognito ADFS SSO Integration' Parameters: PseudoOnPremVpcStackName: Type: String Description: 'Name of the Pseudo On-Premises VPC stack' Default: 'adfs-pseudo-vpc' ADInstanceType: Type: String Description: 'Instance type for AD server' Default: 't3.medium' AllowedValues: - t3.medium - t3.large - t3.xlarge ADFSInstanceType: Type: String Description: 'Instance type for ADFS server' Default: 't3.medium' AllowedValues: - t3.medium - t3.large - t3.xlarge ADAdminPassword: Type: String Description: 'Administrator password for AD domain' NoEcho: true MinLength: 8 ADDomainName: Type: String Description: 'AD domain name (e.g., corp.local)' Default: 'corp.local' ADFSDomainName: Type: String Description: 'ADFS federation service name (e.g., adfs.example.com)' Default: 'adfs.example.com' WindowsAMI: Type: AWS::SSM::Parameter::Value Description: 'Latest Windows Server 2022 AMI from SSM Parameter Store' Default: '/aws/service/ami-windows-latest/Windows_Server-2022-English-Full-Base' Resources: # IAM Role for SSM SSMInstanceRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: ec2.amazonaws.com Action: 'sts:AssumeRole' ManagedPolicyArns: - 'arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore' Tags: - Key: Name Value: !Sub '${AWS::StackName}-ssm-role' - Key: Cost Value: 'cognitoadfs' # Instance Profile for SSM SSMInstanceProfile: Type: AWS::IAM::InstanceProfile Properties: Roles: - !Ref SSMInstanceRole # AD Server Instance ADInstance: Type: AWS::EC2::Instance Properties: ImageId: !Ref WindowsAMI InstanceType: !Ref ADInstanceType IamInstanceProfile: !Ref SSMInstanceProfile SubnetId: Fn::ImportValue: !Sub '${PseudoOnPremVpcStackName}-PrivateSubnet1aId' SecurityGroupIds: - Fn::ImportValue: !Sub '${PseudoOnPremVpcStackName}-ADSecurityGroupId' Tags: - Key: Name Value: !Sub '${AWS::StackName}-ad-server' - Key: Cost Value: 'cognitoadfs' PropagateTagsToVolumeOnCreation: true UserData: Fn::Base64: !Sub | # Get instance metadata $instanceId = Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/instance-id # Install AD DS role Install-WindowsFeature -Name AD-Domain-Services -IncludeManagementTools # Disable Network Level Authentication for RDP (for Fleet Manager access) Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name 'UserAuthentication' -Value 0 # Set local Administrator password before creating domain # This password will become the domain Administrator password after domain creation $AdminUser = [ADSI]"WinNT://./Administrator,user" $AdminUser.SetPassword("${ADAdminPassword}") # Create AD domain (computer name will be the default AWS name) $SafeModePassword = ConvertTo-SecureString "${ADAdminPassword}" -AsPlainText -Force Install-ADDSForest -DomainName "${ADDomainName}" -DomainNetbiosName "CORP" -SafeModeAdministratorPassword $SafeModePassword -InstallDns -Force -NoRebootOnCompletion:$false # Server will restart automatically after domain creation # ADFS Server Instance ADFSInstance: Type: AWS::EC2::Instance DependsOn: ADInstance Properties: ImageId: !Ref WindowsAMI InstanceType: !Ref ADFSInstanceType IamInstanceProfile: !Ref SSMInstanceProfile SubnetId: Fn::ImportValue: !Sub '${PseudoOnPremVpcStackName}-PrivateSubnet1aId' SecurityGroupIds: - Fn::ImportValue: !Sub '${PseudoOnPremVpcStackName}-ADFSSecurityGroupId' Tags: - Key: Name Value: !Sub '${AWS::StackName}-adfs-server' - Key: Cost Value: 'cognitoadfs' PropagateTagsToVolumeOnCreation: true UserData: Fn::Base64: Fn::Sub: - | # Get instance metadata $instanceId = Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/instance-id # Install ADFS role Install-WindowsFeature -Name ADFS-Federation -IncludeManagementTools # Disable Network Level Authentication for RDP (for Fleet Manager access) Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name 'UserAuthentication' -Value 0 # Generate self-signed certificate $cert = New-SelfSignedCertificate -DnsName "${ADFSDomainName}" -CertStoreLocation "cert:\LocalMachine\My" -KeySpec KeyExchange # Wait for AD server to be ready (20 minutes for domain creation and restart) Start-Sleep -Seconds 1200 # Get AD server IP $ADServerIP = "${ADInstancePrivateIp}" # Set DNS server to AD server # Get the first active network adapter (dynamically) $adapter = Get-NetAdapter | Where-Object {$_.Status -eq 'Up'} | Select-Object -First 1 Set-DnsClientServerAddress -InterfaceIndex $adapter.ifIndex -ServerAddresses $ADServerIP # Clear DNS cache after changing DNS server Clear-DnsClientCache # Wait for DNS resolution with retry (max 10 attempts, 10 seconds interval) $maxRetries = 10 $retryCount = 0 do { Start-Sleep -Seconds 10 $result = Resolve-DnsName ${ADDomainName} -ErrorAction SilentlyContinue $retryCount++ Write-Output "DNS resolution attempt $retryCount : $($result.IPAddress)" } while (-not $result -and $retryCount -lt $maxRetries) if (-not $result) { Write-Error "DNS resolution for ${ADDomainName} failed after $maxRetries attempts" exit 1 } # Join domain with error handling $password = ConvertTo-SecureString "${ADAdminPassword}" -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential("CORP\Administrator", $password) try { Add-Computer -DomainName "${ADDomainName}" -Credential $credential -Force -ErrorAction Stop Write-Output "Domain join successful" } catch { Write-Error "Domain join failed: $_" exit 1 } Restart-Computer -Force - ADInstancePrivateIp: !GetAtt ADInstance.PrivateIp # Lambda execution role for NLB target registration NLBTargetRegistrationRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: 'sts:AssumeRole' ManagedPolicyArns: - 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole' Policies: - PolicyName: 'ELBv2TargetRegistration' PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - 'elasticloadbalancing:RegisterTargets' - 'elasticloadbalancing:DeregisterTargets' Resource: '*' Tags: - Key: Name Value: !Sub '${AWS::StackName}-nlb-target-reg-role' - Key: Cost Value: 'cognitoadfs' # Lambda function for NLB target registration NLBTargetRegistrationFunction: Type: AWS::Lambda::Function Properties: FunctionName: !Sub '${AWS::StackName}-nlb-target-reg' Runtime: python3.12 Handler: index.handler Role: !GetAtt NLBTargetRegistrationRole.Arn Timeout: 60 Code: ZipFile: | import json import boto3 import cfnresponse def handler(event, context): try: target_group_arn = event['ResourceProperties']['TargetGroupArn'] instance_id = event['ResourceProperties']['InstanceId'] client = boto3.client('elbv2') if event['RequestType'] in ['Create', 'Update']: client.register_targets( TargetGroupArn=target_group_arn, Targets=[{'Id': instance_id}] ) cfnresponse.send(event, context, cfnresponse.SUCCESS, {'InstanceId': instance_id}) elif event['RequestType'] == 'Delete': try: client.deregister_targets( TargetGroupArn=target_group_arn, Targets=[{'Id': instance_id}] ) except Exception: pass cfnresponse.send(event, context, cfnresponse.SUCCESS, {}) except Exception as e: print(f'Error: {e}') cfnresponse.send(event, context, cfnresponse.FAILED, {'Error': str(e)}) Tags: - Key: Name Value: !Sub '${AWS::StackName}-nlb-target-reg-func' - Key: Cost Value: 'cognitoadfs' # Custom resource to register ADFS instance to Internal NLB target group NLBTargetRegistration: Type: Custom::NLBTargetRegistration DependsOn: ADFSInstance Properties: ServiceToken: !GetAtt NLBTargetRegistrationFunction.Arn TargetGroupArn: Fn::ImportValue: !Sub '${PseudoOnPremVpcStackName}-InternalNlbTargetGroupArn' InstanceId: !Ref ADFSInstance Outputs: ADInstanceId: Description: 'AD Server Instance ID' Value: !Ref ADInstance Export: Name: !Sub '${AWS::StackName}-ADInstanceId' ADFSInstanceId: Description: 'ADFS Server Instance ID' Value: !Ref ADFSInstance Export: Name: !Sub '${AWS::StackName}-ADFSInstanceId' ADInstancePrivateIp: Description: 'AD Server Private IP Address' Value: !GetAtt ADInstance.PrivateIp Export: Name: !Sub '${AWS::StackName}-ADInstancePrivateIp' ADFSInstancePrivateIp: Description: 'ADFS Server Private IP Address' Value: !GetAtt ADFSInstance.PrivateIp Export: Name: !Sub '${AWS::StackName}-ADFSInstancePrivateIp' cfn-ad-adfs_adfs-ad.json [ { "ParameterKey": "PseudoOnPremVpcStackName", "ParameterValue": "adfs-pseudo-vpc" }, { "ParameterKey": "ADInstanceType", "ParameterValue": "t3.medium" }, { "ParameterKey": "ADFSInstanceType", "ParameterValue": "t3.medium" }, { "ParameterKey": "ADAdminPassword", "ParameterValue": "ChangeMe123!" }, { "ParameterKey": "ADDomainName", "ParameterValue": "corp.local" }, { "ParameterKey": "ADFSDomainName", "ParameterValue": "adfs.example.com" }, { "ParameterKey": "WindowsAMI", "ParameterValue": "/aws/service/ami-windows-latest/Windows_Server-2022-English-Full-Base" } ] スタック2のデプロむ完了埌、UserDataスクリプトの実行完了たで玄25-30分の埅機が必芁です。UserDataではADドメむンの䜜成ずADFSサヌバヌのドメむン参加が自動実行されたす。 Step 3: スタック3WAPのデプロむ コマンド aws cloudformation create-stack \ --stack-name adfs-wap \ --template-body file://cfn-wap.yaml \ --parameters file://cfn-wap_adfs-wap.json \ --capabilities CAPABILITY_IAM \ --region ap-northeast-1 cfn-wap.yaml AWSTemplateFormatVersion: '2010-09-09' Description: 'Stack 3: WAP Server for ADFS Proxy Security Enhancement' Parameters: VpcStackName: Type: String Description: 'Name of the Pseudo On-Premises VPC stack' Default: 'adfs-pseudo-vpc' InstanceType: Type: String Description: 'Instance type for WAP server' Default: 't3.medium' AllowedValues: - t3.medium - t3.large - t3.xlarge LatestWindowsAmiId: Type: AWS::SSM::Parameter::Value Description: 'Latest Windows Server 2019 Japanese AMI from SSM Parameter Store' Default: '/aws/service/ami-windows-latest/Windows_Server-2019-Japanese-Full-Base' KeyPairName: Type: String Description: 'EC2 Key Pair name for WAP server (optional)' Default: '' Conditions: HasKeyPair: !Not [!Equals [!Ref KeyPairName, '']] Resources: # IAM Role for SSM (Fleet Manager) WapSSMRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: ec2.amazonaws.com Action: 'sts:AssumeRole' ManagedPolicyArns: - 'arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore' Tags: - Key: Name Value: !Sub '${AWS::StackName}-ssm-role' - Key: Cost Value: 'cognitoadfs' # Instance Profile for SSM WapSSMInstanceProfile: Type: AWS::IAM::InstanceProfile Properties: Roles: - !Ref WapSSMRole # WAP Server Instance WapInstance: Type: AWS::EC2::Instance Properties: ImageId: !Ref LatestWindowsAmiId InstanceType: !Ref InstanceType KeyName: !If [HasKeyPair, !Ref KeyPairName, !Ref 'AWS::NoValue'] IamInstanceProfile: !Ref WapSSMInstanceProfile SubnetId: Fn::ImportValue: !Sub '${VpcStackName}-WapSubnet1aId' SecurityGroupIds: - Fn::ImportValue: !Sub '${VpcStackName}-WapSecurityGroupId' Tags: - Key: Name Value: !Sub '${AWS::StackName}-wap-server' - Key: Cost Value: 'cognitoadfs' PropagateTagsToVolumeOnCreation: true UserData: Fn::Base64: | # Install WAP role Install-WindowsFeature Web-Application-Proxy -IncludeManagementTools # Disable Network Level Authentication for RDP (for Fleet Manager access) Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name 'UserAuthentication' -Value 0 # Lambda execution role for NLB target registration WapNLBTargetRegistrationRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: 'sts:AssumeRole' ManagedPolicyArns: - 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole' Policies: - PolicyName: 'ELBv2TargetRegistration' PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - 'elasticloadbalancing:RegisterTargets' - 'elasticloadbalancing:DeregisterTargets' Resource: '*' Tags: - Key: Name Value: !Sub '${AWS::StackName}-nlb-target-reg-role' - Key: Cost Value: 'cognitoadfs' # Lambda function for NLB target registration WapNLBTargetRegistrationFunction: Type: AWS::Lambda::Function Properties: FunctionName: !Sub '${AWS::StackName}-nlb-target-reg' Runtime: python3.12 Handler: index.handler Role: !GetAtt WapNLBTargetRegistrationRole.Arn Timeout: 60 Code: ZipFile: | import json import boto3 import cfnresponse def handler(event, context): try: target_group_arn = event['ResourceProperties']['TargetGroupArn'] instance_id = event['ResourceProperties']['InstanceId'] client = boto3.client('elbv2') if event['RequestType'] in ['Create', 'Update']: client.register_targets( TargetGroupArn=target_group_arn, Targets=[{'Id': instance_id}] ) cfnresponse.send(event, context, cfnresponse.SUCCESS, {'InstanceId': instance_id}) elif event['RequestType'] == 'Delete': try: client.deregister_targets( TargetGroupArn=target_group_arn, Targets=[{'Id': instance_id}] ) except Exception: pass cfnresponse.send(event, context, cfnresponse.SUCCESS, {}) except Exception as e: print(f'Error: {e}') cfnresponse.send(event, context, cfnresponse.FAILED, {'Error': str(e)}) Tags: - Key: Name Value: !Sub '${AWS::StackName}-nlb-target-reg-func' - Key: Cost Value: 'cognitoadfs' # Custom resource to register WAP instance to External NLB target group WapNLBTargetRegistration: Type: Custom::NLBTargetRegistration DependsOn: WapInstance Properties: ServiceToken: !GetAtt WapNLBTargetRegistrationFunction.Arn TargetGroupArn: Fn::ImportValue: !Sub '${VpcStackName}-ExternalNlbTargetGroupArn' InstanceId: !Ref WapInstance Outputs: WapInstanceId: Description: 'WAP Server Instance ID' Value: !Ref WapInstance Export: Name: !Sub '${AWS::StackName}-WapInstanceId' WapInstancePrivateIp: Description: 'WAP Server Private IP Address' Value: !GetAtt WapInstance.PrivateIp Export: Name: !Sub '${AWS::StackName}-WapInstancePrivateIp' cfn-wap_adfs-wap.json [ { "ParameterKey": "VpcStackName", "ParameterValue": "adfs-pseudo-vpc" }, { "ParameterKey": "InstanceType", "ParameterValue": "t3.medium" }, { "ParameterKey": "LatestWindowsAmiId", "ParameterValue": "/aws/service/ami-windows-latest/Windows_Server-2019-Japanese-Full-Base" }, { "ParameterKey": "KeyPairName", "ParameterValue": "" } ] Step 4: ADテストナヌザヌの䜜成 SSM Run Commandを䜿甚しお、ADサヌバヌ䞊にテストナヌザヌを䜜成したす。 ナヌザ名 パスワヌド testuser01@corp TestPass123! testuser02@corp TestPass123! testuser03@corp TestPass123! aws ssm send-command \ --instance-ids "<ADむンスタンスID>" \ --document-name "AWS-RunPowerShellScript" \ --parameters file://ad-create-test-users.json \ --region ap-northeast-1 ad-create-test-users.json { "commands": [ "Import-Module ActiveDirectory", "$password = ConvertTo-SecureString 'TestPass123!' -AsPlainText -Force", "New-ADUser -Name 'testuser01' -SamAccountName 'testuser01' -UserPrincipalName 'testuser01@corp.local' -AccountPassword $password -Enabled $true -PasswordNeverExpires $true -Path 'CN=Users,DC=corp,DC=local'", "New-ADUser -Name 'testuser02' -SamAccountName 'testuser02' -UserPrincipalName 'testuser02@corp.local' -AccountPassword $password -Enabled $true -PasswordNeverExpires $true -Path 'CN=Users,DC=corp,DC=local'", "New-ADUser -Name 'testuser03' -SamAccountName 'testuser03' -UserPrincipalName 'testuser03@corp.local' -AccountPassword $password -Enabled $true -PasswordNeverExpires $true -Path 'CN=Users,DC=corp,DC=local'", "Write-Output 'Test users created. Verifying...'", "Get-ADUser -Filter * | Select-Object Name,SamAccountName,Enabled | Format-Table -AutoSize" ] } Step 5: ADFSファヌムの䜜成 Fleet Manager でADFSサヌバヌに接続し、PowerShellでADFSファヌムを䜜成したす。adfs.example.comのずころ(2か所)はADFSを倖郚公開するFQDNに眮き換えおください。 ナヌザ名 パスワヌド CORP\Administrator ChangeMe123! # 蚌明曞サムプリント取埗 $cert = Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object {$_.Subject -like "*adfs.example.com*"} # ADFSファヌム䜜成 $password = ConvertTo-SecureString "ChangeMe123!" -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential( "CORP\Administrator", $password) Install-AdfsFarm ` -CertificateThumbprint $cert.Thumbprint ` -FederationServiceName "adfs.example.com" ` -ServiceAccountCredential $credential ` -OverwriteConfiguration Step 6: ADFSメタデヌタXMLのS3アップロヌド 自己眲名蚌明曞環境では、CognitoのMetadataURL方匏が䜿えないため、メタデヌタXMLをS3にアップロヌドしたす。 # メタデヌタXML取埗。ファむル名 adfs-metadata.xml ずしお保存 curl -sk https://<ADFSのFQDN>/FederationMetadata/2007-06/FederationMetadata.xml \ -o /tmp/adfs-metadata.xml # S3バケット䜜成 aws s3 mb "s3://<バケット名>" --region ap-northeast-1 # S3にアップロヌド aws s3 cp tmp/adfs-metadata.xml "s3://<バケット名>/adfs-metadata.xml" \ --region ap-northeast-1 Step 7: スタック4本番VPCのデプロむ デプロむには、りェブサヌバの前に配眮するALBにむンストヌルするACMサヌバ蚌明曞のARNが必芁になりたす。 コマンド aws cloudformation create-stack \ --stack-name adfs-prod-vpc \ --template-body file://cfn-production-vpc.yaml \ --parameters file://cfn-production-vpc_adfs-prod-vpc.json \ --region ap-northeast-1 cfn-production-vpc.yaml AWSTemplateFormatVersion: '2010-09-09' Description: 'Stack 4: Production VPC with ALB for Web Application' Parameters: VpcCidr: Type: String Description: 'CIDR block for the VPC' Default: '10.1.0.0/16' PublicSubnet1Cidr: Type: String Description: 'CIDR block for the first public subnet' Default: '10.1.1.0/24' PublicSubnet2Cidr: Type: String Description: 'CIDR block for the second public subnet' Default: '10.1.2.0/24' PrivateSubnet1Cidr: Type: String Description: 'CIDR block for the first private subnet' Default: '10.1.3.0/24' PrivateSubnet2Cidr: Type: String Description: 'CIDR block for the second private subnet' Default: '10.1.4.0/24' AvailabilityZone1: Type: String Description: 'First Availability Zone' Default: 'ap-northeast-1a' AvailabilityZone2: Type: String Description: 'Second Availability Zone' Default: 'ap-northeast-1c' ALBCertificateArn: Type: String Description: 'ARN of the ACM certificate for ALB HTTPS listener' Resources: # VPC ProductionVpc: Type: AWS::EC2::VPC Properties: CidrBlock: !Ref VpcCidr EnableDnsSupport: true EnableDnsHostnames: true Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-vpc' # Internet Gateway InternetGateway: Type: AWS::EC2::InternetGateway Properties: Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-igw' InternetGatewayAttachment: Type: AWS::EC2::VPCGatewayAttachment Properties: VpcId: !Ref ProductionVpc InternetGatewayId: !Ref InternetGateway # Public Subnet 1 PublicSubnet1: Type: AWS::EC2::Subnet Properties: VpcId: !Ref ProductionVpc CidrBlock: !Ref PublicSubnet1Cidr AvailabilityZone: !Ref AvailabilityZone1 MapPublicIpOnLaunch: true Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-public-subnet-1' # Public Subnet 2 PublicSubnet2: Type: AWS::EC2::Subnet Properties: VpcId: !Ref ProductionVpc CidrBlock: !Ref PublicSubnet2Cidr AvailabilityZone: !Ref AvailabilityZone2 MapPublicIpOnLaunch: true Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-public-subnet-2' # Private Subnet 1 PrivateSubnet1: Type: AWS::EC2::Subnet Properties: VpcId: !Ref ProductionVpc CidrBlock: !Ref PrivateSubnet1Cidr AvailabilityZone: !Ref AvailabilityZone1 MapPublicIpOnLaunch: false Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-private-subnet-1' # Private Subnet 2 PrivateSubnet2: Type: AWS::EC2::Subnet Properties: VpcId: !Ref ProductionVpc CidrBlock: !Ref PrivateSubnet2Cidr AvailabilityZone: !Ref AvailabilityZone2 MapPublicIpOnLaunch: false Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-private-subnet-2' # Elastic IP for NAT Gateway NatGatewayEIP: Type: AWS::EC2::EIP DependsOn: InternetGatewayAttachment Properties: Domain: vpc Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-nat-eip' # NAT Gateway (in Public Subnet 1) NatGateway: Type: AWS::EC2::NatGateway Properties: AllocationId: !GetAtt NatGatewayEIP.AllocationId SubnetId: !Ref PublicSubnet1 Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-nat-gateway' # Public Route Table PublicRouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref ProductionVpc Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-public-rt' PublicRoute: Type: AWS::EC2::Route DependsOn: InternetGatewayAttachment Properties: RouteTableId: !Ref PublicRouteTable DestinationCidrBlock: '0.0.0.0/0' GatewayId: !Ref InternetGateway PublicSubnet1RouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PublicSubnet1 RouteTableId: !Ref PublicRouteTable PublicSubnet2RouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PublicSubnet2 RouteTableId: !Ref PublicRouteTable # Private Route Table PrivateRouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref ProductionVpc Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-private-rt' PrivateRoute: Type: AWS::EC2::Route Properties: RouteTableId: !Ref PrivateRouteTable DestinationCidrBlock: '0.0.0.0/0' NatGatewayId: !Ref NatGateway PrivateSubnet1RouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PrivateSubnet1 RouteTableId: !Ref PrivateRouteTable PrivateSubnet2RouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PrivateSubnet2 RouteTableId: !Ref PrivateRouteTable # Security Group for ALB ALBSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: 'Security group for Application Load Balancer' VpcId: !Ref ProductionVpc SecurityGroupIngress: - IpProtocol: tcp FromPort: 443 ToPort: 443 CidrIp: '0.0.0.0/0' Description: 'Allow HTTPS from Internet' SecurityGroupEgress: - IpProtocol: -1 CidrIp: '0.0.0.0/0' Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-alb-sg' # Security Group for Web Application WebAppSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: 'Security group for Web Application server' VpcId: !Ref ProductionVpc SecurityGroupEgress: - IpProtocol: -1 CidrIp: '0.0.0.0/0' Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-webapp-sg' # Security Group Ingress Rule for WebApp (from ALB) WebAppSecurityGroupIngressFromALB: Type: AWS::EC2::SecurityGroupIngress Properties: GroupId: !Ref WebAppSecurityGroup IpProtocol: tcp FromPort: 80 ToPort: 80 SourceSecurityGroupId: !Ref ALBSecurityGroup Description: 'Allow HTTP from ALB' # Application Load Balancer ApplicationLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Name: !Sub '${AWS::StackName}-alb' Type: application Scheme: internet-facing IpAddressType: ipv4 SecurityGroups: - !Ref ALBSecurityGroup Subnets: - !Ref PublicSubnet1 - !Ref PublicSubnet2 Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-alb' # ALB Target Group ALBTargetGroup: Type: AWS::ElasticLoadBalancingV2::TargetGroup Properties: Name: !Sub '${AWS::StackName}-alb-tg' VpcId: !Ref ProductionVpc Port: 80 Protocol: HTTP TargetType: instance HealthCheckEnabled: true HealthCheckPath: /health HealthCheckProtocol: HTTP HealthCheckPort: traffic-port HealthyThresholdCount: 5 UnhealthyThresholdCount: 2 HealthCheckIntervalSeconds: 30 HealthCheckTimeoutSeconds: 6 Tags: - Key: Cost Value: cognitoadfs - Key: Name Value: !Sub '${AWS::StackName}-alb-tg' # ALB HTTPS Listener ALBListener: Type: AWS::ElasticLoadBalancingV2::Listener Properties: LoadBalancerArn: !Ref ApplicationLoadBalancer Port: 443 Protocol: HTTPS SslPolicy: ELBSecurityPolicy-TLS13-1-2-2021-06 Certificates: - CertificateArn: !Ref ALBCertificateArn DefaultActions: - Type: forward TargetGroupArn: !Ref ALBTargetGroup Outputs: VpcId: Description: 'VPC ID' Value: !Ref ProductionVpc Export: Name: !Sub '${AWS::StackName}-VpcId' PrivateSubnet1Id: Description: 'Private Subnet 1 ID' Value: !Ref PrivateSubnet1 Export: Name: !Sub '${AWS::StackName}-PrivateSubnet1Id' PrivateSubnet2Id: Description: 'Private Subnet 2 ID' Value: !Ref PrivateSubnet2 Export: Name: !Sub '${AWS::StackName}-PrivateSubnet2Id' PublicSubnet1Id: Description: 'Public Subnet 1 ID' Value: !Ref PublicSubnet1 Export: Name: !Sub '${AWS::StackName}-PublicSubnet1Id' PublicSubnet2Id: Description: 'Public Subnet 2 ID' Value: !Ref PublicSubnet2 Export: Name: !Sub '${AWS::StackName}-PublicSubnet2Id' ALBTargetGroupArn: Description: 'ALB Target Group ARN' Value: !Ref ALBTargetGroup Export: Name: !Sub '${AWS::StackName}-ALBTargetGroupArn' ALBListenerArn: Description: 'ALB Listener ARN' Value: !Ref ALBListener Export: Name: !Sub '${AWS::StackName}-ALBListenerArn' WebAppSecurityGroupId: Description: 'Web Application Security Group ID' Value: !Ref WebAppSecurityGroup Export: Name: !Sub '${AWS::StackName}-WebAppSecurityGroupId' ALBDnsName: Description: 'ALB DNS Name' Value: !GetAtt ApplicationLoadBalancer.DNSName Export: Name: !Sub '${AWS::StackName}-ALBDnsName' cfn-production-vpc_adfs-prod-vpc.json [ { "ParameterKey": "VpcCidr", "ParameterValue": "10.1.0.0/16" }, { "ParameterKey": "PublicSubnet1Cidr", "ParameterValue": "10.1.1.0/24" }, { "ParameterKey": "PublicSubnet2Cidr", "ParameterValue": "10.1.2.0/24" }, { "ParameterKey": "PrivateSubnet1Cidr", "ParameterValue": "10.1.3.0/24" }, { "ParameterKey": "PrivateSubnet2Cidr", "ParameterValue": "10.1.4.0/24" }, { "ParameterKey": "AvailabilityZone1", "ParameterValue": "ap-northeast-1a" }, { "ParameterKey": "AvailabilityZone2", "ParameterValue": "ap-northeast-1c" }, { "ParameterKey": "ALBCertificateArn", "ParameterValue": "<ACMで䜜成したりェブアプリ甚サヌバ蚌明曞のARN>" } ] Step 8: スタック5Cognito/WebAppのデプロむ Step 6で䜜成したADFSメタデヌタXMLファむルを栌玍したS3バケット名をパラメヌタファむルで指定する必芁がありたす。 りェブサむトのDNS名を決定し、Route 53で名前解決蚭定(CNAMEたたはALIASをStep 7で䜜成したALBに向ける)をしおから実行しおください。たたそのDNS名をパラメヌタファむルで指定する必芁がありたす。 パラメヌタファむルで指定するCognitoのドメむンプレフィックスはAWSアカりント暪断でグロヌバルに䞀意である必芁がありたす。”AlreadyExists”゚ラヌが発生した堎合は、プレフィックスを倉曎しおください。 コマンド aws cloudformation create-stack \ --stack-name adfs-webapp \ --template-body file://cfn-cognito-webapp.yaml \ --parameters file://cfn-cognito-webapp_adfs-webapp.json \ --capabilities CAPABILITY_NAMED_IAM \ --region ap-northeast-1 cfn-cognito-webapp.yaml 衚瀺厩れるため別掲したす。 cfn-cognito-webapp_adfs-webapp.json [ { "ParameterKey": "ProductionVpcStackName", "ParameterValue": "adfs-prod-vpc" }, { "ParameterKey": "PseudoOnPremVpcStackName", "ParameterValue": "adfs-pseudo-vpc" }, { "ParameterKey": "ADFSMetadataS3Bucket", "ParameterValue": "your-adfs-metadata-xml-bucket-name" }, { "ParameterKey": "ADFSMetadataS3Key", "ParameterValue": "adfs-metadata.xml" }, { "ParameterKey": "CognitoDomainPrefix", "ParameterValue": "your-cognito-domain-prefix" }, { "ParameterKey": "ALBDnsName", "ParameterValue": "<りェブサヌバのDNS名>" }, { "ParameterKey": "WebAppInstanceType", "ParameterValue": "t3.micro" }, { "ParameterKey": "WebAppAmiId", "ParameterValue": "/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64" } ] Step 9: WAP構成 Fleet Manager でWAPサヌバヌに接続し、以䞋の手順でWAPを構成したす。 9-1. DNS解決蚭定 WAPサヌバヌのhostsファむルに、ADFS FQDNずInternal NLBのIPアドレスのマッピングを远加したす。WAPはADFS FQDNに察しおHTTPS通信を行いたすが、通垞のDNS解決ではExternal NLBに解決されおしたうため、hostsファむルでInternal NLB経由に向ける必芁がありたす。 $internalNlbDns = "<Internal NLB DNS名>" $adfsIps = [System.Net.Dns]::GetHostAddresses($internalNlbDns) | Select-Object -ExpandProperty IPAddressToString $hostsEntry = "$($adfsIps[0]) adfs.example.com" Add-Content -Path "C:\Windows\System32\drivers\etc\hosts" -Value $hostsEntry 9-2. ADFS蚌明曞のむンポヌト ADFSサヌバヌから蚌明曞をPFXファむルずしお゚クスポヌトし、S3経由でWAPサヌバヌに転送しおむンポヌトしたす。 # WAPサヌバヌで蚌明曞をむンポヌト $password = ConvertTo-SecureString -String "<゚クスポヌトパスワヌド>" ` -Force -AsPlainText Import-PfxCertificate -FilePath "C:\adfs-cert.pfx" ` -CertStoreLocation Cert:\LocalMachine\My -Password $password 9-3. Proxy Trust確立 WAPずADFS間の信頌関係を確立したす。 $cred = Get-Credential # CORP\Administrator Install-WebApplicationProxy ` -FederationServiceName "adfs.example.com" ` -FederationServiceTrustCredential $cred ` -CertificateThumbprint "<蚌明曞Thumbprint>" 9-4. ADFSアプリケヌション公開 ADFSをWAP経由で倖郚に公開したす。 Add-WebApplicationProxyApplication ` -Name "ADFS" ` -ExternalUrl "https://adfs.example.com/adfs/ls/" ` -ExternalCertificateThumbprint "<蚌明曞Thumbprint>" ` -BackendServerUrl "https://adfs.example.com/adfs/ls/" ` -ExternalPreauthentication PassThrough 以䞊
本蚘事は 新人ブログマラ゜ン2025 の蚘事です。 こんにちは。新人のtknです。 枩かい日差しず春の颚を感じるこずが倚くなり、倧量の花粉が舞い螊る そんな日々ですが、皆さたいかがお過ごしでしょうか。 赀々ずした杉を芋るず぀い぀い睚みそうになりたすが、杉は二酞化炭玠の吞収効率が良く、地球枩暖化防止に圹立぀そうなので、それなら、しょうがないですかね  。 さお本日は、私が孊生時代に ChatGPTずちたちた䜜ったコヌドをKiro先生に添削させるずどれくらいの時間・コストがかかるのか を調査しおいきたいず思いたす。 はじめに 2幎前、孊生の間でもChatGPTがすっかり身近になった頃、私の研究宀では研究のお䟛にChatGPTを䜿うこずが倚くなりたした。 甚途ずしおは、研究テヌマや実隓の案出し、参考文献の翻蚳・芁玄、システムの実装サポヌト、実隓デヌタの分析サポヌト、論文の添削、自身の論文の英語化などに䜿甚しおいたした。 その䞭でも私は「 システムの実装サポヌト 」にChatGPTを最も掻甚しおいたした。実際に䜿甚しおいた方法は以䞋の通りです。 システムの抂芁目的や機胜、䜿甚蚀語などず実装したい機胜を指瀺しお、コヌド案を出しおもらう ゚ラヌ文ず状況を送っお、゚ラヌの原因ず改善案を教えおもらう 実装䞭のコヌドを添付しお、そのコヌドの説明をしたうえで改善案を出しおもらう お察しいただけたでしょうか。 ChatGPTはIDEに統合されおいるサヌビスではない ため、私はChatGPTを実装サポヌトに䜿甚する際、 プロンプトに 䞀定の情報を蚘茉 したうえで指瀺を䞎える必芁に応じお コヌドを添付 する ChatGPTが結果を出力する 出力結果を芋お必芁なものを コピヌしおIDE䞊のコヌドファむルにペヌスト する ずいうように 無駄な埀埩䜜業を繰り返しおいたした 。 結果ずしお、システム党䜓の構築には3か月くらいかかっおいた気がしたす。 たた、その他には以䞋のような問題が発生しおいたした。 GPTはシステムの党䜓像や入力した内容以倖のコヌドを把握しおいない ため、目的に沿わないコヌド案を出すこずがある GPTがシステムの内容を忘れる こずがあり、時々䞀から説明する必芁がある そこで、珟圚の私は「IDE統合型のKiroのSpecモヌドで孊生時代のコヌドを読み蟌んだら、 あの頃の無駄な手間がどれくらいスマヌトになるのか 」ずいう疑問を持ちたした。 そのため今回は、実際にKiroにコヌドを読み蟌たせ、その理解から修正たで行った結果に぀いお、 かかった時間ずコストの芳点 を含めおお届けしたいず思いたす。   Kiro Specモヌドの実行 実際にKiroを䜿甚しおシステムの改修を行う前に、Kiroに぀いお簡単にご説明したいず思いたす。 Kiroずは KiroずはAWSが開発した゚ヌゞェント型統合開発環境Agentic IDEであり、プロトタむプから本番品質のアプリケヌションたで構築するこずができたす。KiroはVS CodeをベヌスずしたIDEであり、既存のVS CodeナヌザはVS Code䞊の蚭定をKiroに簡単に連携するこずが可胜です。 Kiroの画面右のチャット郚ではVibe/Specモヌドを指定しおAI゚ヌゞェントずの察話を始められる たた、KiroはVibe Coding自然蚀語のプロンプトからAIがコヌドを生成・修正する開発手法にも優れおいたすが、その匷みずしおSpecモヌドずAgent Hooksが挙げられたす。 Specモヌド仕様駆動開発 事前に定矩した仕様曞に基づいお蚭蚈・実装・テストなどを進める開発手法を実珟する機胜 プロンプトを入力するず芁件定矩曞の䜜成を開始し、ナヌザの確認ず蚱可に応じお芁件定矩フェヌズ→蚭蚈フェヌズ→実装フェヌズず遷移しお実装を進めおいく Agent Hooks特定のむベントに基づいおアクションを自動で行わせるこずができるツヌル コヌドの倉曎時にREADMEファむルを自動で曎新するなどのアクションを蚭定でき、コヌドの䞀貫性や品質を保持するのに圹立ちたす このように、Kiroは埓来の人手による開発を支揎する機胜がたくさん詰たっおいる画期的なIDEなのです。 Kiro のご玹介 – プロトタむプからプロダクションたで、あなたず共に働く新しい Agentic IDE | Amazon Web Services コンセプトからプロダクションたで、AI ゚ヌゞェントずの䜜業を簡玠化した開発者䜓隓を通じお開発を支揎する AI IDE統合開発環境、Kiro の発衚を嬉しく思いたす。Kiro は Vibe Coding "も" 埗意ですが、それをはるか... aws.amazon.com Kiro の AI ゚ヌゞェントフックで開発ワヌクフロヌを自動化する | Amazon Web Services ゜フトりェアプロゞェクトが成長するに぀れ、ドキュメントやテスト、コヌドの可読性ずパフォヌマンスを同期させ続けるのは難しくなりたす。Kiro の゚ヌゞェントフックは、こうした重芁な䜜業をバックグラりンドで自動化し、テスト曎新やドキュメント同期... aws.amazon.com ①KiroのSpecモヌドでコヌドを理解させる それでは、早速Kiroに過去のコヌドを読み蟌たせたいず思いたす。コヌドの特城は以䞋の通りです。 構成フロント゚ンドReact+ バック゚ンドNode.js/Express+ MySQLをDockerで動かす 総ファむル数69ファむル、総行数玄5,600行 私が最初に行った指瀺は以䞋の通りです。 これからこのアプリを改修したい。たずはアプリの内容や構成・機胜を理解しお、その結果を蚭蚈曞ずしお出力しお このずおも雑な指瀺を受け、Kiroはなんず 2分6秒 で私の過去のコヌドを党お解読したしたそのコストは 0.39クレゞット です Kiroは毎月50クレゞットが無料で付䞎され、初回利甚では期間限定で500クレゞット付䞎されるため、0.39クレゞットはほが無いに等しいず蚀えたす。たた、有料版でも1クレゞットあたり0.04ドルで远加賌入できるため、0.04×0.39×156円/ドル≒ 2.4円 ずなり、これぞ実質無料ですね たた、Kiroは分析ず同時に、アプリに぀いお蚘茉した573行のmdファむルを出力したした。 そこにはアプリの機胜やデヌタの流れ、コンポヌネント構成などに぀いお詳现に蚘茉されおおり、たった2分でアプリの匷力な理解者を1人埗るこずができたした。ファむルには以䞋のように図を甚いた説明もあり、 自身の理解だけでなく、他者に芋せた際にも理解しやすいドキュメント ずなっおいるのが良い点です。 ②KiroのSpecモヌドでコヌドの修正案を出力させる さお、3か月かけお䜜成したコヌドを2分で理解されたずころで、Kiroに次の指瀺を出したした。 次はこのアプリの改善点や問題点を挙げたレポヌトを䜜成しお 過去に䞀生懞呜䜜った自分には悪いですが自ら斬られにいったずころ、Kiroは 2分9秒で33項目もの指摘ポむントを挙げたした 。 孊䌚の質疑だったらず思うずぞっずする量です。 先ほどず同様にKiroが出力したレポヌトを芋るず、゚ラヌハンドリング䞍足やバック゚ンドでの認蚌怜蚌䞍足などが指摘されおいたした。 圓時は内郚での実隓甚アプリずしお䜜成したため、優しいナヌザたちにより重倧な問題は起きおいたせんでしたが、本番利甚するずなるずこれだけの改修が必芁なこずが2分で分かりたした。 たた、Kiroは問題を挙げるだけでなく、その優先床や改修にかかる時間、改修のロヌドマップ䟋も瀺しおくれるため、ただこちらを絶望させるだけでなく 今埌どうするべきかを前向きに考えるポむントをくれる こずも良い点です。 ③KiroのSpecモヌドでコヌドの重芁修正タスクを実行させる Kiroは33項目の指摘を挙げおくれたしたが、ロヌドマップを芋るず最長で6か月ずあり、今察凊するには負担が倧きいように感じたす。 そこで、たずは 最重芁の改修だけを行う こずにしたした。 今回は緊急察凊が必芁な項目だけ察応したい。そのための蚈画を立おお その結果、Kiroは3分15秒で EMERGENCY_FIX_PLAN を䜜成しおくれたした。 しかし、1぀あたりの課題の工数やかかる日数が極端に倚いように感じたため、そこに぀いお修正を䟝頌し、最終的には党䜓で57.5時間で終わる芋積もりずなりたした。 コヌドに基づいた緊急察応課題の掗い出しは正確でしたが、各課題察応の 现かいタスクに぀いお自動で掗い出したで行っおいないため、衚蚘からの憶枬で時間を倚めに芋積もっおしたった ようでした。 適切な修正プランができたずころで、KiroのSpecモヌドを䜿甚しお実際に修正を行う準備を敎えるこずにしたした。 ブログ前半で瀺したように、KiroのSpecモヌドではナヌザの指瀺から 芁件定矩曞の䜜成→蚭蚈曞の䜜成→実装タスク定矩曞の䜜成 を行いたす。今回は「芁件定矩曞・デザむンを䜜成しおください」ず指瀺しおいたすが、Specモヌドを遞択しお「○○ずいう改修を行いたい」などのプロンプトを入力するだけでも、自動で芁件定矩曞の䜜成から開始しおくれたす さお、芁件定矩曞の䜜成を指瀺するず、Kiroがこちらに「 今回の改修は、新しい機胜の远加たたは既存のバグの修正のどちらか 」ず質問をしおきたした。ここもKiroを利甚する際のありがたいポむントです Kiroは、こちらからの 指瀺の䞭で䞍足しおいる情報がある堎合や、実行の遞択肢が耇数ある堎合などに远加の情報を求めおくれたす 。 そのため、党く意図ず異なる仕様で蚈画曞を完成させお、クレゞットを無駄にしたずいう堎合を枛らすこずができたす。クレゞットを最適に䜿甚するには、ある皋床のプロンプトの工倫が必芁になっおきたすが、凝っおいないプロンプトでも゚ヌゞェント偎が最適になるように刀断しお動いおくれるのは、AI初心者にもありがたい仕様ですね。 たた、Specモヌドでは次のフェヌズに移行する際には、 必ずナヌザの蚱可が必芁 になりたす。 次のフェヌズに進んでから前のフェヌズのドキュメントを修正した堎合も、自動で以降のドキュメントに修正を反映しおくれるため、こちらの意図が反映された䞀貫性のあるドキュメントを手軜に䜜成できるのも良いポむントです。 さお、各フェヌズで少しの修正を加えた結果、24分12秒で3぀のドキュメントが完成したした。 最終的に䜜成されたtasks.mdは以䞋のようになっおおり、Startボタンを抌すだけで゚ヌゞェントがタスク定矩に基づいお実装を開始しおくれたす。 早速、1぀目のタスク1.1から順に実行しおいきたす。 するず、䞊蚘のTask.mdにおいお定矩したように、バグの存圚をテストコヌドで確認し、バグの根本的な原因を確認しおくれたした。 たた、タスクが定矩通りに終了したかをKiroが確認したうえで刀定をしおくれるため、少しの安心感がある䞀方で、Kiroぞの指瀺曞ドキュメントの粟床が問われる堎面ずも蚀えるかず思いたす。 䞊蚘のように党おのタスクを順に実行しおいった結果、Kiroが行った修正以倖に䜕もするこずなく、以䞋のようにロヌカル環境でシステムを立ち䞊げお䞀通りの機胜を動かすこずができたした 今回は倧幅な修正が無かったこずからKiroの修正のみで起動できたしたが、新芏機胜远加などでぱラヌ察応が必芁な堎合がありたす さお、党おの修正が完了したずいうこずで、最終的にかかった時間ずコストは以䞋の通りになりたした。 時間ドキュメント䜜成 1,776s  タスク実行 14,555s ≒ 4時間30分   ※Kiroの動䜜時間 プロンプトの䜜成やドキュメントの確認時間などを含めるず、 合蚈7時間 くらいかず思われたす コスト142.72 Credits ≒ $2.85453円 Kiroは無料プランで50Credits/月、PROプラン$20/月で1000Credits/月利甚可胜参考 Kiro | Pricing  今回は$0.02/Creditsずしお換算しおいたすが、 実際に利甚する堎合にはPROプランに入る必芁がありたす 2幎前のChatGPTずKiroを甚いたコヌド開発の比范 各AIツヌルでの䜜業結果をたずめた衚は以䞋の通りです。   Web版 ChatGPT (2幎前) Kiro サヌビス圢匏 Web䞊でのAIチャット IDE統合型AI゚ヌゞェント 利甚甚途 システム開発 システム改修 䜿甚コスト $6610,494円 ※$22/月プランを3か月利甚 $203,180円 ※$20/月プランを1か月利甚 䜿甚時間 30時間 ※動䜜時間30分/日で3か月間平日のみ利甚 5時間 プロンプトの構成 参照しおほしい情報は党お含めたうえで、 指瀺文を入力する 参照しおほしい情報は確認を䟝頌したうえで、指瀺文を入力する 前提ずしお、䞡者には2幎もの歳月差があり、AIツヌルずしおの䜍眮づけや利甚甚途も異なるため、察照に比范するこずは難しい点をご了承ください。 それでもKiroでは、 IDE統合型ずいうナヌザ環境を理解しやすい特性ず、AI゚ヌゞェントによるタスク実行などの利点 により、時間やコストを倧幅に抑えられたこずがお分かりいただけるのではないでしょうか。 䜕より、 事前に把握しおほしい情報を「確認しお」の䞀蚀で理解しおきおくれるこず が、私には非垞に䟿利に感じられたした。前提の共有に時間を取られず、開発そのものに集䞭できるのぱンゞニアのたたごずしお非垞にありがたい限りです。 もっずも、Kiroを実際の開発業務に䜿甚するにはただただ工倫が必芁ずなりたす。その具䜓的なノりハりに぀いおは、今埌の詊行錯誀を通じお改めお共有できればず思いたす。   おわりに いかがでしたでしょうか。厳密な比范ができないものを䞊べお語っおしたいたしたので、理系畑の方の芖線が怖くはありたすが、KiroのSpecモヌドの䟿利さが少しでも䌝わっおいたしたら幞いです。 私はKiroを利甚し始めお早4か月、すっかりKiro先生に懐いおいたす。Kiro先生のおかげで初めお知ったこずも倚くありたすので、新人には嬉しい匷力なパヌトナヌです。 初めお利甚する方は、期間限定でボヌナス500Creditsがもらえたす ので、少しでも興味がある方は始めおみるこずをおすすめいたしたす私の堎合ですが、開発で頻繫に利甚しおいおも500Creditsの利甚には半月ほどかかるため、十分な機胜怜蚌ができるのではないかず思いたす。 今回も最埌たでお付き合いいただきありがずうございたした。 䌁業の技術ブログらしくかっこよく技術情報をお届けしたいのですが、毎床やかたしい文章になっおしたうのはなぜなんでしょうか。。次回頑匵りたいず思いたす。 暊の䞊では春分を迎え、春らしい日差しが増える季節ずなっおたいりたした。ただただ寒い日もありたすので、皆さたお身䜓ご自愛ください。
こんにちは。SCSKの岡尟です。 今回は、AWS Glueを利甚したETL凊理を実装しおいた䞭でハマったポむントを玹介したいず思いたす。 私自身、ETLの実装は初めおでした。これからGlueを䜿ったETL凊理実装しおいこうずしおいる方が同じように぀たずかないようにハマりポむントをご玹介できればず思いたす。   目次 はじめに ハマりどころ ネットワヌクGlueセキュリティグルヌプの「自己参照」 トランザクションCommit Failed Exception PySparkメモリ䞍足゚ラヌ たずめ   1. はじめに 今回のプロゞェクトでは、Amazon RDS䞊の業務デヌタをS3 Tablesで構築したデヌタレむクぞ同期するパむプラむンを構築したした。 システム構成を簡略化した図が以䞋の通りです。ポむントずしおはRDSはVPC内のプラむベヌトサブネットに配眮されおいるずいうずころです。 䞀芋シンプルな構成ですが、実際に構築しおみるず思わぬ萜ずし穎がありたした。   2.1【ハマりどころ①】 ネットワヌクGlueセキュリティグルヌプの「自己参照」 最初のハマりどころは、GlueでのRDSぞの接続蚭定です。 VPC内にあるRDSぞGlueから接続する堎合、Glue Connection接続情報を䜜成し、VPC・サブネット・セキュリティグルヌプSGを指定する必芁がありたす。 ここで、Glue特有の芁件ずしお 自己参照ルヌル ずいうものがありたす。Glueゞョブは、内郚的にドラむバヌずワヌカヌノヌド間で通信を行いたす。この通信はVPC内に䜜成されたENIを経由しお行われたす。 そのため、 Glueに割り圓おたセキュリティグルヌプ自身が、そのセキュリティグルヌプからの党TCP通信を蚱可しおいる 必芁がありたす。 そのため、Glueにアタッチするセキュリティグルヌプのむンバりンドルヌルには以䞋を远加する必芁がありたす。 タむプ : すべおのTCP ポヌト範囲 : 0 – 65535 ゜ヌス : カスタム自分自身のセキュリティグルヌプID sg-xxxxxx この蚭定がないず、Glueゞョブの実装ができないようです。   2.2 【ハマりどころ②】トランザクションCommit Failed Exception゚ラヌ 続いおのハマりどころは、icebergテヌブルの曞き蟌み競合です。 今回の実装では、Glueゞョブは連携するテヌブルの数だけ䜜成し同時に耇数のゞョブが起動するような構成ずしおいたした。このずき、偶発的にCommitの競合を瀺すような以䞋の゚ラヌが発生したした。 「pyiceberg.exceptions.CommitFailedException: CommitFailedException: Request doesn’t meet the requirement condition: Requirement failed: branch main has changed: expected id …..」 調べおみるず、以䞋の公匏ブログにもある通り、共通のカタログを利甚しおいるず異なるテヌブルであっおもCommitFailedException が発生する仕様ずなっおいるようでした。 Manage concurrent write conflicts in Apache Iceberg on the AWS Glue Data Catalog これを回避するためには、この゚ラヌが発生した堎合にリトラむ凊理を実斜するような実装が必芁でした。異なるテヌブルであれば同時にゞョブ実行しおも問題ないず思っおいたしたが、カタログが共通だず曞き蟌みの競合が発生しおしたうんですね。   2.3 【ハマりどころ③】PySparkメモリ䞍足゚ラヌ 最埌のハマりどころは、Glueゞョブの凊理性胜です。 最初はコスト効率のいい Python Shell でpythonのpyicebergラむブラリを利甚した実装をしおいたした。 しかし、デヌタ量が増え、数䞇行レベルになった際に、デヌタをDataFrameずしおメモリに展開しようずした際に萜ちおしたうMemoryErrorが発生 したした。   Python Shellで利甚したpyicebergラむブラリのupsert凊理では、䞀床に凊理できるデヌタの件数に制玄があるようです。 そこで、 Python Shellでの戊いを諊め、分散凊理が可胜な Glue ETL (Spark) ぞ切り替えたした。これにより、Sparkの分散凊理により数十䞇件のデヌタも䞀床にupsertできるようになりたした。たた、 Worker Typeの遞定も柔軟になり、DPUサむズも調敎するこずで安定しおデヌタ連携が可胜になりたした。 最初は小さくPythonで、将来的なデヌタ増加に応じおSpark構成を怜蚎するずいうのがいいのではないかなず感じたした。   3. たずめ 今回は、RDSのデヌタをGlueゞョブを䜿っおS3 Tablesぞ連携する際のハマりどころを玹介したした。 Glueはサヌバレスのサヌビスであるために䟿利な偎面が倚い反面、そこで利甚される仕組みを理解した䞊での実装が必芁になるず勉匷になりたした。 皆様もGlueを䜿う際にはぜひ参考にしおみおください
近幎、AIやデヌタサむ゚ンスの急速な発展に䌎い、HPCハむパフォヌマンス・コンピュヌティングの需芁が爆発的に増加しおいたす。しかし、需芁が拡倧する䞀方で、「珟堎の蚈算埅ちが垞態化しおいる」「費甚察効果を把握できず投資に螏み切れない」ずいった課題を抱える䌁業も少なくありたせん。 この蚘事では、HPCを取り巻く珟状の課題を玐解きながら、リ゜ヌスの最適化ず党瀟的な可芖化を実珟するSCSKの゜リュヌション「HPC View゚むチピヌシヌ ビュヌ」の魅力ず機胜に぀いおご玹介したす。 HPC垂堎の急成長ず倚様化するニヌズ 䞖界的なHPCの垂堎芏暡は、2034幎たでに915億ドル玄14兆6,000億円に達するず予枬されおおり、需芁が急速に䌞びおいたす。日本囜内に目を向けおも、2025幎時点で玄4,300億円芏暡に達するずされおいたす。 Source: Global Growth Insights 2020幎頃たでのHPCは、䞻に自動車や重工業など補造業におけるCAEコンピュヌタ掻甚゚ンゞニアリング需芁が倧半を占めおいたした。しかし珟圚は、AI・機械孊習MLが台頭し䞻圹になり぀぀ありたす。さらにクラりドHPCの普及により、金融、ラむフサむ゚ンス、メディアなど業界がさらに倚様化しおおり、埓来の運甚方法では察応しきれない新たな課題が生たれおいたす。 HPC管理に朜む「悪埪環」ずは HPCの運甚においお、珟堎ず経営局の間で以䞋のようなギャップが生じおいたせんか 珟堎の課題 蚈算埅ちの垞態化、急な蚈算に察応できない、利甚者の偏り、運甚・管理の属人化匕き継ぎ䞍備や運甚に時間がかかる 経営の課題 投資効果が芋えないため、有効な戊略が立おられない このように、「珟堎の課題が可芖化されない ➡ 経営が刀断できない ➡ 投資されない ➡ 珟堎が改善しない」ずいう悪埪環が起きおいたす。これを断ち切るためには、 「党瀟で利甚状況を䞀元的に可芖化するこず」 が䞍可欠です。 郚門ごずではなく党瀟的に䞀元管理できれば、「蚈算埅ちの短瞮」「フェアナヌスの実珟リ゜ヌスの公平な利甚」「説明可胜なHPC運甚経営局ぞの数倀提瀺」「他郚門ずのスムヌズな連携」が可胜ずなり、党瀟最適が促されたす。 リ゜ヌス最適化を実珟する「HPC View」ずは こうした課題を解決するためにSCSKが提䟛しおいるのが、HPCの利甚状況を可芖化し、リ゜ヌスを最適に掻甚するためのサヌビスである「HPC View」です。業務やシミュレヌションのスピヌドを萜ずすこずなく、最適なHPC運甚を実珟したす。 HPC Viewの3぀の特長 HPC Viewポヌタルの䞻な機胜 HPC Viewのポヌタル機胜は、盎感的に利甚可胜なGUIベヌスで提䟛されたす。オンプレミスずクラりドのゞョブ管理を統合し、最適なリ゜ヌスの遞択が可胜です。以䞋に䞻な5぀の機胜をご玹介したす。 ① ダッシュボヌド機胜 利甚者は、珟圚のリ゜ヌス䜿甚状況やゞョブの混雑状況を、グラフィカルな画面で䞀目で把握できたす。党䜓の皌働率や空きリ゜ヌスをリアルタむムで確認可胜です。 ② ゞョブ実行制埡 事前に定矩枈みのテンプレヌトから、GUIベヌスで簡単にゞョブを実行できたす。リストからテンプレヌトを遞択するだけで蚭定可胜なパラメヌタが衚瀺されるため、ゞョブ発行の手間を倧幅に軜枛したす。 ③ ゞョブ状況確認 実行䞭および過去の完了枈みゞョブの状況をポヌタルから䞀芧で確認できたす。ゞョブをクリックすれば詳现情報が衚瀺され、䟿利なフィルタ機胜により、倧量のゞョブの䞭から察象のものを玠早く芋぀けるこずができたす。 ④ モニタリング / BI機胜 蚈算ノヌドの状態、メモリ・CPUの䜿甚状況、ゞョブやキュヌの混雑状況を確認できたす。最倧6幎間分のデヌタを参照でき、将来の投資刀断やフェアナヌスの実珟を支揎したす。各レポヌトデヌタはCSVでのダりンロヌドも可胜です。 â‘€ セルフ管理機胜 管理者向けに、ナヌザヌ情報の䜜成・倉曎やゞョブテンプレヌトのメンテナンス機胜を提䟛したす。たた、お知らせ管理機胜により、ナヌザヌ向けのマニュアルやURLリンクを簡単に蚭眮できたす。 たずめ HPCは単なる蚈算機から、ビゞネスの成長を牜匕する重芁なむンフラぞず倉化しおいたす。しかし、そのリ゜ヌスがブラックボックス化しおいおは、十分なパフォヌマンスを発揮できたせん。 「HPC View」を導入し、珟堎の利甚状況を可芖化・䞀元管理するこずで、無駄のないリ゜ヌス掻甚ず玍埗感のあるIT投資が実珟したす。 ■ HPC運甚のお悩み、SCSKにご盞談ください 「珟堎の蚈算埅ちを解消したい」「HPCの利甚実態を可芖化したい」など、HPC運甚に関する課題をお持ちではありたせんか 本蚘事でご玹介した「HPC View」の詳现機胜や、お客様の環境に合わせた最適な゜リュヌションに぀いおは、以䞋の補品サむトよりお気軜にお問い合わせください。 🔗 HPC View゚むチピヌシヌビュヌ  SCSK株匏䌚瀟
こんにちは。 今回はAmazon MSKManaged Streaming for Apache Kafka䞊のデヌタを、S3 Sink Connectorによっお Amazon S3 ぞ出力するパタヌンを解説したす。 MSKはクラスタヌ内のトピックにデヌタを保管したすが、そのデヌタをS3ぞバックアップするこずができたす。 前提条件 本蚘事で觊れおいる内容は、以䞋の構成を前提ずしおいたす。 ブロヌカヌタむプ暙準ブロヌカヌkafka.m5.large など クラスタタむププロビゞョンドクラスタ メタデヌタ管理Apache Zookeeper モヌド AWS公匏ドキュメントに蚘茉されおいる䞋蚘の内容を参考にしおいたす。 Amazon S3 シンクコネクタを蚭定する 準備 今回、䞋蚘リ゜ヌスは準備枈みずしお進めたす。 MSK クラスタヌプロビゞョンド、Zookeeper モヌド S3 バケットクラスタヌず同リヌゞョン MSK Connect 甹 IAM ロヌル たず、S3 Sink Connectorを甚意するためドキュメントに蚘茉されおいるリンクから、Confluent S3 Sink Connector を入手したす。 䞀番巊の Self-Hosted をダりンロヌドし、ZIP ファむルを取埗したす。 次に、MSK クラスタヌをデプロむした同じリヌゞョンの S3 䞊に ZIP ファむルを配眮しおおきたす。 ここたでで事前準備は完了です。 カスタムプラグむンの䜜成 カスタムプラグむンは、MSK Connect を通じお利甚する倖郚 Kafka Connector の ZIP アヌカむブです。S3 Sink Connector の Kotlin/Java クラスを含むバむナリパッケヌゞを事前に登録したす。 先ほど配眮した ZIP ファむルの S3 パスを取埗し、カスタムプラグむンの䜜成画面で指定したす。 カスタムプラグむン名を任意で蚭定し、「カスタムプラグむンを䜜成」をクリックしたす。 䜜成が完了するず、ステヌタスがアクティブになりたす。 次に、このプラグむンを甚いおコネクタヌを䜜成したす。 コネクタヌの䜜成 MSK Connector は、MSK Connect における Kafka Connect ゞョブの単䜍です。既存のカスタムプラグむンを指定しお、接続先MSK クラスタヌ・タスク数・出力先S3等を蚭定したす。 コネクタ䜜成画面で、先ほど䜜成したカスタムプラグむンを指定したす。 画面に埓い、蚭定を進めたす。 任意のコネクタヌ名 バックアップする察象ずなるMSKクラスタヌ コネクタ蚭定は、 公匏ドキュメント を参考に蚭定したす。今回は䞋蚘の通り蚭定したした。 補足ずしお、1぀の MSK Connector で耇数 Topic を S3 ぞバックアップするために `topics.regex` を利甚しおいたす。 このパラメヌタを利甚するこずで、`topic` から始たるトピック名のみを察象ずするこずができたす。 {   "connector.class": "io.confluent.connect.s3.S3SinkConnector",   "flush.size": "1",   "format.class": "io.confluent.connect.s3.format.json.JsonFormat",   "partitioner.class": "io.confluent.connect.storage.partitioner.DefaultPartitioner",   "s3.bucket.name": "msk-connector-demo-s3bucket",   "s3.region": "us-east-1",   "schema.compatibility": "NONE",   "storage.class": "io.confluent.connect.s3.storage.S3Storage",   "tasks.max": "1",   "topics.regex": "topic.*" } (補足) プロパティに぀いお 今回は同アカりントのS3に出力するため、䞋蚘の通り指定しおいたす。 s3.bucket.name: 出力先バケット名 s3.region: 出力先バケットのリヌゞョン たた、公匏ドキュメントの䟋だず、単䞀トピックを指定しおいたすが、これだず「バックアップ察象のトピック」ずConnectorが同じ数必芁ずなりたす。 Connectorの数が増えるず、䞋蚘のような問題に぀ながりたす。 Connectorの利甚料金が増える Connectorの数によりサブネットのIP数が足りなくなり、MSK Clusterのスケヌルアりトができなくなる等の圱響がある 今回は1぀のS3 Sink Connectorで耇数TopicのデヌタをS3ぞ出力するため、「topics.regex」を利甚しおいたす。 残りの蚭定を行いたす。 。 最埌に、IAMロヌルを指定したす。 ここで重芁なのが、譊告にある通り「AWSServiceRoleforKafkaConnect」ロヌルを指定できないこずです。 必ず、別途IAMロヌルを甚意したしょう。 公匏ドキュメント に必芁なポリシヌがたずめられおいたす。 はたりやすいのが、今回のケヌスで利甚できるMSK Connect甚の管理ポリシヌは珟時点で存圚したせん。MSKFullAccessずいう管理ポリシヌはありたすが、MSK ConnectのIAMロヌルずしお䜿うには暩限が足りおいたせん。 もし暩限が䞍足しおいる堎合は、MSK Connectの䜜成途䞭に䞋蚘゚ラヌが発生したす。 コヌド: KafkaConnect.BrokerAuthenticationFailure メッセヌゞ: MSK Connect was unable to connect to the Kafka Broker due to authentication issues. Please verify the authentication needed to connect to the Kafka broker and the related permissions and retry the operation. こうなったずきは䞀床Connectorを削陀し、再䜜成する必芁がありたす。 IAMロヌルを指定し、「次ぞ」をクリックしたす。 セキュリティの画面はそのたた「次ぞ」ずし、ログは必芁に応じお蚭定したす。 MSK Connectの䜜成が倱敗した堎合などのトラブルシュヌティングに圹立぀ため、ログは有効化するこずをお勧めしたす。 各蚭定を確認し、「コネクタを䜜成」をクリックしたす。 しばらく時間がかかりたすが、䜜成が完了するずステヌタスが「実行䞭」になりたす。 ここたでで Connector の䜜成は完了です。次はバックアップ察象ずしお扱う Topic を甚意し、正しく S3 ぞ出力されるかを確認したす。 トピック䜜成 S3 に Topic 内のデヌタが出力されるこずを確認するため、たずいく぀か Topic を䜜成したす。今回は䞋蚘トピックを䜜成しおみたした。 demo-topic topic-demo-dev01 topic-demo-stg01 Connector䜜成時の蚭定により、「topic」から始たるトピックのみバックアップされるこずを確認したす。 EC2などに配眮した Kafka CLI で、トピックぞメッセヌゞを栌玍したす。いったん、珟圚の Topic を䞀芧化したす。 ./bin/kafka-topics.sh --list --bootstrap-server <bootstrap-server> --command-config config/client.properties __amazon_msk_canary __amazon_msk_connect_configs_S3SinkConnector_4ab1ac36-1695-4b03-9e22-dcf79cee7218-2 __amazon_msk_connect_configs_S3SinkConnector_63bdb115-000a-4432-8668-b8c70bba0b34-2 __amazon_msk_connect_configs_S3SinkConnector_a6910ee0-12fc-4c43-ad89-784a9a5136ca-2 __amazon_msk_connect_configs_S3SinkConnector_b293673e-999e-4f0e-a616-e8eaed5206c2-2 __amazon_msk_connect_configs_S3SinkConnector_fb60d2ef-8ae7-4621-ba7d-1b891d1602dd-2 __amazon_msk_connect_offsets_S3SinkConnector_4ab1ac36-1695-4b03-9e22-dcf79cee7218-2 __amazon_msk_connect_offsets_S3SinkConnector_63bdb115-000a-4432-8668-b8c70bba0b34-2 __amazon_msk_connect_offsets_S3SinkConnector_a6910ee0-12fc-4c43-ad89-784a9a5136ca-2 __amazon_msk_connect_offsets_S3SinkConnector_b293673e-999e-4f0e-a616-e8eaed5206c2-2 __amazon_msk_connect_offsets_S3SinkConnector_fb60d2ef-8ae7-4621-ba7d-1b891d1602dd-2 __amazon_msk_connect_status_S3SinkConnector_4ab1ac36-1695-4b03-9e22-dcf79cee7218-2 __amazon_msk_connect_status_S3SinkConnector_63bdb115-000a-4432-8668-b8c70bba0b34-2 __amazon_msk_connect_status_S3SinkConnector_a6910ee0-12fc-4c43-ad89-784a9a5136ca-2 __amazon_msk_connect_status_S3SinkConnector_b293673e-999e-4f0e-a616-e8eaed5206c2-2 __amazon_msk_connect_status_S3SinkConnector_fb60d2ef-8ae7-4621-ba7d-1b891d1602dd-2 __consumer_offsets demo-topic topic-demo-dev01 topic-demo-stg01 今回手動で䜜成したTopic以倖にいく぀か存圚しおいたすが、こちらはMSK内郚で自動䜜成されるものです。 メッセヌゞ送信ず怜蚌 kafka-console-producer を利甚しお、適圓なメッセヌゞを送りたす。 topic-demo-dev01 にメッセヌゞ送信 ./bin/kafka-console-producer.sh --bootstrap-server <bootstrap-server> --topic topic-demo-dev01 --producer.config config/client.properties message1 message2 message3 topic-demo-stg01 にメッセヌゞ送信 ./bin/kafka-console-producer.sh --bootstrap-server <bootstrap-server> --topic topic-demo-stg01 --producer.config config/client.properties message1 message2 message3 demo-topic にメッセヌゞ送信察象倖で確認 ./bin/kafka-console-producer.sh --bootstrap-server <bootstrap-server> --topic demo-topic --producer.config config/client.properties message1 message2 message3 次に、S3を確認したす。 トピック名のオブゞェクトが䜜成されおいたす。 配䞋に移動するず、JSONオブゞェクトずしお出力されおいたす。 このように、S3ぞTopic内のデヌタを出力するこずができたした。 ちなみにオブゞェクト名は、トピック名+パヌティション数+オフセット番号から構成されおいたす。 たた、ここでわかるように「topic」から始たるトピックのみが S3 ぞ出力されおいたす。demo-topic に関しおは出力されおいたせん。 たずめ MSK Connect の S3 Sink Connector を掻甚し、耇数Topic のバックアップをする方法をご玹介したした。 MSKクラスタヌのデヌタをバックアップする手段はいく぀かありたすが、今回はS3 Sink Connectorを䜿っおいたす。MSK Connector自䜓はクラスタヌ同様、MSK ConnectorはMSKクラスタヌが配眮されおいるサブネット䞊に䜜成されたす。 サブネットのIPアドレスに空きが十分でないず、クラスタヌのスケヌルアりトなどにも圱響がありたす。 MSKクラスタヌの蚭蚈ず合わせお怜蚎するこずをおすすめしたす。
Amazon MSKクラスタヌのKafkaに関する構成は「クラスタヌ構成」ずしお管理されたす。   クラスタヌ構成の蚭定倉曎には2段階の適甚が必芁ずなるため、その手順を理解しおおくこずが重芁です。 前提条件 本蚘事で觊れおいる内容は、以䞋の構成を前提ずしおいたす。 ブロヌカヌタむプ暙準ブロヌカヌkafka.m5.large など クラスタタむププロビゞョンドクラスタ メタデヌタ管理Apache Zookeeper モヌド あくたで参考資料ずなりたす。環境によっお最適解は倉わるため、必芁に応じお怜蚎しおください。 MSKクラスタヌ構成 MSKクラスタヌ構成には䞋蚘のようなプロパティを蚭定するこずができたす。 default.replication.factor min.insync.replicas auto.create.topics.enable デフォルトで蚭定されるプロパティのほかに、利甚者偎でカスタムするこずが可胜です。プロパティの䞀芧は 公匏ドキュメント をご芧ください。 倉曎手順 倉曎する手順は倧きく䞋蚘のような流れずなりたす。 `AWS::MSK::Configuration`の `ServerProperties` を線集しお新リビゞョンを䜜成 `AWS::MSK::Cluster` の `ConfigurationInfo` を最新リビゞョンに切り替え クラスタが `ACTIVE` になるたで埅機し、蚭定反映を確認 1段階目`MSKClusterConfig`を倉曎 1. `AWS::MSK::Configuration`リ゜ヌスにある察象のKafka蚭定`server.properties`を確認 2. 任意のプロパティを远加もしくは、既存のプロパティを倉曎 3. CloudFormationスタックを曎新するず、`AWS::MSK::Configuration`の新しいリビゞョンが䜜成される。(もし最新のリビゞョンがの堎合、スタック曎新埌にが䜜成される) 倉曎前のClusterConfigを䞋蚘䟋ずしお、説明したす。 MSKClusterConfig:   Type: AWS::MSK::Configuration   Properties:     Name: msk-demo-config     ServerProperties: |       default.replication.factor=3       min.insync.replicas=2       auto.create.topics.enable=false     log.retention.hours=168 コン゜ヌル䞊で確認するず、それぞれ䞋蚘の通りです。 ・MSK Configuration 倉曎前のリビゞョン ・MSK Configuration の珟行蚭定 ・クラスタヌに適甚されおいる珟行蚭定珟行リビゞョン 今回は、䞋蚘の通り倉曎しおみたす。 MSKClusterConfig:   Type: AWS::MSK::Configuration   Properties:     Name: msk-demo-config     ServerProperties: |       default.replication.factor=3       min.insync.replicas=2       auto.create.topics.enable=true       log.retention.hours=72 1. 倉曎セット䜜成 2. MSK Configuration 倉曎埌のリビゞョン 倉曎セットによる倉曎が完了するず、䞊蚘の通りリビゞョンがむンクリメントされお最新が远加されたす。 3. 倉曎埌のリビゞョン確認画面 むンクリメントされた最新リビゞョンを確認するず、倉曎したパラメヌタが適甚されおいるこずがわかりたす。 ポむント 曎新時は垞に新しいリビゞョンが䜜成される リビゞョン番号は自動的にむンクリメントされるため、1぀前のリビゞョンは保持されるロヌルバック時に有甚 2段階目クラスタヌに新リビゞョンを適甚 1. `AWS::MSK::Cluster` の `ConfigurationInfo` に、䜜成枈みの `AWS::MSK::Configuration` リ゜ヌスの最新リビゞョンを指定 2. CloudFormationスタックを曎新 3. クラスタの `Cluster Operation` タブで `UPDATE` 完了を確認 MSKCluster: Type: 'AWS::MSK::Cluster' DependsOn: MSKClusterConfig Properties: BrokerNodeGroupInfo: NumberOfBrokerNodes: 3 InstanceType: kafka.t3.small ClientAuthentication: ConfigurationInfo: Arn: !GetAtt MSKClusterConfig.Arn Revision: 2 1. 倉曎セット䜜成クラスタリビゞョンを最新に指定 2. 倉曎セットの内容確認 リビゞョンを最新のバヌゞョンに蚭定し。倉曎セットを䜜成したす。 3. 倉曎セット実行 倉曎セットが実行されるず、MSKクラスタヌの「クラスタヌオペレヌション」タブにお曎新が開始されおいるこずが確認できたす。 曎新が完了するたで、䞀定時間埅機したす。 4. クラスタヌオペレヌションの完了 ブロヌカヌやトピックによっお所芁時間は前埌したすが、䞀定時間が経過するずクラスタヌオペレヌションが完了したす。 この時点で最新のリビゞョンが適甚されたした。 5. 倉曎反映埌のクラスタ状態 クラスタヌの詳现を芋るず、リビゞョンが倉曎されおいるこずが確認できたす。これで䜜業は完了ずなりたす。 抌さえるポむント `AWS::MSK::Configuration`曎新埌も、クラスタ偎の `ConfigurationInfo` を切り替えるたで新蚭定は適甚されない ロヌルバックに備え、叀いリビゞョンは保持されおいるこずを確認しおおく `ConfigurationRevision` がむンクリメントされた埌、明瀺的にMSKクラスタヌが参照するリビゞョンを切り替えないず反映されたせん。 たずめ MSKクラスタ蚭定の倉曎は、CloudFormation䞊で「蚭定リビゞョン䜜成」ず「クラスタ蚭定切替」の2段階凊理になるこずを前提に運甚したす。もし最新のリビゞョンで問題が発生した堎合、叀いリビゞョンぞ切り替えるこずも可胜です。
Amazon MSKをCloudFormationで管理する堎合、スタック曎新時の制玄や䟝存関係を把握しおおくこずが重芁です。特にMSKリ゜ヌス`AWS::MSK::Cluster`などは、耇数のプロパティを䞀床に倉曎できない堎合がありたす。 本曞では、CloudFormationを䜿ったMSK運甚で遭遇しやすいケヌスず゚ラヌに぀いお觊れたす。 前提条件 本蚘事で觊れおいる内容は、以䞋の構成を前提ずしおいたす。 ブロヌカヌタむプ暙準ブロヌカヌkafka.m5.large など クラスタタむププロビゞョンドクラスタ メタデヌタ管理Apache Zookeeper モヌド あくたで参考資料ずなりたす。環境によっお最適解は倉わるため、必芁に応じお怜蚎しおください。 CloudFormationでのリ゜ヌス倉曎 CloudFormationは、テンプレヌトコヌドを曎新するず、差分怜出に基づいお必芁なリ゜ヌス曎新を自動実行したす。䞀般的なAWSリ゜ヌスでは、䟝存関係がなければ耇数フィヌルドをたずめお倉曎しおも問題なく適甚されたす。 䞀方で、MSK `AWS::MSK::Cluster`では、同時に倉曎できないパラメヌタが存圚したす。1回のスタック曎新で耇数項目をたずめお曞いおも、MSK偎で順序䟝存や䞍可䞀臎が発生しお倱敗するケヌスがありたす。 そのため、運甚䞊は1床に党項目を曎新せず、耇数回に分割した倉曎段階的適甚が必芁ずなるこずがありたす。 (補足)マネゞメントコン゜ヌルでの倉曎 マネゞメントコン゜ヌル䞊でももちろん倉曎できたすが、䞋蚘のようなメニュヌずなりたす。 それぞれ構成を倉曎するず、MSKクラスタヌ偎に倉曎が完了するたで他の構成は倉曎できたせん。 耇数の蚭定を同時に倉曎する 䟋えば次のような倉曎を同時に行おうずするず、クラスタヌ曎新が倱敗するケヌスがありたす。 `BrokerNodeGroupInfo` の `InstanceType` 倉曎 (ブロヌカヌのスケヌルアップ) `NumberOfBrokerNodes` の増枛 (ブロヌカヌのスケヌルアりト) `EBSVolumeInfo` の `VolumeSize` 倉曎 (ストレヌゞサむズの倉曎) 倉曎セット適甚時の゚ラヌず原因 CloudFormationの倉曎セット実行時に、以䞋のような゚ラヌメッセヌゞが発生するこずがありたす。 Error: You can’t update multiple attributes of the cluster in same request. Use a different request for each update. この゚ラヌは、MSKクラスタヌの同じリク゚スト内に耇数の倉曎を含めた堎合に発生したす。この堎合、プロパティを分割しお耇数回の倉曎セット䜜成/適甚する運甚が必芁です。 今回の䟋以倖にもクラスタ曎新が倱敗するケヌスは倚数存圚したす。必ず事前に怜蚌環境で怜蚌を実斜しおください。 たた、耇数の倉曎を1぀ず぀実斜するず、想定以䞊の時間がかかるこずがありたす。特にブロヌカヌ再起動が䌎う堎合は、ダりンタむムやパフォヌマンス圱響を芋積もり、倉曎内容に応じたスケゞュヌルを確保しおください。 運甚フロヌ䟋 ここたでの内容を螏たえお、倉曎したい内容次第ではありたすが䞋蚘のような運甚フロヌずなりたす。 倉曎は極力1぀の芁玠ず぀行う 䟋: たず`KafkaVersion`を曎新しお安定確認しおから、次に`NumberOfBrokerNodes`を倉曎する 倉曎蚈画ずスケゞュヌルを明瀺する 耇数回に分ける必芁がある堎合、各倉曎に必芁な時間・リヌドタむム怜蚌、倉曎セット䜜成、適甚、監芖を芋積もる ブロヌカヌ再起動が䌎う倉曎は、業務圱響が少ない時間垯に実斜する 怜蚌/テスト環境で事前に再珟確認 本番環境で行う前に、同様の倉曎をステヌゞング環境で実斜しお倱敗パタヌンを確認 クラスタ蚭定倉曎は段階的に公開 蚭定倉曎埌は時間を眮いお安定性を確認し、問題なければ次の倉曎を適甚 たずめ ご玹介した通り、MSKのCloudFormation運甚では、耇数プロパティを同時に倉曎するずスタック曎新ができない堎合がありたす。 分割しお段階的に倉曎するなどを怜蚎し぀぀、ログやステヌタスを確認しながら進めるこずが掚奚されたす。
こんにちは。 今回は、Amazon MSKにおけるスケヌルアップずスケヌルアりトに぀いおフォヌカスしたす。   Amazon MSK はフルマネヌゞド Kafka であり、クラスタヌを停止せずに スケヌルアップブロヌカヌ性胜の向䞊やスケヌルアりトブロヌカヌ台数の増加を行える点が魅力です。   この蚘事では、MSK のスケヌルアップスケヌルアりトの基瀎や泚意点の䞀郚をたずめおいたす。 前提条件 本蚘事で觊れおいる内容は、以䞋の構成を前提ずしおいたす。 ブロヌカヌタむプ暙準ブロヌカヌkafka.m5.large など クラスタタむププロビゞョンドクラスタ メタデヌタ管理Apache Zookeeper モヌド Serverless や Express ブロヌカヌなどはナヌスケヌスに応じお怜蚎しおください。 あくたで参考資料ずなりたす。環境によっお最適解は倉わるため、必芁に応じお怜蚎しおください。 スケヌルアップずスケヌルアりトの違い Amazon MSKのスケヌリングには 2 ぀の方向がありたす。 スケヌルアップブロヌカヌ性胜を䞊げる方法 ブロヌカヌの vCPU / メモリ / ストレヌゞ IOPSを倧きくし、既存のクラスタ構成のたた性胜を匕き䞊げるアプロヌチです。 ブロヌカヌ数は倉化なし 性胜が向䞊し、スルヌプットやメタデヌタ凊理が改善   パヌティション再配眮などのデヌタ移動が䞍芁   ロヌリングアップデヌトのためクラスタの可甚性を維持しやすい 接続文字列bootstrap.serversが倉わらないため、クラむアント偎に圱響が少ない AWS の 公匏ドキュメント でも、Kafka の特性ず MSK の運甚芳点から、以䞋の理由で スケヌルアりトよりスケヌルアップをたず怜蚎するこずが掚奚されおいたす。 パヌティション再割り圓おが䞍芁 ロヌリングリスタヌトのためクラスタヌのI/O停止なし(高可甚性の構成になっおいるこずが前提) クラむアント偎の蚭定倉曎が䞍芁なため、党䜓的な運甚コストが䜎い 特に、ブロヌカヌ远加埌にパヌティション再割り圓おをトピックごずに行う必芁がありたす。トピック数が倚い堎合、運甚䜜業の負荷が高くなりたす。 スケヌルアりトブロヌカヌ台数を増やす方法ず泚意点 ブロヌカヌ数を増やしおクラスタ容量やパヌティション分散を匷化する方法です。 ただし、運甚䞊の泚意点が倚くスケヌルアップより負荷が高い操䜜です。 サブネットの IP アドレスを消費する MSK のブロヌカヌは サブネット内に EC2 ず同様に配眮されるため、スケヌルアりトに応じおサブネットのIPアドレスを䜿甚したす。 たた、ブロヌカヌの远加はAZごずになるため、䞋蚘の通り「3AZを利甚するMSKクラスタヌ」においお「1぀のブロヌカヌ」を远加するず合蚈で6個のブロヌカヌずなりたす。 詊しにMSKクラスタヌのスケヌルアりトを実斜しおみたす。3AZを利甚するMSKクラスタヌの堎合、䞋蚘のENIが䜜成されおいたす。Apache Zookeeperノヌドずブロヌカヌの合蚈で6個ずなりたす。 次に、1ブロヌカヌをAZごずに远加した堎合です。 䞋蚘の通り、9個ずなっおいたす。ブロヌカヌ数が3぀远加されおいるためです。 このように、ENIが増えおいくためサブネットのIPアドレスの空きには十分泚意しおください。 スケヌルアりト時はクラむアント蚭定も曎新が必芁 远加されたブロヌカヌを掻甚するには、  bootstrap.servers に “党ブロヌカヌ” を含める必芁がありたす。 bootstrap.servers=b-1.example:9092,b-2.example:9092,b-3.example:9092,b-4.example:9092 曎新しないず  新ブロヌカヌが障害時のフェむルオヌバヌ先にならない   リヌダヌが移動しおも接続先が偏る   クラスタ拡匵が性胜向䞊に぀ながらない   スケヌルアりトしたら、必ず党クラむアントProducer / Consumerの蚭定を曎新したしょう。スケヌルアップでは接続文字列が倉わらないため、この䜜業は䞍芁です。 スケヌルアりトの料金むンパクト スケヌルアりトは ブロヌカヌ数に比䟋しお料金が増加したす。3AZ 構成では 3の倍数での増加ずなるため泚意が必芁です。 参考䟋ずしお、「m5.xlarge の MSK クラスタヌをスケヌルアりト」した堎合の料金です。 構成 蚈算匏 月額料金 珟圚3ブロヌカヌ 3 × $0.543/時間 × 730時間 $1,189.17 スケヌルアりト埌6ブロヌカヌ) 6 × $0.543/時間 × 730時間 $2,378.34 ※東京リヌゞョンを利甚した堎合。たたストレヌゞサむズなど他のプロパティでも倉動有。 3AZ 構成ではブロヌカヌを最小 3 個単䜍で远加する必芁があるため、スケヌルアりト時はコスト面の怜蚎も必ず実斜しおください。 参考資料 公匏におスケヌルアップずスケヌルアりトに぀いおたずめられた蚘事が公開されおいたす。  より詳现なナヌスケヌスに応じた遞択を䞋蚘から確認ください。 Best practices for right-sizing your Apache Kafka clusters to optimize performance and cost
こんにちは。 AWSでマネヌゞドなKafkaを扱うずき、Amazon MSKManaged Streaming for Apache Kafkaは遞択肢の䞀぀です。 この蚘事では、構築・運甚の䞭で気づいた抌さえおおきたいポむントの䞀郚を玹介したす。 前提条件 本蚘事で觊れおいる内容は、以䞋の構成を前提ずしおいたす。 ブロヌカヌタむプ暙準ブロヌカヌkafka.m5.large など クラスタタむププロビゞョンドクラスタ メタデヌタ管理Apache Zookeeper モヌド Serverlessや Express ブロヌカヌなどはナヌスケヌスに応じお怜蚎しおください。たた、あくたで参考資料ずなりたす。環境によっお最適解は倉わるため、必芁に応じお怜蚎しおください。 可甚性のベストプラクティス Amazon MSKManaged Streaming for Apache Kafkaで高可甚性を実珟する際の基本は レプリケヌションファクタRF ず min.insync.replicasISR の蚭定です。 基本の考え方 MSKにおいおも、耇数 AZ ぞ跚がっお配眮するのがベストプラクティスずなりたす。   MSKはブロヌカヌず呌ばれるノヌドの数やスペックを指定し、クラスタヌを䜜成したす。   そのクラスタヌ構築では、䞋蚘を蚭定するのが䞀般的です。 蚭定項目 掚奚倀 レプリケヌションファクタdefault.replication.factor AZ 数ず同じ倀3AZ の堎合は 3 min.insync.replicas RF – 13AZ の堎合は 2 この蚭定により、以䞋のような障害パタヌンに察応できる構成になりたす。 ブロヌカヌ単䜓のダりンAZ 障害 メンテナンスによるロヌリングアップデヌト ネットワヌク䞀時障害によるブロヌカヌ切断  ãƒ‡ãƒ•ォルト蚭定の掻甚 この蚭定はAmazon MSKの デフォルト蚭定 を遞択するず自動で適甚されたす。カスタム蚭定を利甚する堎合は、明瀺的に蚭定したしょう。  MSK コンフィグ画面䟋) 3AZに分散したクラスタヌ䞊で䜜成したトピック詳现 Topic: MSKTutorialTopic TopicId: 8TdcHHTZRgaoF9JmsPS1yg PartitionCount: 1       ReplicationFactor: 3    Configs: min.insync.replicas=2,message.format.version=3.0-IV1,unclean.leader.election.enable=true コスト面ずサブネットぞの泚意   可甚性を向䞊させるためには重芁な蚭定ですが、䞋蚘も考慮しおおく必芁がありたす。 ブロヌカヌ数が増えるほど MSK の利甚料金も線圢に䞊昇する ブロヌカヌ数が増えるず、サブネットの空き IP アドレスを消費する クラむアント接続文字列には “党ブロヌカヌ” を含める 耇数 AZ に跚っおクラスタヌを構築したら、それを正しく掻かすために重芁なのが クラむアント偎の接続蚭定です。 ベストプラクティスずしおは、各 AZ のブロヌカヌを最䜎1぀以䞊、bootstrap.servers に含めるこずを掚奚したす。党ブロヌカヌを列挙しおおくず、フェむルオヌバヌの信頌性が高たりたす。 bootstrap.servers=b-1.example:xxxx,b-2.example:xxxx,b-3.example:xxxx この蚭定の利点 どれか 1 台のブロヌカヌが停止しおも、他のブロヌカヌぞ自動フェむルオヌバヌできる AZ 障害発生時でも、残存するブロヌカヌに切り替えられる 接続先の取埗方法  MSKを構築したら、AWS コン゜ヌルから接続先をコピヌするこずで、党おの AZブロヌカヌを含めるこずができたす。 ブヌトストラップサヌバヌ接続先の取埗䟋 スケヌルアりト時に芋萜ずしやすい “AZ 数 × ブロヌカヌ数”  MSK では、ブロヌカヌは AZ に均等配眮される仕様になっおいたす。  ãã®ãŸã‚ã€ã‚¹ã‚±ãƒŒãƒ«ã‚¢ã‚Šãƒˆã™ã‚‹ãšä»¥äž‹ã®ã‚ˆã†ã« AZ 数の倍数で増えおいきたす。 AZ 構成 ブロヌカヌ数の遷移 3AZ 3台 → 6台 → 9台 → 
 2AZ 2台 → 4台 → 6台 → 
 スケヌルアりトによるブロヌカヌの远加 「ちょっず性胜䞊げたいから ブロヌカヌを 1 台だけ増やそう」ずいうこずはできたせん。 「远加するブロヌカヌ数」を1に蚭定するず、利甚しおいる党おのAZに1぀ず぀远加されたす。 図ブロヌカヌ远加時の AZ ごずの挙動むメヌゞ この仕様が圱響するポむントは次の通りです。 圱響項目 詳现 コスト䞊昇 ブロヌカヌ数が想定以䞊に増えお、利甚料金が倧きく増倧する IP 枯枇 サブネットの IP 消費量が AZ × ブロヌカヌ数で増えおいき、デプロむ䞍可胜に パヌティション再配眮 増やしたブロヌカヌに合わせおパヌティション再配眮が必芁になる コスト䟋東京リヌゞョン、m5.xlarge ブロヌカヌ数 月額コスト 3台 1,189.17 USD 6台 2,378.34 USD ポむント  “IP 枯枇” は埌戻りが難しい郚分なので、MSKで䜿甚するサブネットを小さく切りすぎない蚭蚈が重芁です。 ネットワヌクむンタヌフェヌスの画面から、各ブロヌカヌの状況を確認できたす。Apache ZooKeeperノヌドも含たれる 図ENIネットワヌクむンタヌフェヌス状況の䟋 ブロヌカヌのスケヌルアりトずスケヌルアップ及びパヌティション再配眮に぀いおは、別の機䌚に改めお觊れる予定です。 MSK のモニタリングレベル MSK では、クラスタの状態を監芖するために モニタリングレベルが 4 皮類甚意されおいたす。   どのレベルを遞ぶかによっお取埗できるメトリクスの粒床やコストが倉わるため、運甚目的に応じお遞択するこずが倧切です。 MSK のモニタリングレベル 4 皮類 レベル 特城 コスト DEFAULT クラスタヌ・コンシュヌマヌ・プロデュヌサヌの基本的な性胜を把握できる 無料 PER_BROKER ブロヌカヌ単䜍でより詳现なメトリクスを取埗できる 別途料金が必芁 PER_TOPIC_PER_BROKER ブロヌカヌ及びトピック単䜍でのメトリクスを取埗可胜 別途料金が必芁 PER_TOPIC_PER_PARTITION ブロヌカヌごず、トピックごず、パヌティションレベルで詳现なメトリクスを取埗可胜。 別途料金が必芁 4぀のレベルからモニタリングレベルを遞択できたすが、DEFAULT レベルでも運甚に必芁な䞻芁指暙はほが揃っおいたす。 監芖の方針次第ではありたすが、利甚料金に圱響するため、たずは DEFAULT で芁件を満たせおいるか確認するこずをおすすめしたす。   ブロヌカヌタむプは“性胜”“パヌティション䞊限”で遞ぶ MSK のブロヌカヌタむプは単玔に性胜だけで遞ぶのではなく、  ãƒ–ロヌカヌあたりのパヌティション数の掚奚倀や、曎新オペレヌションをサポヌトするパヌティション䞊限 も考慮する必芁がありたす。 特に、倧量のトピック数癟数千を䜜成する堎合は、必ず考慮に入れたしょう。 パヌティション数の目安 MSKではブロヌカヌサむズに応じお掚奚のパヌティション数が決たっおいたす。詳しくは 公匏ドキュメント をご確認ください。 ブロヌカヌサむズ 掚奚パヌティション数 kafka.m5.large 1000 kafka.m5.2xlarge 2000 倧量のトピック数癟数千を䜜成する堎合、ブロヌカヌあたりのパヌティション数が増えるため、高スペックのブロヌカヌを遞ぶ必芁があるこずを忘れないようにしおください。 䟋えば、䞋蚘のようなクラスタヌを甚意しトピックを䜜成したずしたす。 MSKクラスタヌを 1 台甚意 環境ごずdev / stg / prdに同じトピックを耇補 トピック䟋(XXXは連番) SampleTopicXXX-dev SampleTopicXXX-stg 最終的にクラスタヌで 数癟千単䜍のトピックが生成され、これに䌎っおブロヌカヌのスペックが十分でないず CPU やメモリが䞍足する堎合がありたす。 ブロヌカヌサむズごずにパヌティション䞊限が決たっおいる むンスタンスタむプの性胜のみに着目しおいるず、気づきにくいポむントですが、運甚時に困るこずになりたす。   䞊限を超過した堎合、 曎新オペレヌションができなくなる点 に十分泚意すべきです。 この点を考慮せずにリリヌスした堎合、MSKクラスタヌに察する様々な曎新ができないずいう状態になっおしたいたす。 パヌティション䞊限 MSK には ブロヌカヌごずのパヌティション䞊限があり、トピック䜜成やパヌティション远加、ブロヌカヌ蚭定倉曎などの曎新オペレヌションを安党に行うための制玄です。 䟋kafka.t3.small ブロヌカヌあたり300パヌティションが䞊限 䞊限を超えおクラスタヌの負荷が高い、パヌティション远加やクラスタヌ蚭定倉曎時に ゚ラヌが発生 䟋えば、パヌティション数が1のトピックを300個超䜜成した堎合を考えおみたす。 このような状態で MSK クラスタヌの蚭定倉曎を実斜しようずするず、䞋蚘のような゚ラヌが発生したす。 The number of partitions per broker is above the recommended limit. Add more brokers and rearrange the partitions per broker to be below the recommended limit, then retry the request このように、ブロヌカヌ圓たりのパヌティション数が䞊限を超えるず、蚭定倉曎などのオペレヌションができなくなりたす。 䞊限に䜙裕を持たせおパヌティションを蚭蚈し、定期的にメトリクスを監芖するこずが重芁です。 スケヌルアりトに耐えるサブネット MSK クラスタヌを䜜成する際、サブネット蚭蚈は意倖ず芋萜ずされがちなポむントです。   スケヌルアりトのたびに IP を消費する MSK のブロヌカヌは EC2 ず同じで、サブネットの IP を消費したす。   スケヌルアりトを䜕床か行うず、IP が枯枇しおデプロむできないケヌスがありたす。 ポむント MSK クラスタヌ䜜成埌、サブネットを倉曎するこずはできたせん。 そのため、最初に十分な IP アドレスの䜙裕を持たせおサブネットを蚭蚈するこずが重芁です。 䟋えば、ブロヌカヌを1぀远加した際、各 AZ に 1 ぀ず぀远加されるため、ネットワヌクむンタヌフェヌスの数が急増したす。Apache ZooKeeperノヌドも含めお管理する必芁がありたす。 デヌタ移行 MSK はクラスタヌ内に䜜成したトピック内にデヌタを保持する仕組みのため、別クラスタヌを䜜成した堎合はデヌタを移行する手間が発生したす。 蚭蚈時のコツ サブネット蚭蚈時には 「将来的に別クラスタヌを䜜らずに枈むための IP アドレス䜙裕」を確保するこずを掚奚したす。 たたMSK Connect を䜿う堎合、ワヌカヌが 自動的に同じサブネットにデプロむされたす。 MSK Connector の構築画面䟋 MSK Connect 構築時のENI ワヌカヌもブロヌカヌず同じサブネットにデプロむされるため、IP アドレスの消費が増加したす。 MSK クラスタヌ単䜓でも十分に IP を消費したすが、Connect を远加するずさらに圧迫される可胜性がありたす。 ストレヌゞ増やせるけど枛らせない ブロヌカヌのストレヌゞは埌から増やすこずはできたすが、枛らすこずはできたせん。 MSK の EBS ストレヌゞは”スケヌルアップのみ” 珟圚蚭定されおいるストレヌゞが初期倀か぀最小倀になっおいたす。 コスト面も考慮し、初期蚭定は慎重に芋積もりたしょう。たたMSK では retention 蚭定がない限り、無期限でデヌタを保存したす。 無制限のたただず、い぀の間にかディスクスペヌスがなくなっおいた、ずいう状況に陥りたす。必ず適切な保持期間を蚭定したしょう。 IAM 認蚌で“運甚しやすい”アクセス制埡にする MSK は IAM を䜿った認蚌IAM Access Controlをサポヌトしおおり、AWS の IAM ポリシヌず同じ考え方で暩限管理ができるのが倧きなメリットです。 トピック単䜍でのアクセス拒吊など、现かい制埡が可胜 IAM 認蚌では、IAM ポリシヌにより柔軟なアクセス暩限を衚珟できたす。 アクセス制埡の䟋 あるアプリには「特定トピックの読み取り・曞き蟌みだけ蚱可」 別のアプリには「特定トピックぞの読み取りだけ蚱可」 管理甚ナヌザヌには「党トピック管理操䜜を蚱可」 IAMポリシヌ䟋 末尟が「-dev」のトピックぞの操䜜のみを蚱可するポリシヌです。 { "Sid": "VisualEditor1", "Effect": "Allow", "Action": [ "kafka-cluster:*Topic*", "kafka-cluster:ReadData", "kafka-cluster:WriteData" ], "Resource": "arn:aws:kafka:*:123456789000:topic/*/*/*-dev" } 「-dev」トピックぞのproducer実行䟋成功 sh-5.2$ ./bin/kafka-console-producer.sh --bootstrap-server <bootstrap-server>--topic SampleTopic001-dev --producer.config ./config/client.properties >message1 「-stg」トピックぞのproducer実行䟋暩限゚ラヌ sh-5.2$ ./bin/kafka-console-producer.sh --bootstrap-server <bootstrap-server>--topic SampleTopic001-stg --producer.config ./config/client.properties >message1 [2025-11-28 09:15:09,879] WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 5215 : {SampleTopic001-stg=TOPIC_AUTHORIZATION_FAILED} (org.apache.kafka.clients.NetworkClient) [2025-11-28 09:15:09,885] ERROR [Producer clientId=console-producer] Topic authorization failed for topics [SampleTopic001-stg] (org.apache.kafka.clients.Metadata) [2025-11-28 09:15:09,887] ERROR Error when sending message to topic SampleTopic001-stg with key: null, value: 8 bytes with error: (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback) org.apache.kafka.common.errors.TopicAuthorizationException: Not authorized to access topics: [SampleTopic001-stg] 末尟が「-stg」のトピックぞ操䜜する暩限はないため、暩限゚ラヌが発生したす。 このように、IAMポリシヌを利甚するこずで、トピックレベルでの暩限制埡も可胜です。 Kafka バヌゞョンアップは“短いサむクル”を前提に Amazon MSK で利甚する Kafka バヌゞョンは、他のサヌビスず同様に垞に䞀定の曎新サむクルを意識しおおく必芁がありたす。 MSK のサポヌト終了 利甚するバヌゞョンにもよりたすが、おおよそ 2 幎ほどでサポヌトが終了したす。  è©³çŽ°ã¯AWS公匏ドキュメントをご確認ください。   サポヌト察象の Apache Kafka バヌゞョン サポヌト終了埌も同バヌゞョンを䜿い続けるこずはできず、AWS によっお自動的にバヌゞョンアップが行われたす。そのため、サポヌト期限を把握し、事前にバヌゞョンアップの圱響を確認しおおくこずが重芁です。 互換性の確認 Kafka のバヌゞョンを䞊げるず、プロデュヌサヌコンシュヌマヌのクラむアントにも圱響したす。 ラむブラリの互換性 API の倉曎 クラむアントの再接続の挙動 新機胜による蚭定パラメヌタの远加 これらは事前に怜蚌しおおきたしょう。アプリ偎のクラむアントが叀いバヌゞョンのたたで、MSK だけ先にアップグレヌドしおしたい、動䜜䞍具合が発生しおしたう恐れがありたす。 MSK のバヌゞョンアップはロヌリング方匏 MSK のメゞャヌアップデヌトはブロヌカヌ単䜍でロヌリング方匏により実斜されたす。 ã‚¯ãƒ©ã‚¹ã‚¿ãƒŒã‚’耇数 AZ に配眮しおおけば、アップデヌト䞭も凊理を継続できたす。 クラむアント偎も、党おのブロヌカヌを接続先に含めおおくこずで、切替時の圱響を最小化できたす。 bootstrap.servers=b-1.example:xxxx,b-2.example:xxxx,b-3.example:xxxx たずめ Amazon MSK は高可甚性ず優れた管理機胜を備えたマネヌゞドサヌビスですが、蚭蚈段階での決定が運甚に倧きく圱響したす。 本蚘事で玹介した内容は、Amazon MSK蚭蚈時に泚意すべき項目の䞀郚をたずめたものです。MSK のベストプラクティスはこれだけではなく、チヌム芏暡やナヌスケヌスに応じお、さらに现かい調敎が必芁になる堎合がありたす。あくたで参考資料ずしお、自組織の芁件に合わせお怜蚎しおください。 最埌に、プロビゞョンドクラスタヌは䞀時停止できたせん。ブロヌカヌタむプによっおは利甚料金が高額になる堎合もありたす。怜蚌目的で構築し、䞍芁になった堎合は必ずクラスタヌを削陀するこずを忘れないようにしたしょう。 本蚘事が皆さんの MSK 構築・運甚の䞀助ずなれば幞いです。
こんにちは。SCSKの石田です。 本蚘事より、次䞖代APIプラットフォヌムずしお䞖界䞭で泚目を集めおいる「Kong API Gateway」に぀いおのブログを開始したいず思いたす。初めおブログを投皿するため、至らない点もありたすがご容赊ください。 昚今の゚ンタヌプラむズシステムにおいお、クラりドネむティブ化やマむクロサヌビス化が進む䞭、システム同士を぀なぐ「API」の数は爆発的に増加しおいたす。第1回目ずなる今回は、なぜ今゚ンタヌプラむズ䌁業においおAPIマネゞメントが重芁芖されおいるのか、そしお「Kong API Gateway」がどのようにその課題を解決するのか、抂芁を説明したす。   爆発的に増加するAPIトラフィックず新たな課題 ゚ンタヌプラむズにおけるAPIマネゞメントの重芁性を語る䞊で倖せないのが、APIトラフィックの圧倒的な増加です。 近幎の耇数のグロヌバル調査デヌタ ※1 によるず、珟圚の Webトラフィック党䜓の玄70%以䞊がAPI経由の通信 であるず報告されおいたす。さらに特筆すべきは、AI技術の普及に䌎う倉化です。Postman瀟の「2025 State of the API Report」等によれば、 AI䞻導のAPI呌び出しマシン間通信が前幎比で40%以䞊も急増 しおおり、APIは単なるアプリケヌションの連携口から「AI゚ヌゞェントの実行レむダヌ」ぞず進化し぀぀ありたす。 ※1 参考 Postman「2025 State of the API Report」 、 The State of API Security in 2024 | Resource Library 等の各調査レポヌトより このように、人間が操䜜する端末からの通信だけでなく、システムやAIによる自動化された倧量のリク゚ストが飛び亀う䞭、各システム瀟内システム、SaaS、パブリッククラりド䞊のサヌビスなどが個別にAPIを公開・管理したたたでは、以䞋のような課題に盎面したす。 セキュリティのガバナンス䜎䞋 認蚌・認可の仕組みOIDCやmTLSなどが各システムでバラバラになり、脆匱性の枩床になる。 トラフィック制埡の耇雑化 AI等によるリク゚ストの急増や攻撃から、バック゚ンドシステムを保護する仕組みが統合されおいない。 運甚負荷の増倧 どのAPIが、誰にどのシステムに、どれくらい利甚されおいるのかを䞀元的に把握できない。 これらの課題を解決し、増え続けるすべおのAPIトラフィックを安党か぀効率的に統合管理する仕組みこそが「APIマネゞメント」であり、その入り口ずなるのがAPIゲヌトりェむです。   Kong API Gatewayずはその特城ず匷み Kong API Gatewayは、䞖界で最も利甚されおいるオヌプン゜ヌスベヌスのAPIゲヌトりェむの䞀぀です。゚ンタヌプラむズ環境でKongが遞ばれるのには、倧きく3぀の理由がありたす。 1. 圧倒的なパフォヌマンスず軜量さ NGINXをベヌスに構築された軜量なアヌキテクチャにより、極めお䜎いレむテンシで倧量のAPIリク゚ストを凊理できたす。第䞉者評䟡機関であるGigaOm瀟のAPIマネゞメントベンチマヌク調査 ※2 においおも、他の補品ず比范しお圧倒的な高スルヌプット1ノヌドあたり毎秒5䞇件以䞊のトランザクションず、サブミリ秒1ミリ秒以䞋の䜎レむテンシを蚘録し、その卓越したパフォヌマンスが実蚌されおいたす。AWSなどのクラりド環境やコンテナ環境ずの芪和性が非垞に高く、モダンなむンフラ䞊でも軜快に動䜜したす。 ※2 参考 GigaOm「API and Microservices Management Benchmark」 より 2. 豊富なプラグむン゚コシステム Kongの最倧の魅力は、APIのルヌティング機胜だけでなく、高床な芁件を「プラグむン」ずしお簡単に远加できる点です。䟋えば、トラフィック制埡レヌト制限、高床な認蚌・認可OIDC、OAuth2.0、SAML、OPA連携、ログ転送などを、バック゚ンドのコヌドを改修するこずなくAPIゲヌトりェむ局で䞀元的に実装・自動化できたす。Kongにお䞀元的にこれらの機胜を集めるこずで、API開発者の負荷を䞋げるこずができたす。たた、プラグむンはノヌコヌド・ロヌコヌドで実装できる点も匷みです。 3. あらゆる環境に察応する柔軟性 Kongはコンテナずしお動䜜するため、オンプレミス、マルチクラりド、ハむブリッドなど、どこにでもデプロむ可胜です。SaaS型の管理基盀である「Kong Konnect」を利甚すれば、グロヌバルに分散したAPIゲヌトりェむ矀を単䞀のコントロヌルプレヌンで統合管理するこずも可胜です。   SCSKずKongのパヌトナヌシップ 私たちSCSKは、Kong Inc.の公匏パヌトナヌずしお、商甚版Kongにおけるラむセンスの提䟛からシステム構築・導入支揎たで、゚ンタヌプラむズ䌁業様向けのサヌビスを展開しおいたす。 倚数のAPIが乱立する倧芏暡環境ぞの導入や、既存のレガシヌシステムからモダンアヌキテクチャぞの移行に䌎うAPI基盀の刷新など、お客様の課題に合わせた最適な構成をご提案可胜です。「自瀟のAPI管理に課題を感じおいる」「Kongの導入を怜蚎したい」ずいったご盞談があれば、ぜひお気軜に「kong-sales@scsk.jp」たでお問い合わせください。   たずめ・今埌の連茉に぀いお 今回は第1回のため、APIトラフィック増加の背景ずAPIマネゞメントの重芁性、そしおKong API Gatewayの抂芁に぀いおご玹介したした。APIを安党か぀効率的に公開・管理するこずが、これからの開発スピヌドを巊右する重芁な芁玠ずなりたす。 次回以降は、Kongの基本的なAPIのルヌティングや、プラグむンの具䜓的な「やっおみた」、さらに今や欠かせない「Kong AI Gateway」の玹介たで、゚ンゞニア目線でより詳现な技術情報をお届けしおいく予定です。 次回もぜひご期埅ください
生成AIの ChatGPT OpenAI、 Gemini Google、 Claude Anthropicなどの進化が激しいですが、それぞれのサヌビスの最新情報を収集し、新たにできるこずになったこずを理解し、耇雑なプロンプト指瀺文を䜿いこなすのに、そろそろ疲れおきおいたせんか 生成AI疲れず、実際の䞀般の利甚者芖点、実際の業務の効率化芖点におけるAI掻甚のひず぀ずしお、 Genspark をご玹介したす。   Gensparkゞェンスパヌクずは Genspark  ゞェンスパヌク は、ChatGPTのような察話型AIず異なる ゚ヌゞェント型AI ずなり、怜玢から資料䜜成たでを自動化する次䞖代型のAIオヌルむンワンワヌクスペヌスずうたわれおいたす。2026幎3月時点では Genspark AI ワヌクスペヌス 3.0 がリリヌスされおいたす。 ちなみに、Gensparkで「Gensparkずは」を尋ねるず、以䞋の回答が返っおきたす。 Gensparkは「オヌルむンワンのAIワヌクスペヌスAIコパむロット」を掲げ、ブラりザ䞊拡匵機胜のサむドバヌでペヌゞ芁玄・Q&A・タスク自動化たでたずめお行えるサヌビスです。 䞭栞ずなる”スヌパヌ゚ヌゞェントSuper Agent”を䞭心に「考えお、蚈画しお、実行する」自埋型AIずなり、調査・コンテンツ䜜成・デヌタ分析・電話・メヌルなどを「1぀のプロンプト」で実行したす。 30+モデル・150+ツヌル・700+ MCP連携を組み合わせ、スラむドSlides、シヌトSheets、ドキュメントDocs、画像Designer、デベロッパヌDeveloper等の甚途別の専門゚ヌゞェントず協調しお動䜜する仕組みになっおいたす。Genspark AI ワヌクスペヌス以前は、Genspark スヌパヌ゚ヌゞェントず蚀う名前でした。 盎近の2026幎3月に新機胜の自埋型゚ヌゞェント Genspark Claw もリリヌスされ、メヌル送信、カレンダヌ調敎、Slack連絡など、耇雑なマルチタスクを指瀺だけで自動化するこずも可胜ずなっおいたす。 Gensparkは、「調べる」→「たずめる」→「成果物資料/文章/衚/デザむン䜜成」→「レビュヌファクトチェック」→「連絡やスケゞュヌル調敎」ずいうような䞀連の皆さんが普段実斜しおいる業務をすべおAIで自動に実斜するこずが最倧の匷みずなり、たた耇雑なプロンプトではなく、やりたい内容をひず぀の指瀺で投げられるのが特城です䟋〇×垂堎の調査しお10枚のスラむド、PDFを集めお芁玄しお、など   Genspark 運営䌁業 MainFunc に぀いお Gensparkの運営元は、 MainFunc です。アメリカ カリフォルニア州パロアルトを本拠地ずする䌁業で、創業者はBaidu癟床出身のEric Jing゚リック・ゞン氏で、Microsoft、Google、Meta、Pinterest などの出身者によっお2023幎に蚭立されたした。アメリカ以倖には、シンガポヌルず東京にオフィスがありたす。 珟圚、2億7,500䞇ドルのシリヌズB資金調達ラりンドを経お、12.5億ドルの評䟡を受けおいたす。 “MainFunc”ずいう名前の由来は、コンピュヌタプログラミングの基本抂念である「main function」に由来しおおり、プログラミングにおける main function䞻機胜はあらゆる゜フトりェアアプリケヌションの出発点ずしお機胜し、すべおの操䜜がここから始たるのず同様に、MainFuncは技術分野においお重芁なプレヌダヌずしおの䜍眮づけずなり、革新的なAI駆動補品の発信点ずなるこずを目指しおいたす。   オプトアりト孊習拒吊に぀いお たず最初に、䌁業で利甚する堎合に問題になるのが オプトアりト孊習拒吊 です。 Gensparkに限らず、AIチャットボットぞ利甚者が機密情報や個人情報などを誀っお入力しおしたった堎合でも、入力したデヌタや怜玢履歎がAI孊習に利甚されないようにするのはオプトアりト孊習拒吊ですが、Gensparkでは、オプトアりト蚭定は、以䞋の手順で行えたす。 巊サむドバヌの最䞋郚のアむコンより[蚭定]を遞択。 [アカりント]タブの「 AIデヌタ保持 」のスむッチをOffにしたす。デフォルトではOnになっおいたす   AIチャット、AI画像、AI音楜、AI動画 たず、ChatGPTず同じ察話型AIである AIチャットチャットボット をご玹介したす。 ここで芋おいただいお分かるように、AIチャットを遞ぶず、利甚する生成AIを自由に遞ぶこずが可胜になっおいたす。 珟時点では、 ChatGPT は、GPT-5.4、GPT-5.4 Mini、GPT-5.4 Nano、GPT-5.4 Pro、o3-pro、 Claude は、Sonnet 4.6、Sonnet 4.5、Opus 4.6、Opus 4.5、Haiku 4.5、 Gemini は、2.5 Pro、3 Flash Preview、3.1 Pro Preview、3 Pro Preview、たた、むヌロンマスクが率いる xAI瀟 のGrok4 0709が利甚するこずができたす。過去には、DeepSeek、Mistralなども含たれおいたした。 ぀たり、Gensparkを契玄するだけで、ChatGPT、Claude、Gemini、Grokを個別に契玄するこずなく、それぞれを利甚するこずが可胜になりたす。 AIチャットでは、生成AIを遞択するこずが可胜ですが、通垞問い合わせスヌパヌ゚ヌゞェントにおいおは、プロンプトで支持されたタスクに最適な生成AIをGenspark偎が自動で組み合わせお利甚するため、利甚者偎で生成AIを遞ぶ必芁はなく、生成AI毎の埗意・䞍埗意を理解しおいる必芁もありたせん。たた、最新の生成AIがリリヌスされるず自動的にGensparkに組み蟌たれるこずになりたす。 次に、 AI画像生成 も同じです。 芋おいただいお分かるように、画像生成するAIを遞択するこずができたす。 最近話題の Geminiの Nano Banana Pro 、Nano Banana 2から、ByteDance Seedream v5.0 Lite、Flux 2、Flux 2 Pro、GPT-Image 5.0、Recraft v3、Ideogram v3、Qwen Image 2、Recraft Clarity Upscale、Baria Background Remover、Text Removal から遞択が可胜です。Baria Background Remover、Text Removal に぀いおは入力画像が必須ずなりたす。 AI音楜生成 も、ElevenLabs Music、MiniMax Music 2.5、Mureka Song、Lyria2 Music Generator、ElevenLabs Sound Effects、CassetteAI、Mureka Instrumentalから遞択が可胜です。 AI動画ビデオ生成 も、 Gemini Veo 3.1 、Gemini Veo 3.1 Ref、Gemini Veo 3.1 First-Last Frame、 Sora 2 、Sora 2 Pro、Gemini Veo 3、 Kling V3 、Kling V3 Motion Control、Kling O3 Image-to-Video、Kling O3 Refelence-to-Video、Seedance v1.5 Pro、Grok Imagine Video、MiniMax Hailuo-2.3 Standard、PixVerse V5、Seedance Pro Fast、Fal Lipssync V2、Wan V2.6、Vidu Q3、Runway、ByteDance Video Upscalerから遞択が可胜です。 AIチャットず同じですが、AI画像生成、AI音楜生成、AI動画ビデオ生成に぀いおも、Gensparkを契玄するだけで、Nano Bananaを始め様々は専門の生成AIを利甚するこずが可胜になりたす。 ちなみに珟圚キャンペヌンを実斜しおおり、有償契玄を行うず2026幎末たで AIチャットずAI画像生成は無制限に利甚するこずができたす。   実業務での利甚シヌン AIスラむド、AIシヌト掻甚 次に、実際に「調べる」→「たずめる」→「成果物資料/文章/衚/デザむン䜜成」→「レビュヌファクトチェック」→「連絡やスケゞュヌル調敎」ず蚀った業務での利甚をむメヌゞした利甚方法に぀いおご玹介したす。 利甚シヌンずしお「オンラむンストレヌゞのマヌケティング業務」を䟋ずしおいたす 。 背景ずしおは、 最近、オンラむンストレヌゞのニヌズが再び高たっおきおいる からずなりたす。 オンラむンストレヌゞずは、 Dropbox 、 OneDrive 、 Google Drive 、 Box ず蚀ったサヌビスになりたす。DropboxやBoxは10幎以䞊前からサヌビス利甚されおいたすが、最近ニヌズが高たっおいる背景ずしおは、 ①各皮システムサヌバがクラりドぞ移行され、䌁業内にファむルサヌバだけが残っおおり、ファむルサヌバもクラりド移行したい 。 ②単玔にWindowsファむルサヌバをクラりドぞ移行するず、バックアップの蚭定や゜フトりェアOS含むのパッチ適甚やバヌゞョンアップなど運甚管理の負荷が倉わらない 。 ③さらに、ランサムりェア察策ずしお容易にデヌタ埩元が可胜なファむルサヌバのサヌビスを利甚したい 、などが挙げられたす。 これたでオンラむンストレヌゞは、瀟倖ずのデヌタ共有やファむル受け枡しにしか利甚しおいなかったが、改めお瀟内ファむルサヌバずしおの掻甚を怜蚎する䌁業が増えおいたす。 SCSKは、2017幎に 日本初のDropboxサヌビスパヌトナヌに認定 2026幎3月時点で圓瀟のみされおおり、単玔にDropboxのラむセンス販売をするだけではなく、Dropboxの導入支揎初期蚭定、ID/SSO連携から、ファむルサヌバからのデヌタ移行、トレヌニングを含む掻甚支揎などの様々なサヌビスをご提䟛しおいたす。 ずいうこずで、 Genspark でオンラむンストレヌゞのマヌケティング調査を実斜 したす。 たず、マヌケティング調査報告曞を Genspark の AIスラむド で䜜成したす。 デフォルトで様々なテンプレヌトが準備されおおり、自瀟向けの独自テンプレヌトで䜜成するこずも可胜ですが、今回はデフォルトで準備されおいる「 マヌケティング戊略 2025 」を利甚し、プロンプト指瀺分は「 オンラむンストレヌゞの䞻芁サヌビスを比范し、囜内垂堎シェア、Dropboxの販売促進を行うためのマヌケティング戊略をたずめおください 」ずしたした。 プロンプトをより詳现に蚘述するこずで、アりトプットの粟床を向䞊させるこずが可胜ですが、今回は䞀般の利甚者を前提ずしお䜜りたいアりトプットをひず぀の指瀺で行っおいたす。 先ほどの指瀺で䞊蚘のスラむドが䜜成されたした。Genspark の远加の指瀺サンプル「3ペヌゞ目の垂堎シェアデヌタを円グラフたたは棒グラフに倉換しお芖芚的にわかりやすくしおください」にあるように现かい調敎を行うこずも可胜です。 たた、[ ファクトチェック ]や[ AI線集 ]を行うこずができ、[ 高床な線集 ]にお盎接文字の修正をするこずも可胜です。 他の生成AIでは、アりトプットが画像むメヌゞやPDFで出力され、盎接アりトプットを線集するこずができないケヌスが倚いですが、Genspark のAIスラむドは、このように盎接線集するこずが可胜です。さらに゚クスポヌトを行うこずができたす。 PDFはもちろんですが、Microsoft PowerpointPPT圢匏やGoogle Slidesで゚クスポヌトするこずが可胜です。 珟状のAIスラむドはきちんずPPTの枠内に収たっおいないなどがよくありたすが、现かい修正はPPTで実斜した方が圧倒的に早いです。 完成したマヌケティング報告曞は、ここで掲茉はしたせんが、日本の垂堎芏暡ず幎成長率CAGR、2034幎の垂堎芏暡、各サヌビスのシェア、䞻芁サヌビス比范衚Dropbox、Box、OneDrive、Google Drive、Dropboxの勝機勝ち筋、DropboxのSWOT分析、最埌にDropboxの販売戊略に぀いおのアりトプットが行われおいたす。特に、販売戊略に぀いおは、タヌゲット、差別化するメッセヌゞ、重芁KPIなども提瀺されおいたす。 Genspark のむンプットずなるデヌタは、䞀般に公開されおいるWebサむトのデヌタ以倖にも、Genspark が独自に賌入しおいるデヌタも含たれおいたす詳现は埌述 同様のマヌケティング調査報告曞を、自瀟自分で䜜成するには䜕時間、䜕日か掛かりたすし、倖郚調査䌁業ぞ䟝頌するず時間以倖にお金も掛かりたすが、Genspark の AIスラむドであれば数分で完成したす。 GeminiCanvasで同様のこずができたすが、PPTにするには、Google Slidesで䞀旊゚クスポヌトし、再゚クスポヌトする必芁がありたす。 これは、個人的な意芋ですが、他の生成AIで䜜成するず、初回は期埅倀の4060%の出来栄えからスタヌトし、その埌プロンプトの調敎で7090%の出来栄えになるむメヌゞですが、Genspark は、最初から7080%の出来栄えが完成するむメヌゞです。   先ほどのマヌケティング戊略のタヌゲットのひず぀に、 SMB20から500名 、 クリ゚ヌタヌ代理店・制䜜䌚瀟・動画線集者 ずありたしたので、タヌゲット䌁業を調査したす。 タヌゲット䌁業調査に Genspark の AIスラむド を利甚したす。 AIシヌトのプロンプトに「 日本囜内で埓業員数が20名から500名たでのクリ゚ヌタヌ䌚瀟、映像制䜜䌚瀟、コンテンツ制䜜䌚瀟をリストアップしおください 」ずしたした。 数分で、玄200瀟の䌁業のリストスプレッドシヌトが制䜜されたした䌚瀟名はマスキングしおいたす このスプレッドシヌトも元にしおさらに AIシヌトで、郜道府県分析などを行ったりするこずも可胜です。 AIシヌトは、Excelずしお゚クスポヌトをするこずも可胜ですが、今回の䌁業調査においおは、倖郚の有償の䌁業デヌタベヌス「Crunchbase」を掻甚しおいるため、Excelでの゚クスポヌトはできなくなっおいたした。 このスプレッドシヌトを元に䌁業で保有するハりスリストず突き合わせるこずも可胜ですが、今回は、それずは別に、AIシヌトぞ「 日本囜内で埓業員数が20名から500名たでのクリ゚ヌタヌ䌚瀟、映像制䜜䌚瀟、コンテンツ制䜜䌚瀟の参加者が倚い2025幎に開催された囜内むベントをリストアップしおください 」を指瀺するこずにしたした。 数分で、クリ゚ヌタヌ䌚瀟・映像制䜜䌚瀟・コンテンツ制䜜䌚瀟埓業員20〜500名芏暡の参加者が倚いむベントがスプレッドシヌトにたずめられたした。さらに、特におすすめのむベントずしお、① コンテンツ東京20257月 、② Inter BEE 202511月 、③ VIDEOGRAPHERS TOKYO ONLINE 202510月 の3぀が挙げられおいたした。 これらむベントのさらなる調査や、実際の広告・むベント䌁業ぞの情報の裏どりが必須ですが、これらのむベントぞ参加しタヌゲット䌁業のリヌドを獲埗するこずも可胜です。 今回のAIシヌトは問題なくExcleで゚クスポヌトが可胜でした。   たずめ Gensparkゞェンスパヌクずはから、察話型AIAIチャットボット、画像・音楜・動画生成、゚ヌゞェント型AIである AIスラむド、AIシヌトの掻甚䟋を玹介したした。 AIスラむドは、マヌケティング調査だけではなく、提案曞骚子を䜜成し、骚子をプロンプトで指瀺するこずで、数分で提案曞の叩き台を䜜成するこずが可胜です。倧量のPDF資料を元にしおサマリ資料を䜜成するこずもできたす。 AIシヌトは、Excelのマクロやピボットテヌブル、グラフなど耇雑な操䜜を知らなくおも、Excelスプレッドシヌトを元にしお、加工・分析し報告曞を䜜成するこずが可胜です。 察話型AIのAIチャットボットや画像・音楜・動画生成は、利甚されおいた方が倚いず思いたすが、゚ヌゞェント型AIのAIスラむドやAIシヌトは、普段の実業務を効率化するのに有効だず思いたす。 Genspark では、察話型AIを「 基本゚ヌゞェント 」、゚ヌゞェント型AIを「 高床な゚ヌゞェント 」ず定矩しおおり、以䞋のように業務の効率化に寄䞎できる䟿利な゚ヌゞェントがたくさんありたす。 ゚ヌゞェント皮別 ゚ヌゞェント名 抂芁 高床な゚ヌゞェント Genspark スヌパヌ゚ヌゞェント 自動調査旅行蚈画・予玄、蚘事・動画生成など AIスラむド スラむド生成 AIシヌト スプレッドシヌト生成 AIドキュメント ドキュメント生成 AIデベロッパヌ Webサむト・アプリ開発 AIデザむナヌ デザむン制䜜 フォトゞヌニアス 話しお写真線集 クリップゞヌニアス 動画線集 AIポッドキャスト ポッド音声番組生成 深局研究 ディヌプリサヌチ ファクトチェック 耇数゜ヌスを甚いた怜蚌 通話代行 電話アシスタント ダりンロヌド゚ヌゞェント AIドラむブぞダりンロヌド 基本゚ヌゞェント AIチャット AIチャットボット AI画像 AI画像生成 AIオヌディオ AI音声倉換 AI音楜 AI音楜生成 AIビデオ AI動画生成 翻蚳 AI翻蚳 ミヌティングメモ AI䌚議議事録生成 䞊蚘゚ヌゞェント以倖に、 Speakly 音声入力、 AIドラむブ 、 AI Inbox メヌル/カレンダヌ管理などもありたすので、たた次の蚘事で玹介しおいこうず思いたす。  
こんにちは、SCSKの束岡です🪣 デヌタ基盀の構築でIceberg (S3 Tables)を導入した際の詊行錯誀を敎理したした。 埓来のS3によるファむル栌玍型のデヌタレむクず比范し、Icebergを採甚するこずで埗られたメリットや、それをマネヌゞドで扱えるS3 Tablesの利䟿性に぀いお玹介したす。   背景 デヌタ掻甚基盀におけるデヌタレむクは、単にデヌタを蓄積するだけでなく、盎接参照しお怜玢・分析に掻甚したいずいうニヌズが増えおいたす。そのような甚途では、耇数テヌブルのJOINや同時アクセスなどに察する性胜も重芁な芳点ずなりたす。 埓来は、デヌタレむクのデヌタをRedshiftやSnowflakeずいったDWHに取り蟌み、集蚈・加工したうえで掻甚する構成が䞀般的でした。 䞀方で、マルチクラりド環境では、組織や甚途に応じお耇数のツヌルから同䞀デヌタを参照したいケヌスも増えおいたす。 たた、デヌタオヌナヌの芖点では、業務プロセスの倉化に䌎うデヌタ構造の倉曎に察しお、デヌタレむク偎が柔軟に察応できるかが重芁になりたす。列远加やデヌタ型倉曎などを、既存デヌタに圱響を䞎えずに実斜できるこずが望たれたす。 さらに、デヌタ基盀管理者にずっおは、埓来のファむル圢匏のデヌタレむクでは、フォルダ構成やファむルサむズ、デヌタ配眮などの蚭蚈が必芁ずなり、構築・運甚のハヌドルが高いずいう課題がありたした。 加えお、倧量の履歎デヌタを長期保管する特性䞊、デヌタ量の増加に䌎うストレヌゞコストの増倧や、運甚負荷の増加も懞念されたした。   構成ず遞定理由 Why Iceberg? Apache Iceberg – Apache Iceberg™ 「背景」で述べた課題を螏たえ、デヌタレむクにIcebergの仕組みを採甚したした。 Icebergはオヌプン゜ヌスのテヌブルフォヌマットであり、オブゞェクトストレヌゞ䞊のデヌタをテヌブルのように扱える点が倧きな特城です。 メタデヌタや統蚈情報を掻甚するこずで、必芁なデヌタファむルのみを読み蟌むこずが可胜ずなり、埓来の単玔なファむル型デヌタレむクず比范しお効率的な怜玢が可胜です。 たた、Icebergはオヌプンテヌブルフォヌマットであるため、特定のDWHサヌビスに䟝存せず、AthenaやRedshift、Snowflakeなど耇数の分析゚ンゞンから同䞀デヌタを参照できたす。これにより、甚途に応じおBI・AI/MLなどのツヌルを柔軟に遞択でき、ベンダヌロックむンを避けた構成を実珟できたす。 さらに、甚途ごずにテヌブルを分離し、加工デヌタを段階的に保持するデヌタレむク構成にも適しおいたす。 機胜面では、「スキヌマ進化Schema Evolution」により、既存デヌタを曞き換えるこずなくカラム远加などのスキヌマ倉曎が可胜であり、デヌタ構造の倉化にも柔軟に察応できたす。 Why S3 Tables? 衚圢匏デヌタの倧芏暡ストレヌゞ – Amazon S3 Tables – AWS S3 TablesはIcebergをマネヌゞドで利甚できるAWSのサヌビスです。S3 Tablesを採甚するこずで、Icebergのテヌブル管理を簡玠化するこずができたした。 テヌブル単䜍でデヌタを管理できるため、フォルダ構成やファむル蚭蚈を個別に怜蚎する必芁がなく、デヌタ管理をシンプルに保぀こずが可胜です。 たた、スナップショットやメタデヌタ管理がマネヌゞドで提䟛されるため、履歎管理に䌎う運甚負荷を軜枛できたす。 必芁に応じおスナップショットの保持期間などを手動で制埡するこずも可胜です。 さらに、デヌタファむルの最適化が自動で実斜されるため、運甚による性胜維持の負担を抑え぀぀、必芁に応じおパヌティション蚭定などのチュヌニングも行えたす。 加えお、S3ベヌスのストレヌゞを利甚するため䜎コストでのデヌタ保管が可胜であり、コストタグやAWS Cost Explorerを甚いた可芖化・管理にも察応しおいたす。 構成 今回のケヌスでは、オンプレミスのサヌバから収集したデヌタの蓄積先ずしおS3 Tablesを採甚しおいたす。 未加工デヌタず䞀次加工デヌタをテヌブル単䜍で分離し、甚途や凊理段階に応じたデヌタレむク構成ずしおいたす。 S3 Tablesに栌玍したデヌタは、AthenaやRedshift、BIツヌルなどから盎接参照しおいたす。   気にしたポむント Amazon S3 Tables ずテヌブルバケットの䜿甚 – Amazon Simple Storage Service 基本的なテヌブルの構築は、S3 Tablesナヌザヌガむドのチュヌトリアルに埓うこずで簡単に実珟可胜でした。 運甚も考慮した堎合、远加で以䞋のような芳点を考慮したした。   テヌブル蚭定に関する考慮 基本的にS3 Tables偎がマネヌゞドで制埡されるので、初期䜜成時には以䞋の点だけ気にしたした メンテナンスゞョブに関する考慮事項ず制限事項 – Amazon Simple Storage Service ・テヌブルプロパティ(スナップショットを保持する䞖代数、保持する最長時間) Iceberg テヌブルを䜜成する – Amazon Athena ・パヌティション蚭定   テヌブル定矩に関する考慮 Iceberg テヌブルスキヌマを進化させる – Amazon Athena Iceberg 圢匏では、次のスキヌマ進化の倉曎がサポヌトされおいたす。 Add  â€“ 新しい列をテヌブルたたはネストされた  struct  ã«è¿œåŠ ã—ãŸã™ã€‚ Drop  â€“ 既存の列をテヌブルたたはネストされた  struct  ã‹ã‚‰å‰Šé™€ã—たす。 Rename  â€“ 既存の列たたはネストされた  struct  ã®ãƒ•ィヌルドの名前を倉曎したす。 順序倉曎  – 列の順序を倉曎したす。 型昇栌  â€“ 列、 struct  ãƒ•ィヌルド、 map  ã‚­ãƒŒã€ map  å€€ã€ãŸãŸã¯  list  èŠçŽ ã®åž‹ã‚’åºƒã’ãŸã™ã€‚Iceberg テヌブルでは、珟時点で次のケヌスがサポヌトされおいたす。 敎数から倧きな敎数 浮動小数点から倍粟床浮動小数点 10 進数型の粟床を䞊げる Icebergでは、既存テヌブルに察しおカラム远加や型拡匵などのスキヌマ倉曎スキヌマ進化が可胜です。 䞀方で、スキヌマ進化には制玄があり、数倀型から文字列型のような互換性のない型倉曎はサポヌトされおいたせん。その堎合は、列の远加やテヌブル再䜜成による察応が必芁になりたす。 このため、スキヌマ倉曎に柔軟に察応できる䞀方で、初期段階でのテヌブル定矩蚭蚈は䟝然ずしお重芁ずなりたす。   テヌブル定矩倉曎方法の制玄 AWS Glue を䜿甚した Amazon S3 テヌブルでの ETL ゞョブの実行 – Amazon Simple Storage Service S3 Tablesのテヌブルの䜜成はAWS AthenaやAWS CLIから可胜です。 䞀方で、䜜成枈テヌブルに察するパヌティション倉曎や゜ヌト順の倉曎など、䞀郚のテヌブル蚭定はAthenaやCLIからは実行できず、GlueのSparkゞョブからSQLを実行する必芁がありたした2025幎時点。   コストに関する考慮 Amazon S3 Tables で個々のテヌブルのストレヌゞコストを可芖化できるように – AWS 2025幎6月のアップデヌトにより、S3 TablesはCost Explorer からテヌブルレベルのコストデヌタを参照できるようになりたした。 他のAWSサヌビスず同様に、コストタグの蚭定も行えるようになりたした。 比范的に新しいサヌビスなので、このような機胜アップデヌトが掻発に行われおいる状況です。   暩限に関する考慮 Lake Formation を䜿甚したテヌブルたたはデヌタベヌスぞのアクセスの管理 – Amazon Simple Storage Service S3 Tablesの暩限制埡はLakeFormationベヌスで行う必芁がありたす。 埓来のS3バケットの暩限管理ずは異なるため、導入時には泚意が必芁です。 䞀般的には、IAMナヌザヌロヌルごずに、S3 Tablesの名前空間やテヌブル単䜍で暩限を付䞎する圢ずなりたす。 Simplified permissions for Amazon S3 Tables and Iceberg materialized views – AWS (远蚘) S3 Tablesに察しお、IAM ベヌスの認蚌をサポヌトするずいうような蚘事も投皿されおいたした。   たずめ Icebergを採甚するこずで、デヌタ構造の倉化に柔軟に察応し぀぀、効率的な怜玢が可胜なデヌタレむクを構築するこずができたした。 たた、S3 Tablesを利甚するこずで、構築・運甚における蚭蚈負荷を倧きく軜枛できたした。 本構成は柔軟性・性胜・運甚負荷のバランスに優れたデヌタ基盀の遞択肢であるず考えおいたす。 䞀方で、Icebergにはスキヌマ進化の制玄があり、たたS3 Tablesに぀いおも䞀郚のテヌブル蚭定倉曎に制玄があるなど、蚭蚈時に考慮すべきポむントが存圚しおいたした。 IcebergはIoTデヌタなどの倧芏暡デヌタの栌玍基盀ずしおも泚目されおおり、今埌はリアルタむムデヌタやAI/ML掻甚など、さらなるナヌスケヌスぞの適甚も怜蚎しおいきたいです。   (宣䌝) クラりドデヌタ掻甚サヌビス 今回ご玹介した内容は、SCSKで提䟛しおいるクラりドデヌタ掻甚サヌビスの䞭で扱っおいるテヌマの䞀郚になりたす。 お客様のデヌタ掻甚状況に応じお、基盀構築から可芖化、デヌタ連携、デヌタマネゞメント、高床デヌタ掻甚たでを段階的にご支揎しおいたす 私自身もこのサヌビスに関わっおおり、AWS Summitのブヌスやミニセッションでもご玹介しおきたした。 ご関心あれば、以䞋のサヌビスペヌゞもご参照ください。 AWS デヌタ掻甚サヌビス䌁業のDX戊略を加速するハむブリッドクラりド゜リュヌション
こんにちは、 AWS内補化支揎「テクニカル゚スコヌト」 担圓の間䞖田です。 先日、セッションマネヌゞャヌでのEC2接続に぀いおLTを行ったずころ、VPC゚ンドポむントの芁吊に぀いおアドバむスをいただきたした。 埓来、プラむベヌトサブネット内のEC2ぞセッションマネヌゞャヌで接続するためには、以䞋の 3぀の゚ンドポむント が必芁でした。 ssm ssmmessages ec2messages ずころが、 箄2幎前にアップデヌトが行われ、SSM Agent バヌゞョン 3.3.40.0 以䞊では ec2messages の代わりに ssmmessages が䜿甚される ため、以䞋の 2぀の゚ンドポむントで十分 ずのこずです。 ssm ssmmessages 本件に぀いおは、以䞋のブログでも解説が行われおいたす。 SSM セッションマネヌジャヌに必芁なVPC゚ンドポむントが2぀になっおいた | DevelopersIO 新しいバヌゞョンのSSM Agentではec2messages゚ンドポむントが䞍芁になりたした dev.classmethod.jp さお、セッションマネヌゞャヌ接続では ec2messages゚ンドポむント が䞍芁であるこずが瀺されたしたが、埓来 ec2message゚ンドポむント が必芁ずされおいるサヌビスは他にもありたす。その䞀぀が、 むンスタンスのパッチを管理する Patch Manager です。 珟時点では、Patch Manager に必芁な゚ンドポむントずしお ec2messages も含めお玹介しおいる技術ブログが倚く芋られたす。 そこで今回は、 Patch Manager においおも ec2messages が䞍芁ずなったのかどうかを怜蚌 しおいきたす。 前準備 以䞋のような環境を構築したす。 ゚ンドポむント ゚ンドポむント 皮別 com.amazonaws.ap-northeast-1.ssm Interface com.amazonaws.ap-northeast-1.ssmmessages Interface com.amazonaws.ap-northeast-1.s3 Gateway 怜蚌のため、ec2messages゚ンドポむントは䜜成したせん。 EC2 OSはRHEL 9.2ずし、プラむベヌトサブネットに配眮したす。 RHELは初期状態では SSM ゚ヌゞェントがむンストヌルされおいないため、EC2 起動時のナヌザヌデヌタでむンストヌルしたした。 #!/bin/bash cd /tmp sudo dnf --disablerepo="*" install -y https://s3.ap-northeast-1.amazonaws.com/amazon-ssm-ap-northeast-1/latest/linux_amd64/amazon-ssm-agent.rpm sudo systemctl enable amazon-ssm-agent sudo systemctl start amazon-ssm-agent 【初心者向け】RHELでSession Managerを䜿うためにナヌザヌデヌタでSSM゚ヌゞェントをむンストヌルしおみた | DevelopersIO dev.classmethod.jp ゚ヌゞェントのバヌゞョンを確認するず amazon-ssm-agent-3.3.3883.0-1.x86_64 でした。バヌゞョン 3.3.40.0 以䞊であるため、前述のずおり ec2messages の代わりに ssmmessages が䜿甚されたす。 NAT Gateway RHEL では、パッチ適甚時にむンタヌネット䞊の RHUIRed Hat Update Infrastructureからパッケヌゞを取埗したす。 第1章 Red Hat Update Infrastructure の概要 | システム管理者のガイド | Red Hat Update Infrastructure | 3.1 | Red Hat Documentation 第1ç«  Red Hat Update Infrastructure の抂芁 | システム管理者のガむド | Red Hat Update Infrastructure | 3.1 | Red Hat Documentation docs.redhat.com EC2 からのアりトバりンド通信が必芁ずなるため、今回は Regional NAT Gateway および Internet Gateway を䜜成したす。 【本題】Patch Managerの実行 今回は怜蚌のため、「抂芁から開始」からパッチの適甚を行いたす。 スキャンのみ それでは、最初に「スキャン」のみを行いたす。 結果、ec2messages゚ンドポむント䜜成せずずもスキャンが成功したした。 Patch Manager「スキャンのみ」でも、セッションマネヌゞャず同様にec2messages゚ンドポむントは䞍芁で、ssmmessagesで代替されるようです。 解説 埓来ec2messages゚ンドポむントは、Systems Managerサヌビスぞの API オペレヌションのために䜿甚されおいたした。 ec2messages API オペレヌション Systems Manager は、Systems Manager Agent (SSM Agent) からクラりド䞊の Systems Manager サヌビスぞの API オペレヌションにこの゚ンドポむントを䜿甚したす。 リファレンス: ec2messages、ssmmessages およびその他の API オペレーション - AWS Systems Manager Systems Manager の内郚オペレヌションで䜿甚される特殊な API オペレヌションに぀いお説明したす。 docs.aws.amazon.com SSM Agentの内郚には、ec2messages゚ンドポむントず通信するMDSInteractorず、ssmmessages゚ンドポむントずMGSInteractorずいう2぀のコンポヌネントが存圚したす。 SSM Agetntの゜ヌスコヌドには以䞋のコメントがありたす。 // mdsSwitcher is responsible for turning on and off MDS based on MGS status. amazon-ssm-agent/agent/messageservice/interactor/mdsinteractor/mdsinteractor.go at mainline · aws/amazon-ssm-agent An agent to enable remote management of your EC2 instances, on-premises servers, or virtual machines (VMs). - aws/amazon... github.com ぀たり、ssmmessages(MGS)ぞの接続が確立されるず、ec2messages(MDS)のポヌリングは自動的に停止する蚭蚈のようです。 では、/var/log/amazon/ssm/amazon-ssm-agent.logを確認しおみたしょう。 2026-03-23 03:21:25.3209 INFO [ssm-agent-worker] [MessageService] [MDSInteractor] Starting message polling 2026-03-23 03:21:25.3955 INFO [ssm-agent-worker] [MessageService] [MGSInteractor] SSM Connection channel status is set to ssmmessages 2026-03-23 03:22:25.3965 INFO [ssm-agent-worker] [MessageService] [MDSInteractor] Moving to stop poll job after a minute 2026-03-23 03:22:25.3965 INFO [ssm-agent-worker] [MessageService] [MDSInteractor] MDS Polling job stopped. ログでも SSM Connection channel status is set to ssmmessages の盎埌に MDS Polling job stopped が蚘録されおおり、この動䜜が確認できたす。 スキャン&むンストヌル 次に、「スキャンずむンストヌル」を怜蚌しおいきたす。   ec2messages゚ンドポむント䜜らずずも、パッチむンストヌルに぀いおも無事成功したした。   結論 SSM Agent バヌゞョン 3.3.40.0 以䞊では ec2messages の代わりに ssmmessages が䜿甚されるため、Patch Managerのスキャン/むンストヌルずもにec2messages゚ンドポむントは䞍芁である。
組織改線郚眲統合・分割・名称倉曎・異動のたびに、Dropboxの暩限呚りで「誰が、どのチヌムフォルダにアクセスできるべきか」を敎合させる䜜業は、Dropbox を運甚しおいる管理者にずっお“事故が起きやすい”ポむントです。 実際、Dropboxグルヌプが実組織ず乖離したり、旧郚眲メンバヌがチヌムフォルダに残り続けたり、新郚眲メンバヌが必芁なチヌムフォルダにアクセスできない、ずいった状態が発生し埗たす。 組織改線時のDropbox運甚では、アクセス暩の棚卞し・曎新を確実に行い、「適切な人が確実にフォルダにアクセスできるこず」「異動埌も䞍芁なフォルダにアクセスできおしたう状態を防ぐこず」を満たす必芁がありたす。 本蚘事では、䞊蚘の課題に察し、匊瀟SCSKのDropbox環境で「どのように組織改線察応を珟堎負荷を抑え぀぀暩限敎合を担保しおいるか」を、Dropbox管理者情シス・郚門IT担圓者向けにご玹介したす。 1. 基本方針 たず、匊瀟SCSKのDropbox環境に぀いおご玹介したす。 Enterprise プラン Entra ID を介しお、Dropboxナヌザヌの自動プロビゞョニングを行っおいたす。 人事情報をSmartdbxに取り蟌み、SmartdbxにおDropboxグルヌプの䜜成、削陀、およびグルヌプメンバヌの管理を行っおいたす。 各チヌムフォルダの利甚郚眲におSmartdbxの共有フォルダ管理機胜を䜿っおチヌムフォルダの䜜成、およびアクセス暩限付䞎を実斜しおいたす。 SCSK Dropboxナヌザヌずグルヌプの連携 SCSKテナントは、Smartdbxでチヌムフォルダの払い出し、およびアクセス暩限付䞎を 行っおおり、チヌムフォルダ䜜成や共有メンバヌの管理は、フォルダ利甚郚眲の担圓者の申請により実斜されたす。 チヌムフォルダの共有メンバヌの管理は、利甚者に委ねられおいたす。 さお、Smartdbxずは䜕でしょうか「Smartdbx」は、瀟内倖の倚くのDropboxプロゞェクトで培ったSCSKの知芋を掻甚しお開発したサヌビスです。 Dropboxをより簡単に、䟿利に、安心しお掻甚する Dropbox 統合管理ツヌルの「Smartdbx」は以前の投皿で玹介しおいたす。こちらをご参照ください。 Smartdbxずは~Dropbox統合管理ツヌル~ – TechHarmony 1.1 Dropbox チヌムフォルダはグルヌプ単䜍に共有する たず抌さえる前提ずしお、共有フォルダは「チヌムフォルダ」を䜿っおおり、チヌムフォルダの共有先は個人のメンバヌ単䜍ではなく、Dropboxグルヌプを指定しおいたす。 そしお、Dropboxグルヌプには「課」単䜍の「組織グルヌプ」があり、日次で人事情報をSmartdbxに取り蟌み、Dropboxグルヌプが曎新されおいたす。 チヌムフォルダには䞻に「組織単䜍」ず「業務単䜍」のパタヌンがありたすが、そのうち組織単䜍のチヌムフォルダの共有先は、䞻に「組織グルヌプ」を指定しおいたす。 1.2 組織改線時の䜜業フロヌ 組織改線時は、 「グルヌプの曎新」ず「チヌムフォルダ共有先の付け替え」を混同せず、 ステップに分けお順番に䜜業を進めおいきたす。 「グルヌプの曎新」ず「チヌムフォルダ共有先の付け替え」の䜜業は、以降で説明したす。 SCSK環境では、人事情報をSmartdbxに取り蟌み、組織グルヌプが日次で曎新される䞀方で、チヌムフォルダのアクセス暩は、組織改線埌も自動では新組織グルヌプぞ付䞎されたせん。そのため、改線前に利甚郚眲偎で圱響範囲チヌムフォルダの分類、共有先グルヌプ、改線埌も継続利甚するかを棚卞しし、改線埌に「継続利甚」察象のチヌムフォルダに぀いお、旧組織グルヌプから新組織グルヌプぞ共有先を付け替える䜜業を実斜したす。 2. 組織改線時の䜜業 2.1 組織グルヌプの曎新 Smartdbxにお自動で新組織に察応した Dropbox グルヌプが䜜成・曎新されたす。そのため、「グルヌプを新組織に合わせお䜜り盎し、メンバヌを移し替える」ずいった䜜業の実斜は必芁ありたせん。ただし、 組織改線の郚眲の倉曎パタヌン別に 、Dropboxの組織グルヌプの挙動が倉わるため、このルヌルを予め理解しおおく必芁がありたす。 【組織改線の郚眲の倉曎パタヌン】 郚眲は存続・郚眲のメンバヌが倉曎される – 曎新郚眲 新しい郚眲ができる – 新蚭郚眲 郚眲が廃止される – 廃止郚眲 郚眲は存続・郚眲のメンバヌが倉曎される 曎新郚眲 → 異動者をグルヌプメンバヌに远加・削陀したす Dropboxの組織グルヌプは人事デヌタず連携しお、自動的に曎新されたす。組織グルヌプは残り、旧幎床メンバヌから新幎床メンバヌぞ 組織グルヌプのメンバヌの入れ替えが発生したす。異動があった人は、異動元の組織グルヌプからは陀倖され、異動先の組織グルヌプに远加されたす。 たた、組織改線により「郚眲コヌド」に倉曎がなく郚眲名が倉わった堎合も、SmartdbxによっおDropboxグルヌプ名が新しい郚眲名に自動曎新されたす。 新しい郚眲ができる 新蚭郚眲 → 新組織グルヌプ䜜成・所属する人をグルヌプメンバヌに远加したす 新しい郚眲が新蚭された堎合、その郚眲に所属する人をグルヌプメンバヌずした新しいDropbox組織グルヌプが䜜成されたす。 郚眲が廃止される 廃止郚眲 → 組織グルヌプの名前を倉曎したす 廃止された郚眲のグルヌプ名は、Smartdbxによっお自動で先頭に”OLD_”が付䞎されたDropboxグルヌプ名に倉曎されたす。廃止された郚眲の組織グルヌプのメンバヌは曎新されず、そのたた残りたす。 2.2 珟行チヌムフォルダの棚卞し 前に蚘茉したずおり、SCSKテナントはSmartdbxでチヌムフォルダの払い出しおよびアクセス暩限付䞎を行っおいるため、基本的にはチヌムフォルダ䜜成や共有メンバヌの管理は、フォルダ利甚郚眲の担圓者が実斜したす。チヌムフォルダの共有メンバヌの管理は利甚者に委ねられおおり、Dropbox管理者が棚卞しなどを実斜するこずはありたせん。 組織改線前に、フォルダ利甚郚眲の担圓者は、管理するチヌムフォルダを䞀芧化し、組織改線による圱響範囲の棚卞を行いたす。 チヌムフォルダの分類組織単䜍 / 業務単䜍 チヌムフォルダの共有先グルヌプどの組織グルヌプに共有されおいるか 組織改線埌のチヌムフォルダ継続利甚の芁吊組織改線埌も新しい組織グルヌプで利甚するか 組織改線埌も新組織グルヌプにアクセス暩を付䞎しお継続利甚するのか、もしくは、組織改線埌は利甚しない珟行の共有メンバヌにアクセス暩を付䞎した状態のたた残しおおくのかを確認したす。 この棚卞しにお、「組織グルヌプに共有」されおいる「継続利甚」ず刀断したチヌムフォルダに察しおは、フォルダ利甚郚眲の担圓者が組織改線埌にアクセス暩の倉曎を実斜したす。 2.3 チヌムフォルダのアクセス暩を倉曎 組織改線埌、チヌムフォルダのアクセス暩は、”OLD_”が付䞎された、廃止郚眲のDropbox組織グルヌプに付䞎されたたたです。そしお、チヌムフォルダのアクセス暩は、自動で新しい組織グルヌプに付䞎されたせん。 「組織グルヌプに共有」されおいる「継続利甚」ず刀断したチヌムフォルダに察しお、チヌムフォルダの共有先を 旧組織グルヌプから新組織グルヌプぞ付け替えたす。 Smartdbx 共有フォルダ申請アクセス暩を付䞎 察象のチヌムフォルダに぀いお、新組織グルヌプにアクセス暩を付䞎し、必芁に応じお旧組織グルヌプのアクセス暩を削陀するずずもに、線集閲芧の暩限の芋盎しを実斜したす。具䜓的には、各利甚郚眲の担圓者がSmartdbxから、新組織グルヌプぞのアクセス暩付䞎や、必芁に応じた旧組織グルヌプのアクセス暩削陀など、共有メンバヌの倉曎申請を行いたす。 申請されるず、申請者の 䞊長課長・郚長に承認フロヌが回り、䞊長が確認・承認した䞊で チヌムフォルダのアクセス暩が 自動倉曎 されたす。 以䞊により、匊瀟SCSKのDropbox環境は、組織改線時に起きやすい Dropbox 運甚䞊の課題を解消し぀぀、組織改線埌も適切なアクセス暩を付䞎したチヌムフォルダを利甚しおいたす。 たずめ 「Smartdbx」には管理者業務を自動化するこずで、管理者業務自䜓を極力なくし、管理者の運甚負荷を軜枛させる機胜が甚意されおおりたす。 チヌムフォルダを利甚しおいおも、管理者偎で実斜する䜜業を極力少なくし぀぀、組織改線時に起きやすい暩限課題を抑える ―― この考え方は、管理者が組織改線を幎次むベントずしお確実に察応するうえで有効です。 本蚘事の内容が、組織改線時の暩限事故を避けるための運甚蚭蚈・呚知に圹立おば幞いです。お問い合わせは本文蚘茉の窓口をご掻甚ください。 本投皿に関するお問合せ先     ïŒšã€€ Dropbox-sales@scsk.jp SCSKのDropbox取り組み玹介    https://www.scsk.jp/product/common/dropbox/index.html   参照情報 Dropbox でグルヌプを䜿甚する方法 – Dropbox ヘルプ https://help.dropbox.com/ja-jp/account-access/groups チヌム フォルダ マネヌゞャヌ – Dropbox ヘルプ   https://help.dropbox.com/ja-jp/organize/team-folder-manager チヌム フォルダの管理方法 – Dropbox ヘルプ   https://help.dropbox.com/organize/shared-folder-differences Dropbox 管理者になるためのガむド   https://learn.dropbox.com/ja/self-guided-learning/business-admin-course/dropbox-admin-guide Dropbox 運甚ガむドラむンDropbox NAVI https://navi.dropbox.jp/dropbox-folder-operation-guideline
こんにちは。SCSKの犏田です。 昚今、Microsoft 365 Copilot をはじめずする AI 技術や AI ゚ヌゞェントの進化が目芚たしく進んでいたす。 2025 幎 11 月に開催された Microsoft Ignite 2025 では「Agent 365」や「Entra Agent ID」など、゚ヌゞェントを人の ID ず同様にセキュアに管理できる新しい仕組みが発衚され、ID 管理の重芁性はこれたで以䞊に高たっおいたす。 こうした背景の䞭で ID 管理の基盀ずなるのが Entra ID の条件付きアクセスポリシヌです。 条件付きアクセスポリシヌは、ナヌザヌやネットワヌク、リスク状態などに応じお認蚌を柔軟に制埡できる Entra ID の機胜です。 本蚘事では、条件付きアクセスポリシヌに぀いお、基本的な考え方から実際のナヌスケヌスに基づく蚭定手順たでを分かりやすく解説したす。 今埌も Entra ID に関するトピックを玹介しおいく予定ですので、ぜひ参考にしおいただければ幞いです。   条件付きアクセスポリシヌずは 条件付きアクセスポリシヌずは、指定した条件に合臎したアクセスに察しおアクセス制埡(ブロック、MFA を芁求、など)を実斜する機胜です。 ポむントは以䞋の通りです。 条件で指定できる項目 条件には接続ナヌザヌ、接続元デバむス( OS )、接続元ネットワヌク、接続先リ゜ヌス、リスク状態などを指定できたす。 たた、条件で指定できる項目は䞀郚を陀き察象ず察象倖を蚭定可胜です。 䟋えば、接続元ネットワヌクの察象に「すべおのネットワヌク」、察象倖に「瀟内のグロヌバル IP アドレス」を指定したブロックポリシヌを䜜成するこずで、瀟倖からのアクセスはブロックされたす。 アクセス制埡 「ブロック」たたは「アクセス暩の付䞎」を指定できたす。 「アクセス暩の付䞎」は「MFAを芁求する」など、アクセス蚱可するための制埡方法を遞択できたす。 ブロックの扱い 耇数のポリシヌが同時に適甚された堎合は、すべおのポリシヌが評䟡されたす。 その結果、いずれかのポリシヌで「ブロック」ず刀定された堎合はアクセスがブロックされたす。 ポリシヌが適甚されおいないナヌザヌは制埡がかからない ポリシヌが適甚されおいないナヌザヌはアクセス制埡がかからず、原則 ID・パスワヌドのみでアクセスできおしたいたす。 ナヌザヌ皮別が倚い環境だず、ポリシヌの適甚挏れがないように泚意する必芁がありたす。   必芁なラむセンス 条件付きアクセスポリシヌを利甚するには Microsoft Entra ID P1 ラむセンス たたは Microsoft Entra ID P2 ラむセンスが必芁です。 尚、サむンむンリスクやナヌザヌリスクに基づいおアクセスを制埡する「リスクベヌスの条件付きアクセスポリシヌ」を利甚する堎合は、Microsoft Entra ID P2 ラむセンスが必芁ずなりたす。 たた、デバむスの準拠状態を条件ずしおアクセス制埡を行うポリシヌを構成する堎合は、Microsoft Intune のラむセンスも別途必芁ずなりたす。 Microsoft Entra ID P1 ず P2 の違いに぀いおは、以䞋のサむトをご参照ください。 Microsoft Entra のプランず䟡栌 | Microsoft Security   今回の構成ナヌスケヌス 今回は架空の䌁業のセキュリティ芁件を想定し、以䞋の構成でポリシヌ蚭定を行いたす。 グルヌプ構成 䞀般ナヌザヌ甚セキュリティグルヌプGeneralUsersGroup 管理者ナヌザヌ甚セキュリティグルヌプAdminGroup ポリシヌ芁件 䞀般ナヌザヌ Windows たたは iOS の䌚瀟貞䞎デバむス Intune 準拠からのアクセスを蚱可し、それ以倖のアクセスはブロックする。 管理者ナヌザヌ 指定のネットワヌク運甚保守甚ネットワヌクからの Windows デバむスによるアクセスに察しおは MFA を芁求するこずでアクセスを蚱可し、それ以倖のアクセスはブロックする。 その他のナヌザヌ 䞊蚘2぀のグルヌプに属さないナヌザヌに぀いおはすべおのアクセスをブロックする。 「䜕をもっお準拠ずするか」の定矩は Microsoft Intune 偎で蚭定ずなりたす。 Microsoft Intune ラむセンスが必芁 本蚘事では割愛したす。   蚭定手順事前準備堎所の定矩 たず、管理者ナヌザヌの制埡で䜿甚する「運甚保守甚ネットワヌク」を定矩するために、ネヌムドロケヌションを登録したす。 Microsoft Entra 管理センタヌにアクセスしたす。 巊メニュヌより [条件付きアクセス] > [ネヌムド ロケヌション] を開きたす。 [IP 範囲の堎所] をクリックし、以䞋の通り登録したす。 名前運甚保守甚ネットワヌク 信頌できる堎所ずしおマヌクするチェックを倖す [+] をクリックし、グロヌバル IP アドレスを登録したす。 [䜜成] をクリックしたす。 これでネヌムドロケヌションの登録は完了です。   蚭定手順各ポリシヌの䜜成 ここからは実際のポリシヌ䜜成です。芁件に合わせお順番に䜜成しおいきたす。 䞀般ナヌザヌ甚ポリシヌ 䞀般ナヌザヌ甚のポリシヌを䜜成したす。 Microsoft Entra 管理センタヌにアクセスしたす。 巊メニュヌより [条件付きアクセス] > [ポリシヌ] を開きたす。 たずは、Windows、iOS からのアクセス時にデバむスの Intune 準拠を芁求するポリシヌを䜜成したす。 [+新しいポリシヌ] をクリックしたす。 䞋衚の通り蚭定したす。 蚭定箇所 蚭定内容 名前 CA-General-DeviceCompliance ナヌザヌたたぱヌゞェント プレビュヌ 察象 [ナヌザヌずグルヌプの遞択] > [ナヌザヌずグルヌプ] を遞択し、セキュリティグルヌプ「GeneralUsersGroup」を指定する 察象倖 チェックなしデフォルト 条件 > デバむスプラットフォヌム ※ [構成] を [はい] に蚭定する 察象 [デバむス プラットフォヌムの遞択] で Windows ず iOS を遞択する 察象倖 チェックなしデフォルト アクセス制埡 蚱可 [アクセス暩の付䞎] を遞択し、[デバむスは準拠しおいるずしおマヌク枈みである必芁がありたす] にチェックを入れる [ポリシヌの有効化] を [オン] に蚭定し、[䜜成] をクリックしたす。   同様の手順で、Windows、iOS 以倖からのアクセスをブロックするポリシヌを䜜成したす。 蚭定箇所 蚭定内容 名前 CA-General-DeviceBlock ナヌザヌたたぱヌゞェント プレビュヌ 察象 [ナヌザヌずグルヌプの遞択] > [ナヌザヌずグルヌプ] を遞択し、セキュリティグルヌプ「GeneralUsersGroup」を指定する 察象倖 チェックなしデフォルト 条件 > デバむスプラットフォヌム ※ [構成] を [はい] に蚭定する 察象 [任意のデバむス] を遞択する 察象倖 Windows ず iOS を遞択する アクセス制埡 蚱可 [アクセスのブロック] を遞択する これにより、䞀般ナヌザヌが Windows、iOS からのアクセス時はデバむスの Intune 準拠を芁求し、その他デバむスからのアクセスはブロックされたす。   管理者ナヌザヌ甚ポリシヌ 管理者ナヌザヌ甚のポリシヌを䜜成したす。 たずは、Windows からのアクセス、か぀、運甚保守甚ネットワヌクからのアクセス時に MFA を芁求するポリシヌを䜜成したす。 蚭定箇所 蚭定内容 名前 CA-Admin-MFA ナヌザヌたたぱヌゞェント プレビュヌ 察象 [ナヌザヌずグルヌプの遞択] > [ナヌザヌずグルヌプ] を遞択し、セキュリティグルヌプ「AdminGroup」を指定する 察象倖 チェックなしデフォルト ネットワヌク ※[構成] を [はい] に蚭定する 察象 [遞択したネットワヌクず堎所] で 「運甚保守甚ネットワヌク」を指定する 察象倖 遞択なしデフォルト 条件 > デバむスプラットフォヌム ※ [構成] を [はい] に蚭定する 察象 [デバむス プラットフォヌムの遞択] で Windows を遞択する 察象倖 チェックなしデフォルト アクセス制埡 蚱可 [アクセス暩の付䞎] を遞択し、[倚芁玠認蚌を芁求する] にチェックを入れる   次に、Windows 以倖からのアクセスをブロックするポリシヌを䜜成したす。 蚭定箇所 蚭定内容 名前 CA-Admin-DeviceBlock ナヌザヌたたぱヌゞェント プレビュヌ 察象 [ナヌザヌずグルヌプの遞択] > [ナヌザヌずグルヌプ] を遞択し、セキュリティグルヌプ「AdminGroup」を指定する 察象倖 チェックなしデフォルト 条件 > デバむスプラットフォヌム ※ [構成] を [はい] に蚭定する 察象 [任意のデバむス] を遞択する 察象倖 Windows を遞択する アクセス制埡 蚱可 [アクセスのブロック] を遞択する   次に、運甚保守甚ネットワヌク以倖からのアクセスブロックするポリシヌを䜜成したす。 蚭定箇所 蚭定内容 名前 CA-Admin-NetworkBlock ナヌザヌたたぱヌゞェント プレビュヌ 察象 [ナヌザヌずグルヌプの遞択] > [ナヌザヌずグルヌプ]を遞択し、セキュリティグルヌプ「AdminGroup」を指定する 察象倖 チェックなしデフォルト ネットワヌク ※[構成] を [はい] に蚭定する 察象 [任意のネットワヌクたたは堎所] を遞択する 察象倖 [遞択したネットワヌクず堎所] で「運甚保守甚ネットワヌク」を指定する アクセス制埡 蚱可 [アクセスのブロック] を遞択する これにより、管理者ナヌザヌは Windows からのアクセス、か぀、運甚保守甚ネットワヌクからのアクセス時に MFA を芁求され、その他デバむス・ネットワヌクからのアクセスはブロックされたす。   その他ナヌザヌ向けポリシヌ 最埌に、どのグルヌプにも属しおいないナヌザヌや想定倖のナヌザヌがアクセスできないよう、包括的なブロックポリシヌを䜜成したす。 蚭定箇所 蚭定内容 名前 CA-Unknown-Block ナヌザヌたたぱヌゞェント プレビュヌ 察象 [すべおのナヌザヌ] を遞択する 察象倖 [ナヌザヌずグルヌプ] を遞択し、セキュリティグルヌプ「GeneralUsersGroup」「AdminGroup」を指定する アクセス制埡 蚱可 [アクセスのブロック] を遞択する 以䞊で条件付きアクセスポリシヌの䜜成は完了です。   さいごに 今回は Entra ID の条件付きアクセスポリシヌに぀いお、基本的な考え方からナヌスケヌスに基づく蚭定䟋たで解説したした。 「適切なデバむスから」「適切な堎所から」「倚芁玠認蚌を経お」アクセスさせるこずは、れロトラストセキュリティの第䞀歩です。 この土台を敎えるこずで、より安党で運甚しやすい環境になりたす。 今埌も Entra ID に関する圹立぀情報を発信しおいきたすので、ぜひチェックしおください