TECH PLAY

AWS

AWS の技術ブログ

2980

近年、世界中の機関や組織がランサムウェア攻撃の被害を受けています。医療機関も例外ではなく、ランサムウェアを用いた攻撃の標的となることがしばしばあります。 本ブログでは、医療機関でも被害が増えているランサムウェアとその被害からの復旧における重要な指標、バックアップを活用したデータ保護についてご紹介します。また、その中でバックアップや復旧において、ご活用いただける AWS のサービスや機能についてご紹介します。 ランサムウェアについて ランサムウェアとは、ビジネスに不可欠なデータへ不正にアクセスし、データの暗号化やアクセス遮断を行い、身代金を要求するようなマルウェアの一種です。 昨今では様々なタイプのランサムウェアが出てきており、ファイルを暗号化するだけでなくデバイス自体を暗号化するなど、ランサムウェアは継続的に変化する脅威として知られています。 デバイスやファイルを不正にロックされることにより、被害者はそれらのリソースへのアクセスが遮断されてしまいます。医療機関の場合、患者の診察履歴や投薬の記録といった、ミッションクリティカルなデータへのアクセスができなくなります。そのため、医療機関は、サイバー攻撃に備えた事業継続計画の策定が急務となっています。 また、攻撃者に対して身代金を支払う行為は、必ずしもデータが回復するとは限らず、攻撃者に対する支援につながるため、決して行ってはいけません。 ガイドラインに則ったソリューション構築におけるポイント整理 医療機関では電子カルテをはじめ、診療報酬請求のためのレセプトコンピューター、PACS (医用画像管理システム)、各種部門システム等多くの医療情報システムが稼働しています。日本におけるすべての医療行為は医療法等で医療機関等の管理者の責任で行うことが求められています。クラウドサービスを利用する場合も、医療情報システムの構築や運用に関連して、安全かつ適切な技術的及び運用管理方法を確立し、安全管理や e-文書法の要件等への対応を行っていく必要があります。具体的には 3 省 2 ガイドラインと称される、厚生労働省、総務省、経済産業省の 3 省が定めた医療情報システムに関する各ガイドラインに対して、関連事業者や責任者が要求事項を整理検討し、必要に応じて対策を施す必要があります。 医療機関及び医療情報システム事業者における 3 省 2 ガイドラインの位置付けについては、 医療情報ガイドラインの改定から読み解くクラウド化 | Amazon Web Services ブログ にて解説を行なっております。 医療情報の電子保存における要求事項の 3 基準 厚生労働省のガイドラインに記載されている医療情報の電子保存における要求事項の 3 基準には、「真正性」「見読性」「保存性」の 3 つがあります。各基準は以下のように定義されています。電子カルテのような医療情報を扱うシステムは、これらも考慮する必要があります。 真正性: 正当な権限で作成された記録に対し、虚偽入力、書き換え、消去及び混同が防止されており、かつ、第三者から見て作成の責任の所在が明確であること。 見読性 : 電子媒体に保存された対象を、「診療」「患者への説明」「監査」「訴訟」などの要求に応じて、それぞれの目的に対し支障のない応答時間やスループット、肉眼で見読可能な状態にできること。 保存性 : 記録された情報が法令などで定められた期間にわたって真正性を保ち、見読可能にできる状態で保存されること。 復旧における重要な指標 データの復旧には、目標復旧時点 (RPO) と目標復旧時間 (RTO) という 2 つの重要な指標が存在します。 RPO: データを過去のどの時点まで復旧させる必要があるかという指標です。例えば、ランサムウェアの被害においては、データの損失をどれだけ許容できるかに関連があります。 RTO: どれだけの時間で復旧を完了させるかを示す指標です。システムの停止時間やダウンタイムと関連があります。 バックアップ取得対象とするシステムの RPO や RTO を確認し、適切なバックアップ頻度で適切な復旧環境を検討できているかについて確認することが重要です。 ランサムウェア被害とRPO、RTOの関係性 バックアップと復旧戦略を考える上で、データ量とコストはトレードオフの関係であることに注意してください。優先すべき復旧対象データを特定し、RPO や RTO を明確にすることが、ビジネスの継続や復旧コストなどの観点から重要となってきます。 従来のバックアップ戦略 AWS サービスを紹介する前に、従来のバックアップ戦略について説明します。医療機関内で、各種のアプリケーションおよびデータベースサーバーが稼働しており、院内にある 1 次バックアップサーバーにバックアップが集約されることがよくあります。これらのバックアップを長期間テープストレージに書き出したり、遠隔地に 2 次バックアップサーバーを用意することで、物理的に隔離して保管されている場合もあります。しかし、このような仕組みは、増え続けるバックアップデータに対して、都度ストレージの追加が発生するなど、コスト効率の良いアプローチとは言えません。 これらの課題については、利用した分だけ料金が発生する従量課金という、クラウドならではの特徴を活かしたアプローチで解決することができます。 AWS ストレージサービスでの Immutable なデータ保護環境 ランサムウェア被害を受けた際のリカバリにおいては、保存されたデータは本当にランサムウェアの被害を受ける前の正しいデータかどうか疑われます。そのため、ランサムウェアに対応するためには、災害対策で考えられるような物理的な遠隔地に置かれるだけでなく、一度書いたら二度と上書きができないような、Immutable なストレージが必要です。Immutable とは、「変更不可能な」という意味で、一度作成したら、その状態を変えることができないということです。AWS のストレージサービスには Immutable を実現するための、Write Once Read Many (WORM) 機能を備えているものもあります。このように物理的に離して障壁(エアギャップ)を設けるだけでなく、Immutable な状態のように論理的な障壁 (ロジカルエアギャップ) を生じさせるような構成を、クラウドであれば容易に実装することが可能です。 ここからは、AWS のストレージサービスとその詳細を紹介します。 S3 Object Lock Amazon Simple Storage Service (Amazon S3) は、任意の量のデータの保存と取得をどこからでも行えるように設計されたオブジェクトストレージです。 S3 Object Lock は、WORM モデルを使用したオブジェクトの保存を可能にします。この機能を有効化することで、S3 上にアップロードされたオブジェクトに対する上書きや削除操作が行えなくなり、データの改ざん防止機能としてご利用いただくことができます。 医療機関の場合、例えば S3 上に保存している電子カルテのバックアップなどを、ランサムウェアによるデータ上書きや削除といった攻撃から保護することができます。 S3 バケットの作成時に詳細設定から S3 Object Lock を有効化するか、既存のバケットに対してはAWS サポートへの サポートケース の起票により有効化することができます。 Amazon S3 オブジェクトロックの設定画面 S3 Object Lock には、「ガバナンスモード」と「コンプライアンスモード」の2種類の保持モードが存在します。ガバナンスモードでは、特定の IAM アクセス許可を持つユーザー以外の上書きや削除操作から保護し、コンプライアンスモードでは、保持期間中はルートユーザーを含むすべてのユーザーの上書きや削除操作からオブジェクトを保護することができます。 ガバナンスモードとコンプライアンスモードの選択画面 また、デフォルトの保持期間を設定せずに、リーガルホールドの設定を行うことが可能です。リーガルホールドは、保持期間を設定していないので、上書きや削除操作から無期限に保護することができます。こちらを適用することで、IAM でリーガルホールドの権限が付与されたユーザーのみ、上書きや削除操作を許可するように設定することができます。 ガバナンスモードとコンプライアンスモードの場合、保持期間が終了した後は、リーガルホールドの設定を有効にしない限り、オブジェクトバージョンを上書きまたは削除することができます。 以上のように、S3 Object Lock を有効化することで、データを Immutable な状態で保存することができます。 より詳細な情報は、「 S3 オブジェクトロックの仕組み – Amazon Simple Storage Service 」や「 Amazon S3 オブジェクトロックによるデータの保護 | Amazon Web Services ブログ 」をご参照ください。 AWS Backup Vault Lock AWS Backup は、バックアップの一元管理と自動化を実現するフルマネージドサービスです。手動と自動スケジュールのバックアップを実施することができます。1 つのコンソールで、多岐にわたる AWS リソースのバックアップの設定と実行、復旧を実施することができ、一元管理することができます。暗号化した個別の Vault と呼ばれる単位でデータを格納することができるため、セキュリティを確保することもできます。Vault は、バックアップを保存および整理するためのコンテナです。 AWS Backup Vault Lock は AWS Backup のオプション機能で、対象の Valut を読み込み専用である WORM に設定することができます。この機能により、バックアップデータを変更できなくなるため、バックアップデータの暗号化といった、ランサムウェアによる悪意ある攻撃を防ぐことができます。また、不注意や誤操作によってバックアップが削除されることも防ぐことができるという利点もあります。 医療機関に限らず、ランサムウェア被害から復旧する際に利用するバックアップデータを、悪意ある上書きや削除から保護することができます。 AWS Buckup Vault の設定画面 AWS Backup Vault Lock 機能も、S3 Object Lock と同様に、特定の IAM 権限でのみ Vault に格納されたリカバリポイントを削除可能な「ガバナンスモード」と、ルートユーザーであったとしても Vault に格納されたリカバリポイントを削除できない「コンプライアンスモード」が用意されており、お客様の要件に合わせて選択することが可能です。また、リーガルホールドの機能も提供しており、保持期間が終了していても、明示的に解除されるまではバックアップの削除を防ぐことができます。 より詳細な情報は、「 AWS Backup Vault Lock – AWS Backup 」や「 AWS Backup | 一元管理型クラウドバックアップ | よくある質問 #Write-Once-Read-Many (WORM) 」をご参照ください。 EBS スナップショットゴミ箱機能のルールロック Amazon Elastic Block Store (Amazon EBS) は、EC2 インスタンスで使用するためのブロックレベルのストレージボリュームを提供します。 EBS スナップショット とは、Amazon EBSボリュームのデータを Amazon S3 にバックアップできます。そして、 EBS スナップショットゴミ箱 は、EBS スナップショット を誤って削除した場合でも、スナップショットを復旧できる機能です。ゴミ箱からの手作業での削除インターフェースは存在せず、ゴミ箱ルールに入れたものはゴミ箱ルールで指定された保持期間を迎えるまでは削除できません。 しかし、ランサムウェアや悪意を持った攻撃者は、ゴミ箱ルールを削除してからスナップショットを復元してデータを不正に取得し、それを削除するという方法でゴミ箱の回避を試みることもあり得ます。それを阻止することができる機能が、 EBS スナップショットのゴミ箱のルールロック です。これは、EBS スナップショットゴミ箱機能のルールを編集、削除することを防ぐ機能です。「ロック解除の遅延期間」を設定すると、その期間中は遅延期間を変更や削除ができない状態になります。 ルールがロックされると、保持ルールの編集もできなくなるため、保持しているゴミ箱内の EBS スナップショット の削除保護が実現できます。ルール自体の変更や削除ができないため、攻撃者は前述の手法でスナップショットを削除することができなくなります。 例えば、医療機関で本番運用している AWS アカウントの権限が侵害された場合、ロック解除の遅延期間を設けているため、その期間中は EBS スナップショットからデータを復旧できなくなることを心配せず、セキュリティ脅威を検出して対応するための時間を確保することができます。 ルールロックの設定画面 より詳細な情報は、「 保持ルールの操作 – Amazon Elastic Compute Cloud 」をご参照ください。 Amazon FSx for NetAPP ONTAP の SnapLock Amazon FSx for NetApp ONTAP は、ONTAP ファイルシステムの一般的な機能、パフォーマンス、API を AWS のフルマネージドサービスとして利用でき、AWS の俊敏性、スケーラビリティ、セキュリティ、および耐障害性を享受することができます。 SnapLock は、WORM を備えたボリュームを作成する ONTAP 機能で、指定された期間内のファイルの変更や削除を防止することができます。そのため、ランサムウェアや悪意を持った攻撃者によるデータの改ざんや削除から、データを保護することができます。 現在オンプレミスで利用中のファイルシステムがあり、AWS クラウド上に移行する場合、ランサムウェア被害に対策できるファイルストレージの移行先として検討することができます。 SnapLock の設定画面 SnapLock では、「コンプライアンスモード」と「エンタープライズモード」の 2 つのモードが用意されています。 コンプライアンスモードでは、保持期間が終了するまで、全てのユーザーはファイルの名前変更や削除操作を行うことができなくなります。 エンタープライズモードでは、コンプライアンスモードでボリュームを作成する前に、組織のデータ保持ポリシーや、保存設定をテストするために使用されます。このモードでは、承認されたユーザーのみに削除操作を許可することができます。また、有効な保存期間内の WORM ファイルが含まれていても、そのボリュームを削除することができます。 この機能は、既存のボリュームに対して有効化することができませんが、SnapLock が有効なボリュームを新規作成して、そのボリュームにデータをコピーすることはできます。 より詳細な情報は、「 新着情報 – 規制コンプライアンスとランサムウェア対策を目的として Amazon FSx for NetAPP ONTAP が WORM 保護のサポート提供を開始 | Amazon Web Services ブログ 」をご参照ください。 各サービスの機能の比較 今回ご紹介した、4 つのサービスの機能の比較表を以下に示します。 Amazon S3 AWS Backup ゴミ箱機能(EBS スナップショット) Amazon FSx for NetAPP ONTAP 名称 Object Lock Vault Lock Rule Lock SnapLock 保護対象リソース バージョニングされたオブジェクト リカバリポイント ゴミ箱内の EBS スナップショット ファイルとボリューム 設定対象リソース オブジェクトまたはバケット Vault ゴミ箱機能のリテンションルール SnapLockの設定はボリューム単位、リテンションの設定はファイル単位 リソース削除のタイミングとロックのリテンションの関係 ロックのリテンションとオブジェクトの削除は独立 ロックのリテンションとリカバリポイントが削除されるタイミングが同じ ロックのリテンションとゴミ箱からスナップショットが削除されるタイミングが同じ ロックのリテンションとファイルの削除は独立 実際に保護対象リソースが削除できるタイミング ロック解除後のライフサイクルなどで指定したタイミング Backup plan でのリテンション次第 ゴミ箱機能のリテンションルール次第 ロック解除後のファイルの標準的な削除タイミング ユースケース オブジェクトストレージである S3 上に保存している電子カルテのバックアップなどを、ランサムウェアによるデータ上書きや削除といった攻撃から保護 AWS上の各種リソースや、オンプレミスのVMware 仮想環境のバックアップで利用でき、ランサムウェア被害から復旧する際に利用するバックアップデータを、悪意ある上書きや削除から保護 既に EC2 で稼働している医療情報システムがあり、AWS アカウントの権限が侵害された場合、ロック解除の遅延期間中に EBS スナップショットからデータを復旧できなくなることを心配せず、セキュリティ脅威を検出して対応するための時間を確保 医用画像や文書ファイルを、ランサムウェア被害から保護することができるファイルストレージ ランサムウェア被害を対策する上では、ロックの保持期間やロック解除の遅延期間を適切に設定することが重要です。適切に設定するためには、セキュリティ侵害の特定と対応にかかる時間を見積り、それよりも長くする必要があり、過去のセキュリティインシデントやアカウント侵害の特定と修復に必要な時間を確認しなければなりません。一方で、お客様自身が意思をもって削除を試みたい場合、ロックの保持期間やロック解除の遅延期間が終了するのを待つ必要があり、その後にリソースの削除やルールの変更、もしくはルールの削除する必要があります。 まとめ 本ブログでは、ランサムウェアの脅威に備えるためのガイドラインの要点、復旧戦略を検討する上でのポイントとなる目標復旧時点と目標復旧時間についてお話ししました。また、バックアップのストレージとして AWS では S3 の Object Lock や AWS Backup の Vault Lock、EBS スナップショットゴミ箱機能のルールロック、Amazon FSx for NetAPP ONTAP の SnapLock がランサムウェア対策において有効であることを説明しました。 内閣サイバーセキュリティーセンターの NICS や 厚生労働省 、 情報処理機構 、 医療機関向けセキュリティ教育支援ポータルサイト など、各組織よりランサムウェア対策の特設ページが設けられています。最新の情報をご確認の上、対策を検討いただければ幸いです。 著者について 吉村 弘明 (Yoshimura, Hiroaki) は AWS Japan のソリューションアーキテクトです。週末は料理をしたり、美味しいご飯を求めて都内を歩いています。       片山 洋平 (Katayama, Yohei) は AWS Japan のパブリックセクターのソリューションアーキテクトです。主に医療機関をはじめとしたヘルスケア業界のお客様のソリューション構築の支援を行なっています。週末は登山を嗜んでいます。
アバター
はじめに 日本の工作機械メーカー株式会社牧野フライス製作所(マキノ)は、5Gネットワークを介した自律走行搬送ロボット(Autonomous Mobile Robot, AMR)制御システムの立ち上げに5か月足らずで成功しました。マキノは、5GネットワークとAWS Wavelengthを使用して、移動するAMR と制御サーバー間の無線通信の安定性を向上させました。同社はパブリック 5G と AWS Wavelength を選択することで、プライベート 5G 環境を自社で構築する場合と比較して大幅なコスト削減を実現しました。 AWS Japan 主催の イベント にて、株式会社牧野フライス製作所 CIO 中野 義友 氏、情報システム部 志津里 淳 氏、開発本部 児玉 匠 氏 は、この先進的な取り組みのほぼ全てをマキノ社員による内製開発によって、わずか5ヶ月足らずの期間に実現したことを発表しました。このブログでは、マキノが取り組んだ課題と実装したソリューションについて説明します。 工場を走り働くロボット 一般的にマシニングセンタとして知られている装置では、さまざまな金属加工を実行するために、フライスやビットなどの重い工具を交換する必要があります。現在、これらの工具は人間の作業者によって手作業で置き換えられており、肉体的に厳しい労働を伴います。マキノは、工場内での工具の搬送や交換を自動化する AMR を自社で製造・販売しています。マキノのAMRにはLiDARセンサーが搭載されており、周囲の障害物を検知して自律的に移動することができます。作業現場の作業員や他のAMRと協力して作業できるように設計されています。 図1: マキノのAMR 図2:マキノのAMRはLiDARで周囲を認識できる 図 3: マキノの AMR ダッシュボードには LiDAR を使った自動マッピングが表示される 課題 マキノのAMRは制御サーバーから要求を受け取り、自律的に移動してその要求を処理します。これまで、マキノは AMR とサーバー間の通信に Wi-Fi を使用していました。サーバーは、HTTPSやWebRTCなどの複数のプロトコルを使用して要求メッセージをAMRに送信します。これには、安定した中断のない通信が必要でした。しかし、移動中の AMR とサーバー間の通信が不安定になることがありました。AMR が Wi-Fi アクセスポイントの圏外に移動して接続が切断されると、別のアクセスポイントへのハンドオーバーに時間がかかります。マキノは、Wi-Fiハンドオーバープロセスの遅延がこの不安定性の原因であると特定しました。これを解決するには、アクセスポイント間の安定したハンドオーバーが必要です。 図4: Wi-Fi アクセスポイント間ハンドオーバーの課題 5GはAMR制御アプリの安定した無線通信を実現する そこでマキノはWi-Fiの代わりに5Gネットワークを採用しました。5G通信は、移動中でもシームレスな接続を実現するように設計されているため、ロボットが動いているときでも基地局間の受け渡しがスムーズになります。 工場の屋内で5G通信を実現する方法はいくつかあります。たとえば、工場のオーナーは「ローカル5G」と呼ばれる独自のプライベート5Gネットワークを構築できます。マキノは、さまざまな無線通信方式の評価を行いました。具体的には、プライベート5Gとパブリック5Gの比較を行いました。 評価の末、マキノはパブリック5Gを選択した結果、コスト削減とリアルタイムでの安定した操作性の両方を実現しました。マキノは、5Gネットワークの導入に加えて、これまで工場にあったサーバーをパブリック5Gを用いたハイブリッドクラウドサービスであるAWS Wavelengthに移行しました。AWS のソリューションアーキテクトが マキノ の技術的課題の解決を支援しました。 図 5:  5G 通信を用いたソリューションの概要 マキノがパブリック 5G と AWS Wavelength を選んだ理由 AWS Wavelength は、モバイルキャリアが所有する 5G 基地局ネットワーク上の AWS リソースを使用して処理を行うサービスです。5G基地局のすぐ近くで処理を実行して応答できるため、AWS Wavelength は 5G 通信の低レイテンシー処理に最適です。日本の大手モバイルキャリアであるKDDIは、AWS Wavelengthをサポートしています。 図 6: AWS Wavelength マキノは以下の理由により、パブリック5GとAWS Wavelengthの組み合わせがWi-Fiやプライベート5Gよりも今回のユースケースに適した選択肢であると結論付けました。 ネットワークの安定性とパフォーマンス まず、マキノはモバイル接続における5G通信の優れたパフォーマンスに着目しました。同社は工場に5G基地局を設置し、ネットワークの安定性とパフォーマンスを評価し、移動するロボットが複数の5G基地局エリアで通信しても通信断が発生しないことを確認しました。その後、同社は通信パフォーマンスを測定しました。Wavelength Zone のインスタンスから AMR までのネットワークレイテンシーは 10 ~ 15 ミリ秒でした。また、VPN トンネル上で HTTPS を使用するアプリケーションで測定した場合でも、制御アプリケーションから AMR までの全体のレイテンシーは約 40 ミリ秒でした。これはマキノ の AMR を制御するメッセージを送信するに十分なレイテンシーの低さです。このAWS Wavelengthへの移行においてマキノはアプリケーションの最適化の効果よりも稼働開始までの期間を優先し、「リフト」アプローチ(大きな設計変更をしない移行戦略)を採用していますが、将来、アプリケーションを AWS Wavelength 用に最適化できれば、さらに通信レイテンシーを改善できる可能性があります。ネットワークスループットは、ダウンストリームの平均1.1 Gbps、アップストリームの平均140 Mbpsで測定され、マキノにとって満足のいく結果でした。 初期費用の削減 マキノは意思決定において特にコストを重視しました。パブリック5Gネットワークには、プライベート5Gネットワークの運用とは異なり、5G機器の構築と保守に費用をかける必要がない(通信事業者に任せられる)という利点があります。 保守性 パブリック5Gの場合、5G通信ネットワークを運用するためのライセンスを取得したり、専門家を雇ったりする必要はありません。パブリック5Gは一般的なスマートフォンでも使用できます。5G通信事業者は基地局を継続的にアップグレードしますが、プライベート5Gネットワークの所有者は自社の機器のアップグレードと修理に責任があります。 ロボットの遠隔監視と調査 これまで、AMRは工場内で監視および管理されていました。制御サーバーは工場内にあり、工場のLANに接続されていたため工場外からのAMR管理は不可能でした。しかし、パブリック5Gの活用により、マキノは遠隔管理が可能になり、AMRの運用をリモートで調査できるようになりました。AMRに問題が発生した場合、オペレーターはリモートで調査し、適切な措置を講じることができます。さらに、より詳細なログをリモートでリアルタイムに表示できるようになりました。 工場にサーバーを設置する必要がなくなる マキノは、AWS Wavelengthを使用することで、制御サーバーをAMRを納める工場に設置する必要をなくすことに成功しました。これにより、マキノからロボットを購入するお客様は、自社の工場内にサーバーインフラを設置する必要がなくなりました。これにより、マキノのお客様が高度なロボットを購入するプロセスが簡単になります。 AWS Wavelength によるネットワーク構成 図 7: ソリューションの AWS アーキテクチャ図 AMRの制御サーバーは Wavelength Zoneにあります。AMR とサーバーは、パブリック 5G ネットワークを介して通信します。制御用のタブレットとサーバーはインターネットを介して通信します。 マキノは AWS Wavelength を使用する際にいくつかの要素を考慮しました。 IPアドレス範囲 :通常、工場の機器はプライベートIPアドレスを使用します。マキノのAMRには、特定のプライベートなIPアドレス範囲が必要でした。一方、AWS Wavelengthによって付与されるIPアドレスの範囲は、キャリア固有のグローバルIPアドレスで構成されます。 デバイス認証:  AWS Wavelength は、AWS IoT Core などの AMR デバイス認証用のマネージドサービスをサポートしていません。 図8: マキノのAMRをAWS Wavelengthとパブリック5Gネットワークで使用する際の考慮点 同社は慎重に検討した結果、これらの問題の解決策を見つけました。同社は Wavelength Zoneに VPN ルーターインスタンスを作成しました。VPN ルーターは各 AMR への VPN トンネルを確立し、AMR のプライベート IP アドレス範囲からの通信を可能にします。デバイス認証は、VPN トンネルの接続時にVPNのクライアント証明書を使用して行うことができます。 図 9: マキノの AMR を AWS Wavelengthとパブリック 5G ネットワークで利用するためのソリューション その結果、マキノは AWS Wavelength を使用して AMR やサーバーと安全に通信できるようになりました。 おわりに マキノはAMR 制御システムをパブリック 5G ネットワークと AWS Wavelength 上にわずか 5 か月足らずで構築し、次のようなメリットを得ました。 ネットワークの安定性とネットワークパフォーマンス 初期費用の削減 保守性 ロボットの遠隔監視と調査 工場内のサーバーレスAMRシステム マキノは、この新たなシステムを顧客に販売する予定です。そのために同社は、AWS上のアーキテクチャを最適化し、保守性と運用性をより迅速かつ容易にすることで、さらなる運用改善とネットワークパフォーマンスの向上できると考えています。 詳細はこちら AWS Japan イベントでのマキノのセッション マキノは、2022年4月7日に開催されたAWSイベントで、5GネットワークとAWS Wavelengthを使用したAMRとユースケースについて説明しています。 このブログ にはスライドとビデオ(日本語)が含まれています。 AWS Wavelength など、 AWS が提供するさまざまなハイブリッドサービスについて学ぶことで、ユーザーに適したソリューションを選択できます。これらのAWS ハイブリッドサービスによるスマートプロダクトソリューションを検討する際は、最適なソリューションを見つけるお手伝いをする AWS のソリューションアーキテクトにご依頼ください。 牧野フライス製作所 株式会社について 牧野フライス製作所は日本を拠点とするフライス盤・マシニングセンタメーカーです。同社は世界中に工場と営業所を持ちます。また、ロボットや先端技術を積極的に活用しています。 吉川晃平(Kohei Yoshikawa) 吉川は AWS Japan のシニアソリューションアーキテクトです。北海道大学の修士課程を卒業後、ソフトウェア開発者およびシステムインテグレーターとして20年以上従事しました。2020 年 12 月に AWS に入社し、日本の多くの製造業のお客様を支援してきました。週末はサイクリング、冬はスキーを楽しんでいます。 このブログは吉川による” Makino improves performance of Autonomous Mobile Robots with AWS Wavelength and 5G network “を和訳したものです。
アバター
私たちは AWS Supply Chain のイノベーションにより、サプライチェーンの未来に備えています。 私たちは、お客様の声に耳を傾け、お客様の課題を理解し、フィードバックを収集することで、お客様の立場に立って取り組むことでイノベーションを起こします。 このアプローチにより、当社のイノベーションがお客様のあらたなニーズに確実に対応できるようになります。 AWS Supply Chain は、サプライチェーンのリーダーがサプライチェーンの回復力を高めるため、リスクを軽減し、コストを削減してするのに役立つクラウドベースのアプリケーションです。 AWS Supply Chain は、サプライチェーンデータを統合し、機械学習 (ML) を活用したコネクタとアクションに繋がるインサイトを提供し、コンテキストに応じたコラボレーションを組み込みます。 在庫切れを減らすことで顧客サービスのレベルを高め、過剰在庫によるコストを削減できるように設計されています。 このブログ記事は、最近の AWS Supply Chain のリリースをまとめたものです。 ブログで紹介する機能は、お客様のフィードバックに基づいています。 需要計画における製品系統を使用した予測 AWS Supply Chain Demand Planning では、製品を 製品系統 と呼ばれる以前のバージョンまたは代替バージョンとリンクして、予測の精度を高めることができるようになりました。 製品とその以前のバージョンまたは代替製品との間にリンクを確立することで、プランナーは以前のモデルまたは類似製品の過去の売上データを利用して予測に役立てることができます。 この「代理履歴」は、より正確な需要予測の基礎を形成し、製品系統を通じて生成される予測が本質的に正確であることを保証し、それによって手動調整の必要性を最小限に抑えます。 需要計画の強化 需要予測は効率的なサプライチェーンの中心であるため、このプロセスを強化するために複数の機能を導入しました。 需要予測に 複数のオーバーライド を適用できるため、複数の製品にまたがった調整を同時に実施できます。 AWS Supply Chain Demand Planning の直感的な ユーザーインターフェイス が刷新され、予測設定が簡単になり、ワークフローが効率化されました。 予測における手動のオーバーライドを自動的に 保持 し、計画サイクル全体にわたって保持する一貫性があり効率的な予測が可能になります。 ユーザーエクスペリエンスとコンプライアンスの向上 私たちはシームレスなユーザー体験を提供することに全力を注いでいます。 AWS CloudTrail を AWS Supply Chain Demand Planning と 統合 しました。これにより、ガバナンスを常に監視を行い正常稼動を確実にし、透明性とコンプライアンスを向上させることができます。 新しい地域への可用性の拡張 各地でAWS Supply Chain に対する関心は高まり続けているため、提供地域を拡大しています。 現在、AWS Supply Chain はオーストラリア ( シドニー )、ヨーロッパ ( アイルランド )、米国東部 (バージニア北部)、米国西部 (オレゴン)、ヨーロッパ (フランクフルト) でご利用いただけます。 結論 今後数か月以内に、さらにエキサイティングなアップデートを発表する予定です。 これらの強化は、イノベーションへの注力と、お客様に価値を提供するという当社の取り組みによって推進されています。 AWS Supply Chain にアクセスして、詳細を確認して利用を開始しましょう。 また、 AWS Workshop Studio にアクセスして、インスタンスの作成、データの取り込み、ユーザーインターフェイスの操作、インサイトの作成、需要計画の生成に関する技術的な概要を自分のペースで確認することもできます。 本ブログはソリューションアーキテクトの水野 貴博が翻訳しました。原文は こちら 。 著者について Harold Abell は AWS Supply Chain のシニアプロダクトマネージャーです。 Harold は AWS Supply Chain の創立者プロダクトマネージャーの 1 人で、アプリケーションのコンセプトと設計に携わっています。 Harold は、ゼネラル・エレクトリック (GE) とアマゾンウェブサービス (AWS) の両方で、サプライチェーンとソフトウェア開発において 10 年以上の業界経験があります。 Harold はブリガム・ヤング大学を卒業し、製造工学の学士号と修士号、デューク大学のフクア・スクール・オブ・ビジネスで経営学修士号を取得しています。 余暇には、Harold は妻と3人の女の子とのスノースキーやボートなど、アウトドアのあらゆるものが大好きです。 Harini Kidambi は AWS Supply Chain Demand Planning のプロダクトマネージャーです。 BlueYonderとアマゾンウェブサービス (AWS) の両方でサプライチェーンと分析の分野で5年以上の経験があります。 彼女は AWS Supply Chain のお客様と協力して、お客様のビジネスニーズを理解し、技術ソリューションとユーザーエクスペリエンスを調整し、最大のビジネス価値を実現できるよう支援しています。 Vita Grebeniuk は AWS Supply Chain のシニアテクニカルプログラムマネージャーです。 Vita は、ソフトウェア開発とプログラム管理の分野で 10 年以上の経験があります。 現在の役職では、AWS Supply Chain のさまざまなワークストリームと連携して、製品の拡張や、お客様のビジネスの成長と複雑なサプライチェーンの課題の解決に役立つ重要な機能の立ち上げに取り組んでいます。 Vita はサイクリングやスキー、アメリカやカナダの旅行、ロードトリップも好きです。基本的には外で過ごす時間を増やし、家族をアクティブに保つためなら何でも好きです。 <!-- '"` -->
アバター
背景 生成系 AI の応用の幅が広がる技術としてマルチモーダルなモデルがあります。マルチモーダルではモデルの入出力に複数の異なるデータ形式を用いることができます。例えば Amazon Bedrock の Stable Diffusion ではテキストを入力に画像を生成することができます。画像とテキストという異なるデータ形式の入出力をするためマルチモーダルなモデルといえます。他にも入力した画像の説明文章をテキストとして出力できる BLIP-2 (Bootstrapping Language-Image Pre-training) と呼ばれるモデルもあり、AWS では Amazon SageMaker の推論 Endpoint にデプロイすることで利用することができます。詳しくは こちらのブログ をご覧ください。さらに、BLIP-2 は画像に対しキャプションをつけるタイプのモデルでしたが、対話形式で画像に対する問い合わせをすることができる MiniGPT-4 が生まれました。MiniGPT-4 は BLIP-2 の ViT (Vision Transformer) 、 Q-Former (Querying Transformer) と LLM (Large Language Models) を線形結合層で繋ぐことで実現されます。LLM を切り替える場合はこの線形結合層のみを再学習するため BLIP-2 や LLM 自体の再学習をしない分少ないパラメータを対象に再学習できるメリットがあります。 これらのように画像を入力にテキストを生成するモデルを Image to Text と呼びます。Image to Text のモデルを使えば、画像に対して説明を求めたり、QA することができるようになります。これを応用して、画像にタグを付与したり、テキストを入力に画像を検索したりできるようになります。従来の物体検出のような Computer Vision 技術で取得できた画像情報とは異なる情報を柔軟に取得できる可能性があります。どれくらいの情報が取得できるのか是非試したいですよね。 画像へ対話形式の問合せを日本語で試したい!と思っても、MiniGPT-4 は英語のモデルのため日本語には難があるかもしれません。そこに、MiniGPT-4 の線形結合層を日本語データで再学習した OSS の 日本語 LLM が発表されました。それが rinna株式会社の bilingual-gpt-neox-4b-minigpt4 です。今回は無料の Jupyter ノートブックサービスである SageMaker Studio Lab から bilingual-gpt-neox-4b-minigpt4 を利用して画像に対する QA に日本語で挑戦してみたいと思います。 制限事項 執筆時点で SageMaker Studio Lab には CPU と GPU いずれも 1 日あたり利用時間上限が決められています。また、閉域接続ではなくインターネットでご利用いただくサービスになります。好評いただいているサービスのため、特に GPU の利用時に一度では Start runtime できず複数回トライいただく場合があります。これらの特徴と上手にお付き合いいただきご利用いただければ嬉しいです。 前準備 SageMaker Studio Lab は AWS アカウント不要の無料のノートブックサービスです。AWS アカウントがなくても利用でき、メールアドレスがあれば登録することができます。 こちらのブログ をご覧いただき登録を完了いただけると以降の手順がスムーズです。 SageMaker Studio Lab は 機械学習帳とも連携 しており、SageMaker Studio Lab を使ってすぐに機械学習のスキル獲得を始めていただく事ができます。 sagemaker-distribution を利用して永続化領域を節約 本ブログでは 公式の environment.yml ではなく、 sagemaker-distribution カーネルを利用する方法をお伝えします。これにより、SageMaker Studio Lab の永続化領域を有効利用することができ、SageMaker Studio への移行も簡単にすることができます。sagemaker-distribution は PyTorch、TensorFlow、Keras などの人気のあるライブラリがプリインストールされている環境を提供します。SageMaker Studio と SageMaker Stdio Lab の両方に互換性のある Pythonライブラリが 18 種類以上付属しています。この環境は永続的であり、SageMaker Studio Lab 利用者に割り当てられた 15 GB の空き容量を使用しません。詳しくは こちら をご覧ください。sagemaker-distribution カーネルは 2023 年 8 月に SageMaker Studio Lab で利用できるようになりました。 bilingual-gpt-neox-4b-minigpt4 のダウンロードと必要なライブラリのインストール こちらの作業は CPU モードで実行することで GPU 利用時間を節約しましょう。CPU と GPU の切り替えはログインページのラジオボタンからの切り替えになります。ノートブックの実行画面にはないため注意してください。 公式のダウンロード手順 に従い必要なファイルをダウンロードします。SageMaker Studio Lab から Terminal を起動し、以下を実行します。Terminal は画面左上のプラスボタンから Launch タブを開き、Terminal を選択することで起動できます。Blog 執筆時点では以下のコマンドとなっていました。最新のコマンドは こちらの URL からご確認ください。 git clone https://github.com/Vision-CAIR/MiniGPT-4.git cd ./MiniGPT-4 git checkout 22d8888 # latest version as of July 31, 2023. wget https://huggingface.co/rinna/bilingual-gpt-neox-4b-minigpt4/resolve/main/customized_mini_gpt4.py wget https://huggingface.co/rinna/bilingual-gpt-neox-4b-minigpt4/resolve/main/checkpoint.pth ダウンロードが終わったことを確認したら、元のモデルファイルを /tmp/model_data に保存するように customized_mini_gpt4.py に変更を加えます。元のままの場合、ユーザの永続化領域にモデルファイルが保存され容量を圧迫してしまうためです。111 行目以降の from_pretreined の引数に cache_dir = ‘/tmp/model_cache/’ を追加し、以下のように変更します。永続化領域を節約する効果は こちら をご覧ください。画面左側のファイル一覧からダブルクリックで customized_mini_gpt4.py の編集画面を開くことができます。 if self.low_resource: self.gpt_neox_model = CustomizedGPTNeoXForCausalLM.from_pretrained( gpt_neox_model, torch_dtype=torch.float16, load_in_8bit=True, device_map={'': device_8bit}, cache_dir = '/tmp/model_cache/' ) else: self.gpt_neox_model = CustomizedGPTNeoXForCausalLM.from_pretrained( gpt_neox_model, torch_dtype=torch.float16, cache_dir = '/tmp/model_cache/' ) それでは こちらのページ を参考にノートブックを作成していきましょう。作成された MiniGPT-4 ディレクトリに sample.ipynb を作成します。以降の作業は全て sample.ipynb に実装します。 画面左上のプラスボタンから sagemaker-distribution: Python を選択いただくとノートブックファイルを作成できます。ファイル名を sample.ipynb に変更してください。 作業中、sagemaker-distribution カーネルが選択されているかを確認する場合は、右上のカーネル選択にてsagemaker-distribution が選択されているかをご覧ください。 次に以下のコマンドをセルで実行してください。 !conda install -y -c conda-forge opencv !pip install omegaconf !pip install iopath !pip install timm !pip install webdataset !pip install transformers !pip install decord !pip install sentencepiece これで環境は整いました。 ノートブックで Image QA にトライ ここからは GPU モードで実行しましょう。移行の実装は公式の I/O Format と How to use the model のソースコードをセルに分割して書き下したものになります。 まずは、必要なモジュールを import します。以下のコードをセルに貼り付けて実行してください。 import torch import requests from PIL import Image from minigpt4.processors.blip_processors import Blip2ImageEvalProcessor from customized_mini_gpt4 import CustomizedMiniGPT4 GPU が利用可能かを以下のコマンドで確認しておきましょう。以下のコードをセルに貼り付けて実行してください。 torch.cuda.is_available() GPU モードで SageMaker Studio Lab を起動していても、torch の version と CUDA Driver が合わない場合、上記の結果は False が返ります。この場合、以降のコードは CPU で実行され期待動作しない場合がありますため注意が必要です。sagemaker-distribution カーネルを使えばこの問題は起きません。SageMaker-Distibution カーネルには SageMaker Studio Lab の GPU が使用できるバージョンの torch が予めプリインストールされているためです。もし False が返ってきた場合指定したカーネルが誤っている可能性がありますのでご確認ください。 次に、モデルを準備します。以下のコードをセルに貼り付けて実行してください。CustomizedMiniGPT4 はダウンロード手順で取得した customized_mini_gpt4.py の中に実装があります。興味がある方は是非確認してみてください。 checkpoint.pth は再学習した線型結合層のモデルファイルです。こちらも先ほどの手順でダウンロード済です。 model = CustomizedMiniGPT4(gpt_neox_model="rinna/bilingual-gpt-neox-4b") tokenizer = model.gpt_neox_tokenizer if torch.cuda.is_available(): model = model.to("cuda") ckpt_path = "./checkpoint.pth" if ckpt_path is not None: print("Load BLIP2-LLM Checkpoint: {}".format(ckpt_path)) ckpt = torch.load(ckpt_path, map_location="cpu") model.load_state_dict(ckpt['model'], strict=False) それでは、問合せ対象の画像を準備しましょう。以下のコードをセルに貼り付けて実行してください。ここでは huggingface にあるサンプル画像を利用します。猫が横たわっている画像が表示されれば成功です。 image_url = "https://huggingface.co/rinna/bilingual-gpt-neox-4b-minigpt4/resolve/main/sample.jpg" raw_image = Image.open(requests.get(image_url, stream=True).raw).convert('RGB') raw_image BLIP-2 を利用して画像をエンコードします。画像を数字列に変換する Embedding と呼ばれる手法です。この値とテキストを入力することで画像への問合せが可能となります。以下のコードをセルに貼り付けて実行してください。 vis_processor = Blip2ImageEvalProcessor() image = vis_processor(raw_image).unsqueeze(0).to(model.device) image_emb = model.encode_img(image) 以下は公式のサンプルプロンプトです。 に先ほどの Embedding した値が入ります。ユーザー/システムで話者を識別しています。以下のコードをセルに貼り付けて実行してください。 prompt の中身が表示されれば成功です。 prompt = [ { "speaker": "ユーザー", "text": "&lt;Img&gt;&lt;ImageHere&gt;&lt;/Img&gt; 何が写っていますか?" }, { "speaker": "システム", "text": "a cat on a table with a laptop" }, { "speaker": "ユーザー", "text": "猫はどんな体勢をしていますか?" }, ] prompt = [ f"{uttr['speaker']}: {uttr['text']}" for uttr in prompt ] prompt = "\n".join(prompt) prompt = ( prompt + "\n" + "システム: " ) print(prompt) 画像の Embedding に加えて、テキストも Embedding して、それらを組み合わせる処理をします。詳しくは、 customized_mini_gpt4.py の get_context_emb をご覧ください。以下のコードをセルに貼り付けて実行してください。 embs = model.get_context_emb(prompt, [image_emb]) さあ、最後に回答となるテキストを生成するコードです。 output に回答テキストが入ります。以下のコードをセルに貼り付けて実行してください。結果はどうなるでしょうか? output_ids = model.gpt_neox_model.generate( inputs_embeds=embs, max_new_tokens=512, do_sample=True, temperature=1.0, top_p=0.85, pad_token_id=tokenizer.pad_token_id, bos_token_id=tokenizer.bos_token_id, eos_token_id=tokenizer.eos_token_id ) output = tokenizer.decode(output_ids.tolist()[0], skip_special_tokens=True) print(output) 出力例: うつ伏せ 以下に、著者が試してみた画像に対する対話型での QA を記載します。是非、皆さんのアイデアで試してみてください。 ユーザー: &lt;Img&gt;&lt;ImageHere&gt;&lt;/Img&gt; 何が写っていますか? システム: 猫がテーブルの上のパソコンを眺めている ユーザー: 猫は何色? システム: 白 ユーザー: 茶色に見えますが、白ですか? システム: 茶色 ユーザー: 猫可愛いですね。この猫の隣にあるのは何ですか? システム: パソコン ユーザー: このシーンの次には何が起きると思いますか? システム: パソコンが壊れる 最後に いかがでしたか?本ブログでは、日本語対応の OSS のモデルを利用して、画像に対して対話型で QA することに挑戦してみました。画像を変えてみたり、プロンプトを変えてみたりして結果を確認してみてください。また、 bilingual-gpt-neox-4b-minigpt4 の登場によって、日本語 LLM と学習用データを準備すれば線形結合層の再学習のみで日本語対応できる MiniGPT-4 が作れることが示されました。今後、登場する日本語 LLM の OSS を利用して皆さん独自のデータで再学習したい場合にも適用できる方式になります。是非、そちらにも挑戦いただければ嬉しいです。著者もどこかで実験し Blog にできればと考えています。 著者 中島 佑樹 西日本のお客様をメインで担当するソリューションアーキテクト。社会人博士を修了したことをきっかけに AIML を得意分野としている。 システム一般のテーマや Amazon Bedrock を用いた生成系 AI のシステム開発、Amazon SageMaker Studio Lab を用いた AIML への入門まで幅広く活動。
アバター
みなさんこんにちは! アマゾンウェブサービスジャパン合同会社 ソリューションアーキテクトの Yuan です。 2023 年 10 月 26 日に「第三十五回 アップデート紹介とちょっぴり DiveDeep する AWS の時間」をオンラインで開催しました。本イベントは、AWS の数あるアップデートの中から「すぐ使える、運用に役立つ、あったらいいなと思ってた、おもしろい、重要」なものをピックアップし、ちょっぴり DiveDeep してカジュアルな雰囲気でお伝えするイベントです。 今回は「Serverless 編」ということで、 実際に AWS の Serverless 関連サービスをご利用いただいているお客様から事例やサービスの機能についてご紹介頂きました。 今回も非常に多くの方にご参加いただきました。ご参加いただいた皆様、誠にありがとうございました。 実施内容 今回はいつもの 5 分間アップデート以外に、ゲストスピーカーの株式会社ゼンリンデータコムの 新谷 亮人様、株式会社 Serverless Operations の 金 仙優 様、Ragate 株式会社 久保 翔太 から AWS の Serverless サービスを用いたサービス構築・運用の事例についてご紹介頂きました。合計 1 時間半の中で盛りだくさんの内容でお送りしました。 本記事の中に資料や動画のリンクを記載しておりますので、ぜひご活用ください! 当日参加したメンバー アジェンダ 今月のお勧め 5 分間アップデート (5 分) スピーカー : アマゾン ウェブ サービス ジャパン合同会社 ソリューションアーキテクト 高橋 佑里子 今月の AWS のサービスアップデートを 5 分でご紹介しました。多くのアップデートの中から以下の 3 つをピックアップしました。 Amazon Bedrock が一般利用可能に ハンズオン (日本語) Generative AI Use Cases JP (日本語) AWS Lambda のバースト同時実行数のクォータが soft limit に Amazon OpenSearch Service が OpenSearch バージョン 2.9 をサポート開始 AWS の新着情報については 公式ページ のほか、毎週のアップデート情報をまとめて発信している 週刊 AWS を合わせてご覧頂くことがオススメです! 100 台のサーバー運用からの脱却を目指して:初めての AWS サーバレス環境構築の裏側 (15 分) スピーカー : 株式会社ゼンリンデータコム 新谷 亮人 様 ゼンリンデータコムが長年にわたり提供する月間数億 PV の「店舗案内パッケージ」サービスが、AWS サーバーレスアーキテクチャとマイクロサービス化によりマルチテナント型の SaaS として進化しました。本セッションでは、15 年間で肥大化したモノリシックな環境からマイクロサービス・サーバレス環境への移行について、AWS のサービス選定、疎結合構成のメリット、AWS Lambda リリースや構成管理の課題などを失敗談も含めてご紹介します。サーバレス環境に興味はあるけれど踏み出せない、サーバレス導入を検討している方向けのセッションです。 人気番組の新作配信を安定起動させた、サーバーレスな AWS 分散負荷試験ソリューション「Distributed Load Testing」を使った負荷試験の仕組み (15 分) スピーカー : 株式会社 Serverless Operations COO 金 仙優 様 サーバーレス構成における「負荷試験」は、アクセススパイク時のパフォーマンス面のみならず、安定性、コストなど様々な面において最適化を行うための手段になります。このセッションでは、某人気番組が配信される度に激しいアクセススパイクに見舞われ、毎回サーバーが落ちていた VOD サービスを完全リニューアル、その番組の新作エピソードを問題なく配信できるまでの対応についてご説明します。特に、負荷試験で利用した AWS の分散負荷試験ソリューション「Distributed Load Testing」に焦点を当てて解説いたします。アクセススパイク以外でも、サーバーレスにおいて負荷試験を行う目的とメリットは多々ありますので、その点も合わせてお伝えしていきます。 【RDB 開発者向け】Amazon DynamoDB 設計ベストプラクティス事例紹介 (15 分) スピーカー : Ragate 株式会社 開発部プロジェクトマネージャー 久保 翔太 様 Amazon RDS とAmazon DynamoDB はどちらを選択するのが最適なのか。また、Amazon DynamoDB の設計のベストプラクティスに悩んでいる方向けに、自社の事例を交えて解説致します。 AWS マルチアカウント戦略を採用したサーバーレスアプリケーションの管理と運用 (15 分) スピーカー : 木村情報技術株式会社 システム開発本部 第三開発部 徳山 鐘三 様 AWS Lambda にて Docker ランタイムが利用できるようになったことにより、アプリケーション開発の自由度がより高まりました。またマルチアカウント戦略を取り入れることにより柔軟で管理しやすいアーキテクチャを実現する事ができます。 本セッションではマルチアカウント戦略を取り入れた上での Docker on Lambda を利用したサーバーレスアプリケーションのアーキテクチャや運用方法について、具体的な事例を交えて紹介します。 当日の様子 当日の内容を抜粋してご紹介します。 100 台のサーバー運用からの脱却を目指して:初めての AWS サーバレス環境構築の裏側 [ 資料 、 動画 ] こちらのセッションは株式会社ゼンリンデータコムプロダクト第一開発部シニアエンジニア新谷 亮人様より、15年以上歴史を持つ「店舗案内パッケージ」をサーバーレス構成にリニューアルする道と課題を紹介いただきました。「店舗案内パッケージ」はお客様が持つ店舗情報をホームページ上で案内したり、社内業務に利用したりする可能なサービスで、ビジネスの成長につれて、サーバー台数が100台を超え、パッチ適応などの運用負荷が高くなっていました。そこで、フロントエンドを Angular で SPA 化して、Amazon S3 にホスティングさせ、バックエンドは Amazon API Gateway、AWS Lambda、Amazon DynamoDB 及び Amazon CloudSearch を利用してサーバレス構成にリニューアルしました。そこで得られたメリット及び新たの課題も紹介されました。サーバレス構成を始めたい方には是非おすすめする内容です。 人気番組の新作配信を安定起動させた、サーバーレスな AWS 分散負荷試験ソリューション「Distributed Load Testing」を使った負荷試験の仕組み [ 資料 、 動画 ] 2 つ目のセッションでは、株式会社 Serverless Operations COO 金 仙優様より、サーバーレスな AWS 分散負荷試験ソリューション「Distributed Load Testing」を使った負荷試験の仕組みを紹介いただきました。負荷試験の基本的な考え方、サーバーレスで負荷試験を行うメリットを解説した上、AWS 公式展開している Distributed Load Testing on AWS ソリューション を活用して、動画配信サービスのサービス品質を安定させた事例を紹介しました。Distributed Load Testing on AWS で負荷試験を実施したことで、スパイクなトラフィックが発生した際の DynamoDB のホットパーティションニング問題を特定して解決しました。サーバーレスで負荷試験を実施したい方はぜひご確認ください。 【RDB 開発者向け】Amazon DynamoDB 設計ベストプラクティス事例紹介 [ 資料 、 動画 ] 3 つ目のセッションでは、Ragate 株式会社開発部プロジェクトマネージャー久保 翔太様より、Amazon DynamoDB 設計ベストプラクティスを紹介いただきました。Amazon DynamoDB はサーバーレスの大規模で高速なキーバリューデータベースですが、テーブル設計の考えは従来のリレーショナルデータベースと異なります。こちらのセッションでは RDB 開発者視点から Amazon DynamoDB を扱う際のテクニックと事例を紹介しました。Amazon DynamoDB のインデックスを設計する際の注意事項、実際のサービスにはどうモデリングしたのかの説明など有用な情報も含まれているので、これから Amazon DynamoDB を始めたい方には非常におすすめです。ご興味のある方はぜひご確認ください。 AWS マルチアカウント戦略を採用したサーバーレスアプリケーションの管理と運用&nbsp; [ 資料 、 動画 ] 最後のセッションでは、木村情報技術株式会社 システム開発本部第三開発部徳山 鐘三様より、AWS マルチアカウント戦略を採用したサーバーレスアプリケーションの管理と運用を紹介いただきました。こちらのセッションでは、木村情報技術株式会社様の Biznar の事例を中心に、実際に Ruby on Rails のアプリケーションを Docker on Lambda でサーバレス化した際の管理・運用、マルチアカウント戦略をとっていた際の経験を紹介しました。事例では、安価に Rails アプリケーションと同じ感覚でサーバーレスアプリケーションを構築できました。また、各テナントに独自の AWS アカウントを用意して、高い隔離性やアカウント別の請求を実現することができ、AWS Control Tower、AWS Config、AWS Security Hub でアカウント統制を行いました。Ruby on Rails のアプリケーションのサーバーレス化、マルチアカウントの運用を検討している方におすすめの内容です。ご興味のある方はぜひご覧いただきたいです。 いただいたご質問とその回答 「5 分間アップデート」について Q. 東京リージョンの Bedrock で ELYZA (llama2ベースの日本語学習 モデル) は使用できますか? A. 東京リージョンの Bedrock で ELYZA は現在ご利用いただけません。ロードマップについて詳細はお伝えできませんが、llama 2 は近日公開予定となっております。 次回予告 次回は「Disaster Recovery 編」です。 ゲストスピーカーとして、株式会社マーズフラッグの 佐々木 崇之 様、エムオーテックス株式会社 の 立古 佳大 様、株式会社 Works Human Intelligence の 兒玉 拓也 様、株式会社ブイキューブの 岩上 蘭 様及び 中尾 真夕 様をお招きしまして、AWS での Disaster Recovery (DR) を中心に 4 セッションをご提供します。 次回も多くの方々のご参加を心よりお待ちしております! 『アップデート紹介とちょっぴり DiveDeep する AWS の時間』の視聴申し込みでは複数月分をまとめてご選択頂くことが可能です!また、イベント開催直前にリマインドメールをお送りいたします。下記リンクから参加ご希望月の申し込みをお願いいたします。 第三十六回「アップデート紹介とちょっぴり DiveDeep する AWS の時間」- Disaster Recovery 編- 開催日時:2023 年 11 月 16 日(木)16:00 – 17:30 オンライン開催 アジェンダ 16:00 – 16:10 オープニングセッション 16:10 – 16:25 BCP の改善へ向けた可用性向上 ~Amazon RDS 周りを中心に~ スピーカー: 株式会社マーズフラッグ サービスプラットフォーム部、シニアエンジニア 佐々木 崇之 氏 16:25 – 16:40 ある日「DR やって?」と言われたら – 開発・運用現場が始める DR の第一歩 スピーカー: エムオーテックス株式会社 開発本部 サービス開発1部 サービス開発1課 SREグループ 立古 佳大 氏 16:40 – 16:45 Q&amp;A 16:45 – 17:00 コールドスタンバイによる DR 対策とフェールオーバーやフェールバックの定義について スピーカー: 株式会社 Works Human Intelligence Engineer 兒玉 拓也 氏 17:00 – 17:15 AWS マルチアカウント戦略を採用したサーバーレスアプリケーションの管理と運用 スピーカー: 株式会社ブイキューブ 技術本部 新規開発グループ インフラチーム 岩上 蘭 氏 スピーカー: 株式会社ブイキューブ 技術本部 新規開発グループ 開発チーム 中尾 真夕 氏 17:15 – 17:20 Q&amp;A 17:20 – 17:30 クロージングセッション このブログの著者 袁 嘉希 ( Yuan Jiaxi ) ソリューションアーキテクトとして ISV/SaaS 系のお客様の技術支援を行っております。
アバター
みなさん、こんにちは。ソリューションアーキテクトの下佐粉です。 今週も 週刊AWS をお届けします。 最近急に寒くなってきましたね。近年はこの季節になると技術系のアドベントカレンダーが作られることが多くなっていますが、AWSに関連するアドベントカレンダーも色々とありますので、いくつか紹介します。 – Amazon Bedrock Advent Calendar 2023 – Anthropic Claude Advent Calendar 2023 – AWS Analytics Advent Calendar 2023 – AWS CDK Advent Calendar 2023 – AWS Lambda と Serverless Advent Calendar 2023 興味のあるジャンルにぜひ気軽に参加してみてください。 それでは、先週の主なアップデートについて振り返っていきましょう。今週は発表が多めでしたので、本稿で取り上げる数も少し多くなっています。そのため、説明はできるだけ簡素にしています。 2023年11月6日週の主要なアップデート 11/6(月) AWS Lambda supports faster polling scale-up rate for Amazon SQS as an event source Amazon SQSをイベントソースにした場合の AWS Lambda の同時実行数が最大で300まで増加可能になりました(旧来は60でした)。これにより、より大きいイベントのスパイクに対応できるようになりました。 Amazon MWAA now supports Apache Airflow version 2.7 and deferrable operators Amazon Managed Workflows for Apache Airflow (MWAA) で Apache Airflow version 2.7 環境が利用可能になりました。合わせて(Airflow 2.2から導入されていた) deferrable operatorもMWAAで利用可能になりました。deferrable operatorは、何か外部タスク等の完了を待つ必要がある際に、完了するまでの間ワーカースロットを開放して他のジョブにあてるための仕組です。 詳細はこちらのブログをご覧ください 。 AWS Fargate now enables Amazon ECS tasks to selectively leverage SOCI Amazon ECS + AWS Fargate の環境においてSOCIの利用がより柔軟になりました。これまでは(重い)コンテナイメージをLazy loadしたい場合はECSのタスク定義内のコンテナイメージすべてにSOCI(インデックス)を作成しておく必要がありましたが、この改善によりLazy LoadしたいコンテナイメージのみにSOCIを準備するだけで良くなりました。 11/7(火) Amazon ElastiCache now supports network-optimized C7gn Graviton3-based nodes Amazon ElastiCache で Graviton3 ベースの C7gn ノードを利用可能になりました。ElastiCache C7gn ノードは第5世代 AWS Nitro Card を活用してより高いネットワークバンド幅を提供します。 AWS announces general availability of Amazon Aurora MySQL zero-ETL integration with Amazon Redshift Amazon Aurora MySQL zero-ETL integration with Amazon Redshift&nbsp;がGA(一般提供開始)になりました。東京リージョンでも利用可能になっています。この機能は、Aurora MySQL の表の更新をニアリアルタイムでRedshiftにレプリケーションする仕組みで、ETLインフラの構築不要で利用できます。また、Zero-ETL機能自体の費用は無料です。 本機能が対応している Aurora は Amazon Aurora Serverless v2 (MySQL) もしくはプロビジョン型のAurora MySQLで、Redshift側は、Amazon Redshift Serverlessもしくはプロビジョン型のAmazon Redshift RA3インスタンスです。 詳細はこちらのブログをご覧ください 。 11/8(水) Amazon Kinesis Video Streams WebRTC Ingestion is now generally available Amazon Kinesis Video Streams のWebRTCインテグレーションがGA(一般提供開始)になりました。本機能を使うことで、WebRTCに準拠したIoT機器、ブラウザ等からのデータを容易にKinesis Video Streamsに渡すことが可能になります。 AWS announces Amazon Aurora PostgreSQL Optimized Reads Amazon Aurora PostgreSQLで、Optimized Reads機能が利用可能になりました。これは内蔵のNMVe SSDをキャッシュとして活用することで読み取り性能を改善するものです。db.r6gd、db.r6idインスタンスで利用可能です。 QuickSight launches FLOAT data type support for SPICE datasets BIサービスの Amazon QuickSight にFLOAT型が追加されました。これまでもDECIMAL(固定小数点)が提供されていましたが、これは小数点以下の桁が4桁まででした。FLOAT(浮動小数点)はより小さい桁を扱う場合に適した型です。 11/9(木) Amazon SNS increases default FIFO topic throughput by 10x to 3,000 messages per second Amazon SNS の FIFO (First-In-First-Out)トピックの最大スループットが、従来の300メッセージ/秒から、10倍の3,000メッセージ/秒まで引き上げられました。 Amazon RDS for Oracle now supports Oracle Multitenant Amazon RDS for Oracle で Oracle Multitenant 構成が利用可能になりました。 Oracle Database 19c, 21c で利用可能です。Oracle Multitenant 構成を利用することで、ベースとなる multitenant container database (CDB) の中に複数のpluggable database (PDB)がホストできるようになります。 Amazon RDS for MySQL delivers up to 3X higher write throughput at no additional charge Amazon RDS for MySQL で MySQL 8.0.35 が利用可能になりました。8.0.35では前バージョンの8.0.34と比較して最大で3倍の書き込みスループットを実現しています。 Amazon OpenSearch Service introduces Neural Search Amazon OpenSearch Service で、Neural Searchが利用可能になりました。OpenSearch 2.9 以降で利用可能です。Neural Search はこれまでの OpenSearch を活用したベクトル検索を更に進化させた機能で、これまで外部で実行する必要のあったモデルによる処理を OpenSearch 内部で実行することで、ベクトル検索をワンストップで実行可能にします。 Amazon FSx for OpenZFS is now available in ten additional AWS Regions Amazon FSx for OpenZFS を利用可能なリージョンが追加され、大阪リージョンを含む10のリージョンで新たに利用可能になりました。これにより、大阪リージョンでAmazon FSx for NetApp Ontap, for OpenZFS, for Windows File Server, for Lustre の4種類全てが利用可能になりました。 Amazon SQS announces support for JSON protocol Amazon SQS の通信プロトコルとしてJSON protocolが利用可能になりました。これにより旧来のAWS Query protocolと比較してより短いレイテンシでの通信が可能になります。AWS SDKを最新バージョンに更新することで、JSON protocolがデフォルトで利用されるようになりますので、アプリケーションコードの変更は不要です。 Amazon Aurora Global Database for PostgreSQL now supports write forwarding Amazon Aurora Global Database for PostgreSQL でwrite forwardingが利用可能になりました(for MySQLでは以前より利用可能です)。write forwardingは、secondaryリージョンにて書き込みSQLが実行された際に、primaryリージョンに転送して実行するというものです。 AWS Lambda adds support for Amazon Linux 2023 AWS Lambda のマネージドランタイム、およびコンテナベースイメージとして、 Amazon Linux 2023 が利用可能になりました。 11/10(金) Amazon CloudFront announces unified security dashboard Amazon CloudFront のコンソールに、統合セキュリティダッシュボードが追加されました。例えば、AWS WAF への攻撃の状況等を一元的に確認することが可能です。 詳細はこちらのブログをご覧ください 。 最後に1つハンズオン資料の紹介を。お問い合わせいただく事が多い Generative AI (生成系 AI) に関するAWSサービスを体験するハンズオンが公開されています。社内データを活用したチャットボットや要約、文章校正、画像生成などの構築を体験することができます。興味がある方はぜひトライしてみてください。 – 生成系 AI 体験ワークショップ それでは、また来週! ソリューションアーキテクト 下佐粉 昭 (twitter – @simosako )
アバター
本日 (2023 年 10 月 4 日) 、Amplify の GraphQL API 機能のための AWS Cloud Development Kit (CDK) コンストラクト を発表できることを嬉しく思います。Amplify の GraphQL API CDK コンストラクトを使用すると、単一の GraphQL スキーマ定義を使用して、 Amazon DynamoDB テーブルや AWS Lambda 関数などのデータソースをバックエンドとするリアルタイム GraphQL API を作成できます。( Construct Hub で見る) フロントエンド用の API を立ち上げるためには、開発者は API エンドポイント、カスタムビジネスロジック、データソースを構築して繋げ合わせるために、何千行もの反復的で差別化されないコードを書く必要があります。 AWS Amplify は、開発者が単一の定義ファイルでデータモデルを定義し、データソースの create, update, list, read, subscribe, delete のような一般的な API 操作をサポートするために必要な AWS リソースを自動的に生成できるようにすることで、この重労働を取り除きます。これまでは Amplify CLI でのみ利用可能でしたが、今回のアップデートでこの機能を AWS CDK に拡張します。 CDK Day 2023 の Amplify のセッションで、新しい Amplify GraphQL API コンストラクトのプレビューを皆さんにお見せしました。 新しい GraphQL API コンストラクトの詳細なツアーに参加しましょう!本記事では、フロントエンドのためのバックエンドを必要とし、AWS CDK を使っているお客様が利用できる 6 つの新機能にフォーカスします。 既存 CDK アプリやリソースとのシームレスな統合 リアルタイム API とデータスタックのための信頼できる唯一の情報源 簡単に始められ、拡張できる認可ルール 拡張可能なカスタム Query, Mutation, Subscription API 生成されたリソースを完全に制御する L2 および L1 コンストラクトへのエスケープハッチ リアルタイム機能のためのファーストクラスのクライアントライブラリサポート 1. 既存 CDK アプリやリソースとのシームレスな統合 新しい Amplify GraphQL API CDK コンストラクトは、既存 CDK アプリ内のドロップインコンポーネントとして使用できます。Lambda 関数のような既存のリソースとシームレスに統合できます。CDK のコンポーザブルアーキテクチャをベースに、手作りのリソースやインポートしたリソースを GraphQL API のデータソースとして使用しながら、Amplify の自動化された CRUD 操作、認可ルール、AWS AppSync によるリアルタイムのサブスクリプションの恩恵を受けることができます。新しい Amplify GraphQL API コンストラクトでは、CDK で開始し、CDK で反復し、CDK でデプロイします。 開始するには、既存 CDK アプリを使用するか、新しいアプリを作成します。 mkdir amplify-cdk-demo cd amplify-cdk-demo mkdir backend cd backend cdk init app --language=typescript 次に、以下のコマンドで新しい Amplify GraphQL API CDK コンストラクトと依存関係をインストールします。 npm install @aws-amplify/graphql-api-construct CDK アプリの lib/backend-stack.ts ファイルで、新しい Amplify GraphQL API コンストラクトをインポートして初期化します。 import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; import { AmplifyGraphqlApi, AmplifyGraphqlDefinition } from '@aws-amplify/graphql-api-construct'; import * as path from 'path' export class BackendStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); const amplifyApi = new AmplifyGraphqlApi(this, "MyNewApi", { definition: AmplifyGraphqlDefinition.fromFiles(path.join(__dirname, "schema.graphql")), authorizationModes: { defaultAuthorizationMode: 'API_KEY', apiKeyConfig: { expires: cdk.Duration.days(30) } } }) } } 上記のコードは、 schema.graphql に格納されたスキーマ定義に基づいて新しい API をインスタンス化し、API キーを API のデフォルト認証モードとして使用します。API キーの有効期限はデプロイ時から 30 日間です。 次に、 schema.graphql を新規作成し、データモデルと API の単一のソースとして使用します。 2. リアルタイム API とデータスタックのための信頼できる唯一の情報源 新しい Amplify GraphQL API コンストラクトでは、開発者はデータモデルを GraphQL スキーマ定義言語で定義し、DynamoDB テーブル ( @model ) 、Lambda 関数 ( @function ) 、OpenSearch クラスタ ( @searchable ) などの付随するデータソースを生成するためのディレクティブを使って拡張します。CDK コンストラクトは、Amplify CLI の既存の GraphQL Transformer 機能と完全に同等の機能を備えています。開発者は @auth ディレクティブを使用して API とデータをセキュアにすることができます。 @auth ディレクティブは、グローバル、モデルレベル、フィールドレベルの認可ルールを構成する機能だけでなく、デフォルトで拒否する認可を提供します。新しい CDK コンストラクトは、CDK コード内から Amplify によって生成されたすべてのリソースにアクセスし、カスタマイズする機能を備えており、拡張可能です。 以下のスキーマは Blog アプリケーションを記述しています。以下の GraphQL スキーマをアプリケーションにコピー &amp; ペーストしてください。 type Blog @model @auth(rules: [{ allow: public }]) { title: String content: String authors: [String] } 次に、CDK を使ってアプリケーションをデプロイし、プロンプトが表示されたら “y” と答えます。 cdk deploy デプロイが完了したら、AWS AppSync コンソールにアクセスして API を選択し、いくつかのテストクエリを実行します。作成クエリとリストクエリを実行して結果を確認してみましょう。 3. 簡単に始められ、拡張できる認可ルール 新しい Amplify GraphQL API CDK コンストラクトは、デフォルトの拒否ルールをすぐに提供することで、認可を簡単に始めることができます。API レベル、データモデルごと、あるいは個々のフィールドごとにきめ細かい認証ルールを追加することで、アクセス制御をさらにカスタマイズすることができます。Amplify は、ユーザー単位、複数ユーザー、グループ単位、複数グループによる特定のレコードへのアクセスなど、一般的な認証ルールを提供します。これらのルールは、Amazon Cognito または任意の OpenID Connect (OIDC) プロバイダで動作します。カスタムの認可パターンを実現するために、Lambda 関数を活用することもできます。この宣言的な認証モデルを使えば、アプリケーションの成長に合わせて拡張できる、堅牢なアクセス制御を得ることができます。 API をロックダウンして、一般ユーザーは全てのブログを読むことができるが、サインインしたユーザーはブログの作成、閲覧、更新、削除ができるようにしてみよう。まず、GraphQL スキーマを更新して、”public ” アクセスルールをスコープダウンし、新しい “owner” 認可ルールを追加しましょう。”owner” 認可ルールでは、ユーザーごとの認可を指定することができる。サインインしたユーザーが新しいレコードを作成すると、そのレコードは自動的にサインインしたユーザーをオーナーとして指定します。 type Blog @model @auth(rules: [ { allow: public, operations: [ read ] }, { allow: owner } ]) { title: String content: String authors: [String] } 認可ルールは以下のように定義されています。 Public (API キーを使用するユーザー ) はどのブログでも読むことができます。 Owner (Cognito 経由でサインインしたユーザー) は自分のブログを作成、閲覧、更新、削除できます。 注意 :グループベースの認可やフィールドレベルの認可など、さらに高度な認可を追加できます。これによって、「Admins グループのメンバーにのみブログの削除を許可する」、「サインインした作者にのみ表示される新しい privateNotes フィールドを追加する」などのユースケースに拡張することが出来ます。認可機能の全範囲については、 ドキュメント を参照してください。 lib/backend-stack.ts の CDK コンストラクトプロパティを更新し、ユーザーのサインインとサインアップ管理に新しいユーザープールまたは既存のユーザープールを使用するようにしました。 import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; import { AmplifyGraphqlApi, AmplifyGraphqlDefinition } from '@aws-amplify/graphql-api-construct'; import * as path from 'path' import { UserPool, UserPoolClient } from 'aws-cdk-lib/aws-cognito'; export class BackendStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); const userPool = new UserPool(this, "MyNewUserPool") new UserPoolClient(this, "MyNewUserPoolClient", { userPool: userPool }) const amplifyApi = new AmplifyGraphqlApi(this, "MyNewApi", { definition: AmplifyGraphqlDefinition.fromFiles(path.join(__dirname, "schema.graphql")), authorizationModes: { defaultAuthorizationMode: 'API_KEY', apiKeyConfig: { expires: cdk.Duration.days(30) }, userPoolConfig: { userPool: userPool } } }) } } 以下のコマンドで最新のものを再度デプロイします。 cdk deploy デプロイ後、 Amazon Cognito ユーザプールコンソール でテストユーザーを作成します。 AppSync コンソール では API キーを使う、もしくはサインインしたユーザーとして、GraphQL クエリを実行してテストすることができます。 4. 拡張可能なカスタム Query, Mutation, Subscription API 基本的な CRUD 操作以外のカスタムビジネスロジックを実装する必要がありますか?Amplify GraphQL API CDK コンストラクトを使用することで、独自の Lambda 関数をトリガーするカスタム GraphQL リゾルバを簡単に定義できます。カスタム Query, Mutation, Subscription を追加して、検索、分析、メッセージングなどの特殊な API を実装します。カスタムデータタイプを定義して、レスポンスフォーマットを構造化します。RDS や 3rd Party のAPI など、あらゆるソースからデータにアクセスします。Amplify が GraphQL スキーマの生成、クライアントSDK の構築、およびそれらの繋込みを行うことで、お客様はカスタムロジックの作成に専念することが出来ます。GraphQL と AWS Lambda の柔軟性で API 機能を拡張しましょう。 例えば、ブログアプリケーションにシンプルな PubSub API 機能を構築するとします。読者はブログサイトに表示され、お互いにメッセージをライブ配信することができます。 まず、GraphQL スキーマを編集して、サインインしたユーザがメッセージを送信し、Subscription がメッセージを受信できるような Mutation を追加する必要があります。 type Blog @model @auth(rules: [ { allow: public, operations: [ read ] }, { allow: owner } ]) { title: String content: String authors: [String] } type Mutation { broadcastLiveMessage(message: String): String } type Subscription { subscribeToLiveMessages: String @aws_subscribe(mutations: ["broadcastLiveMessage"]) } @aws_subscribe ディレクティブは、 mutations 引数で指定されたすべての Mutations に対してリアルタイムの Subscription をセットアップします。 次に、 lib/backend-stack.ts の CDK コードに戻って、 broadcastLiveMessage Mutation からのメッセージを subscribeToLiveMessages Subscription に渡す JavaScript リゾルバを追加します。Amplify GraphQL API をインスタンス化した後、以下のコードを追加します。 const broadcastDataSource = amplifyApi.addNoneDataSource("BroadcastNone") amplifyApi.addResolver("BroadcastResolver", { dataSource: broadcastDataSource, typeName: 'Mutation', fieldName: 'broadcastLiveMessage', code: Code.fromAsset(path.join(__dirname, 'resolvers', 'broadcastLiveMessage.js')), runtime: FunctionRuntime.JS_1_0_0 }) 上記のコードでは、まず NONE データソースを作成し、API に新しいリゾルバを追加して broadcastLiveMessage Mutation を処理します。このタイプのデータソースは、アクションを他の AWSリソースと連携することなく、AppSync 内でローカルに解決したい場合に使用します。 broadcastLiveMessage Mutations を処理するために、新しい resolvers フォルダに broadcastLiveMessage.js を作成します。 resolvers/broadcastLiveMessage.js は、Mutation からのメッセージ引数を使用し、Subscription に結果としてそれを渡します。 export function request(ctx) { return { payload: { message: ctx.arguments.message } } } export function response(ctx) { return ctx.result.message } もう一度変更をデプロイしてみます。 cdk deploy それでは、2 つの AppSync コンソールウィンドウを開いて、変更を検証してみましょう。1 つは一般向けの Subscription で、もう 1 つは Mutations を送信するために使用します。 5. 生成されたリソースを完全に制御する L2 および L1 コンストラクトへのエスケープハッチ Amplify は、DynamoDB テーブルや Lambda 関数のような基本リソースのプロビジョニングをしますが、アプリケーションが成熟するにつれて、開発者はより深いアクセスが必要になってきます。CDK コンストラクトは、L2 および L1 CDK コンストラクトを通じて基礎となるリソースに直接アクセスするためのエスケープハッチを提供します。DynamoDB の課金モードを微調整したり、Lambda に VPC インタフェースを追加したり、OpenSearch インデックスを CDK でカスタマイズできます。 AppSync API や DynamoDB テーブルなど、生成されたすべてのリソースは、L2 コンストラクトとして .resources パラメータの下で利用可能です。 .resources.cfnResources 経由でアクセスすることで、生成されたリソースの L1 コンストラクトにさらにドロップダウンできます。例えば、基礎となる AppSync API で X-Ray トレースを有効にするには、L1 レベルにドロップダウンして必要な X-Ray トレースを設定します。 &gt;amplifyApi.resources.cfnResources.cfnGraphqlApi.xrayEnabled = true 一度設定すれば、変更を再度デプロイすることができます。 cdk deploy 6. リアルタイム機能のためのファーストクラスのクライアントライブラリサポート バックエンドの実装を合理化すると同時に、Amplify はお客様の GraphQL API に強く型付けされたクライアント SDK の自動生成を提供します。クライアントアプリでリアルタイムデータのサポートと強力な GraphQL クエリをすぐに利用できます。Web アプリの場合は、React ベースの JavaScript クライアントを生成します。クロスプラットフォームまたはモバイルアプリについては、Android、iOS、および React Native をサポートしています。これらのプラットフォームに対応するクライアントコードを生成する方法については、 ドキュメント を参照してください。Amplify クライアントライブラリを使えば、複雑なロジックを 1 からコーディングすることなく、魅力的なユーザー体験を構築することができます。 この例では、React アプリケーションを使ってこのライブブログを紹介します。まず、ターミナルから以下のコマンドを実行して、新しい React アプリケーションを作成します。 cd .. npx create-react-app frontendcd frontend 全体的なフォルダー構造は以下のようになります。 &gt;amplify-cdk-demo |-backend |-frontend 次に、アプリケーションをバックエンド API に接続するための Amplify Libraries をインストールします。 npm install aws-amplify 次に、バックエンド API を認識するように Amplify Libraries を設定する必要があります。アプリのエントリーポイント (すなわち index.js ) に行き、 cdk deploy を実行したときにターミナルに出力された API エンドポイントの情報を使って、Amplify Libraries を設定します。先程の cdk deploy で以下のように出力されているはずです。 ✨ Deployment time: 62.86s Outputs: BackendStack.amplifyApiModelSchemaS3Uri = s3://backendstack-mynewapiamplifycodegenassetsamplifyc-1u3xykyhe309m/model-schema.graphql BackendStack.awsAppsyncApiEndpoint = https://wy5mtp7jzfctxc5w5pzkcoktbi.appsync-api.us-east-1.amazonaws.com/graphql BackendStack.awsAppsyncApiId = eci46vifpvbvhno55uo2ovtoqm BackendStack.awsAppsyncApiKey = da2-XXXX BackendStack.awsAppsyncAuthenticationType = API_KEY BackendStack.awsAppsyncRegion = us-east-1 フロントエンドの index.js に、Amplify Libraries をインポートし、対応する情報を設定します。 import { Amplify } from 'aws-amplify' Amplify.configure({ aws_appsync_graphqlEndpoint: 'https://wy5mtp7jzfctxc5w5pzkcoktbi.appsync-api.us-east-1.amazonaws.com/graphql', aws_appsync_region: 'us-east-1', aws_appsync_authenticationType: 'API_KEY', aws_appsync_apiKey: 'da2-XXXX' }) Amplify Libraries の API カテゴリを使って生の GraphQL リクエストを書くこともできるます、以下の npx スクリプトを使うことで、一般的なリクエストの大部分を Amplify に生成させることもできます。 npx @aws-amplify/cli codegen add --apiId eci46vifpvbvhno55uo2ovtoqm --region us-east-1 npx @aws-amplify/cli codegen 注意 :バックエンドにスキーマ変更をデプロイする度に、対応するクライアントヘルパーコードを再生成するために、 npx @aws-amplify/cli codegen を再実行する必要があります。 src/graphql/ フォルダに新しいファイル群があるはずです。これらは GraphQL Query、Mutation、Subscription のクライアントコードヘルパーです。 src/graphql/ ├── mutations.js ├── queries.js └── subscriptions.js ブログとメッセージ機能を表示するためにフロントエンドの UI を変更します。 App.js にアクセスし、以下の内容に置き換えます。 import "./App.css"; import { useEffect, useState } from "react"; import { API } from "aws-amplify"; import { listBlogs } from "./graphql/queries"; import { subscribeToLiveMessages } from "./graphql/subscriptions"; import { broadcastLiveMessage } from "./graphql/mutations"; function App() { const [blogs, setBlogs] = useState([]); const [messages, setMessages] = useState([]); useEffect(() =&gt; { // fetches all blog posts async function fetchBlogs() { const response = await API.graphql({ query: listBlogs, }); setBlogs(response.data.listBlogs.items); } fetchBlogs(); // setup subscriptions for live chat messages const subscription = API.graphql({ query: subscribeToLiveMessages }).subscribe(next =&gt; { setMessages(messages =&gt; [...messages, next.value.data.subscribeToLiveMessages]) }) return () =&gt; subscription.unsubscribe() }, []); // sends the live chat message to users function handleMessageSend(event) { if (event.key === 'Enter') { API.graphql({ query: broadcastLiveMessage, variables: { message: event.target.value } }) } } return ( &lt;div style={{ display: "flex", gap: 20 }}&gt; &lt;div&gt; &lt;h1&gt;Articles&lt;/h1&gt; {blogs.map((blog) =&gt; ( &lt;div style={{ border: '1px solid black', padding: 10, borderRadius: 10}}&gt; &lt;h2&gt;{blog.title}&lt;/h2&gt; &lt;p&gt;{blog.content}&lt;/p&gt; &lt;/div&gt; ))} &lt;/div&gt; &lt;div&gt; &lt;h1&gt;Live chat&lt;/h1&gt; &lt;input type="text" placeholder="Hit enter to send message" onKeyDown={handleMessageSend} /&gt; &lt;hr&gt;&lt;/hr&gt; &lt;ul&gt; {messages.map(message =&gt; &lt;li&gt;{message}&lt;/li&gt;)} &lt;/ul&gt; &lt;/div&gt; &lt;/div&gt; ); } export default App; 70 行以下のコードで、ライブチャット機能を持つブログ記事フロントエンドを構築しました。アプリをローカルで実行するには、ターミナルで以下のコマンドを実行してます。 npm run start あなたのアプリはこのように見えるはずです。ライブチャット機能をテストするために、別のウィンドウで開いてみてください。 成功の秘訣 CDK を使用してデプロイされたリアルタイム API とデータスタックが React アプリに統合されました!これは、Amplify GraphQL CDK コンストラクトのほんの一部の機能です。より深く掘り下げるために、以下のリソースもぜひご覧ください。 Construct Hub の Amplify GraphQL API コンストラクト Amplify GraphQL API 機能の認可ルール カスタムビジネスロジック (Lambda 関数、HTTP、JS/VTL リゾルバ ) JavaScript、Android、Swift、Flutter 用の GraphQL クライアントヘルパーコードの生成 他に質問がある場合は、 Discord に参加するか、問題や機能要求を提出したい場合は、 GitHub にアクセスしてください。 本記事は、「 Connect a React app to GraphQL and DynamoDB with AWS CDK and Amplify 」を翻訳したものです。 翻訳者について 稲田 大陸 AWS Japan で働く筋トレが趣味のソリューションアーキテクト。普段は製造業のお客様を中心に技術支援を行っています。好きな AWS サービスは Amazon Location Service と AWS Amplify で、日本のお客様向けに Amazon Location Service の解説ブログ などを執筆しています。
アバター
AWS Amplify UI チームは、エンドユーザーのための機能豊富なアプリを構築するのに役立つ、8 つの新しい React ユーザーインターフェイスコンポーネントと 2 つの改良されたコンポーネントを紹介します。本記事では、新しいコンポーネントと、それらをプロジェクトにどのように使用できるかを紹介します。Amplify UI は、クラウドに接続されたクロスプラットフォームと、パフォーマンス、テーマ性、応答性、アクセシビリティに優れた React コンポーネントの両方を備えたコンポーネントライブラリです。 1. Fieldset &lt;Fieldset legend="Favorite fruits" variation="outlined" direction="column"&gt; &lt;CheckboxField label="Apple" name="apple" /&gt; &lt;CheckboxField label="Pear" name="pear" /&gt; &lt;/Fieldset&gt; Fieldset は、アクセス可能な &lt;legend&gt; を伴う &lt;fieldset&gt; 要素をレンダリングする新しいコンポーネントです。Fieldset は、フォーム内の関連する要素をグループ化するために使用される HTML 要素です。例えば、チェックボックスのグループや、より大きなフォーム内に関連するフィールドを作成するために使用されます。以前は、独自のフィールドセットを作成し、スタイルを設定する必要がありましたが、Fieldset コンポーネントの導入により、このプロセスはより簡単になりました。 Fieldset はコンテキストプロバイダなので、Fieldset の無効状態は、Amplify UI のフォームコントロールとネストされた Fieldset に正しく受け継がれます。 isDisabled プロパティを true に設定すると、Fieldset の子要素であるすべてのフォームフィールドが無効になります。 2. Input &lt;Input placeholder="placeholder" /&gt; Input は &lt;input&gt; 要素が受け入れる標準的な HTML 属性のどれでも受け入れます。標準的な &lt;input&gt; 属性は MDN Documentation で確認することができます。Input プリミティブはテキスト入力専用にスタイルされています (テキスト、日付、数字など)。 3. Label &lt;Flex direction="column" gap="small"&gt; &lt;Label htmlFor="first_name"&gt;First Name:&lt;/Label&gt; &lt;Input id="first_name" name="first_name" /&gt; &lt;/Flex&gt; Label は UI 要素のキャプションを表します。Label コンポーネントは Input コンポーネントと一緒に使うことで、独自のフォームフィールドを構成することができます。Label は、 &lt;label&gt; 要素が受け入れる標準的な HTML 属性を受け入れます。標準的な &lt;label&gt; 属性は MDN Documentation で確認することができます。 4. SelectField (更新) &lt;SelectField label="Fruit" descriptiveText="What's your favorite fruit?" isMultiple={true} &gt; &lt;option value="apple"&gt;Apple&lt;/option&gt; &lt;option value="banana"&gt;Banana&lt;/option&gt; &lt;option value="orange" disabled&gt;Orange&lt;/option&gt; &lt;option value="pineapple"&gt;Pineapple&lt;/option&gt; &lt;option value="kiwi"&gt;Kiwi&lt;/option&gt; &lt;option value="tangerine"&gt;Tangerine&lt;/option&gt; &lt;/SelectField&gt; SelectField に isMultiple と selectSize プロパティが追加され、ユーザの選択を処理するための設定オプションが増えました。 5. Button (更新) &lt;Button variation="primary" colorTheme="success" &gt; Click me! &lt;/Button&gt; 更新された Button コンポーネントでは、 colorTheme プロパティがサポートされ、より多くのカラーバリエーションを柔軟に組み込むことができるようになりました。 variation 、 size 、 colorTheme プロパティにより、54 種類のスタイルのボタンが用意されました! 6. Message &lt;Message variation="plain" colorTheme="neutral" heading="A message heading"&gt; Basic message content &lt;/Message&gt; Message コンポーネントは Alert コンポーネントの後継です。Message はよりカスタマイズ可能で柔軟性があるため、アプリケーションのより多くの状況で使用することができます。Message にはデフォルトで ARIA ロールが設定されていません。使用するケースに応じて、 role 属性を渡したり、必要に応じて独自の ARIA 属性を追加したりすることができます。Message コンポーネントには、メッセージのカラーバリエーションを増やす colorTheme プロパティがあります。colorTheme プロパティは、同名の buttonプロパティに似ています。 7. Breadcrumbs (パンくずリスト) import { Breadcrumbs } from '@aws-amplify/ui-react'; export default function DefaultBreadcrumbsExample() { return ( &lt;Breadcrumbs items={[ { href: '/', label: 'Home', }, { href: '/react/components', label: 'Components', }, { label: 'Breadcrumbs', }, ]} /&gt; ); } Breadcrumbs コンポーネントは柔軟性があるので、レンダリングされるものを完全にコントロールすることができ、より高度なユースケースをアンロックすることができます。 &lt;Breadcrumbs.Container&gt; &lt;Breadcrumbs.Item&gt; &lt;Breadcrumbs.Link&gt; &lt;Breadcrumbs.Separator&gt; Breacrumbs コンポーネントを NextJS の Link コンポーネントと useRouter コンポーネントと一緒に使うことで、現在のパスに基づいて Breadcrumbs を自動的に生成することができます。 import Link from 'next/link'; import { Breadcrumbs } from '@aws-amplify/ui-react'; import { useRouter } from 'next/router'; export default function NextBreadcrumbsExample() { const { asPath } = useRouter(); const nestedRoutes = asPath .split('#')[0] .split('?')[0] .split('/') .filter((subpath) =&gt; subpath.length &gt; 0); const breadcrumbs = [ { href: '/', text: 'Home' }, ...nestedRoutes.map((subpath, i) =&gt; { const href = '/' + nestedRoutes.slice(0, i + 1).join('/'); const text = subpath; return { href, text }; }), ]; return ( &lt;Breadcrumbs.Container&gt; {breadcrumbs.map(({ href, text }, i) =&gt; { const isCurrent = i === breadcrumbs.length - 1; return ( &lt;Breadcrumbs.Item key={href}&gt; &lt;Link href={href} passHref&gt; &lt;Breadcrumbs.Link isCurrent={isCurrent}&gt;{text}&lt;/Breadcrumbs.Link&gt; &lt;/Link&gt; {isCurrent ? null : &lt;Breadcrumbs.Separator /&gt;} &lt;/Breadcrumbs.Item&gt; ); })} &lt;/Breadcrumbs.Container&gt; ); } 8. Dropzone export default function DefaultDropZoneExample() { const [files, setFiles] = React.useState([]); return ( &lt;&gt; &lt;DropZone onDropComplete={({ files }) =&gt; { setFiles(files); }} &gt; Drag images here &lt;/DropZone&gt; {files.map((file) =&gt; ( &lt;Text key={file.name}&gt;{file.name}&lt;/Text&gt; ))} &lt;/&gt; ); } DropZone コンポーネントは、要素に必要なイベントハンドラを追加し、ファイルタイプによってドロップされたファイルをフィルタリングします。ドロップされた後のファイルを取得するには、 files と rejectedFiles 配列を持つ関数である onDropComplete プロパティを使用できます。 9. IconsProvider Amplify UI コンポーネントで使用するアイコンをカスタマイズするには、アプリケーションを IconProvider コンポーネントでラップし、変更したいアイコンを渡します。 icons プロパティは、アイコンの名前を React コンポーネントにマッピングするオブジェクトでなければなりません。例えば、以下のように実装することが出来ます。 import { IconsProvider, Rating } from '@aws-amplify/ui-react'; import { FiStar } from 'react-icons/fi'; export default function IconProviderExample() { return ( &lt;IconsProvider icons={{ rating: { filled: &lt;FiStar /&gt;, empty: &lt;FiStar /&gt;, }, }} &gt; &lt;Rating value={3.5} /&gt; &lt;/IconsProvider&gt; ); } IconProvider コンポーネントは、React コンテキストを使用して、子コンポーネントがカスタムアイコンセットを利用できるようにします。IconProvider 内部のどのコンポーネントも、内部フックを介してカスタムアイコンにアクセスできます。アプリケーションの特定の部分でアイコンを変更したい場合は、他の React コンテキストと同じように、アプリケーションのさまざまな部分で IconsProvider をネストできます。 10. StorageImage &lt;StorageImage alt="cat" imgKey="cat.jpg" accessLevel="public" /&gt; StorageImage コンポーネントは @aws-amplify/ui-react-storage パッケージの新しい Storage 接続コンポーネントで、Storage に保存された画像を簡単に表示するために使用できます。 まとめ これら 10 個の新しいコンポーネントと更新されたコンポーネントにより、Amplify UI は React アプリケーションの構築と拡張においてより柔軟性と効率性を提供します。私たちは、アクセスしやすく、カスタマイズ可能で、ユーザーフレンドリーなアプリケーションを簡単に作成するために必要なツールを提供するために努力を続けています。他にもご希望のコンポーネントがありましたら、 GitHub でお知らせください 。 これらのコンポーネントやその他の Amplify UI の詳細については、 ドキュメントをご覧ください 。 本記事は、「 AWS Amplify UI: 10 new and updated components 」を翻訳したものです。 翻訳者について 稲田 大陸 AWS Japan で働く筋トレが趣味のソリューションアーキテクト。普段は製造業のお客様を中心に技術支援を行っています。好きな AWS サービスは Amazon Location Service と AWS Amplify で、日本のお客様向けに Amazon Location Service の解説ブログ などを執筆しています。
アバター
この記事は Amazon Redshift: Lower price, higher performance の翻訳記事です。 ほぼすべてのお客様と同様に、あなたも可能な限り最高のパフォーマンスを実現しながら、コストを最小限に抑えたいと考えることでしょう。つまり、コストパフォーマンスに注意を払う必要があるということです。 Amazon Redshift を使用すると、コストを最小限に抑えながら最高のパフォーマンスを実現することができます。 Amazon Redshift は、数百人の同時ユーザーをサポートするための同時実行スケーリングや、クエリパフォーマンスを高速化するための強化された文字列エンコーディング、Amazon Redshift Serverless のパフォーマンス強化といった先進的な技術を使用することで、実際のワークロードにおいて他のクラウドデータウェアハウスと比較して、ユーザーあたりのコストを最大 4.9 倍削減し、最大 7.9 倍優れたコストパフォーマンスを実現します。コストパフォーマンスが重要な理由と、Amazon Redshift では、特定のレベルのワークロードパフォーマンスを得るためにどの程度のコストが必要になるかという尺度、つまりパフォーマンス ROI (投資収益率) を理解するためにぜひ読んでください。 コストとパフォーマンスの両方がコストパフォーマンスの計算に含まれるため、コストパフォーマンスについては 2 つの考え方があります。 1 つ目の考え方は、コストを一定に保つことです。1 ドルを使えるとしたら、データウェアハウスからどの程度のパフォーマンスが得られるでしょうか? コストパフォーマンスの優れたデータベースは、支出した 1 ドルごとに優れたパフォーマンスを提供します。したがって、同じ一定のコストの 2 つのデータウェアハウスを比較する場合、コストパフォーマンスの高いデータベースの方がクエリの実行が速いです。 2 つ目の考え方は、パフォーマンスを一定に保つことです。ワークロードを 10 分以内で完了する必要がある場合、それにかかるコストはいくらでしょうか? コストパフォーマンスに優れたデータベースでは、ワークロードを10 分以内でより低コストで実行できます。したがって、パフォーマンスを一定に保ち、同じパフォーマンスを実現するサイズの 2 つのデータウェアハウスを比較する場合、コストパフォーマンスの高いデータベースの方がコストが低くなり、コストを節約することができます。 最後に、コストパフォーマンスのもう 1 つの重要な観点は、予測可能性です。データウェアハウスのユーザー数が増加するにつれて、データウェアハウスのコストがどれくらいかかるかを把握することは、計画を立てる上で非常に重要です。今日最高のコストパフォーマンスを提供するだけでなく、ユーザーやワークロードが追加されたときに予測どおりに拡張し、最高のコストパフォーマンスを提供する必要があります。理想的なデータウェアハウスは線形にスケールする必要があります。つまり、クエリスループットを 2 倍にするためにデータウェアハウスをスケーリングすることは、理想的にはコストが 2 倍 (またはそれ以下) になるということです。 この投稿では、Amazon Redshift がその他の主要なクラウドデータウェアハウスと比較して、コストパフォーマンスが非常に優れているということを説明するために、パフォーマンスの計測結果を共有します。これは、他のデータウェアハウスに費やすのと同じ金額を Amazon Redshift に費やした場合、Amazon Redshift を使用した方がパフォーマンスが向上することを示しています。あるいは、同じパフォーマンスを実現するように Redshift クラスターのサイズを調整すると、他のデータウェアハウスと比較してコストが低くなるということです。 実ワークロードにおけるコストパフォーマンス Amazon Redshift を使用すると非常に多様なワークロードを強化できます。複雑な抽出、変換、ロード (ETL) ベースのレポートのバッチ処理やリアルタイムのストリーミング分析から、数百、さらには数千の同時ユーザーに1 秒未満の応答時間でサービスを提供する必要がある低レイテンシーのビジネスインテリジェンス (BI) ダッシュボードまでのありとあらゆるワークロードです。AWS は、お客様のコストパフォーマンスを継続的に向上させる方法の 1 つとして、Amazon Redshift のパフォーマンスをさらに向上できる機会とお客様のユースケースを見つけるために、Redshift フリートからのソフトウェアおよびハードウェアのパフォーマンステレメトリーを常にレビューしています。 フリート テレメトリによるパフォーマンス最適化の最近の例としては、次のようなものがあります。 文字列型に対するクエリの最適化 – Amazon Redshift が Redshift フリート内のさまざまなデータ型をどのように処理するかを分析した結果、文字列を多く含むクエリを最適化すると、お客様のワークロードに大きなメリットがあることがわかりました。 (これについては、この投稿の後半で詳しく説明します。) 自動化されたマテリアライズド ビュー – Amazon Redshift のお客様は、サブクエリパターンを持つ多くのクエリを実行することが多いことがわかりました。たとえば、いくつかの異なるクエリが同じ結合条件を使用して同じ 3 つのテーブルを結合する場合があります。 Amazon Redshift は、マテリアライズドビューを自動的に作成および維持し、機械学習による 自動マテリアライズドビュー の自律的な機能を使用して、マテリアライズドビューを使用するようにクエリを透過的に書き換えられるようになりました。自動マテリアライズドビューを有効にすると、ユーザーの介入なしに、反復的なクエリのパフォーマンスを透過的に向上させることができます。 (ただし、自動マテリアライズドビューは、この投稿で説明したどのベンチマーク結果にも使用されていません) 同時実行性の高いワークロード – Amazon Redshift を使用してダッシュボードのようなワークロードを提供するユースケースが増加しています。これらのワークロードの特徴は、要求されるクエリ応答時間が 1 桁秒以下であり、使用パターンが突発的でしばしば予測不可能で、数十から数百のユーザーが同時にクエリを実行します。この典型的な例は、Amazon Redshift を利用した BI ダッシュボードで、多くのユーザーが週初めの月曜の朝にトラフィックが急増します。 特に同時実行性の高いワークロードは非常に幅広い適用範囲を持っています。ほとんどのデータウェアハウスのワークロードでは同時実行で動作し、Amazon Redshift では、数百、さらには数千のユーザーが同時にクエリを実行することも珍しくありません。 Amazon Redshift は、クエリの応答時間を予測可能かつ高速に保つように設計されています。 Redshift Serverless は、必要に応じて自動的に処理能力を追加および削除することで、クエリの応答時間を高速かつ予測可能に保ちます。つまり、1 人または 2 人のユーザーがアクセスしているときに迅速に読み込まれる Redshift Serverless のダッシュボードは、多くのユーザーが同時にアクセスしている場合でも引き続き迅速に読み込まれることを意味します。 このタイプのワークロードをシミュレートするために、100 GB データセットを使用した TPC-DS から派生したベンチマークを使用しました。 TPC-DS は、さまざまな典型的なデータウェアハウスクエリを含む業界標準のベンチマークです。 100 GB という比較的小規模なスケールでは、このベンチマークのクエリは Redshift Serverless 上で平均数秒で実行されます。これは、インタラクティブな BI ダッシュボードを読み込むユーザーが期待する典型的な速度であることを表しています。このベンチマークでは 1 ~ 200 の同時テストを実行し、同時にダッシュボードを読み込もうとする 1 ~ 200 人のユーザーをシミュレートしました。また、自動スケールアウトをサポートするいくつかの一般的なクラウドデータウェアハウスに対してテストを繰り返しました (自動スケールアップをサポートしていないため、私たちはブログ「 Amazon Redshift の継続的なコストパフォーマンス最適化 」の競合他社 A を含めませんでした)。私たちは、平均クエリ応答時間を測定しました。これは、ユーザーがクエリの完了 (またはダッシュボードの読み込み) を待つ時間を意味します。結果を次のグラフに示します。 競合他社 B は、同時クエリ数が約 64 個になるまではうまく拡張できていますが、その時点で追加のコンピューティングを提供できなくなり、クエリがキューに入り始め、クエリの応答時間の増加につながっています。競合他社 C も自動的にスケーリングできていますが、Amazon Redshift や競合他社 B よりもクエリのスループットが低くなり、クエリのランタイムを低く保つことができません。さらに、コンピューティングが不足した場合のクエリのキューイングはサポートしていないため、同時ユーザー数が約 128 人を超えて拡張することができません。これを超えて追加のクエリを送信すると、システムによって拒否されます。 ここで、Redshift Serverless は、数百のユーザーが同時にクエリを実行している場合でも、クエリ応答時間を約 5 秒と比較的一定に保つことができます。競合他社 B と競合他社 C の平均クエリ応答時間は、データウェアハウスの負荷が増加するにつれて着実に増加しています。その結果、データウェアハウスがビジー状態になると、ユーザーはクエリが返るまでより長く (最大 16 秒) 待たなければならなくなります。これは、ユーザーがダッシュボードを更新しようとしている場合 (リロード時に複数の同時クエリを送信することもあります)、Amazon Redshift は、たとえダッシュボードが他の数十、数百ものユーザーによって同時に読み込まれている場合でも、ダッシュボードの読み込み時間を一貫した状態に保つことができることを意味します。 Amazon Redshift は実行時間の短いクエリに対して非常に高いクエリスループットを提供できるため (「 Amazon Redshift の継続的なコストパフォーマンス最適化 」で説明したように)、スケールアウト時にこれらの高い同時実行性をより効率的に処理できるため、大幅に低いコストで処理することもできます。 これを定量化するために、次のグラフに示すように、前のテストで各データウェアハウスの公開されている オンデマンド価格 を使用してコストパフォーマンスを調べます。なお、 リザーブドインスタンス (RI) 、特に全額前払いオプションで購入した 3 年間の RI を使用すると、プロビジョニングされたクラスター上で Amazon Redshift を実行するコストが最も低くなり、オンデマンドまたは他の RI オプションと比較して、最高の相対的な価格パフォーマンスが得られることには注目すべきでしょう。 したがって、Amazon Redshift は、より高い同時実行でより優れたパフォーマンスを提供できるだけでなく、大幅に低いコストでそれを実現できます。コストパフォーマンスの図の各データポイントは、指定された同時実行数でベンチマークを実行するコストに相当します。コストパフォーマンスは線形であるため、任意の同時実行数でベンチマークを実行したコストを同時実行数 (このグラフの同時ユーザー数) で割ることで、この特定のベンチマークで新しいユーザーを追加するたびにどれくらいのコストがかかるかを知ることができます。 ここまでの結果は簡単に再現できます。ベンチマークで使用されるすべてのクエリは GitHub リポジトリ で利用でき、パフォーマンスはデータウェアハウスを起動し、Amazon Redshift で同時実行スケーリング (または他のウェアハウスで対応する自動スケーリング機能) を有効にし、データをロードすることによってカスタマイズなしの状態で測定します (手動でのチューニングやデータベース固有のセットアップはありません)。そして、各データウェアハウスで 同時実行数を1-200の間で32刻みで変化させ、同時実行テストを行いました。上述の GitHub リポジトリは、公式 TPC-DS データ生成キットを使用して事前生成された (かつ変更されていない)、 Amazon Simple Storage Service (Amazon S3) 内にある様々なスケールのTPC-DSデータを参照しています。。 文字列を多く含むクエリの最適化 前述したように、Amazon Redshift チームは、お客様にさらに優れたコストパフォーマンスを提供するための新しい機会を継続的に探しています。パフォーマンスを大幅に向上させるために最近開始した改善の 1 つは、文字列データに対するクエリのパフォーマンスを高速化する最適化です。たとえば、 SELECT sum(price) FROM sales WHERE city = ‘New York’ のようなクエリを使用して、ニューヨーク市にある小売店から得られた総収益を確認するとします。このクエリは文字列データ ( city = ‘New York’ ) を述語に適用しています。ご想像のとおり、文字列データ処理はデータウェアハウスアプリケーションで広く使用されています。 お客様のワークロードが文字列にアクセスする頻度を定量化するために、Amazon Redshift が管理する数万のお客様のクラスターのフリートテレメトリを使用して、文字列データ型の使用状況の詳細な分析を実施しました。分析の結果、クラスターの 90% では文字列カラムが全カラムの少なくとも 30% を構成し、クラスターの 50% では文字列カラムが全カラムの少なくとも 50% を構成していることがわかりました。さらに、Amazon Redshift クラウドデータウェアハウスプラットフォームで実行されるクエリの大部分は、少なくとも 1 つの文字列カラムにアクセスしています。もう 1 つの重要な要素は、文字列データはカーディナリティが低いことが非常に多く、列に含まれる一意の値のセットが比較的少ないことを意味します。たとえば、販売データを表す orders テーブルには数十億の行が含まれている場合がありますが、そのテーブル内の order_status 列には、 pending 、 in process 、 completed などの数十億の行にわたって一意の値がわずかしか含まれていない可能性があります。 この記事の執筆時点では、Amazon Redshift のほとんどの文字列カラムは LZO または ZSTD アルゴリズムで圧縮されています。これらは優れた汎用圧縮アルゴリズムですが、カーディナリティの低い文字列データを活用するように設計されていません。特に、データを操作する前に解凍する必要があり、ハードウェアメモリ帯域幅の使用効率が低くなります。カーディナリティの低いデータの場合、より最適な別のタイプのエンコーディングである BYTEDICT があります。このエンコードでは、ディクショナリエンコードスキームが使用されており、データベースエンジンは圧縮データを最初に解凍する必要がなく、圧縮データに対して直接操作できます。 文字列の多いワークロードのコストパフォーマンスをさらに向上させるために、Amazon Redshift は現在、BYTEDICT としてエンコードされたカーディナリティの低い文字列カラムのスキャンと述語評価を、LZO や ZSTD などの圧縮エンコーディングと比較して 5 ~ 63 倍高速化する追加のパフォーマンス強化を導入しています (次のセクションの結果を参照)。 Amazon Redshift は、CPU 効率が高い軽量なBYTEDICT でエンコードされたカーディナリティの低い文字列カラムをベクトル化スキャンすることで、このパフォーマンスの向上を実現します。これらの文字列処理の最適化により、最新のハードウェアが提供するメモリ帯域幅が効果的に利用され、文字列データのリアルタイム分析が可能になります。これらの新しく導入されたパフォーマンス機能は、カーディナリティの低い文字列カラム (最大数百の一意の文字列値) に最適です。 Amazon Redshift データウェアハウスで 自動テーブル最適化 を有効にすることで、この新しい高パフォーマンス文字列の機能強化の恩恵を自動的に受けられます。テーブルで自動テーブル最適化が有効になっていない場合は、Amazon Redshift コンソールの Amazon Redshift Advisor から、文字列絡むの BYTEDICT エンコードへの適合性に関する推奨事項を受け取ることができます。 BYTEDICT エンコードを使用したカーディナリティの低い文字列列を持つ新しいテーブルを定義することもできます。 Amazon Redshift の文字列の拡張機能は、 Amazon Redshift が利用可能 なすべての AWS リージョンで利用できるようになりました。 パフォーマンス測定結果 文字列処理の強化によるパフォーマンスへの影響を測定するために、カーディナリティの低い文字列データで構成される 10 TB (テラバイト) データセットを生成しました。 Amazon Redshift フリートテレメトリからの文字列の長さの 25、50、および 75 パーセンタイルに対応する、短、中、長の文字列を使用して 3 つのバージョンのデータを生成しました。このデータを Amazon Redshift に 2 回ロードし、1 つは LZO 圧縮を使用し、もう 1 つは BYTEDICT 圧縮を使用してエンコードしました。最後に、多くの行 (テーブルの 90%)、中程度の行 (テーブルの 50%)、および少数の行 (テーブルの 1%) を返すスキャンを多用するクエリのパフォーマンスを、これらのカーディナリティの低いデータセットに対して測定しました。パフォーマンス結果を次のグラフにまとめます。 この内部ベンチマークでは、多くの行に一致する述語を含むクエリでは、LZO と比較して新しいベクトル化 BYTEDICT エンコーディングで 5 ~ 30 倍の改善が見られました。一方で、少ない行に一致する述語によるクエリでは 10 ~ 63 倍の改善が見られました。 Redshift Serverless コストパフォーマンス この投稿で示した高い同時実行パフォーマンスの結果に加えて、より大きな 3 TB データセットでTPC-DS 派生のクラウドデータウェアハウスのベンチマークも使用して、Redshift Serverless のコストパフォーマンスを、他のデータウェアハウスと比較しました。私たちは同様の価格のデータウェアハウスを選択しました。今回のケースでは、公開されているオンデマンド価格を使用すると、1 時間あたり 32 ドルの 10% 以内に収まっています。結果は、Amazon Redshift RA3 インスタンスと同様に、Redshift Serverless が他の主要なクラウドデータウェアハウスと比較して優れたコストパフォーマンスを実現していることを示しています。いつものように、これらの結果は、 GitHub リポジトリ の SQL スクリプトを使用して再現できます。 Amazon Redshift がデータ分析のニーズをどのように満たすかを確認する最良の方法として、自身の PoC ワークロードを使用して Amazon Redshift を試してみることをお勧めします。 あなたのワークロードにおける最高のコストパフォーマンスを見つける この投稿で使用されているベンチマークは、業界標準の TPC-DS ベンチマークから派生したもので、次の特徴があります。 スキーマとデータは TPC-DS から変更せずに使用しています。 クエリは、TPC-DS キットのデフォルトのランダムシードを使用して生成されたクエリパラメーターを持つ公式 TPC-DS キットを使用して生成しています。データウェアハウスがデフォルトの TPC-DS クエリの SQL 言語をサポートしていない場合は、TPC で承認された変更を加えたクエリを使用しています。 テストには 99 個の TPC-DS の SELECT クエリを含みます。これには、メンテナンスとスループットの手順は含んでいません。 単発の 3TB 同時実行テストでは、3 回の POWER RUN が実行され、データウェアハウスごとに最良の実行結果を採用しました。 TPC-DS クエリのコストパフォーマンスは、時間あたりのコスト (USD) にベンチマークの実行時間 (時間単位) を掛けたものとして計算しています。これは、ベンチマークの実行コストに相当します。前述したようにリザーブド インスタンスの価格ではなく、すべてのデータウェアハウスで最新の公開されたオンデマンド価格を使用しています。 これをクラウドデータウェアハウスベンチマークと呼びます。 GitHub リポジトリ で利用可能なスクリプト、クエリ、データを使用して、前述のベンチマーク結果を簡単に再現できます。この投稿で説明されているように、これは TPC-DS ベンチマークから派生したものであり、テストの結果は公式仕様に準拠していないため、公開されている TPC-DS の結果と比較することはできません。 結論 Amazon Redshift は、さまざまなワークロードに対して業界最高のコストパフォーマンスを提供することに尽力しています。 Redshift Serverless は、最良の (最も低い) コストパフォーマンスでリニアにスケールし、一貫したクエリ応答時間を維持しながら数百人の同時ユーザーをサポートします。この投稿で説明したテスト結果に基づくと、Amazon Redshift は、最も近い競合他社 (競合 B) と比較して、同じレベルの同時実行数で最大 2.6 倍優れたコストパフォーマンスを示しました。前述したように、3 年間全額前払いオプションでリザーブドインスタンスを使用すると、Amazon Redshift の実行コストが最も低くなり、この投稿で使用したオンデマンドインスタンスの価格と比較して、相対的なコストパフォーマンスがさらに向上します。継続的なパフォーマンス向上に対する当社のアプローチには、顧客のユースケースとそれに関連するスケーラビリティのボトルネックを理解するというお客様を中心とした考え方と、パフォーマンスを大幅に最適化する機会を特定するための継続的なフリートデータ分析を組み合わせた独自の組み合わせが含まれます。 各ワークロードには独自の特性があるため、まだ始めたばかりの場合は、Amazon Redshift がどのようにコストを削減しながらパフォーマンスを向上させるかを理解するための最良の方法は PoC です。独自の PoC を実行する場合は、クエリスループット (1 時間あたりのクエリ数)、応答時間、コストパフォーマンスなどの適切な指標に焦点を当てることが重要です。 PoC を自分で実行するか、AWS または システムインテグレーターおよびコンサルティングパートナー の 支援 を受けて、データ主導の意思決定を行うことができます。 Amazon Redshift の最新の開発状況を常に把握するには、 Amazon Redshift の最新情報 フィードをフォローしてください。 翻訳はソリューションアーキテクトの池田 敬之が担当しました。
アバター
この投稿は、プリンシパルソリューションアーキテクトの Anton Aleksandrov とシニアプロダクトマネージャーの Tarun Rai Madan の投稿を翻訳したものです。 本日、 AWS Lambda は、 Amazon Simple Queue Service(Amazon SQS) をイベントソースとして構成したスパイクのある Lambda ワークロードのポーリングスケールアップ率を最大 5 倍高速化したことを発表しました。 この機能により、Lambda と SQS を使用してイベント駆動型アプリケーションを構築し、SQS キュー内のメッセージのバースト時に応答性の高いスケーリングを実現します。また、より高速なメッセージ処理を実現するために Lambda 関数または SQS キューを複製する必要性を減らします。 概要 AWS Lambda で最新のイベント駆動型およびメッセージングアプリケーションを構築するお客様は、分離されたアーキテクチャを作成するための基本的なビルディングブロックとして Amazon SQS を使用します。 Amazon SQS は、マイクロサービス、分散システム、サーバーレスアプリケーション向けのフルマネージドなメッセージキューイングサービスです。Lambda 関数がイベントソースとして SQS キューをサブスクライブすると、Lambda はキューをポーリングし、メッセージを取得し、取得したメッセージをバッチで関数ハンドラに送信して処理します。メッセージを効率的に消費するために、Lambda はキューの深さの増加を検出し、キューに入れられたメッセージを処理するためのポーラープロセスの数を増やします。 今日まで、Lambda は SQS キューを購読した Lambda 関数に対して 1 分間に最大 60 回の同時実行を追加し、約 20 分で最大 1,250 の同時実行にスケールアップしていました。しかし、お客様の声では、Lambda と SQS を使用して構築する最新のイベント駆動型アプリケーションのいくつかは、メッセージの突然の急増に敏感であり、エンドユーザーのメッセージの処理に顕著な遅延を引き起こす可能性があるとのことでした。SQS キューでメッセージのバーストがあるアプリケーションに Lambda のパワーを活用するために、これらのお客様はより速くスケールアップするための Lambda メッセージポーリングが必要でした。 今日の発表により、SQS キューを購読する Lambda の機能は、メッセージバックログが急増するキューに対して最大 5 倍速くスケールし、1 分間に最大 300 の同時実行を追加し、最大 1,250 の同時実行数にスケールアップできます。このスケーリングの改善は、Lambda と SQS の統合のシンプルさを使用して、特にリアルタイムシステム向けに、受信メッセージの急増時により高速に拡張できるイベント駆動型アプリケーションを構築するのに役立ちます。また、SQS キューでのメッセージの急増時に処理を高速化する利点を提供する一方で、SQS イベントソースごとに最大同時 Lambda 呼び出しを制限する柔軟性を提供し続けます。 SQS による最大同時 Lambda 呼び出しの制御 新しく改善されたスケーリングレートは、イベントソースとして Lambda と SQS を使用するすべての AWS アカウントに自動的に適用されます。取らなければならない明示的なアクションはなく、追加費用もありません。このスケーリングの改善は、お客様がより高速な SQS ポーリングスケールアップを必要とする、より高性能な Lambda アプリケーションを構築するのに役立ちます。関連するダウンストリームが高負荷になる可能性を低減するために、Lambda は関数レベルで予約済み同時実行数(Reserved concurrency)、イベントソースレベルで最大同時実行数(Maximum concurrency)を設定できます。 次の図は、SQS イベントソースの流量を制御するために使用できる設定を示しています。予約済み同時実行数(Reserved concurrency)を使用して関数レベルのスケーリングを制御し、最大同時実行数(Maximum concurrency)を使用してイベントソースのスケーリングを制御します。 予約済み同時実行数(Reserved concurrency) は、関数に割り当てる最大同時実行数です。関数に割り当てられた予約済み同時実行数がある場合、他の関数はその同時実行数を使用できません。 関数にスケールアップするのに十分な同時実行数を確保したい場合は、予約済み同時実行数を使用することを推奨します。SQS イベントソースが Lambda の同時実行をスケールアップしようとしているが、関数がすでに予約済み同時実行数によって定義されたしきい値に達している場合、Lambda サービスはさらなる関数呼び出しを制限します。 これにより、SQS イベントソースがスケールダウンを試み、同時に処理されるメッセージの数が減少する可能性があります。キューの設定に応じて、制限されたメッセージは再試行のためにキューに返されるか、保持ポリシーに基づいて期限切れになるか、 デッドレターキュー (DLQ) または 失敗の宛先 (on-failure destination) に送信されます。 最大同時実行数(Maximum concurrency) 設定を使用すると、イベントソースレベルで同時実行数を制御できます。これにより、イベントソースが Lambda 関数に送信しようとする同時呼び出しの最大数を定義できます。1つの関数に複数の SQS イベントソースが構成されているシナリオでは、各イベントソースの最大同時実行数を個別に定義することで、よりきめ細やかな制御が可能です。SQS イベントソースにレート制御を追加しようとする場合は、より高い柔軟性を提供するために、まず初めに最大同時実行数の設定を評価することを推奨します。 予約同時実行と最大同時実行は補完的な機能であり、併用することができます。最大同時実行数は、ダウンストリームシステムが高負荷になるのを防ぐために呼び出しをスロットルするのに役立ちます。予約同時実行数は、関数が利用可能な同時実行数を確保するのに役立ちます。 シナリオ例 あなたのビジネスはストレージから大量の文書を処理する必要があると考えてください。数時間ごとに、ビジネスパートナーは大量のドキュメントをアカウントの S3 バケットにアップロードします。 回復力(レジリエンシー)のために、アップロードされた各ドキュメントの SQS キューにメッセージを送信するようにアプリケーションを設計したので、誤ってスキップすることなく効率的に処理できます。ドキュメントは、単一のドキュメントを処理するのに約 2 秒かかる Lambda 関数を使用して処理されます。 これらのドキュメントの処理は CPU 使用率の高い操作であるため、1 つの呼び出しごとに 1 つのドキュメントを処理することにしました。Lambda のパワーを使用して、できるだけ多くの同時実行環境に並列処理をファンアウトしたいと考えています。Lambda 関数は、これらのドキュメントを可能な限り迅速にスケールアップし、コストを節約するためにすべてのドキュメントが処理されたらゼロにスケールダウンします。 ビジネスパートナーが 20万件の文書をアップロードすると、20万件のメッセージが SQS キューに送信されます。Lambda 関数は SQS イベントソースで構成され、キューからのメッセージを消費し始めます。 この図は、SQS イベントソースのスケーリング改善の前にテストシナリオを実行した結果を示しています。予想通り、同時実行数は 1 分間に 60 増加することがわかります。900 の同時実行数に徐々にスケールアップし、キュー内のすべてのメッセージを処理するには、約 16 分かかります。 次の図は、SQS イベントソースのスケーリングの改善後に同じテストシナリオを実行した結果を示しています。両方のチャートに使用される時間枠は同じですが、2 番目のチャートのパフォーマンスは優れています。同時実行数は毎分 300 増加します。1,250 の同時実行数にスケールアップするのに 4 分しかかからず、キュー内のすべてのメッセージは約 8 分で処理されます。 この例をデプロイする サンプルプロジェクト を使用して、自分の AWS アカウントでこのパフォーマンステストを複製します。 AWS Cloud Development Kit (CDK) を使用して AWS アカウントのサンプルプロジェクトをプロビジョニングするには、README.md の指示に従ってください。 このサンプルプロジェクトは、20万件のメッセージを処理する大規模なワークロードを実証するように構成されています。アカウントでこのサンプルプロジェクトを実行すると、料金が発生する場合があります。 AWS Lambda の料金 と Amazon SQS の料金 を参照してください。 デプロイしたら、“sqs-cannon” ディレクトリの下にあるアプリケーションを使用して、20万件のメッセージを SQS キューに送信します(もしくは他の数値を設定します)。SQS キューにメッセージを入力するのには数分かかります。すべてのメッセージが送信されたら、README.md で説明されているように SQS イベントソースを有効にし、プロビジョニングされた CloudWatch ダッシュボードのチャートをモニタリングします。 新しい AWS アカウントのデフォルトの同時実行数クォータは 1000 です。このクォータの増加をリクエストしていない場合、同時実行数はこの数に制限されます。 サービスクォータ を使用するか、アカウントチームに連絡して同時実行数の増加をリクエストしてください。 セキュリティのベストプラクティス Lambda 関数に SQS キューへのアクセスを許可するときは、常に最も特権の低い権限を使用してください。これは、特定の機能のみが特定のキューに対して特定のアクションを実行する権限を持つようにすることで、潜在的な攻撃面を減らします。たとえば、関数がキューからのみポーリングする場合は、メッセージを読む権限を付与しますが、新しいメッセージを送信する権限は付与しません。 関数実行ロール は、関数が他のリソースで実行できるアクションを定義します。 キューアクセスポリシー は、このキューにアクセスできるプリンシパルと、許可されるアクションを定義します。 サーバーサイド暗号化(SSE) を使用して、暗号化された SQS キューに機密データを保存します。SSE では、メッセージは常に暗号化された形式で保存され、SQS は許可された消費者に送信するためにのみ復号化します。SSE は、SQS が管理する暗号化キー (SSE-SQS) または AWS Key Management Service で管理されるキー (SSE-KMS) を使用して、キュー内のメッセージの内容を保護します。 まとめ 改善された Lambda の SQS イベントソースポーリングスケールアップ機能は、SQS キューを使用したスパイクのあるイベント駆動型ワークロードのスケールアップパフォーマンスを追加料金なしで最大 5 倍高速化できます。この改善は、SQS キューのメッセージの急増時に処理を高速化するメリットを顧客に提供しますが、イベントソースとして SQS による最大同時実行数を制限する柔軟性を提供し続けます。 より多くのサーバーレス学習リソースについては、 Serverless Land をご覧ください。 翻訳はソリューションアーキテクトの淡路が担当しました。原文は こちら です。
アバター
はじめに 2023年10月12日にAWS Support の事例Webinar&nbsp; を実施しました。AWS サポートは障害対応だけでなく、開発時から運用まで、AWS をより良くご利用いただくための支援をします。例えば、コスト削減、セキュリティ強化、重要なシステムのマイグレーションなどのクラウドの活用に関するお客様の課題をサポートします。最上位プランである「エンタープライズ」に加えて、2023年1月から新たに「エンタープライズ On-Ramp」が登場し、よりリーズナブルな価格で上位サポートがご利用できるようになりました。本セミナーでは「エンタープライズ」と「エンタープライズ On-Ramp」をご利用のお客様にご登壇いただき、導入の背景や効果をご紹介いただきました。 セッション1:RevComm の急速な事業成長を支えるエンタープライズサポート 株式会社RevComm は 2017 年の創業以来、AI 搭載型のクラウド IP 電話 「MiiTel (ミーテル)」を中心に急速な事業成長を遂げ、累計のユーザー数は5万人を超えました。CTO の平村様とLead Infrastructure Engineerの工藤様のお二人から、経営とエンジニアリングの現場という2つの視点で事例をご紹介いただきます。 RevComm は急速な事業拡大を背景に2022年7月にエンタープライズサポートに加入しました。導入の狙いとしては、①開発の円滑化による更なる事業拡大、②新たな顧客層(金融機関や自治体等)からのセキュリティや高可用性へのニーズの対応、③従業員のスキルアップ(導入した頃は150人程度で40% がエンジニア)、④AWS の有効活用による技術競争力の強化、の4点です。 導入効果の1つとして、エンジニア一人ひとりがAWS サポートを使いこなし、技術的課題を早く解決できるようになったことが挙げられます。RevComm はマイクロサービスチーム(ソフトウエアエンジニア)がインフラ構築・運用を担当し、インフラエンジニアは横断的な部分を担当しています。つまり、ソフトウエアエンジニアもAWS に触れる機会があるのですが、エンタープライズサポート導入前は開発段階ではAWS サポートを活用していませんでした。しかし、導入後は開発に関するAWS サポートへの質問が42件まで増加し、その約7割がソフトウエアエンジニアからでした。各エンジニアが技術的課題を自ら解決できるようになり、インフラエンジニアがボトルネック化しないスケーラブルな開発体制に変わったとも言えます。 また、担当テクニカルアカウントマネージャ(TAM )からの情報提供も効率的な事業運営に役立っています。例えば、新機能やサービスの情報やメンテナンスの情報をRevComm の状況に即してTAM から解説やフォローをしてもらえます。インフラ側から各エンジニアに最新の情報を展開することでAWS をうまく使いこなすために一役買っています。 [ プレゼン資料のダウンロードはこちら ] セッション2:開発チームの自走を支える為の AWS エンタープライズサポート 株式会社リクルートは、2021年4月に複数の事業会社・機能会社を統合する形で誕生しました。多くの開発チームを横断的に支援するCCOE としてご活躍の宮地様からお話いただきます。 エンタープライズサポートへの加入はある障害がきっかけでした。オペレーションミスが障害のトリガーでしたが、そのアカウントがサポート未加入のためAWS サポートに技術的な問い合わせができず、再発防止のための根本原因の特定には至りませんでした。当時は開発チーム毎にサポート加入を決めていました。しかし、責任あるプロダクト提供のためには全アカウントでエンタープライズサポートに入るべきだと考え、CCOE から意見を上げ全社的な意思決定につなげました。これは、リクルートが「ボトムアップ組織」であることをよく表していると思います。 仕様や設計の質問もできるAWS サポートは、開発チームの自走に役立っています。TAM と協力し、AWS サポートの使い方勉強会を社内向けに行った結果、問い合わせ件数が2倍以上に増加しました。TAM との定例会では、実際の問い合わせをレビューし、正確な回答を早く引き出すアドバイスをTAM からもらうことで、問合せの質の向上にも取り組んでいます。また、ナレッジの蓄積も重要です。様々な知見やノウハウが含まれているためAWS サポートからの回答が自動的に社内wiki に蓄積される仕組みをつくり他のエンジニアも参照できるようにすることで、組織的な技術力強化に利用しています。 複雑な課題が発生したときのTAM からの支援もメリットの1つです。以前、複数アカウント間でのデータ連携の問題が発生し、問題個所の特定に時間がかかったことがありました。リクルートの開発チーム、AWS のSA ・TAM が協力し事象を整理したことで、適切なアカウントからAWS サポートに適切な問い合わせができました。結果的にAmazon Aurora の仕様によるものと分かりましたが、インタラクティブな初期対応は、エンタープライズサポートならではだと思います。 [ プレゼン資料のダウンロードはこちら ] セッション3:カオナビにおける AWS サポートアップグレード 株式会社カオナビ プラットフォーム本部長の髙橋様から「プロダクトの成長を維持する開発組織であり続けるために、柔軟な権限分離と委譲を実現する手法としてマルチアカウント化を進め、エンタープライズ On-Ramp プランを導入するまでのお話」というテーマでお話をしていただきます。 タレントマネジメントシステム「カオナビ」は2012年の事業開始から成長を続け3,000を超える企業に採用されています。事業成長にともなってエンジニア数も増加すると、生産性・開発効率の向上や、品質(セキュリティ・統制)の維持が課題となります。この課題に対応するために、開発チーム体制を「単一チーム」→「チーム開発」→「ハイブリッド」と変化させてきました。また、体制に合わせてシステムを分割するために、権限の分離や移譲、統制の強化も必要ですし、変化に対応するための柔軟性の維持も大切です。そこで1つのAWS アカウントを分割し複数のアカウントで運用する、マルチアカウント運用の整備も進めています。 AWS アカウントの増加に伴いAWS サポートのアップグレードの検討を行いました。ポイントはサポート利用料と管理コストの2つです。AWS アカウント単位での加入となる開発者プラン・ビジネスプランでは、どのアカウントがどのサポートプランなのか管理が必要です。サポートプランが混在した状況でアカウントが増加していくと、認知コスト、コミュニケーションコスト、プラン変更運用など様々な内部的コストが増大します。一方で、エンタープライズOn-Ramp は全アカウント一括で加入できるため、将来的にも管理コストを抑えることができます。サポート利用料もアカウントが多い場合はビジネスプランと大差がないため、エンタープライズOn-Ramp の採用を決めました。今後はビジネスプランでは利用できなかったプールTAMも活用していきたいと思います。 [ プレゼン資料のダウンロードはこちら ] セッション4:エンタープライズ On-Ramp で AWS の利用体験を高める スタートアップ企業である株式会社スタディストでは、創業からAWS を使い「Teachme Biz」、「ハンクラ」というサービスを提供してきました。若松様からSRE の視点でエンタープライズOn-Ramp の活用事例をお話しいただきます。 エンタープライズOn-Ramp に加入した理由は3つです。1つ目は、AWSサポートのリードタイムの改善です。ビジネス的には急いでいてもAWS は正常に使えている場合、AWS サポートへの問い合わせでは高い緊急度を選択できません。しかし、エンタープライズOn-Ramp ではプールTAM にサポートケースをエスカレするとTAM がAWS サポートとのコミュニケーションを支援してくれます。請求に関する急ぎの問い合わせをしたときには期待以上に迅速に対応してもらえ助かりました。 2つ目はサポート未加入のAWS アカウントの解消です。エンタープライズOn-Ramp ではすべてのAWS アカウントからSlack を使って問合せAWS サポートに問い合わせできます。問い合わせ毎にスレッドが作成され履歴が残るため、Slack チャネルに参加しているメンバーへの共有も簡単です。マネジメントコンソールからの問い合わせの場合、必要なIAM 権限が必要で、問合せ内容は個々のエンジニアに閉じていましたが、Slack の活用でナレッジの展開にもつながっています。 3つ目はサポート料金です。最上位のエンタープライズプランは予算オーバーでしたが、エンタープライズOn-Ramp ならスタートアップの当社でも手の届く範囲だったため採用を決めました。エンタープライズ On-Ramp に加⼊したことで、AWS サポートの利⽤体験が大幅に向上しました。もう、ビジネスプランには戻りたくないと思っています。 [ プレゼン資料のダウンロードはこちら ] さいごに 本Webinar ではゲストスピーカーの皆様から具体的なエピソードを交えてエンタープライズサポートとエンタープライズOn-Ramp の活用方法を共有いただきました。ご利用を検討中のお客様が「自社にとっての活用方法」をイメージしていただく一助になると幸いです。ミッションクリティカルなシステムの運用にエンタープライズサポートやエンタープライズOn-Ramp の活用をご検討のお客様はAWS の営業担当までお問い合わせください。 本ブログは、技術支援本部 シニア事業開発マネージャー 庄司が担当しました。
アバター
この記事は、 AWS App Runner adds support for monorepos を翻訳したものです。 はじめに AWS App Runner は、インフラストラクチャやコンテナに関する経験がなくても、コンテナ化されたウェブアプリケーションや API サービスを構築、デプロイ、実行できる、フルマネージド型のコンテナアプリケーションサービスです。本日より、AWS App Runner はモノレポ構造を取っているソースコードリポジトリからのサービスのデプロイをサポートします。これにより、複数のサービスのソースコードをホストするモノレポにおいて、デプロイするソースディレクトリを AWS App Runner に伝えることができます。 モノレポは、複数の異なるプロジェクトのコードを、明確に定義された関係を持つ単一のリポジトリに保存するソフトウェア開発戦略です。クラウドコンピューティングを利用するお客様は、コラボレーションを強化し、コードの重複を避け、可視性を向上させるために、モノレポ開発戦略を採用している場合があります。これは、マイクロサービスベースのアーキテクチャに従った最新のアプリケーションを開発する場合に特に有益です。 お客様は、AWS App Runner の「ソースからのビルド」機能を使用してソースコードから直接サービスをデプロイすることで、ビルドとデプロイのワークフロー管理を AWS App Runner に任せることができます。以前は、AWS App Runner は、ビルドコマンドと起動コマンドを実行する際にリポジトリのルートディレクトリのみをサポートしていました。本日より、アプリケーションのビルドパイプラインとデプロイパイプラインを個別に管理する必要がなくなります。アプリケーションのビルドとデプロイに使用する AWS App Runner サービス設定でソースディレクトリを定義できます。 サービスの自動デプロイを有効にすることもできます。自動デプロイを有効にすると、AWS App Runner はソースディレクトリまたはサービスの依存関係に更新があったときにサービスを再ビルドしてデプロイします。ソースディレクトリ以外の他のアプリケーションやフォルダが更新されても、AWS App Runner はサービスを不必要に再構築してデプロイしません。 つまり、お客様は AWS App Runner のソースからのビルド機能を利用して、モノレポ構造に従うソースコードリポジトリから直接サービスをデプロイできます。お客様は、ソースコードベースのサービスの標準ビルド料金を支払います。お客様は、モノレポアプリケーションの柔軟性と、AWS App Runner でのシンプルな実行のメリットを享受できます。 ソリューション概要 AWS App Runner でモノレポをサポートする機能を紹介するために、ウォークスルーを行います。1 つのソースコードリポジトリから 2 つのサービス (1 つはフロントエンド、もう 1 つはバックエンド) を含むサンプルアプリケーションをデプロイします。 サンプルアプリケーションは、架空のホテルのウェブサイトを運営する 2 つのマイクロサービスのモノレポによって支えられています。フロントエンドとバックエンドはどちらも、 Express ウェブフレームワークが提供する Node.js アプリケーションです。AWS App Runner を使用して、アプリケーションをホストする 2 つのサービスを作成します。 アプリケーションをサポートするインフラストラクチャの一部として、Amazon Relational Database Service ( Amazon RDS ) データベースと、2 つのサービスとデータベース間の通信に必要な Amazon Virtual Private Cloud ( Amazon VPC ) ネットワークコンポーネントを作成します。パブリックのインターネットトラフィックがフロントエンドサービスに到達し、ホテルの部屋の管理をリクエストできるようになります。 これらのリクエストは、 VPC Connector と VPCIngressConnection を経由して、Amazon RDS データベースにクエリを実行してリクエストを処理するバックエンドサービスに安全に送信されます。最後に、リクエストが処理され、リクエスタがレスポンスを受け取ります。AWS App Runner によるプライベートネットワーキングの詳細については、 VPC ネットワーキング と プライベートサービス に関する詳細な投稿を参照してください。 AWS App Runner サービスを作成する際には、各ソースディレクトリに対して行われたコミットがそれぞれのサービスにのみデプロイされるように、自動デプロイを有効にしてそれぞれのソースディレクトリを設定します。 図 1: AWS クラウド内で接続された 2 つの モノレポ AWS App Runner サービスを示すアーキテクチャ図 前提条件 ウォークスルーを完了するには、次のツールのセットアップが必要です。 AWS Command Line Interface (AWS CLI) version 2 Git jq GitHub アカウント ウォークスルー AWS App Runner の Connection コードベースのサービスの場合、AWS App Runner はリポジトリからコードをデプロイするための Connection を必要とします。このチュートリアルでは、フォークできるホテルアプリケーションのモノレポを GitHub 上に作成しました。 まず、この GitHub リポジトリ にアクセスし、個人の GitHub アカウントにモノレポブランチをフォークします。フォークする際には、Copy the main branch only のチェックを外し、main 以外のブランチもコピーするようにしてください。フォークしたのち、リポジトリの URL を環境変数として保存します。 REPOSITORY_URL=https://&lt;&lt;YOUR_FORKED_REPOSITORY_URL&gt;&gt; 次に、us-east-2 の AWS App Runner コンソール にアクセスして、個人用 GitHub アプリケーションに接続する GitHubConnection という名前の AWS App Runner の Connection を作成します。認証されると、GitHub リポジトリから AWS App Runner サービスを作成できるようになります。この認証ハンドシェイクの仕組みの詳細については、 開発者ガイド をご覧ください。 ConnectionArn をこの後使用できるようにローカルに保存します。 export MRO_AWS_REGION=us-east-2 LIST_CONNECTIONS_RESPONSE=$(aws apprunner --region $MRO_AWS_REGION \ list-connections \ --connection-name "GitHubConnection") APP_RUNNER_CONNECTION_ARN=$(echo ${LIST_CONNECTIONS_RESPONSE} | jq -r '.ConnectionSummaryList[0].ConnectionArn') ネットワーク及びデータベースインフラストラクチャの構築 サンプルのリポジトリ (もしくは、新しくフォークしたレポジトリ) をクローンします。 export MRO_STACK_NAME=apprunner-monorepo git clone --branch monorepo https://github.com/aws-samples/apprunner-hotel-app.git cd ./apprunner-hotel-app/ それでは以下のコマンドを実行し、AWS CloudFormation のテンプレートである infrastructure/base-infra.yaml を利用して、VPC、VPC エンドポイント、VPC Connector、Amazon RDS インスタンス、データベースの認証情報のための AWS Secrets Manager の Secret をデプロイしましょう。 aws cloudformation deploy \ --region ${MRO_AWS_REGION} \ --template-file ./infrastructure/base-infra.yaml \ --stack-name ${MRO_STACK_NAME} \ --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM 上記の AWS CloudFormation スタックの実行が完了するまで待ちます。この際、スタック作成に時間がかかる場合はコマンドから抜けてプロンプトに戻る場合があります。必要に応じてスタックの実行状況を確認し、スタックの実行が継続していれば問題ありません。スタックの実行が完了したら、以下のコマンドを実行してスタックから出力値を取得します。 #Hotel Name HOTEL_NAME=$(aws cloudformation describe-stacks \ --region ${MRO_AWS_REGION} \ --stack-name ${MRO_STACK_NAME} \ --query 'Stacks[0].Outputs[?OutputKey==`HotelName`].OutputValue' \ --output text) #RDS Secret SECRET_ARN=$(aws cloudformation describe-stacks \ --region ${MRO_AWS_REGION} \ --stack-name ${MRO_STACK_NAME} \ --query 'Stacks[0].Outputs[?OutputKey==`DBSecret`].OutputValue' \ --output text) #VPC ID VPC_ID=$(aws cloudformation describe-stacks \ --region ${MRO_AWS_REGION} \ --stack-name ${MRO_STACK_NAME} \ --query 'Stacks[0].Outputs[?OutputKey==`VPCID`].OutputValue' \ --output text) #App Runner VPC Endpoint VPC_ENDPOINT=$(aws cloudformation describe-stacks \ --region ${MRO_AWS_REGION} \ --stack-name ${MRO_STACK_NAME} \ --query 'Stacks[0].Outputs[?OutputKey==`AppRunnerVPCEndpoint`].OutputValue' \ --output text) #Backend App Runner VPC Connector VPC_BE_CONNECTOR_ARN=$(aws cloudformation describe-stacks \ --region ${MRO_AWS_REGION} \ --stack-name ${MRO_STACK_NAME} \ --query 'Stacks[0].Outputs[?OutputKey==`AppRunnerBEVPCConnector`].OutputValue' \ --output text) #Frontend App Runner VPC Connector VPC_FE_CONNECTOR_ARN=$(aws cloudformation describe-stacks \ --region ${MRO_AWS_REGION} \ --stack-name ${MRO_STACK_NAME} \ --query 'Stacks[0].Outputs[?OutputKey==`AppRunnerFEVPCConnector`].OutputValue' \ --output text) #App Runner IAM Instance Role INSTANCE_ROLE_ARN=$(aws cloudformation describe-stacks \ --region ${MRO_AWS_REGION} \ --stack-name ${MRO_STACK_NAME} \ --query 'Stacks[0].Outputs[?OutputKey==`AppRunnerInstanceRole`].OutputValue' \ --output text) モノレポサービスの作成 これで、バックエンドとフロントエンドの AWS App Runner サービスをサポートするために必要なすべてのインフラストラクチャが揃いました。 バックエンドサービスの作成 それでは、バックエンドサービスを作成しましょう。まず、以下のコマンドを実行して、サービスの構成を表すローカルファイル create_backend_service.json を作成します。SourceDirectory は Git リポジトリ内の backend ディレクトリ が指定されていることに注意してください。 cat &gt; create_backend_service.json &lt;&lt; EOF { "ServiceName": "hotel-backend", "SourceConfiguration": { "CodeRepository": { "RepositoryUrl": "${REPOSITORY_URL}", "SourceCodeVersion": { "Type": "BRANCH", "Value": "monorepo" }, "CodeConfiguration": { "ConfigurationSource": "API", "CodeConfigurationValues": { "BuildCommand": "npm install", "Port": "8080", "Runtime": "NODEJS_16", "RuntimeEnvironmentSecrets": { "HOTEL_NAME" : "${HOTEL_NAME}", "MYSQL_SECRET": "${SECRET_ARN}" }, "StartCommand": "npm start" } }, "SourceDirectory": "backend" }, "AutoDeploymentsEnabled": true, "AuthenticationConfiguration": { "ConnectionArn": "${APP_RUNNER_CONNECTION_ARN}" } }, "InstanceConfiguration": { "Cpu": "1 vCPU", "Memory": "3 GB", "InstanceRoleArn": "${INSTANCE_ROLE_ARN}" }, "NetworkConfiguration": { "EgressConfiguration": { "EgressType": "VPC", "VpcConnectorArn": "${VPC_BE_CONNECTOR_ARN}" }, "IngressConfiguration": { "IsPubliclyAccessible": false } } } EOF バックエンドサービスを作成します。 BACKEND_CREATE_SERVICE_RESPONSE=$(aws apprunner --region $MRO_AWS_REGION \ create-service \ --cli-input-json file://create_backend_service.json) バックエンドサービスの ServiceArn を保存します。 BACKEND_SERVICE_ARN=$(echo ${BACKEND_CREATE_SERVICE_RESPONSE} | jq -r '.Service.ServiceArn') VpcIngressConnection の作成 デフォルトでは、AWS App Runner サービスはインターネット経由でパブリックにアクセスできます。ただし、バックエンドサービスは公開されることを意図したものではありません。VPC 内でのみアクセスできるようにする必要があります。 バックエンドサービスへのネットワークアクセスを制限するために、AWS App Runner VPC Ingress Connection リソースを作成します。VPC Ingress Connection は VPC インターフェイスエンドポイントと AWS App Runner サービス間の接続を確立し、Amazon VPC 内からのみ App Runner サービスにアクセスできるようにします バックエンドサービスへのプライベートアクセスを許可する VpcIngressConnection を作成します。 INGRESS_CREATE_RESPONSE=$(aws apprunner --region ${MRO_AWS_REGION} \ create-vpc-ingress-connection \ --service-arn ${BACKEND_SERVICE_ARN} \ --vpc-ingress-connection-name "Private-Connection-To-Backend" \ --ingress-vpc-configuration VpcId=${VPC_ID},VpcEndpointId=${VPC_ENDPOINT}) VpcIngressConnectionArn と、バックエンドサービスURL の出力値を保存します。 INGRESS_ARN=$(echo ${INGRESS_CREATE_RESPONSE} | jq -r '.VpcIngressConnection.VpcIngressConnectionArn') BACKEND_URL="https://$(echo ${INGRESS_CREATE_RESPONSE} | jq -r '.VpcIngressConnection.DomainName')/" フロントエンドサービスの作成 いよいよフロントエンドサービスをデプロイします。以下のコマンドを実行して、サービスの構成を表すローカルファイル create_frontend_service.json を作成します。SourceDirectory は Git リポジトリ内の frontend ディレクトリ が指定されていることに注意してください。 cat &gt; create_frontend_service.json &lt;&lt; EOF { "ServiceName": "hotel-frontend", "SourceConfiguration": { "CodeRepository": { "RepositoryUrl": "${REPOSITORY_URL}", "SourceCodeVersion": { "Type": "BRANCH", "Value": "monorepo" }, "CodeConfiguration": { "ConfigurationSource": "API", "CodeConfigurationValues": { "BuildCommand": "npm install", "Port": "8080", "Runtime": "NODEJS_16", "RuntimeEnvironmentSecrets": { "HOTEL_NAME" : "${HOTEL_NAME}" }, "RuntimeEnvironmentVariables": { "BACKEND_URL": "${BACKEND_URL}" }, "StartCommand": "npm start" } }, "SourceDirectory": "frontend" }, "AutoDeploymentsEnabled": true, "AuthenticationConfiguration": { "ConnectionArn": "${APP_RUNNER_CONNECTION_ARN}" } }, "InstanceConfiguration": { "Cpu": "1 vCPU", "Memory": "3 GB", "InstanceRoleArn": "${INSTANCE_ROLE_ARN}" }, "NetworkConfiguration": { "EgressConfiguration": { "EgressType": "VPC", "VpcConnectorArn": "${VPC_FE_CONNECTOR_ARN}" }, "IngressConfiguration": { "IsPubliclyAccessible": true } } } EOF フロントエンドサービスを作成します。 FRONTEND_CREATE_SERVICE_RESPONSE=$(aws apprunner --region $MRO_AWS_REGION \ create-service \ --cli-input-json file://create_frontend_service.json) フロントエンドサービスの ServiceArn と、ServiceUrl の出力値を保存します。 FRONTEND_SERVICE_ARN=$(echo ${FRONTEND_CREATE_SERVICE_RESPONSE} | jq -r '.Service.ServiceArn') FRONTEND_URL="https://$(echo ${FRONTEND_CREATE_SERVICE_RESPONSE} | jq -r '.Service.ServiceUrl')" 作成が完了するまでの間、適宜ステータスを確認します。 aws apprunner --region $MRO_AWS_REGION \ describe-service \ --service-arn ${FRONTEND_SERVICE_ARN} サービスが利用可能になったら、FRONTEND_URL を介してアプリケーションにアクセスします。 echo ${FRONTEND_URL} 図2: モノレポのフロントエンドとバックエンドサービスで構築された実行中のホテルアプリケーション このアプリケーションは、Create ボタンを押下してデータベーススキーマを作成し、ホテルの部屋を追加して表示することができます。自動デプロイを有効にしている場合、GitHub リポジトリの frontend ディレクトリに変更がコミットされると、フロントエンドサービスへのデプロイが開始されますが、バックエンドサービスへのデプロイは行われません。本記事では、自動デプロイを有効にしてサービスを作成しています。ぜひ試してみてください! 後片付け このウォークスルー中に作成された AWS リソースにはコストがかかります。ウォークスルーが終了したら、作成したインフラストラクチャを必ず削除してください。 まず、AWS App Runner VpcIngressConnection を削除します。 INGRESS_DELETE_RESPONSE=$(aws apprunner --region ${MRO_AWS_REGION} \ delete-vpc-ingress-connection \ --vpc-ingress-connection-arn ${INGRESS_ARN}) 次に、フロントエンド、バックエンドサービスを削除します。 FRONTEND_DELETE_SERVICE_RESPONSE=$(aws apprunner --region $MRO_AWS_REGION \ delete-service \ --service-arn ${FRONTEND_SERVICE_ARN}) BACKEND_DELETE_SERVICE_RESPONSE=$(aws apprunner --region $MRO_AWS_REGION \ delete-service \ --service-arn ${BACKEND_SERVICE_ARN}) 最後に、AWS CloudFormation スタックを削除します。 DELETE_STACK_RESPONSE=$(aws cloudformation --region $MRO_AWS_REGION \ delete-stack \ --stack-name ${MRO_STACK_NAME}) まとめ 本記事では、AWS App Runner を使用してモノレポ構成のリポジトリからサービスをデプロイする方法を紹介しました。App Runner のモノレポをサポートする機能を使用して、単一のソースコードリポジトリにフロントエンド層とバックエンド層の両方を持つサンプルアプリケーションをデプロイしました。AWS App Runner を使用して、本番環境のウェブアプリケーションでこの新機能を試すことをお勧めします。AWS App Runner の詳細については、 ドキュメント と 開発者ガイド をご覧ください。 翻訳はパートナーソリューションアーキテクトの髙橋達矢が担当しました。原文は こちら です。
アバター
この記事は Announcing Container Insights with Enhanced Observability for Amazon EKS on EC2 (記事公開日: 2023 年 11 月 7 日) を翻訳したものです。 Container Insights は、Amazon のフルマネージドなモニタリングおよびオブザーバビリティサービスであり、DevOps エンジニア、開発者、SRE、IT マネージャーに、コンテナ化されたアプリケーションとマイクロサービス環境に対するすぐに使える可視性を提供します。Container Insights を使用すると、Kubernetes クラスターの問題の監視、切り分け、診断を最小限の労力で実施できます。これは、クラスター、サービス、Pod の CPU、メモリ、ネットワーク、ディスク使用量などのインフラストラクチャテレメトリを、CloudWatch コンソールで簡単に視覚化できるメトリクスとログの形で提供します。また、お客様は CloudWatch アラームを追加して、プロアクティブなアクションのために異常を通知させることができます。本日、これをさらに一歩進める「Amazon EKS のオブザーバビリティが拡張された Container Insights」を発表できることを嬉しく思います。これは、API サーバーや etcd のような Kubernetes コントロールプレーンコンポーネントからの追加テレメトリを提供します。また、より迅速な問題の切り分けとトラブルシューティングのために、Pod ごと、コンテナごと、そして Kube State メトリクス (訳注: kube-state-merics に相当するメトリクスの一部) を含む、コンテナレベルまでの詳細な健全性とパフォーマンスメトリクスも含まれています。 Kube State メトリクスを使用すると、Kubernetes クラスターのコアコンポーネントと全体的な健全性を包括的に可視化できるため、ユーザーはリアルタイムの状態をモニタリングし、問題やボトルネックを迅速に検出できます。詳細なコンテナレベルのメトリクスを使用することで、さまざまなクラスターレイヤーにわたって視覚的にドリルダウンおよびドリルアップして、個々のコンテナのメモリリークなどの問題を簡単に特定し、解決までの平均時間を短縮できます。もう 1 つの重要な利点は、アラームがまだ設定されていない場合でも、リスクを特定しプロアクティブなアクションを取ることができることです。モニタリングされていないコンポーネントにアラームを設定したり、より多くのリソースを割り当てたりして、先手を打ってリスクを軽減し、エンドユーザーエクスペリエンスの低下を回避することができます。最終的には、拡張されたオブザーバビリティ機能により、お客様のアクションに依存することなく、早期のリスク特定とプロアクティブな緩和が容易になり、エンドユーザーエクスペリエンスに悪影響を及ぼす可能性のある問題の予防に役立ちます。 Amazon EKS の拡張されたオブザーバビリティを有効にするにはどうすればよいですか? Amazon CloudWatch Observability EKS アドオン を使用することで、Amazon EKS クラスターで拡張されたオブザーバビリティを得ることができます。Amazon EKS アドオンは、Amazon EKS クラスターで拡張されたオブザーバビリティを有効にする簡単な方法を提供します。このアドオンは CloudWatch エージェントと Fluent Bit をインストールし、インフラストラクチャとコンテナのログに関するインサイトを提供します。CloudWatch エージェントは、クラスターノードから CloudWatch に主要なインフラストラクチャメトリクスを送信します。これにより、CPU、ネットワーク、ディスク、およびその他の低レベルのノードメトリクスをモニタリングできます。Fluent Bit はコンテナログをクラスターから CloudWatch Logs に送信します。これにより、コンテナからのアプリケーションログとシステムログについてのインサイトが得られます。Amazon EKS アドオンを使用するには、クラスター内のワーカーノードが使用する IAM ロールに必要な IAM アクセス許可を設定します。 aws iam attach-role-policy --role-name my-worker-node-role \ --policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy 次に、以下のようにアドオンをインストールします。「my-cluster-name」はクラスターの名前に置き換えてください。 aws eks create-addon --cluster-name my-cluster-name \ --addon-name amazon-cloudwatch-observability 以上です!これで EKS クラスターで Container Insights が有効になります。簡単なオンボーディングを可能にするために、EKS コンソールのクラスター情報ビューからアクセスできるアドオンタブからも同じアドオンを利用可能です。 これにより、CloudWatch コンソールで拡張されたメトリクスとログが表示されるようになります。EKS アドオンは、EKS クラスターにオブザーバビリティを導入する簡単な方法を提供します。いくつかのコマンドを実行するだけで、AWS 上の Kubernetes ワークロードの豊富なモニタリングとトラブルシューティングを有効にすることができます。完了すると、以下のように Amazon EKS の拡張されたオブザーバビリティ機能が有効になります。 kubeclt の出力 有効にすると、AWS マネジメントコンソールでは以下のような拡張された Container Insights のページが表示できます。クラスター、Kube State、コントロールプレーンメトリクスのハイレベルな概要が表示されます。Container Insights ダッシュボードには、クラスターのステータスとアラームが表示されます。CPU とメモリの事前定義されたしきい値を使用して、消費量が多いリソースを迅速に特定し、パフォーマンスへの影響を回避するためのプロアクティブなアクションを可能にします。 Container Insights ダッシュボード また、以下のようにクラスター、ノード、Pod、ワークロード、コンテナのレベル別にトップ 10 リストを表示するオプションもあります。これらは、リソースの消費量に基づいて、使用量が 100% に達する前に、アラームがなくてもリスクのあるコンポーネントを特定するために使用できる重要なチャートです。 トップ 10 リスト 以下に示すクラスターの概要セクションでは、重要性に基づいてクラスターを一覧表示します。アラーム状態にあるクラスターは最初に表示されます。次にリソース消費量の多いクラスターが表示されます。ユーザーはこのリスト表示を使用して、必要に応じてクラスターをフィルタリングすることもできます。 クラスターの概要 上記のビューによると、「prodcatalog」クラスターの使用率が 50% を超えているようです。クラスター名をクリックすると「パフォーマンスのモニタリング」ダッシュボードが開き、さらに詳細を確認できます。このモニタリングダッシュボードには、パフォーマンスを分析するための以下のようなさまざまなビューが用意されています。 クラスター全体のパフォーマンスダッシュボードビュー – クラスター全体のリソース使用率の概要を提供します。 ノードパフォーマンスビュー – 個々のノードレベルのメトリクスを可視化します。 Pod パフォーマンスビュー – CPU、メモリ、ネットワークなどの Pod レベルのメトリクスに焦点を当てます。 コンテナパフォーマンスビュー – 個々のコンテナの使用率メトリクスにドリルダウンします。 例えば、クラスター全体のパフォーマンスダッシュボードビューから始めて、ハイレベルな概要を把握することができます。さまざまなビューを使用することで、クラスターからノード、Pod、コンテナまで、系統的に絞り込んで根本原因を見つけることができます。 クラスターのパフォーマンスモニタリング 以下にチャートによると、ノードレベルの CPU とメモリの使用率が最大で 60% 近くまで急上昇しているようです。 ノードレベルの CPU とメモリの使用率 Container Insights ダッシュボードでは、より詳細なビューにドリルダウンして、さらなるインサイトを得ることができます。例えば、コンテナビューには、Pod の制限に対する CPU とメモリの使用率が表示されます。このビューから、fluent-bit コンテナの使用率が 77% でピークに達していることがわかりました。これらのさまざまなビューを詳しく調べることで、問題の根本原因をより簡単に特定できます。ダッシュボードは、テレメトリデータをさまざまな角度から分析するためのさまざまなビューを提供します。コンテナレベルの詳細にドリルダウンすると、そのコンテナの関連コンポーネントがフィルターに自動的に入力されます。これにより、ユーザーは、障害の発生したコンテナがどのノード上にあるのかを迅速に特定し、そのノード上の他の隣接するコンポーネントに対する潜在的なリスクを調査することができます。ネストされたビューと自動フィルタリングを活用することで、根本原因の分析が非常に効率的になります。これにより、ハイレベルのモニタリングから Pod やコンテナのメトリクスに至るまで、コンテナ化されたワークロードを可視化できます。この可視性は、トラブルシューティングとコンテナのパフォーマンスの最適化に役立ちます。 コンテナのパフォーマンスモニタリング ノードのパフォーマンスダッシュボードビューには、ノードごとに実行中の Pod、CPU とメモリの使用率などが含まれます。特定のインスタンスの詳細を知りたい場合は、フィルターを使用して同じことを実現できます。 ノードのパフォーマンスモニタリング Container Insights のサービスダッシュボードビューは、Kubernetes Service の Pod の CPU、メモリ、ネットワークパフォーマンスのメトリクスを提供します。これらのインサイトにより、リソースの利用をより最適化し、コンテナ化されたサービスの問題をトラブルシューティングできます。 サービスのパフォーマンスモニタリング 加えて、以下に示すように、Java、HAproxy などの一般的なワークロードのためのダッシュボードビューもあります。 一般的なワークロードのためのダッシュボードビュー また、Container Insights でシステムやアプリケーションのログを分析することもできます。メトリクスの横にある 3 つの点をクリックして「View logs」を選択するだけで、関連するログにアクセスできます。Logs Insights には、事前に入力されたクエリが付属しているため、簡単にログデータを分析し、インサイトを得ることができます。 便利なグラフを、Container Insights から直接ダッシュボードに追加することもできます。価値のあるデータを含むグラフを見つけたら、その横にある 3 つの点をクリックして「Add to dashboard」を選択すると、ダッシュボードに自動的に追加され、簡単にモニタリングできるようになります。これらのビューからアラームを作成するのも簡単です。例えば、「CPU Utilization Over Pod Limit」のアラームを作成するには、3 つの点をクリックして「View in metrics」を選択します。これにより、そのメトリックのしきい値に基づいてアラームを設定することができます。Container Insights のこれらのビルトインオプションを活用すると、コンテナ化されたアプリケーションの監視、分析、アラートの作成が簡単になります。 アラーム作成 – View in metrics これにより、以下のようなメトリクスビューが表示されます。ここで「ベル」のアイコンをクリックすることで、このメトリクスのアラームを作成できます。 アラーム作成 – メトリクスビュー これにより、「Create Alarm」ウィザードが開き、ステップバイステップガイドで値をカスタマイズしてアラームを作成できます。アラームを作成すると、アラームダッシュボードにもアラームが表示されます。 アラーム作成ウィザード すべての新しいメトリクスは、CloudWatch メトリクスセクションの「ContainerInsights」メトリクス名前空間の下に整理されます。 ContainerInsights メトリクス名前空間 「ContainerInsights」にアクセスすると、以下のようなさまざまなメトリクスが表示されるはずです。 拡張された Container Insights のさまざまなメトリクス AWS は Amazon EKS の Container Insights に新しい統一された料金モデルを導入し、メトリクス数とログの取り込みにかかるコストを単一の Observation (観測数) 単位の低コストな料金にバンドルします。この競争力のある価格設定により、クラスターを完全にモニタリングする追加メトリクスを収集するための追加コストなしで、デフォルトで拡張されたオブザーバビリティを提供することができます。 このブログ記事では、Amazon EKS のオブザーバビリティが拡張された Container Insights の一部として導入されたさまざまな機能を紹介しました。Container Insights は、AWS 上のコンテナワークロードのオブザーバビリティを得るための簡単な方法を提供し、組織がコンテナ化されたアプリケーションやマイクロサービスをモニタリング、トラブルシューティング、最適化するのに役立ちます。Amazon EKS のオブザーバビリティが拡張された Container Insights の提供開始により、AWS はテレメトリ収集を拡張し、包括的なステータスダッシュボードを提供することで、このサービスを強化しました。AWS 上でコンテナを実行している組織は、オブザーバビリティが拡張された Container Insights を有効にして、Amazon EKS 上の Kubernetes 環境の可視性の向上と迅速なトラブルシューティングを実現することができます。これにより、コンテナの健全性とパフォーマンスをモニタリングする際に推測に頼る必要がなくなります。 Amazon EKS の新しい改善されたオブザーバビリティの詳細については、 こちらのドキュメント をご参照ください。 翻訳はプロフェッショナルサービスの杉田が担当しました。原文は こちら です。
アバター
この投稿は、プリンシパル・ソリューション・アーキテクトのHeeki Park氏、シニア・アプリケーション・アーキテクトのSachin Doshi氏、シニア・ソリューション・アーキテクトのJason Enderle氏 の投稿を翻訳したものです。 Amazon API Gateway は、開発者が Virtual Private Cloud (VPC) 内からのみアクセス可能なプライベート REST API を作成することが可能です。プライベート API へのトラフィックはセキュアな接続を介して送信され、AWS ネットワーク内、特にお客様が管理している VPC 内に留まり、パブリックインターネットから保護されます。このアプローチは、送信されたトラフィックの機密性を確保することで、お客様の規制要件やセキュリティ要件に対応するために使用できます。このため、プライベート API Gateway エンドポイントは、マイクロサービスやデータ API で使用されるような内部 API の公開に適しています。 マイクロサービス・アーキテクチャでは、チームはしばしば個別の AWS アカウントでコンポーネントを構築・管理し、企業固有のカスタムドメイン名を使用してこれらのプライベート API エンドポイントにアクセスすることを好みます。カスタムドメイン名は、ホスト名と API へのパスのエイリアスとして機能します。これにより、クライアントは覚えやすい URL を使用して接続しやすくなり、また基礎となる API エンドポイントの URL が変更された場合でも同じ URL を維持できます。カスタムドメイン名は、企業内の機能に従って API の構成を改善することもできます。例えば、標準的な API Gateway の URL フォーマット: “https://api-id.execute-api.region.amazonaws.com/stage” を “https://api.private.example.com/myservice”に変換できます。 概要 このブログポストは、 プライベートエンドポイントのフロントエンド呼び出し と バックエンド統合パターン に関するドキュメントと、以前に公開された以下で紹介する2つのブログに基づいています。 最初のブログでは、VPC 対応の Lambda 関数と mTLS を使用したコンテナベースのアプリケーションを使用して、 API Gateway からプライベート API エンドポイントを利用する方法 を説明しています。2つ目のブログは、 AWS Fargate や Amazon EC2 を使用してデプロイされた マイクロサービス API へのプライベートバックエンドインテグレーションの実装 を解説するものです。このブログではこれらを拡張し、NGINX リバースプロキシを使ってプライベートエンドポイントにカスタムドメイン名を実装することで、API エンドポイントへのアクセスを簡素化できるようにします。 このソリューションでは NGINX を使用します。NGINX は高性能な仲介役として機能し、プライベートネットワーク内のトラフィックを効率的に転送することができます。構成マッピングファイルは、カスタムドメインとAWSアカウント間の対応するプライベートエンドポイントを関連付けます。この設定マッピングファイルはコードとして管理され、下流の環境と本番環境への統制されたデプロイに使用することができます。 次の図は、コンポーネント間の相互作用と API リクエストのパスを示しています。このユースケースでは、共有サービスアカウント(アカウントA)がカスタムドメイ ンのマッピングを一元管理し、プロバイダーアカウント(アカウントBとアカウントC)のプライベート API エンドポイントへの AWS PrivateLink 接続を作成する役割を担っています。 API へのリクエストは、VPC または VPC にルーティング可能な別のデバイス内から、プライベートカスタムドメインを使用して行われます。例えば、リクエストはドメイン https://api.private.example.com を利用するかもしれません。 Amazon Route 53 の プライベートホストゾーン のエイリアスレコードは、プライベートの Elastic Load Balancing (ELB) の FQDN に解決します。ELB は、ネットワークロードバランサー (NLB)またはアプリケーションロードバランサー (ALB) のいずれかに構成することができます。 ELB は AWS Certificate Manager (ACM) 証明書を使用して、対応するカスタムプライベートドメインのTLS (Transport Layer Security) を終了します。 ELB リスナーはリクエストを関連する ELB ターゲットグループ にリダイレクトし、そのターゲットグループはリクエストを AWS Fargate 上で動作する Amazon Elastic Container Service タスクに転送します。 Fargate サービスは、NGINX ベースのコンテナをホストし、1つ以上のプロバイダーアカウントのプライベート API エンドポイントへのリバースプロキシとして動作します。Fargate サービスは、CPU 使用率を自動的に追跡するメトリックを使用してスケールするように構成されています。 Fargate タスクは、PrivateLink VPC エンドポイントを介して、プロバイダアカウント B またはアカウント C の適切なプライベートエンドポイントにトラフィックを転送します。 API Gateway の リソースポリシー は、API を要求するために使用される特定の VPC エンドポイント、HTTP メソッド、およびソースドメインに基づいて、プライベートエンドポイントへのアクセスを制限します。 このソリューションでは、認証ヘッダ、Content-type ヘッダ、カスタムヘッダなど、上流の呼び出しのヘッダで見つかった追加情報を、プロバイダアカウント(アカウント B およびアカウント C)のプライベートエンドポイントに変更せずに渡します。 前提条件 カスタムドメイン名を使用するには、TLS 証明書と DNS エイリアスの2つのコンポーネントが必要です。この例では、TLS 証明書の管理に ACM を使用し、DNS エイリアスの作成に Route 53 を使用しています。 ACM は、TLS 証明書を統合するためのさまざまなオプションを提供しています: 既存の TLS 証明書を ACM に インポート します。 ACM で 電子メールベース の検証を使用して TLS 証明書を要求します。 DNS ベース の検証を使用して ACM に TLS 証明書を要求します。 プライベート CA を使用して ACM に TLS 証明書を要求します。 次の図は、各オプションに関連する利点と欠点を示しています。 このソリューションでは、DNS ベースの検証 (オプション3) を使用して ACM に TLS 証明書を 要求します。ルートドメイン( example.com など)が登録された パブリックホストゾーン が、 ターゲットアカウントに既にデプロイされているものと仮定します。その後、このソリューションは ACM を使用して、デプロイ時に設定マッピングファイルに指定された ドメイン名の所有権 を検証します。 デプロイされたパブリックホストゾーンでは、 DNS 検証 を使用してプライベートの子ドメイン(api.private.example.comなど)をデプロイできるため、ソリューションのデプロイ時に証明書の検証を自動化するIaC(Infrastructure as Code)デプロイが可能になります。さらに、DNS ベースの検証では、ACM 証明書の有効期限が切れる前に自動的に更新されます。 このソリューションでは、特定の VPC エンドポイント、すなわち共有サービスアカウント(アカウント A)内の execute-api、logs、ecr.dkr、ecr.api、 Amazon S3 ゲートウェイが必要です。execute-api の VPC エンドポイントでプライベート DNS を有効にすることはオプションであり、ソリューションの要件ではありません。これにより、VPC 内のアプリケーションは NGINX リバースプロキシを通じてプライベート API エンドポイントに到達できますが、パブリック API ゲートウェイのエンドポイントも解決できます。 サンプルのデプロイ このパターンを自分のアカウントにデプロイするには、サンプルの AWS Cloud Development Kit (CDK) または GitHub で利用可能な Terraform コードを使うことができます。 このソリューションでは、YAML ベースの設定マッピングファイルを使用して、カスタムドメインとプライベート API エンドポイント間のマッピングを追加、更新、または削除します。デプロイ中に、自動化されたInfrastructure as Code(IaC)スクリプトは提供された YAML ファイルを解析し、以下を実行します: NGINX 設定ファイルを作成します。 NGINX 設定ファイルを標準 NGINX コンテナイメージに適用します。 マッピングファイルを解析し、アカウント A に必要な Route 53 プライベートホストゾーンを作成します。 アカウント A にワイルドカードベースの SSL 証明書(*.example.comなど)を作成します。ACM は、それぞれのパブリックホストゾーン(example.comなど)を使用してこれらの証明書を検証し、ELB リスナーにアタッチします。デフォルトでは、ELB リスナーは最大 25 の SSL 証明書をサポートします。ワイルドカードは、無制限の数のサブドメインを保護するために使用され、複数のサブドメインの管理と拡張を容易にします。 マッピングファイルのフィールドの説明 Property Required Example Values Description CUSTOM_DOMAIN_URL TRUE api.private.example.com プライベート API に必要なカスタム URL PRIVATE_API_URL TRUE https://a1b2c3d4e5.execute-api.us-east-1.amazonaws.com/dev/path1/path2 対象となるプライベート・エンドポイントの実行 URL VERBS FALSE [“GET”,” POST”, “PUT”, “PATCH”, “DELETE”, “HEAD”, “OPTIONS”] このプロパティは、API Gateway リソースポリシーを作成するために使用されます。1つまたは複数のメソッドをカンマ区切りのリストとして指定できます。このプロパティを指定しない場合は、すべての動詞が許可されます。 プライベートエンドポイントに API Gateway リソースポリシーを使用する 自分の VPC または別のアカウントの VPC からプライベートエンドポイントへのアクセスを許可するには、 リソースポリシー を実装する必要があります。リソースポリシーは、VPC エンドポイント、API パス、API メソッドなどの特定の条件に基づいてアクセスを制限するために使用できます。この機能を有効にするには、以下の手順に従います: IaC(Infrastructure as Code)の導入を完了します。 プロバイダーアカウント( アカウント B やアカウント C など )に API Gateway リソースポリシーを作成または更新します。このポリシーには、共有サービスアカウント( アカウント A )の VPC エンドポイント ID を含めます。 API をデプロイして、プロバイダーアカウント( アカウント B やアカウント C など )に変更を適用します。 API Gateway のリソースポリシーをコードで更新するには、 GitHub リポジトリ のドキュメントとコード例を参照してください。 マッピングファイルのアップデートのデプロイ カスタムドメインとプライベートエンドポイント間のマッピングを追加、更新、または削除するには、マッピングファイルを更新してから、以前と同じ手順でデプロイを再実行します。 既存の Infrastructure as Code パイプラインを使用してマッピングファイルの更新をデプロイすることで、人的ミスのリスクを低減し、トレーサビリティを追加し、構成のドリフトを防止し、デプロイプロセスを既存の DevOps プロセスとガバナンスプロセスに従わせることができます。 例えば、設定マッピングファイルを別のソース管理リポジトリに保存し、各変更をそのリポジトリにコミットすることができます。各変更がデプロイメントプロセスのトリガーとなり、デプロイメントプロセスは設定変更をチェックし、適切なデプロイメントを実施します。必要であれば、変更管理プロセスが確実に実施されるように、手動チェックまたはチケットプロセスのいずれかを強制するゲートを導入できます。 ソリューションのコストを理解する このソリューションで言及されているサービスのほとんどは、リクエストの数によって決定される使用量に応じて課金されます。 ただし、時間単位または月単位の費用が発生するサービスもいくつかあります。これには、 Route 53 ホストゾーンの月額料金、 VPC エンドポイント の時間課金、 Elastic Load Balancing 、 Fargate で NGINX リバースプロキシを実行する時間課金などがあります。特定のワークロードに基づいてこれらのオプションのコストを見積もるには、 AWS Pricing Calculator を利用することができます。ここでは、このソリューションで実装されたアーキテクチャに関連するおおよその コストの例 を示します。 結論 このブログポストでは、カスタムドメイン名のリバースプロキシを使って、AWS アカウント間や VPC ネットワーク内で API Gateway を安全にプライベートエンドポイントを利用できるソリューションを紹介しました。このソリューションは、API Gateway とカスタムドメイン名を持つプライベートエンドポイント間のマッピングを管理する簡素化されたアプローチを提供し、シームレスな接続性とセキュリティを確保します。 サーバーレスの学習リソースについては、 Serverless Land をご覧ください。 この投稿は、Heeki Park氏、Sachin Doshi氏、Jason Enderle氏 によって書かれた Implementing custom domain names for Amazon API Gateway private endpoints using a reverse proxy の日本語訳です。この記事はソリューションアーキテクトの松本侑也が翻訳しました。
アバター
こんにちは、アマゾン ウェブ サービス ジャパン 合同会社 ソリューションアーキテクトの中川です。 2023 年 10 月 26 日に AWS for Games Live を開催いたしました。 AWS for Games Live とは? AWS for Games Live は、AWS 公式ウェブマガジン builders.flash の記事と連動したイベントで、AWS for Games の 3 つの柱「Build」「Run」「Grow」の柱のうち 1 つにフォーカスを当てて、その内容を掘り下げるものです。参加者の方々には、ゲーム業界のトレンドを知ったりネットワーキングを楽しんだりする時間として活用していただいています。今回は、「大阪で学ぶゲーム開発最新動向と生成系 AI」と題して、4 つのセッションを設け、AWS のゲーム業界の最新事例、先日リリースした「Amazon Bedrock」についてのご紹介、AWS をご利用のお客様による事例登壇をいただきました。また、イベントの最後には懇親会も開催され、ゲーム開発者の方々とのネットワーキングもお楽しみいただきました。 AWS for Games と最新ゲーム事例のご紹介 ver. Osaka はじめに、ソリューションアーキテクト 鷲見 啓志 から、現在までの 4 年間の AWS の変遷と、AWS for Games、大阪リージョンについてご紹介しました。資料は こちらのリンク からご覧いただけます。 本セッションではまず、大阪で前回イベントが開催された4年前から現在までを振り返り、AWS と大阪の変遷を紹介しました。AWS の主要なアップデートを振り返ると、2020 年には、Amazon EC2 Mac インスタンスが発表され、クラウド上でモバイルゲームのビルドができるようになりました。2021 年には、AWS App Runner, Amazon ECS Anywhere が GA するなど、コンテナ系サービスのアップデートが多くありました。2022 年には、Amazon Aurora Serverless v2 や Amazon Redshift Serverless が GA するなどサーバレスサービスの拡充が多く行われました。2023 年には、Amazon Bedrock という生成系 AI をアプリに簡単に組み込めるサービスが GA しました。 次に、2022 年に生まれた AWS for Games について紹介しました。AWS for Games とは AWS 及び AWS パートナーによるゲーム業界向けの開発( BUILD )、運営( RUN )、成長( GROW )のそれぞれのフェーズをサポートする 6 つのエリアに特化したソリューションとサービスの集まりです。 BUILD では、ゲーム開発者向け仮想ワークステーションによりリモートワークやコラボレーションを支援でき、Perforce Helix Core on AWSで高い可用性/拡張性を、Incredibuild on AWS でビルドの並列化/高速化/コスト最適化を実現できます(お客様 BUILD 事例:ゲームフリーク様、カプコン様、ガンホー・オンライン・エンターテイメント様)。RUN では、高速で安価なネットワークを提供する AWS のグローバルインフラストラクチャを活用でき、AWS Global Accelerator によりネットワークの可用性とパフォーマンスを向上できます。また、ゲームバックエンドシステムの各コンポーネントには、ユースケースに応じて適したコンピューティング環境・データベースを選択でき、例えばマネージドなゲームサーバーの構築には Amazon GameLift、DDoS/Bot 攻撃の緩和には AWS Shield / AWS WAFのようなセキュリティサービスも活用できます(お客様 RUN 事例:VALORANT、ELDEN RING、Dead by Daylight)。GROW では、ゲームの収益拡大に重要なゲームデータ分析パイプラインの構築支援や、チート予測やオペレーション効率化のような AI/ML 活用へ向けた支援が可能です(お客様 GROW 事例:ソーシャルゲームデータ分析基盤、モンスターハンターライダーズにおけるユーザー離脱予測)。 最後に、2021 年に日本で 2 つ目のリージョンとして生まれた、大阪リージョンについて紹介しました。大阪リージョンは、3 つの AZ をもち、他リージョンと同様に単体利用可能な AWS リージョンです。お客様の声を反映し、サービスおよび機能拡充を続けており、多くのパターン様々な業種業態のお客様にご利用頂いています。ぜひ、大阪リージョンの活用もご検討ください。 Generative AI はゲーム開発 運用の夢をみるか? 次に、同じくソリューションアーキテクトの中村 一樹から、「ゲーム開発運用は生成系 AI の恩恵を受けられるか?」というテーマで生成系 AI でできること、AWS サービスとの関わり、活用例についてご紹介しました。 生成系 AI は、新しいコンテンツやアイデアを想像する AI であり、一般に基盤モデル(FM : ファウンデーションモデル)と呼ばれる膨大なデータに基づいて事前にトレーニングされた大規模モデルを搭載しています。特定のタスクを実行する従来の機械学習モデルとは異なり、学習なしで様々な異なるタスクを高い精度で実行できる適応性が基盤モデルの特長です。 生成系 AI は、ビデオ、オーディオ、テキスト、画像などを生成できます。Txt2Txt (テキストからテキストを生成する)モデルは、シナリオなどの文章作成、文章チェックなどの Quality Assuarance、チーム内・社内ナレッジボットなどの開発運用支援に活用できます。Txt2Img(テキストから画像を生成する)モデルや Img2Img(画像から画像を生成する)モデルは、カラーバリエーション検証、ラフ画やテキストからの画像生成などのコミュニケーションサポート等で活用できます。Img2Txt(画像からテキストを生成する)モデルは、表示不具合検知などの Quality Assurance、不適切な User Generated Content の検知などのコンテンツモデレーションで活用できます。 AWS での生成系 AI サービスとしては、AI によるコード生成やセキュリティスキャンができる Amazon CodeWhisperer や、生成系 AI アプリケーションを簡単に構築できる Amazon Bedrock などがあり、その活用例としては、RAG : Retrieval Augmented Generation(検索拡張生成)を使用した社内ナレッジ検索ツールや、Img2Txt を使用した多言語対応による文字のはみ出し・装備の組み合わせにより見た目がおかしくなるチェック、といった画像確認チェックなどが考えられます。 著作権など色々考えないといけないことはありますが、生成系AIを使える範囲で正しく使うと、ゲーム開発運用においても多くの恩恵を受けられます。 &nbsp; 社内システムから大ヒットタイトルまで – Happy Elements の鉄板 AWS 設計 続いて、Happy Elements 株式会社 インフラグループ グループリーダーの長谷川 一輝様から、少人数でも高い安定性を維持できるインフラの標準構成についてご紹介をいただきました。資料は こちらのリンク からご覧いただけます。 まず技術構成として、ゲームエンジンは Unity、アプリケーションフレームワークは Ruby on Rails、リアルタイム通信時はnode.js, gRPC, magiconion、監視ツールは Datadog, New Relic、IaC ツールには Terraform を利用しています。 基本的なインフラの設計方針としては、アプリケーションは Amazon ECS、ワーカーは Amazon EC2、データベースは Amazon Aurora、静的コンテンツ配信は Amazon CloudFront・Amazon S3、ロードバランサーは Application Load Balancer、ログは Amazon CloudWatch Logs から Amazon Kinesis Data Firehose を通して Amazon S3 へ配信する構成です。特別なことはせず、シンプルな構成を意識しています。 アプリケーションの ECS は、Kubernetes ほどの学習コストがなく、バージョンアップの負担も軽減されるため、WebAPI のようなシンプル運用に非常にマッチします。ワーカーの EC2 は、リザーブドインスタンスやスポットインスタンスを活用して大規模利用時のコストメリットを活かす為 Fargate ではなく EC2 を採用していますが、運用コストもそこまで大きくありません。静的アセット配信は必ず CloudFront + S3 を使い高スループットのメリットを活かしつつ、API 通信を含む全てのリクエストを CloudFront に通すことでボリュームディスカウントを効かせています。 Http ロードバランサーには ALB を活用することで他AWS サービスとの連携が容易となり運用負荷が減ります。ログ配信は運用負荷の低い ECS awslogs ドライバを利用して CloudWatch Logs に配信し、そこから Kinesis Data Firehose を使い S3 のデータレイクに集約することでログ処理に繋げています。中でも AWS Enterprise Support が一番オススメしたいサービスで、TAM による助言や IEM など多岐に渡るサポートを受けられるため、少人数で AWS 利用する時の非常に心強い味方だと述べました。 サイバーコネクトツーのゲーム開発効率化と AI のこれから 最後に、株式会社サイバーコネクトツー 代表取締役の松山 洋様から、サイバーコネクトツーの AWS 利用と AI 研究とその活用状況についてご紹介をいただきました。 まずはじめに AWS の利用状況について 2 つご紹介頂きました。1 つ目に オンラインストレージとして Amazon S3 を使用しています。サイバーコネクトツーでは、福岡・東京・大阪の3拠点で連携しながら同じプロジェクトを担当します。その為、ピーク時には各拠点同士で 200 人以上が情報共有をする必要がありますが、そのデータ連携基盤として Amazon S3 を利用しています。2 つ目に、Incredibuild Cloud のクラウドプラットフォームとして AWS を使用しています。これによりビルドの速度が向上し、エンジニアの作業効率の向上に繋がりました。「これを使う前にはもう戻れない」とのエンジニアの声もあったそうです。また、AWS を選んで良かったこととして、オンライン会議等で丁寧にフォローをしてくれる点と、AWS のエンジニアが直接サポートに入ってくれる点を挙げました。分からないことをとにかく手厚くサポートしてくれる、気配り、真心、おもてなしが素晴らしいと述べ、開発効率化について今後も AWS からの最適な提案を期待していると述べました。 次にサイバーコネクトツーの AI 研究とその活用状況についてご紹介頂きました。サイバーコネクトツーでは AI 研究会を発足し、AI の積極運用を目指し活用方法や可能性を模索しています。実際に、漫画作品内の架空ビジュアルの作成や、AI によるラフの作成、ラフからのレタッチ、静止画から短尺の動画の自動生成などで活用を始めています。今後 AI でゲーム開発がどう変わるか?という問いに対しては、現状開発が大きく変わることはないとの見解を示しましたが、開発の初動でスピードは向上し、将来的なゲーム開発には不可欠な技術となり得ると述べました。ただし、人材として AI を活用するスキルが求められること、AI 導入の為の初期設備投資が必要となる点にも触れました。 懇親会 セッション終了後には、懇親会が開催されました。多くの参加者が、会社の壁を超えてセッションの内容についてディスカッションしたり、ネットワーキングを楽しまれたご様子でした。 最後に 前回の Game Tech Night の大阪開催から 4 年を経て、コンピュート、コンテナ、サーバレス、生成系 AI と様々な技術領域でアップデートを迎えた AWS ですが、その多くがゲームの開発運用にも役立っています。実際、Happy Elements 様、サイバーコネクトツー様をはじめ多くのゲーム業界のお客様が AWS を活用することでシステムを改善されました。生成系 AI の活用については、人材、設備投資、著作権など意識すべき点はありますが、現時点でもゲーム開発運用において多くの恩恵をもたらしてくれそうであり、将来的なゲーム開発には不可欠な要素となるでしょう。ゲーム開発運用の効率化・モダン化をお考えのお客様、生成系 AI の導入をお考えのお客様は、ぜひ一度お気軽に AWS までご相談下さい。
アバター
この記事は Persistent storage for Kubernetes (記事公開日: 2022 年 11 月 22 日) を翻訳したものです。 ステートフルアプリケーションを適切に実行するためには、データが永続化され取得できることが必要です。Kubernetes を使用してステートフルアプリケーションを実行する場合、コンテナ、Pod、ノードのクラッシュや終了に関係なく、状態を永続化する必要があります。これには、永続ストレージ、すなわち、コンテナ、Pod、またはノードの生存期間を超えて存続するストレージが必要です。 このブログ記事では、Kubernetes 環境における永続ストレージのコンセプトと、Kubernetes の世界におけるストレージオプションについて取り上げます。そして、ホスト、Pod、コンテナレベルで障害や終了が発生した場合のデータ損失の懸念を軽減する、Kubernetes 上でのステートフルアプリケーションの設計と構築について説明します。 Kubernetes の永続ストレージは、特にストレージの初心者や、Kubernetes を使い始めようとしている人にとっては複雑なトピックです。そのため、私たちはこの 2 つのブログ記事シリーズを作成しました。最初に概念と用語について説明し、次に実用的なユースケースに踏み込みます。 Part 1 [このブログ記事]: この最初のパートでは、Kubernetes の永続ストレージの概念を説明し、 Amazon Elastic Kubernetes Service (Amazon EKS) と永続ストレージとして Amazon Elastic File System (Amazon EFS) を使用して、基本的なワークロードにこれらの概念を適用する方法について解説します。 Part 2 : Amazon EKS 上で Kubeflow を使用して実行される、永続ストレージを必要とする機械学習ワークロードの例を詳しく掘り下げます。 Kubernetes におけるデータの永続化 ステートフルアプリケーションを実行し、永続ストレージがない場合、データは Pod やコンテナのライフサイクルにに関連付けられます。Pod がクラッシュしたり終了したりすると、データは失われます。 このデータ損失を防ぎ、Kubernetes 上でステートフルなアプリケーションを実行するには、以下の 3 つのシンプルな要件に従うストレージが必要です。 ストレージは、Pod のライフサイクルに依存しないようにする必要があります。 ストレージは、Kubernetes クラスター内のすべての Pod とノードから利用可能である必要があります。 ストレージは、クラッシュやアプリケーションの障害に関係なく、高い可用性を持つ必要があります。 Kubernetes ボリューム Kubernetes にはいくつかの種類のストレージオプションが用意されていますが、そのすべてが永続的であるわけではありません。 エフェメラルストレージ コンテナは一時的なファイルシステムを使用してファイルの読み取りと書き込みを行うことができます。しかし、このエフェメラルストレージはストレージに必要な 3 つの要件を満たしていません。コンテナがクラッシュした場合、一時的なファイルシステムは失われ、コンテナは再びまっさらな状態から開始されます。また、複数のコンテナで一時的なファイルシステムを共有することはできません。 エフェメラルボリューム Kubernetes のエフェメラルボリュームは、一時的なファイルシステムが直面する両方の課題を解決します。エフェメラルボリュームの生存期間は Pod に連動します。これにより、コンテナの安全な再起動と、Pod 内のコンテナ間でのデータの共有が可能になります。しかし、Pod が削除されるとすぐにエフェメラルボリュームも削除されるため、依然として 3 つの要件を満たしていません。 一時的なファイルシステムはコンテナのライフサイクルに連動し、エフェメラルボリュームは Pod のライフサイクルに連動します。 ストレージから Pod を切り離す: 永続ボリューム Kubernetes は永続ボリューム (Persistent Volume) もサポートしています。Persistent Volume を使用すると、アプリケーション、コンテナ、Pod、ノード、あるいはクラスター自体のライフサイクルに関係なく、データが永続化されます。Persistent Volume は、先に説明した 3 つの要件を満たします。 Persistent Volume (PV) オブジェクトは、アプリケーションデータを永続化するために使用されるストレージボリュームを表します。PV には、Kubernetes Pod のライフサイクルとは異なる、独自のライフサイクルがあります。 PV は基本的に 2 つの異なるもので構成されいます。 PersistentVolume と呼ばれるバックエンドストレージ技術 ボリュームのマウント方法を Kubernetes に指示するアクセスモード バックエンドストレージ技術 PV は抽象的なコンポーネントであり、実際の物理的なストレージはどこかから提供される必要があります。以下はいくつかの例です。 csi : Container Storage Interface (CSI) → (例: Amazon EFS 、 Amazon EBS 、 Amazon FSx など) iscsi : iSCSI (SCSI over IP) ストレージ local : ノードにマウントされたローカルストレージデバイス nfs : Network File System (NFS) ストレージ Kubernetes は汎用性が高く、 さまざまなタイプの PV をサポート しています。Kubernetes は基盤となるストレージの内部構造を気にしません。実際のストレージへのインターフェースとして PV コンポーネントを提供するだけです。 PV には 3 つの大きなメリットがあります。 PV は Pod のライフサイクルにバインドされていません。PV オブジェクトにアタッチされた Pod を削除しても、PV は存続します。 Pod がクラッシュした場合にも前述の記述は有効です。すなわち、PV オブジェクトは Pod がクラッシュしても PV は存続し、クラスターから削除されません。 PV はクラスター全体で利用可能です。クラスター内の任意のノードで動作している任意の Pod にアタッチできます。 さまざまなバックエンドストレージ技術には、それぞれ独自のパフォーマンス特性とトレードオフがあります。このため、本番環境の Kubernetes では、アプリケーションに応じてさまざなタイプの PV が使用されます。 アクセスモード アクセスモードは PV 作成時に設定され、ボリュームのマウント方法を Kubernetes に伝えます。Persistent Volume は以下の 3 つのアクセスモードをサポートします。 ReadWriteOnce : ボリュームは、同時に 1 つのノードのみによる読み取り/書き込みが可能です。 ReadOnlyMany : ボリュームは、多くのノードによる読み取り専用モードを同時に許可します。 ReadWriteMany : ボリュームは、同時に複数のノードによる読み取り/書き込みが可能です。 訳注: 他に ReadWriteOncePod というアクセスモードがあり、Kubernetes 1.27 からベータ版となっています。 すべての PersistentVolume タイプが すべてのアクセスモード をサポートしているわけではありません。 永続ボリューム要求 (Persistent Volume Claim) PersistentVolume (PV) は、実際のストレージボリュームを表します。Kubernetes には、PV を Pod にアタッチするために必要な追加の抽象化レイヤーである PersistentVolumeClaim (PVC) があります。 PV は実際のストレージボリュームを表し、PVC は実際のストレージを取得するために Pod が行うストレージのリクエストを表します。 PV と PVC の分離は、Kubernetes 環境においては 2 つの異なる役割が存在するという考えに関連しています。 Kubernetes 管理者 : クラスターの保守および運用し、永続ストレージなどの計算リソースの追加を行います。 Kubernetes アプリケーション開発者 : アプリケーションの開発とデプロイを行います。 簡単に言えば、アプリケーション開発者は管理者が提供する計算リソースを消費します。Kubernetes は、PV オブジェクトはクラスター管理者のスコープに属し、PVC オブジェクトはアプリケーション開発者のスコープに属するという考えに基づいて構築されています。 基本的に、Pod は PV オブジェクトを直接マウントできません。明示的に要求する必要があります。そしてその要求動作は、PVC オブジェクトを作成して Pod にアタッチすることで実現します。これが、この抽象化レイヤーが存在する唯一の理由です。PVC と PV は 1 対 1 の対応関係にあります (PV は 1 つの PVC にしか関連付けることができません) 。 このブログ記事では、Pod に永続ストレージをアタッチするこのプロセスをデモします。しかし、その前に、CSI ドライバーに関する背景を説明する必要があります。 Container Storage Interface (CSI) ドライバー Container Storage Interface (CSI) は、さまざまなストレージソリューションを Kubernetes において使いやすくするために設計された抽象化です。さまざまなストレージベンダーは、CSI 標準を実装する独自のドライバーを開発し、ストレージソリューションが (基盤となるストレージソリューションの内部構造に関係なく) Kubernetes と連携できるするようにすることができます。AWS には、 Amazon EBS 、 Amazon EFS 、 Amazon FSx for Lustre などのための CSI プラグインがあります。 静的プロビジョニング 「永続ボリューム要求 (Persistent Volume Claim)」セクションで説明した内容では、まず管理者が 1 つまたは複数の PV を作成し、次にアプリケーション開発者が PVC を作成します。これは静的プロビジョニングと呼ばれます。Kubernetes で PV と PVC を手動で作成する必要があるため、静的です。規模が大きくなると、特に数百の PV や PVC を管理する場合、この方法では管理が困難になる可能性があります。 例えば、Amazon EFS ファイルシステムを作成して PV オブジェクトとしてマウントしたいとします。静的プロビジョニングを使用する場合、次のようにする必要があります。 Kubernetes 管理者のタスク Amazon EFS ファイルシステムを作成します。 ファイルシステム ID をコピーして PV の YAML 定義ファイルに貼り付けます。 YAML ファイルを使用して PV を作成します。 Kubernetes アプリケーション開発者のタスク この PV を要求する PVC を作成します。 Pod の YAML 定義ファイルにの Pod オブジェクトに PVC をマウントします。 この方法は機能しますが、規模が大きくなると時間がかかります。 動的プロビジョニング 動的プロビジョニングでは、PV オブジェクトを作成する必要はありません。その代わり、PVC を作成すると自動的に PV が作成されます。Kubernetes はストレージクラス (Storage Class) と呼ばれる別のオブジェクトを使ってこれを行います。 Storage Class は、コンテナアプリケーションに使用されるバックエンドの永続ストレージ (Amazon EFS ファイルストレージ、Amazon EBS ブロックストレージなど) のクラスを定義する抽象化です。 Storage Class には基本的に次の 2 つのものが含まれます。 Name : これは、Storage Class オブジェクトを一意に識別する名前です。 Provisioner : 基盤となるストレージ技術を定義します。例えば、Amazon EFS の場合は efs.csi.aws.com 、Amazon EBS の場合は ebs.csi.aws.com となります。 Kubernetes が非常に多くの異なるストレージ技術を扱うことができるのは、Storage Class オブジェクトのおかげです。Pod の観点からは、それが EFS ファイルシステムであろうと、EBS ボリュームであろうと、NFS ドライブであろうと、その他何であろうと、Pod には PVC オブジェクトしか見えません。実際のストレージ技術を扱うすべての基盤となるロジックは、Storage Class オブジェクトが使用する Provisioner によって実装されます。 Amazon EKS と Amazon EFS を使用した静的プロビジョニングと動的プロビジョニングのデモ では、学んだことをすべて実践してみましょう。 GitHub のこのページ を参考に、このデモセクションのための作業環境をセットアップしてください。 訳注: 日本語翻訳にあたり、EKS 1.28 においてデモが動作することを検証しています。バージョンを適宜置き換えて実施してください。 次のコードスニペットでは、5 つのノードを持つ Amazon EKS クラスターを確認できます。 $ kubectl get nodes NAME STATUS ROLES AGE VERSION ip-192-168-12-218.us-west-1.compute.internal Ready &lt;none&gt; 2d3h v1.21.5-eks-9017834 ip-192-168-24-116.us-west-1.compute.internal Ready &lt;none&gt; 2d3h v1.21.5-eks-9017834 ip-192-168-46-22.us-west-1.compute.internal Ready &lt;none&gt; 2d3h v1.21.5-eks-9017834 ip-192-168-63-240.us-west-1.compute.internal Ready &lt;none&gt; 2d3h v1.21.5-eks-9017834 ip-192-168-7-195.us-west-1.compute.internal Ready &lt;none&gt; 2d3h v1.21.5-eks-9017834 Kubernetes クラスターの永続ストレージとして Amazon EFS ファイルシステムを使用します。そのためには、まず Amazon EFS CSI ドライバーをインストールする必要があります。 訳注: こちらのドキュメント に従い、EFS CSI ドライバーをインストールしてください。 2023 年 8 月のアップデート で、Amazon EFS CSI ドライバーは EKS アドオンとしてインストールすることができるようになりました。 Amazon EFS を使用した静的プロビジョニング 訳注: マネジメントコンソールから EFS ファイルシステムを作成する場合、事前にセキュリティグループを作成し、EFS ファイルシステムのマウントターゲットと関連付ける必要があります。eksctl によって作成された VPC ( eksctl-efsworkshop-eksctl-cluster/VPC ) に、セキュリティグループを作成し、クラスターセキュリティグループ ( eks-cluster-sg-efsworkshop-eksctl-XXXXXXXX ) から TCP 2049 ポートへのアクセスを許可するインバウンドルールを作成してください。 まず AWS マネジメントコンソールで Amazon EFS ファイルシステム ( myEFS1 ) を作成しましょう。次のステップで PV を作成する際に必要になるので、 FileSystemId を控えておきましょう。 すべてをデフォルトのままにして、ファイルシステムを作成します。 訳注: 「カスタマイズ」を選択し、VPC は eksctl-efsworkshop-eksctl-cluster/VPC を選択し、マウントターゲットのセキュリティグループは事前に作成したセキュリティグループを選択してください。 次に、PV のマニフェストファイルを作成し、新しく作成したファイルシステムの FileSystemId を指定します。 #pv.yaml --- apiVersion: v1 kind: PersistentVolume metadata: name: efs-pv spec: capacity: storage: 5Gi volumeMode: Filesystem accessModes: - ReadWriteOnce storageClassName: "" persistentVolumeReclaimPolicy: Retain csi: driver: efs.csi.aws.com volumeHandle: fs-073d77123471b2917 この pv.yaml ファイルにあるように、 spec.capacity.storage のサイズを 5 ギビバイト (GiB) としました。これは、PV を作成する際に必須であり、Kubernetes を満足させるための単なるプレースホルダー値です。バックエンドには Amazon EFS ファイルシステムを使用しています。これは完全に伸縮性があり、スケーラブルなファイルシステムです。使用量に応じて自動的にスケールアップまたはスケールダウンされるため、容量を心配する必要はありません。 $ kubectl apply -f pv.yaml persistentvolume/efs-pv created $ kubectl get pv efs-pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE efs-pv 5Gi RWO Retain Available 45s PV の ステータスは Available ですが、まだどの Persistent Volume Claim (PVC) ともバインドされていません。次に、PVC を作成します。 #pvc.yaml --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: efs-claim spec: accessModes: - ReadWriteOnce storageClassName: "" resources: requests: storage: 5Gi $ kubectl apply -f pvc.yaml persistentvolumeclaim/efs-claim created では、PV と PVC のステータスを確認してみましょう。 $ kubectl get pv efs-pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE efs-pv 5Gi RWO Retain Bound default/efs-claim 15m $ kubectl get pvc efs-claim NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE efs-claim Bound efs-pv 5Gi RWO 103s PV のステータスが Available から Bound に変わりました。これは、Kubernetes が PVC にマッチするボリュームを見つけることができ、ボリュームがバインドされたことを意味します。 ここで別の PVC を作成しようとすると、PV がもう残っていないため失敗します (PV は 1 つの PVC にのみバインドできます) 。そこで、動的プロビジョニングが役に立ちます。動的プロビジョニングに移る前に、この PVC を使ってサンプルアプリケーション ( efs-app ) を作成し、データがどのように永続化されるかを確認しましょう。 #pod.yaml --- apiVersion: v1 kind: Pod metadata: name: efs-app spec: containers: - name: app image: centos command: ["/bin/sh"] args: ["-c", "while true; do echo $(date -u) &gt;&gt; /data/out.txt; sleep 2; done"] volumeMounts: - name: persistent-storage mountPath: /data volumes: - name: persistent-storage persistentVolumeClaim: claimName: efs-claim $ kubectl apply -f pod.yaml pod/efs-app created kubectl を使用して、データが Amazon EFS ファイルシステムに書き込まれたことが確認できます。 $ kubectl exec -ti efs-app -- tail -f /data/out.txt Mon Mar 21 23:33:05 UTC 2022 Mon Mar 21 23:33:07 UTC 2022 Mon Mar 21 23:33:09 UTC 2022 以下は静的プロビジョニングのまとめです。 Amazon EFS を使用した動的プロビジョニング Amazon EFS CSI ドライバーは、動的プロビジョニングと静的プロビジョニングの両方をサポートしています。EFS の場合、動的プロビジョニングでは各 PV の アクセスポイント が作成されます。つまり、手動で Amazon EFS ファイルシステムを作成し、それを Storage Class パラメータの入力として提供する必要があります。 デフォルトでは、動的プロビジョニングによって作成された各アクセスポイントは、EFS 上の異なるディレクトリにファイルを書き込み、各アクセスポイントは異なる POSIX uid/gid を使用して EFS にファイルを書き込みます。これにより、複数のアプリケーションが同じ EFS ファイルシステムを永続ストレージとして使用しながら、アプリケーション間の分離が実現します。 それでは、動的プロビジョニングに使用する新しい Amazon EFS ファイルシステム ( myEFS2 ) を作成しましょう。 訳注: 静的プロビジョニングで実施した手順と同様に、「カスタマイズ」を選択し、VPC は eksctl-efsworkshop-eksctl-cluster/VPC を選択し、マウントターゲットのセキュリティグループは事前に作成したセキュリティグループを選択してください。 次に、Storage Class を作成し、新しく作成されたファイルシステムの FileSystemId を指定します。 #sc.yaml ---- kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: efs-sc provisioner: efs.csi.aws.com parameters: provisioningMode: efs-ap fileSystemId: fs-026bb4e33bea77857 directoryPerms: "700" Storage Class を作成して確認します。 $ kubectl apply -f sc.yaml storageclass.storage.k8s.io/efs-sc created $ kubectl get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE efs-sc efs.csi.aws.com Delete Immediate false 4s gp2 (default) kubernetes.io/aws-ebs Delete WaitForFirstConsumer false 2d5h 「動的プロビジョニング」セクションで述べたように、アプリケーションをデプロイする前に PV を作成する必要はありません。したがって、先に進んで PVC と Pod を作成できます。 #pvc_pod_1.yaml --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: efs-claim-1 spec: accessModes: - ReadWriteMany storageClassName: efs-sc resources: requests: storage: 5Gi --- apiVersion: v1 kind: Pod metadata: name: efs-app-1 spec: containers: - name: app image: centos command: ["/bin/sh"] args: ["-c", "while true; do echo $(date -u) &gt;&gt; /data/out; sleep 5; done"] volumeMounts: - name: persistent-storage mountPath: /data volumes: - name: persistent-storage persistentVolumeClaim: claimName: efs-claim-1 PVC と Pod をデプロイしましょう。 $ kubectl apply -f pvc_pod_1.yaml persistentvolumeclaim/efs-claim-1 created pod/efs-app-1 created $ kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE efs-claim-1 Bound pvc-82da05b5-ff85-40a5-8135-50428480fd22 5Gi RWX efs-sc 89s $ kubectl get pv | grep efs-sc pvc-7994fdce-5711-4346-aefb-85e10155ec7c 5Gi RWX Delete $ kubectl get pods NAME READY STATUS RESTARTS AGE efs-app-1 1/1 Running 0 95s $ kubectl exec -ti efs-app-1 -- tail -f /data/out Tue Mar 22 00:38:08 UTC 2022 Tue Mar 22 00:38:13 UTC 2022 Tue Mar 22 00:38:18 UTC 2022 efs-app-1 が正常に実行され、EFS CSI ドライバーによって PV が自動的に作成されたことが確認できました。AWS マネジメントコンソールでは、それぞれのアクセスポイントが確認できます。 このプロセスを繰り返して別のアプリケーション ( efs-app-2 ) を作成すると、自動的に別のアクセスポイントが作成されます。PV について心配する必要はありません。 以下は、動的プロビジョニングのまとめです。 クリーンアップ すべてのエクササイズが終わったら、すべてのリソースを削除しましょう。 すべての Kubernetes リソース (PV、PVC、Pod、Storage Class など) を削除します。 $ kubectl delete -f pod.yaml $ kubectl delete -f pvc.yaml $ kubectl delete -f pv.yaml $ kubectl delete -f pvc_pod_1.yaml $ kubectl delete -f sc.yaml AWS マネジメントコンソールまたは AWS CLI で EFS ファイルシステム ( myEFS1 と myEFS2 ) を削除します。 EKS クラスターを削除 ( eksctl delete cluster efsworkshop-eksctl ) します。 訳注: KMS キー ( efsworkshop ) 、Cloud9 環境 ( efsworkshop ) 、IAM ロール ( efsworkshop-admin ) も削除してください。 まとめ このブログ記事では、Kubernetes の永続ストレージの基本原則について説明しました。Persistent Volume を使用することで、Pod のクラッシュや終了に関係なくデータが永続化されるステートフルなアプリケーションを Kubernetes 上に作成できます。Persistent Volume は、静的プロビジョニングまたは動的プロビジョニングのいずれかを使用してプロビジョニングできます。基盤となるストレージとして Amazon EFS を使用して、EKS クラスター上で両方のデモを行いました。 基本的なことはすべて学んだので、次はより実用的なユースケースに移ります。このブログ記事シリーズの Part 2 では、Kubeflow を使って機械学習ワークロードを実行するために永続ストレージを利用します。 このブログ記事をお読みいただきありがとうございます。コンテナでの EFS の使用に関するその他のチュートリアルについては、 amazon-efs-developer-zone GitHub リポジトリにアクセスしてください。 翻訳はプロフェッショナルサービスの杉田が担当しました。原文は こちら です。
アバター
ある企業は、未来に向けて変革したいと考えています。トランスフォーメーションがなければ、破壊的な競合他社に脅かされるか、顧客にサービスを提供できなくなります。しかし、従業員が日々の仕事に忙殺されているため、トランスフォーメーションに着手できません。変革には努力が必要です。また、プロセスを変更すると同時に、そのプロセスを使ってビジネスを運営しなければなりません (「自転車に乗りながらタイヤを交換する」という問題)。新しいスキルの習得、新しいクラウド環境の準備、ビジネスプロセスの変更、企業の再編成など、トランスフォーメーションに必要な作業を、同じプロセスで忙しくしている間に誰が行うのでしょうか? 事実:従業員はすでに忙しいのです。彼らはフルタイムの仕事をしています。彼らは新しい仕事を待っているわけでもありません。もしそうであれば、あなたはそれを容認しないでしょうし、従業員が十分に活用されていなければ、多くの給料を支払うこともないでしょう。また、トランスフォーメーションの仕事をするために新しい従業員を増やすだけでは変革はできません。それではトランスフォーメーションとは言えず、新しい会社や事業部を作るようなものです。トランスフォーメーションは、すでに存在しているものを変えることなのです。 つまり、トランスフォーメーションを会社の日常業務の一部にする方法を見つけなければなりません。というのも、私たちはトランスフォーメーションを、開始点、終着点、一連のステップが明確に定義されたプロジェクトであるかのように言い続けているからです。 以前のブログ記事 で指摘したように、デジタルトランスフォーメーションは解釈がぶれる言葉です。デジタルトランスフォーメーションとは、 企業の働き方を変えること だと理解するのに役立ちます。それは日常の活動や考え方を変えることです。 もちろん、大規模な技術的取り組み (例えばクラウドへの移行) も含まれますが、そうした取り組みは会社の働き方を変えるためのものです。これらは日常業務の変更によって推進されるのが最適なのです。この2つは一体となります。私が役に立つと思ったフレームワークは、 ゴイコ・アジッチのインパクト・マッピング です。彼のフレームワークでは、ビジネスの目的から出発し、どのような行動の変化がその目的を達成するのに役立つかをマッピングします。次に、どのような技術的変化がその行動変容をサポートするかを考えます。 日々の活動とは別に、5年間の詳細なトランスフォーメーションロードマップをプロジェクト計画として作成すれば、問題はさらに悪化します。全員の承認を得るのに何年も費やすことになり、その結果、それを実行する自由な時間を持つ者がいなくなってしまうでしょう。 確かに、この質問の出し方には少し突飛なところがあります。私は冒頭で、あなたが会社の将来にとってトランスフォーメーションが不可欠だと判断し、会社が顧客のニーズに応えられなかったり、新たな競合他社 (おそらくは動きの速い新興企業) によって破壊されたりするリスクがあると仮定しました。会社の従業員には、会社の存続に必要なことをするための十分な時間がないようです。ここには明らかに優先順位の問題があります。会社の存続は最優先事項なので、リストの一番上になければなりません (優先順位設定の問題については、 以前のブログ記事 を参照)。何か他のことをしなければならないのです。 とはいえ、これは私が企業のリーダーたちから聞く話であり、企業のリーダーだった私には彼らがどこから来るのか理解できます。 変革するための時間を見つける 問題に対する考え方を逆転させてみてはどうでしょうか。新しいテクノロジーを構築し、それを使って従業員の働き方を変えるのではなく、従業員が望む働き方を変え、それをテクノロジーの変革の原動力にするのです。そのためのアイデアをいくつか紹介します。 まず、トランスフォーメーションへのコミットメントを示す必要があります。社員に変革を指示したり、計画を書いたり、スライドデッキを作ったりするだけでは不十分です。トランスフォーメーションは、時間に余裕があるときに取り組む余分なものではないというメッセージを伝えなければなりません。それは最優先事項 (冗長な表現?) であり、会社が計画していることではなく、 行っている ことなのです。リーダーはそれを実現するためならトレードオフもいといません。 ある AWS のお客様の幹部は最近、ベストプラクティスや新しい知識を共有するための週1回のセッションなど、自社のトランスフォーメーションを進めるために彼が作った知識共有コミュニティについて話してくれました。彼は金曜日の午後にミーティングを行っていましたが、私にはそれが間違っているように思えました。小さなことかもしれませんが、リーダーシップがそれを重要だと考えていないことを示していました。月曜日のゴールデンタイムに、新しい知識が次の週にどのように使われるかを説明するミーティングを行えば、知識共有セッションが役に立つかどうかは別として、その重要性をより強く示すことができます。トランスフォーメーションを強力に推進するには、知識の共有よりもはるかに多くの 「実行」 が必要なのです。 次に、インセンティブと役割の定義を変える必要があります。トランスフォーメーションのゴールは行動変容 (新しい仕事の仕方や考え方) であるため、新しい行動にインセンティブを与え、それをテクノロジー変革の要件推進に利用することで、トランスフォーメーションを最も効果的に進めることができます。インセンティブを変えなければ、従業員はこれまでと同じことを続けることになります。私は、必ずしも金銭的なインセンティブについて話しているのではなく、従業員の仕事の目的や、自分の役割にとっての成功がどのようなものかを変えただけです。新しいインセンティブの下では、「ただ仕事をする」だけでは失敗につながります。成功するためには、トランスフォーメーションのビジョンに沿って動く必要があるのです。 従業員は、トランスフォーメーションがどこに向かっているのかを明確に認識しなければなりません。詳細なロードマップではなく、変革後の企業の新しい状態と、それがどのように変わるのかというビジョンが重要です。ビジョンは、将来の状態がどのようにビジネス目標や組織の使命をよりよく達成するかを明確にする必要があります。漠然としたものや一般的なものであってはなりません。なぜなら、従業員の頭の中に、何を目指しているのか、なぜそれが重要なのかを明確に描かなければならないからです。忘れてはならないのは、副次的なプロジェクトとしてではなく、全員が日々の活動の中でトランスフォーメーションのビジョンに向かって取り組むことが目標だということです。 考えてみれば、「トランスフォーメーション」と呼ぶだけでも、まるで別個の、しかも非常に大規模なプロジェクトのように聞こえます。そして、誰がそんなことをする時間があるのでしょうか? 詳細なロードマップなしに、大きなコミットメントを進めるのは無責任に感じられます。しかし、コミットメントすべきはビジョンであって、実行の詳細ではありません。 長期的なロードマップの代わりに、大きなトランスフォーメーションの取り組みを一連のビジネス目標に変換し、その総和をトランスフォーメーションのビジョンとすることを試してみてはどうでしょうか。最初の目標は、会社の運営コストの構造を 20% 削減することかもしれません。第二の目標は、特定のビジネスラインを拡大することかもしれません。第三の目標は、パンデミックやランサムウェア攻撃に対処できるよう、業務に回復力を持たせることかもしれません。これらの目標は具体的であり、日常的な企業活動に一体化しやすいのです。 物事を個々の目標に分解すると、トランスフォーメーションが断片化され、考え抜かれた技術的アーキテクチャーが稚拙なものになるのではないかと心配するかもしれません。高レベルのビジョンがそれを導き、アーキテクチャは反復的に形成され、洗練されていきます。 私が USCIS (訳者注:米国市民権・移民業務局) で担当したのは、巨大なトランスフォーメーションプロジェクトでした。私たちの最初の間違いは、このプロジェクトを一枚岩の取り組みと考えたことでした。つまり、 USCIS の紙プロセスをすべてデジタルプロセスにするつもりだったのです。達成可能なビジネス成果を明確にしたほうがよかったのです。オフィス間で移動する紙の量を減らしたいことは分かっていました。そのため、最も紙の移動が多い業務に優先的に取り組むことができました。また、不正申請の検出を強化したいこともわかっていたので、不正の可能性が最も高い移民給付金の種類に焦点を絞ることができました。他の目標についても同様です。このように目標を明確にしたことで、副業として技術インフラを構築するのではなく、日常業務と結びつけてトランスフォーメーションを進めることができました。 CIO はよく私に、ビジネス機能への要求事項ですでに手一杯なのに、どうやってレガシーな技術的負債を是正する時間を確保できるのかと尋ねてきます。うまくいかないのは、新規開発をすべて中止し、システムのモダナイズだけに何年も費やすことです。企業は何年もじっとしているわけにはいきません。その代わりに私は、新規開発作業は継続するが、納品される作業の品質については、安全性、回復力、保守性、自動的にデプロイ可能でテスト可能であることなど、非常に高い基準を採用することをよく勧めます。この標準を達成するためには、レガシーシステムに対する作業においても、レガシーの技術的負債を解決する必要がありますが、それは新機能の開発をサポートする範囲に限られます。こうして、変革的作業は日常業務の一部となっていくのです。 その他の留意点 従業員のトレーニングに時間を割くことは重要ですが、それが新しいスキルを開発するための戦略のすべてというわけにはいきません。技術者は、実践的な作業を行い、他の技術者とペアを組んで仕事を提供することによって、最もよく学ぶことができます。新しいスキルは、前提条件ではなく、トランスフォーメーションのアウトプットとして考えるのです。 組織は、トランスフォーメーションの責任者、 AWS ではシングルスレッドリーダーと呼んでいる者を任命することがあります。トランスフォーメーションに完全に専念する人をリーダーの役割に据えることは、強力なものになり得えます。しかし、この人物がトランスフォーメーションを実施する従業員に対する直接的な管理権限を持っていない場合、まだ問題があります。従業員はどうやって変革活動のための時間を作るのでしょうか? また、トランスフォーメーションには従業員の仕事を変える必要があるため、トランスフォーメーションの責任者はどのようにその変化を引き起こすのでしょうか? シングルスレッドリーダーを置くことは決して悪い考えではないですが、多忙な従業員がその努力の一部となれるよう、組織のリーダー全体のコミットメントと組み合わせる必要がります。トランスフォーメーションが重要だと言うだけでは十分ではありませんし、肩書きに「トランスフォーメーション」とあるシニアリーダーを任命してその重要性を伝えるだけでも十分ではありません。コミットメントとは、トランスフォーメーションを全員の日々の活動やインセンティブの一部にすることを意味するのです。 新しい行動にインセンティブを与えて変革するのは時間がかかるように聞こえるかもしれませんが、決意をもってやればそんなことはありません。社員が暇になるまで待つよりも、確実に速くなるのです。 逆算と前進 変革を日常的な活動から遠ざけすぎると、トランスフォーメーションのための時間を確保できません。変革を日常業務の一部にするためには、テクノロジーを進化させると同時に行動を変える必要があります。従業員は、与えられた目標を達成するために時間を費やします。彼らのインセンティブが変わらなければ、トランスフォーメーションは起こりません。一方、あなたが望む新しい行動に対して従業員にインセンティブを与えることで、従業員はトランスフォーメーションの 推進 に参加するようになります。私たちは時々、物事を逆から考えることがあるのです! Mark Schwartz マーク・シュワルツは、アマゾンウェブサービスのエンタープライズストラテジストであり、『 The Art of Business Value and A Seat at the Table:IT Leadership in the Age of Agility 』の著者です。 AWS に入社する前は、米国市民権・移民業務局 (国土安全保障省の一部) の CIO、Intrax の CIO、および Auctiva の CEO を務めていました。 彼はウォートン大学で MBA を取得し、イェール大学でコンピューターサイエンスの理学士号を取得し、イェール大学で哲学の修士号を取得しています。 この記事はアマゾン ウェブ サービス ジャパン ソリューションアーキテクトの佐藤伸広が翻訳を担当しました。原文は こちら です。
アバター
皆様、こんにちは!PSA (Partner Solutions Architect) の Yukki です。 本記事では直近新規公開された、AWS 初学者向けのコンテンツをご紹介いたします。 皆様や皆様の周りでこのようなお悩みを持っている方はいませんか? 「クラウドという言葉はよく聞くけど、実はどういうものか説明できない」 「あまりにも学習リソースが多すぎて、何から始めればいいかわからない」 「AWS って結局何ができるの?」 このような方をこの記事の対象として、 2023 年 9 ~ 11 月に公開された初学者向けの動画コンテンツ をご紹介します。 &nbsp; 1. QuizKnock 鶴崎 氏が語る AWS の魅力 (提供:アマゾン ウェブ サービス ジャパン合同会社) QuizKnock【クイズノック】はクイズ王・伊沢 拓司 氏率いる東大発の知識集団です。 QuizKnock の YouTube チャンネル 登録者は 212 万人を突破。(2023 年 10 月時点) そのメンバーである鶴崎 修功 氏はなんと AWS ユーザー。「AWS でどんなツールを作ったの?」「ユーザーの視点から見てどんな点がいいの?」といった内容を、実際の AWS ユーザーならではの実感を持って語っていただきます。 AWS の推しサービスの話もあり、熱量を感じ取ることができる動画です。 言わずと知れたクイズ王・伊沢 拓司 氏が初学者の目線から質問をしてくれるので、初めて AWS に触れるという方も楽しさが伝わる内容になっています。まずは気軽に開発の世界に触れてみたいという皆様、ぜひご覧ください。 また動画で紹介されたコンテンツは、以下のページにまとめられていますので合わせてチェックしてみてください。 https://aws.amazon.com/jp/local/quizknock-tie-up/ &nbsp; 2. Cloud for Beginners on-demand training こちらの動画は IT 初学者の方を対象に、基礎的な IT 用語の説明と AWS クラウドを学習する上で必要となる IT 知識について解説する合計約 3 時間のオンデマンドコンテンツです。ウェブサービスや、サーバーはどのように構成されているのか、CPU やメモリはどのような働きをしているのか、 AWS クラウドがどういうものなのかといった、AWS の学習をはじめる際に前提となる知識を効率よく学ぶことができます。IT に関する専門用語について適宜解説しながら進行しているので、AWS に関心がある非 IT 領域の方々や学生の皆様にお勧めです。登録不要ですぐにご覧いただけます。 ご視聴はこちらから: ご視聴ページ &nbsp; &nbsp;&nbsp; &nbsp; 3. AWSome Day Online Conference AWS クラウド初学者向け大規模オンラインイベント AWSome Day Online Conference が 2023 年 11 月 16 日(木)に開催 されます!今回で年内最後の開催となります。上記の 1, 2 で概要についての予備知識を手に入れたあなたなら、きっとより楽しめるのがこのイベントです。実は私がこのイベントの講師をしています。私 Yukki と、トレーニングチームでプログラムマネージャーをしている平賀の 2 名による台本無しの掛け合い形式で進行していきます。平賀さんは皆様の立場になって質問をしたりコメントをしますので、聞きやすくなっています。 さらにそれぞれのトピックでは、AWS を実際に操作するデモを取り入れました。デモも掛け合いを行っていますので、ぜひ皆様は平賀さんの立場になって聞いていただけると、より操作するイメージが湧きやすくなると思います!もし聞いている中で疑問に思うことがあったら、すぐにプライベートチャットで AWS エキスパートに質問することができます。その場で疑問を解消していくことがスムーズな学習のコツ!ということで、ぜひこの機会をご活用ください。資料のダウンロードもできるので、復習にも役立ちます。 こちらのオンラインイベントは参加登録が必要です。お忘れなく!また AWSome Day の画面でお会いしましょう!! ご登録はこちらから: 登録ページ &nbsp; &nbsp;&nbsp; &nbsp; まとめ 本記事では、AWS 初学者向けに最近公開されたコンテンツをご紹介しました。このほかにも、2023 年 10 月にはロールプレイング形式で AWS クラウドについて学べる AWS Cloud Quest の日本語版 の公開もされるなど、数多くの入り口が用意されています。 これらのリソースを活用して、今日から AWS の学習を早速始めてみましょう!最後まで読んでいただき、本当にありがとうございました!!
アバター
イントロダクション Amazon VPC Lattice は、AWS ネットワークインフラストラクチャに直接組み込まれた、フルマネージドなアプリケーションネットワーキングサービスです。複数のアカウント、複数の仮想プライベートクラウド (VPC) にまたがる全てのサービスの接続、セキュア化、監視に使用できます。 Amazon Elastic Kubernetes Service ( Amazon EKS ) では、 Kubernetes Gateway API の実装である AWS Gateway API コントローラー を通じて、Amazon VPC Lattice を使用できます。Amazon EKS のお客様は、Amazon VPC Lattice を用いることで、シンプルかつ一貫性のある方法で、標準的な Kubernetes のセマンティクスによりクラスターをまたいだ接続を設定できます。 一方で、特定のお客様ではアプリケーションレイヤーのセキュリティを強化したいという要望がありました。Amazon VPC Lattice のデザインはセキュアバイデフォルトです。これは、どのサービスを共有したいのか、どの VPC にアクセスを提供したいのかを、明確にする必要があるためです。 Amazon VPC Lattice は 3 レイヤーのフレームワーク を提供しており、ネットワークの複数のレイヤーで多層防御戦略を実装できます。これらのレイヤーには、サービスネットワークと VPC の関連付け、セキュリティグループ、ネットワークアクセスコントロールリスト (ACL)、AWS Identity and Access Management ( AWS IAM ) 認証ポリシーが含まれ、Amazon VPC Lattice を構成することでセキュリティとコンプライアンスの目標を達成することができます。 VPC 内のセキュリティグループのサービスネットワークへの関連付けと認証ポリシーは、どちらもオプションです。セキュリティグループを設定せずに、サービスネットワークを VPC に関連付けることができます。また、認証タイプを NONE に設定して、認証ポリシーを使用しないこともできます。 本記事では、3 つ目のレイヤー、すなわちサービスネットワークと各々のサービスに適用できる、VPC Lattice の認証ポリシーに焦点を当てます。通常、サービスネットワークの認証ポリシーはネットワーク管理者あるいはクラウド管理者によって運用され、粗い粒度での認証を実装します。例えば、AWS Organizations の指定した組織からの認証済みリクエストのみ許可します。一方、サービスの認証ポリシーでは、サービスのオーナーはネットワーク管理者やクラウド管理者がサービスネットワークのレベルで適用した粗い粒度での認証ルールよりも制限の厳しい、きめ細やかな制御を設定できます。認証ポリシーを使用することで、お客様はアプリケーションのコードを変更することなく、 誰が、どのサービスに対して、どのアクションを実行できるか を定義することができます。 我々の実装では、以下の方法を示します。 Amazon VPC Lattice サービスネットワークと Amazon EKS を構築し、Amazon VPC Lattice サービスの認証ポリシーを有効にします。 Amazon EKS と Amazon VPC Lattice でのサイドカーパターンと Init コンテナパターンを用いて、サービスの呼び出し元が AWS IAM 認証で Amazon VPC Lattice サービスに対しての HTTP リクエストの生成を自動的におこなえるようにするソリューションを構築します。呼び出し元のアプリケーションのソースコードの変更は必要ありません。 サービスの呼び出し元が Amazon VPC Lattice サービスネットワーク内の複数のサービスに接続できることを確認します。 ソリューション概要 Amazon VPC Lattice は AWS IAM と統合され、お客様独自のサービス間通信のために、現在 AWS サービスとやり取りする時に慣れ親しんでいるのと同様の認証・認可の機能を提供します。 サービスのアクセス制御を設定するために、アクセスポリシーを使用できます。アクセスポリシーは、サービスネットワークと個々のサービスに関連付けることができる AWS IAM リソースポリシーです。アクセスポリシーでは、PARC (Principal、Action、Resource、Condition) モデルを使用して、サービスのコンテキスト固有のアクセス制御を適用できます。例えば、所有するサービスに対してアクセス可能なサービスを定義するために、アクセスポリシーを使用できます。 Amazon VPC Lattice はクライアント認証に AWS Signature Version 4 (SigV4) を使用します。Amazon VPC Lattice のサービスで認証ポリシーを有効化した後に、署名付き Authorization ヘッダー、 x-amz-content-sha256 、 x-amz-date 、 x-amz-security-token が HTTP リクエストに含まれるよう、サービスを呼び出す側を変更する必要があります。AWS SigV4 の詳細は こちら を参照してください。 Amazon VPC Lattice サービスへのリクエストに署名するために、お客様には以下の選択肢があります。 AWS SDK を用いて、対応するプログラミング言語でリクエストに署名します。このソリューションはパフォーマンスが最適化されますが、アプリケーション開発者によるコードの変更を必要とします。実装については Amazon VPC Lattice のドキュメント を参照してください。 AWS SIGv4 プロキシアドミッションコントローラーを活用し、 AWS SIGv4 プロキシ を用いて HTTP リクエストをフォワードし、AWS Sigv4 ヘッダーを追加します。詳細については、こちらの 記 事 を参照してください。しかし、上記のソリューションには 1 つの制限があります。AWS SIGv4 プロキシアドミッションコントローラーを使用する場合、単一のホストしかサポートされません。 サンプルのマニフェスト では、フロントエンドのコンテナは localhost:8005 にリクエストをしていて、Host ヘッダーは sidecar.aws.signing-proxy/host Annotations で静的に定義された datastore-lambda.sarathy.io に置き換えられていることがわかります。言い換えると、呼び出し元のサービスは単一の Amazon VPC Lattice サービスにのみ接続できます。クライアントが複数の Amazon VPC Lattice サービスに接続する場合に、課題となります。 この記事では、完全に透過的に複数の Amazon VPC Lattice サービスに対する接続をサポートする、最適化されたソリューションを紹介します。 はじめに、Kubernetes の Pod に Init コンテナとサイドカーコンテナを導入します。 Init コンテナ: iptables を実行し、ポート 8080 をリッスンする AWS SigV4 プロキシから Amazon VPC Lattice サービスへのトラフィックをインターセプトします。 SigV4 プロキシ: --name vpc-lattice-svcs, --unsigned-payload フラグとロギングのオプションを含む args を指定して実行します。プロキシコンテナは AWS IAM roles for service accounts (IRSA) によって取得された認証情報を使用して、自動的にリクエストに署名します。 次に、Init コンテナとサイドカーコンテナを自動的に注入します。開発チームが既存の Kubernetes マニフェストに変更を加えないようにするためです。ポリシーエンジンとして Kyverno を使用します。Kyverno は Kubernetes のために設計されており、Kubernetes クラスター内で Dynamic Admission Controller として動作します。この場合、Kyverno は Kubernetes API サーバーから Mutating Admission Webhook の HTTP コールバックを受け取り、マッチするポリシーを適用して、Admission Policy を強制する結果を返します。言い換えると、Kyverno は Init コンテナとサイドカーコンテナをコーディングを必須とせずに自動的に注入することができます。 ウォークスルー Amazon EKS における Amazon VPC Lattice と認証ポリシー 前提条件 管理者権限を持つ AWS アカウント AWS Command Line Interface ( AWS CLI )、 kubectl 、 eksctl 、 Git のインストール Amazon EKS クラスターと Amazon VPC Lattice サービスの準備 ソリューションをテストするための環境を準備する必要があります。 Amazon EKS クラスターの作成と、Amazon VPC Lattice のための Gateway API コントローラーのインストール Kyverno のインストール サンプル httpbin アプリケーションを Amazon VPC Lattice サービスとしてデプロイする 以下のコマンドを使用して、httpbin を Amazon VPC Lattice サービスとしてデプロイします。 git clone https://github.com/aws/aws-application-networking-k8s.git cd aws-application-networking-k8s/examples ## Create the GatewayClass, Gateway, HTTPRoute, Service and Deployment objects kubectl apply -f gatewayclass.yaml kubectl apply -f my-hotel-gateway.yaml kubectl apply -f httpbin.yaml kubectl apply -f httpbin-route.yaml ## Create another VPC Lattice Service (HTTPRoute), Service and Deployment object cat &lt;&lt; EOF &gt; another-httpbin.yaml apiVersion: apps/v1 kind: Deployment metadata: name: another-httpbin labels: app: another-httpbin spec: replicas: 1 selector: matchLabels: app: another-httpbin template: metadata: labels: app: another-httpbin spec: containers: - name: httpbin image: mccutchen/go-httpbin --- apiVersion: v1 kind: Service metadata: name: another-httpbin spec: selector: app: another-httpbin ports: - protocol: TCP port: 80 targetPort: 8080 EOF cat &lt;&lt; EOF &gt; another-httpbin-route.yaml apiVersion: gateway.networking.k8s.io/v1beta1 kind: HTTPRoute metadata: name: another-httpbin spec: parentRefs: - name: my-hotel sectionName: http rules: - backendRefs: - name: another-httpbin kind: Service port: 80 EOF ## Another VPC Lattice Service kubectl apply -f another-httpbin.yaml kubectl apply -f another-httpbin-route.yaml Bash サービスネットワークの保護 この機能を実証するために、 httpbin サービスに認証ポリシーを適用し、認証されたアクセスのみを許可します。 ドキュメント を参照することで、粒度の細かいポリシーを定義できます。 AWS コンソールの VPC セクションに移動し、 VPC Lattice の下の Services 、右ペインの httpbin-default サービスを選択します。 次のページで Access タブの Edit access settings を選択します。 表示される Service access 画面で、 AWS IAM から Apply policy template &gt; Allow only authenticated access を選択します。次に Save changes を選択します。 ここで、サービスが AWS IAM 認証を必要とし、そうでなければ HTTP 403 Forbidden エラーを返すかを示すテストを実施します。 kubectl run curl --image alpine/curl -ti -- /bin/sh curl -v http://httpbin-default-09ff9bb5d43b72048.7d67968.vpc-lattice-svcs.us-west-2.on.aws * Trying 169.254 .171.32:80 .. . * Connected to httpbin-default-09ff9bb5d43b72048.7d67968.vpc-lattice-svcs.us-west-2.on.aws ( 169.254 .171.32 ) port 80 ( #0) &gt; GET / HTTP/1.1 &gt; Host: httpbin-default-09ff9bb5d43b72048.7d67968.vpc-lattice-svcs.us-west-2.on.aws &gt; User-Agent: curl/8.0.1 &gt; Accept: / &lt; HTTP/1.1 403 Forbidden &lt; content-length: 253 &lt; content-type: text/plain &lt; date: Mon, 31 Jul 2023 07:24:10 GMT &lt; * Connection #0 to host httpbin-default-09ff9bb5d43b72048.7d67968.vpc-lattice-svcs.us-west-2.on.aws left intact AccessDeniedException: User: anonymous is not authorized to perform: vpc-lattice-svcs:Invoke on resource: arn:aws:vpc-lattice:us-west-2:091550601287:service/svc-09ff9bb5d43b72048/ because no service-based policy allows the vpc-lattice-svcs:Invoke action # Bash 呼び出し元のアプリケーションのデプロイ ここで、AWS IAM roles for service accounts (IRSA) を使用するようプロキシを構成し、プロキシがリクエストに署名するために AWS IAM ロールの認証情報を使用できるようにします。アイデンティティベースのポリシーである VPCLatticeServicesInvokeAccess を AWS IAM ロールにアタッチすることで、Amazon VPC Lattice サービスを呼び出す権限をロールに付与できます。 Service Account 用の IAM ロールの作成 export CLUSTER_NAME = my-cluster export NAMESPACE = default export SERVICE_ACCOUNT = default eksctl create iamserviceaccount \ --cluster = $CLUSTER_NAME \ --namespace = $NAMESPACE \ --name = $SERVICE_ACCOUNT \ --attach-policy-arn = arn:aws:iam::aws:policy/VPCLatticeServicesInvokeAccess \ --override-existing-serviceaccounts \ --approve Bash 準備が完了したら、プロキシコンテナと一緒にサービスを呼び出すアプリケーションを準備します。プロキシコンテナはポート 8080 をリッスンし、ユーザー ID 101 として実行します。YAML スニペットは以下のとおりです。 - name : sigv4proxy image : public.ecr.aws/aws - observability/aws - sigv4 - proxy : latest args : [ "--unsigned-payload" , "--log-failed-requests" , "-v" , "--log-signing-process" , "--name" , "vpc-lattice-svcs" , "--region" , "us-west-2" , "--upstream-url-scheme" , "http" ] ports : - containerPort : 8080 name : proxy protocol : TCP securityContext : runAsUser : 101 YAML ここでは、メインのアプリケーションからのトラフィックをインターセプトし、 iptables ユーテリティを使って Amazon VPC Lattice CIDR 169.254.171.0/24 に接続するトラフィックを EGRESS_PROXY チェーンにルーティングし、ローカルのポート 8080 にリダイレクトしています。プロキシコンテナによってトラフィックが送信される際の無限ループを避けるため、UID が 101 かどうかをチェックすることで識別し、再度リダイレクトされないようにしています。 initContainers : # IPTables rules are updated in init container - image : public.ecr.aws/d2c6w7a3/iptables name : iptables - init securityContext : capabilities : add : - NET_ADMIN command : # Adding --uid-owner 101 here to prevent traffic from envoy proxy itself from being redirected, which prevents an infinite loop - /bin/sh - - c - &gt; iptables -t nat -N EGRESS_PROXY; iptables -t nat -A OUTPUT -p tcp -d 169.254.171.0/24 -j EGRESS_PROXY; iptables -t nat -A EGRESS_PROXY -m owner --uid-owner 101 -j RETURN; iptables -t nat -A EGRESS_PROXY -p tcp -j REDIRECT --to-ports 8080; YAML コンテナイメージ public.ecr.aws/d2c6w7a3/iptables は、シンプルに iptables がインストールされた Ubuntu Linux ディストリビューションのベースイメージです。 FROM ubuntu:focal RUN apt update &amp;&amp; apt install -y iptables Bash 完全な YAML マニフェストは以下のようになります。 apiVersion: apps/v1 kind: Deployment metadata: name: client-app labels: app: client-app spec: replicas: 1 selector: matchLabels: app: client-app template: metadata: labels: app: client-app spec: serviceAccountName: default initContainers: # IPTables rules are updated in init container - image: public.ecr.aws/d2c6w7a3/iptables name: iptables-init securityContext: capabilities: add: - NET_ADMIN command: # Adding --uid-owner 101 here to prevent traffic from aws-sigv4-proxy proxy itself from being redirected, which prevents an infinite loop - /bin/sh - -c - &gt; iptables -t nat -N EGRESS_PROXY ; iptables -t nat -A OUTPUT -p tcp -d 169.254 .171.0/24 -j EGRESS_PROXY ; iptables -t nat -A EGRESS_PROXY -m owner --uid-owner 101 -j RETURN ; iptables -t nat -A EGRESS_PROXY -p tcp -j REDIRECT --to-ports 8080 ; containers: - name: app image: alpine/curl command: [ "/bin/sh" , "-c" , "sleep infinity" ] - name: sigv4proxy image: public.ecr.aws/aws-observability/aws-sigv4-proxy:latest args: [ "--unsigned-payload" , "--log-failed-requests" , "-v" , "--log-signing-process" , "--name" , "vpc-lattice-svcs" , "--region" , "us-west-2" , "--upstream-url-scheme" , "http" ] ports: - containerPort: 8080 name: proxy protocol: TCP securityContext: runAsUser: 101 Bash curl を実行することで、/get のレスポンスが表示されます。レスポンスは HTTP 200 OK です。 ➜ kubectl get gateway -o yaml | yq '.items[0].status.addresses[].value' another-httpbin-default-03422a15c25e5fca4.7d67968.vpc-lattice-svcs.us-west-2.on.aws httpbin-default-09ff9bb5d43b72048.7d67968.vpc-lattice-svcs.us-west-2.on.aws ➜ VPC_LATTICE_SERVICE_ENDPOINT = http://httpbin-default-09ff9bb5d43b72048.7d67968.vpc-lattice-svcs.us-west-2.on.aws/get ➜ kubectl exec -c app -ti deploy/client-app -- curl $VPC_LATTICE_SERVICE_ENDPOINT { "args" : { } , "headers" : { "Accept" : "*/*" , "Accept-Encoding" : "gzip" , "Host" : "httpbin-default-09ff9bb5d43b72048.7d67968.vpc-lattice-svcs.us-west-2.on.aws" , "User-Agent" : "curl/8.0.1" , "X-Amz-Content-Sha256" : "UNSIGNED-PAYLOAD" , "X-Amzn-Source-Vpc" : "vpc-027db8599a32b83e2" } , "origin" : "192.168.46.245" , "url" : "http://httpbin-default-09ff9bb5d43b72048.7d67968.vpc-lattice-svcs.us-west-2.on.aws/get" } Bash プロキシコンテナのログを確認することで、ヘッダーがプロキシによって追加されたことを確認できます。 Authorization ヘッダーと、 x-amz-content-sha256 、 x-amz-date 、 x-amz-security-token といったヘッダーがリクエストに追加されています。 ➜ kubectl logs deploy/vpc-lattice-client -c sigv4proxy time = "2023-08-07T10:14:59Z" level = debug msg = "signed request" region = us-west-2 service = vpc-lattice-svcs time = "2023-08-07T10:14:59Z" level = debug msg = "proxying request" request = "GET /get HTTP/1.1 \r \n Host: httpbin-default-09ff9bb5d43b72048.7d67968.vpc-lattice-svcs.us-west-2.on.aws \r \n Accept: */* \r \n Authorization: AWS4-HMAC-SHA256 Credential=ASIARKUGXKBDQVWU6BFX/20230807/us-west-2/vpc-lattice-svcs/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token, Signature=&lt;redacted&gt; \r \n User-Agent: curl/8.0.1 \r \n X-Amz-Content-Sha256: UNSIGNED-PAYLOAD \r \n X-Amz-Date: 20230807T101459Z \r \n X-Amz-Security-Token: IQoJb3JpZ2luX2VjEMr//////////&lt;redacted&gt;== \r \n \r \n " Bash ここでは、 VPC_LATTICE_SERVICE_ENDPOINT を 2 つ目のホスト名に置き換えることができます。アプリケーションコードの変更は必要としないので、複数の Amazon VPC Lattice サービスに接続することができます。 ➜ VPC_LATTICE_SERVICE_ENDPOINT = http://another-httpbin-default-03422a15c25e5fca4.7d67968.vpc-lattice-svcs.us-west-2.on.aws/get ➜ kubectl exec -c app -ti deploy/client-app -- curl $VPC_LATTICE_SERVICE_ENDPOINT { "args" : { } , "headers" : { "Accept" : "*/*" , "Accept-Encoding" : "gzip" , "Host" : "another-httpbin-default-03422a15c25e5fca4.7d67968.vpc-lattice-svcs.us-west-2.on.aws" , "User-Agent" : "curl/8.0.1" , "X-Amz-Content-Sha256" : "UNSIGNED-PAYLOAD" , "X-Amzn-Source-Vpc" : "vpc-027db8599a32b83e2" } , "origin" : "192.168.32.152" , "url" : "http://another-httpbin-default-03422a15c25e5fca4.7d67968.vpc-lattice-svcs.us-west-2.on.aws/get" } Bash Kyverno を使って、Init コンテナとサイドカーコンテナを自動で注入する ここで、Kyverno を活用して、Init コンテナとサイドカーコンテナを自動で注入するようにします。Kyverno がインストールされたクラスターでは、注入するための ClusterPolicy を書くことができます。Deployment オブジェクトに vpc-lattices-svcs.amazonaws.com/agent-inject が true であるアノテーションが設定されると、Deployment に Init コンテナとサイドカーコンテナが注入されます。 環境変数 AWS_REGION を指定する必要もあります。 apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: inject-sidecar annotations: policies.kyverno.io/title: Inject Sidecar Container spec: rules: - name: inject-sidecar match: any: - resources: kinds: - Deployment mutate: patchStrategicMerge: spec: template: metadata: annotations: ( vpc-lattices-svcs.amazonaws.com/agent-inject ) : "true" spec: initContainers: # IPTables rules are updated in init container - image: public.ecr.aws/d2c6w7a3/iptables name: iptables-init securityContext: capabilities: add: - NET_ADMIN command: # Adding --uid-owner 101 here to prevent traffic from envoy proxy itself from being redirected, which prevents an infinite loop - /bin/sh - -c - &gt; iptables -t nat -N EGRESS_PROXY ; iptables -t nat -A OUTPUT -p tcp -d 169.254 .171.0/24 -j EGRESS_PROXY ; iptables -t nat -A EGRESS_PROXY -m owner --uid-owner 101 -j RETURN ; iptables -t nat -A EGRESS_PROXY -p tcp -j REDIRECT --to-ports 8080 ; containers: - name: sigv4proxy env: - name: AWS_REGION value: "us-west-2" image: public.ecr.aws/aws-observability/aws-sigv4-proxy:latest args: [ "--unsigned-payload" , "--log-failed-requests" , "-v" , "--log-signing-process" , "--name" , "vpc-lattice-svcs" , "--region" , \ $( AWS_REGION ) , "--upstream-url-scheme" , "http" ] ports: - containerPort: 8080 name: proxy protocol: TCP securityContext: runAsUser: 101 Bash このアプローチでは、Kubernetes Deployment の YAML に vpc-lattices-svcs.amazonaws.com/agent-inject: "true" を指定すると、Deployment に Init コンテナとサイドカーコンテナが注入されます。 クライアントの YAML は以下です。 apiVersion: apps/v1 kind: Deployment metadata: name: vpc-lattice-client labels: app: vpc-lattice-client spec: replicas: 1 selector: matchLabels: app: vpc-lattice-client template: metadata: labels: app: vpc-lattice-client annotations: vpc-lattices-svcs.amazonaws.com/agent-inject: "true" spec: serviceAccountName: default containers: - name: app image: alpine:curl command: [ "/bin/sh" , "-c" , "sleep infinity" ] Bash サイドカーは自動的に注入されます。 ➜ kubectl describe deploy vpc-lattice-client Name: vpc-lattice-client Namespace: default CreationTimestamp: Thu, 20 Jul 2023 11 :01:32 +0800 Labels: app = vpc-lattice-client Annotations: deployment.kubernetes.io/revision: 1 policies.kyverno.io/last-applied-patches: inject-sidecar.inject-sidecar.kyverno.io: added /spec/template/spec/containers/0 .. . Bash パッチが当たった YAML マニフェストは以下のようになります。 ➜ kubectl get deploy vpc-lattice-client -o yaml apiVersion: apps/v1 kind: Deployment metadata: annotations: deployment.kubernetes.io/revision: "1" kubectl.kubernetes.io/last-applied-configuration: | { "apiVersion" : "apps/v1" , "kind" : "Deployment" , "metadata" : { "annotations" : { } , "labels" : { "app" : "vpc-lattice-client" } , "name" : "vpc-lattice-client" , "namespace" : "default" } , "spec" : { "replicas" :1, "selector" : { "matchLabels" : { "app" : "vpc-lattice-client" } } , "template" : { "metadata" : { "annotations" : { "vpc-lattices-svcs.amazonaws.com/agent-inject" : "true" } , "labels" : { "app" : "vpc-lattice-client" } } , "spec" : { "containers" : [ { "command" : [ "/bin/sh" , "-c" , "sleep infinity" ] , "env" : [ { "name" : "HTTP_PROXY" , "value" : "localhost:8080" } ] , "image" : "nicolaka/netshoot" , "name" : "app" } ] , "serviceAccountName" : "default" } } } } policies.kyverno.io/last-applied-patches: | inject-sidecar.inject-sidecar.kyverno.io: added /spec/template/spec/containers/0 creationTimestamp: "2023-07-20T03:01: labels: app: vpc-lattice-client name: vpc-lattice-client namespace: default spec: selector: matchLabels: app: vpc-lattice-client template: metadata: annotations: vpc-lattices-svcs.amazonaws.com/agent-inject: " true" creationTimestamp: null labels: app: vpc-lattice-client spec: containers: - args: - --unsigned-payload - --log-failed-requests - -v - --log-signing-process - --name - vpc-lattice-svcs - --region - $( AWS_REGION ) - --upstream-url-scheme - http env: - name: AWS_REGION value: us-west-2 image: public.ecr.aws/aws-observability/aws-sigv4-proxy:latest imagePullPolicy: Always name: sigv4proxy ports: - containerPort: 8080 name: proxy protocol: TCP resources: { } securityContext: runAsUser: 101 terminationMessagePath: /dev/termination-log terminationMessagePolicy: File - command: - /bin/sh - -c - sleep infinity image: alpine:curl imagePullPolicy: Always name: app initContainers: - command: - /bin/sh - -c - | iptables -t nat -N EGRESS_PROXY ; iptables -t nat -A OUTPUT -p tcp -d 169.254 .171.0/24 -j EGRESS_PROXY ; iptables -t nat -A EGRESS_PROXY -m owner --uid-owner 101 -j RETURN ; iptables -t nat -A EGRESS_PROXY -p tcp -j REDIRECT --to-ports 8080 ; image: public.ecr.aws/d2c6w7a3/iptables name: iptables-init securityContext: capabilities: add: - NET_ADMIN .. . Bash また、クライアントが Amazon VPC Lattice サービスに正常にアクセスできることも確認できます。 ❯ VPC_LATTICE_SERVICE_ENDPOINT = http://httpbin-default-09ff9bb5d43b72048.7d67968.vpc-lattice-svcs.us-west-2.on.aws/get kubectl exec -c app -ti deploy/vpc-lattice-client -- curl $VPC_LATTICE_SERVICE_ENDPOINT { "args" : { } , "headers" : { "Accept" : "*/*" , "Accept-Encoding" : "gzip" , "Host" : "httpbin-default-09ff9bb5d43b72048.7d67968.vpc-lattice-svcs.us-west-2.on.aws" , "User-Agent" : "curl/8.0.1" , "X-Amz-Content-Sha256" : "UNSIGNED-PAYLOAD" , "X-Amzn-Source-Vpc" : "vpc-027db8599a32b83e2" } , "origin" : "192.168.32.152" , "url" : "http://httpbin-default-09ff9bb5d43b72048.7d67968.vpc-lattice-svcs.us-west-2.on.aws/get" } Bash クリーンアップ 将来的な課金を避けるため、以下のコマンドを使用して Amazon VPC Lattice リソースと Amazon EKS クラスターを含む、全てのリソースを削除します。 kubectl delete -f httpbin.yaml kubectl delete -f httpbin-route.yaml kubectl delete -f another-httpbin.yaml kubectl delete -f another-httpbin-route.yaml kubectl delete -f my-hotel-gateway.yaml kubectl delete -f gatewayclass.yaml eksctl delete cluster -f $CLUSTER_CONFIG Bash まとめ この記事では、Amazon VPC Lattice に AWS IAM 認証を実装する方法を、以下のようなソリューションを用いて紹介しました。 Init コンテナを使って iptables コマンドを実行し、VPC Lattice へのトラフィックをインターセプトする。 Kyverno を用いて Init コンテナとサイドカーコンテナを自動的に注入する。 呼び出し元のサービスは、VPC Lattice サービスネットワーク内の IAM 認証で複数のサービスに接続できるようになる。 VPC Lattice をベースにソリューションを構築し、VPC Lattice の IAM 認証を活用してセキュリティ体制を強化したい場合に、本ブログで共有した内容がお役に立てば嬉しいです。Amazon VPC Lattice の詳細については、 ドキュメント やその他の ブログ を参照してください。 翻訳はソリューションアーキテクトの後藤が担当しました。原文は こちら です。
アバター
みなさんこんにちは。ソリューションアーキテクトの林です。2023 年 10 月12 日に AWS が主催するエネルギー業界向けイベント「AWS Energy Tech Forum 2023」を開催しました。今年で 2 回目となる本イベントも 前回 同様のオンライン開催となりましたが、 1000 名近く の方にご登録いただきました。今年の本イベントでは、エネルギー業界で先進的に AWS をご活用いただいている、送配電網協議会様、関電システムズ様、JERA 様、北海道ガス様、関西電力送配電様にご登壇いただきました。 オープニング – 川島 浩史 アマゾン ウェブ サービス ジャパン合同会社 エンタープライズ事業統括本部 ストラテジックカスタマー営業本部 第三営業部 部長 オープニングでは、エネルギー業界におけるクラウド活用のバリューチェーンや日本のエネルギー企業さまのクラウド活用の拡大についてご紹介しました。また、グローバルでの参考取組みとして、ENGIE 社におけるゼロカーボンエネルギーのためのデジタルプラットフォーム、Duke Energy 社と AWS の戦略的提携とグリッドソリューションの共同開発、NERC CIP 標準の対応をサポートするための AWS ユーザーガイド公開について紹介しました。 電力データで何ができるか 社会課題解決に向けた電力データ集約システムの取り組み –&nbsp; 田村 豪一朗 様 送配電網協議会 ネットワーク企画部 部長(電力データ活用担当) セッションでは、送配電網協議会様より、全国のスマートメーターデータを扱う電力データ集約システム構築に至る背景やAWS 選定の理由、実装アーキテクチャなどについてご説明頂きました。ペタバイトクラスの大量データを扱うシステムとして、AWS クラウドの柔軟性と高可用性のメリットを最大限活用した事例となっております。 2020 年 6 月の改正電気事業法により、スマートメーターから得られる電力使用量データを、有事の際に災害復旧などへの活用、平時においても (利用者本人が同意した場合に限り) 社会課題解決などを目的とする活用が可能となりました。スマートメーターデータを活用することで、防災計画の高度化などの災害発生時のレジリエンス強化だけでなく、平時においてもみまもりサービスなどの新たなイノベーションを実現できます。しかし、法改正当時は手作業でデータを抽出しており、データ取得のための作業コストに課題がありました。電力データ集約システムはそのような課題に端を発し、2021 年に検討が開始され、18 カ月の構築フェーズを経て 2023 年 9 月末に運用を開始されております。各エリアで段階的に運用を開始される予定です。全国 10 社の一般送配電事業者から連携されるスマートメーターデータは約 8,000 万件となり、3 年間保持した場合は電力データ量だけで数ペタバイトに及ぶため、システム基盤は大量データを扱うことができ、拡張性がある必要がありました。AWS の拡張性や東京・大阪リージョンの冗長構成での高可用性をご評価頂き、AWS 上での基盤構築の運びとなりました。電力データ集約システムでは全国のスマートメーターデータを収集・加工・蓄積し、Web、API 経由で自治体などの許可された利用者への提供を実現する必要があります。大量データの加工には Amazon EMR &nbsp; を利用した並列加工処理を、増加するデータの蓄積には Amazon Simple Storage Service (S3) を利用して実質無制限でのデータ保存とデータ量に応じた従量課金を実現しております。 関西電力のデジタルトランスフォーメーションを支えるクラウド基盤のアジリティ向上への取り組み –&nbsp; 金子 恭史 様 株式会社関電システムズ テクニカルラボ クラウド&アーキテクチャグループ アシスタントマネジャー セッションでは、関西電力様にて組成した CCoE (Cloud Center of Excellence) 組織や活動内容と更なるアジリティ向上のためのクラウド活用方針についてお話いだたきました。クラウド活用推進のための組織づくりや目標設定を検討されている参加者に参考になる具体的な取組みであったと推察します。 関西電力様は 2025 年までに新たな価値創造を目標とした “Kanden Transformation” を進めており、その加速に向けて IT インフラの「迅速さ・柔軟さ」「IT コスト削減」を実現するクラウドの活用を促進されており、2020 年にクラウドファースト宣言と CCoE を発足されました。クラウド活用推進の体制としては、本社組織が技術的な戦略を担いつつ、情報子会社である関電システムズに実動部隊としての CCoE を設置、基盤運用をオプテージ社が担うという体制を取られております。さらには AWS Professional Services をご活用いただくことで、AWS 利用ガイドライン作成などを効率的に実施されております。 直近では更にクラウドのメリットを活かした迅速でアジリティのある運用を実現するために、セキュリティルールの再定義を進められています。具体的には、発見的統制(権限はシステム開発箇所に付与しつつ、リスクのある設定・操作を検知して通知する統制)を導入することで、セキュリティを担保した形でのシステム開発者への権限付与を実現されています。セキュリティリスクに至る可能性のある設定・操作を AWS Config &nbsp; で検知し、 AWS Security Hub &nbsp; と 連携することで担当者への通知を実現し、セキュリティリスクを即座に発見・対処する仕組みを構築しました。そのほかにも AWS Service Catalog &nbsp; を利用して事前に定義した環境を払い出すことでセキュリティリスクを低減しながらアジリティの向上を実現しています。このような運用変更により、従来であれば 10 営業日以上の申請待ち時間が生じていた作業について、システム開発箇所で完結可能となり、アジリティ向上を実現されています。 IoT/AIを活用した O&amp;M 業務改善の取り組み -Global Data Analyzing Center – –&nbsp; 島添 道裕 様 株式会社JERA O&amp;M・エンジニアリング戦略統括部 G-DAC モニタリングユニット シニアマネージャー –&nbsp; 佐藤 正芳 様 株式会社JERA 情報セキュリティ室 マネージャー –&nbsp; 大澤 正紹 様 株式会社JERA デジタルクリエーション部デジタルトランスフォーメーションユニット マネージャー セッションでは、JERA 様の発電所データの連係の仕組みから Global Data Analyzing Center (以下、G-DAC) でのデータ高度活用についてお話いただきました。発電所という OT 領域のクラウド連係や高度なデータ活用はセキュリティの懸念から進みにくい分野ですが、積極的に推進されている状況は、同領域を検討する参加者にとって参考になったのではないでしょうか。 JERA 様は発電設備の運転実績/設備データを収集・分析する基盤である IoT Platform を構築し、システム・部門を超えたデータ統合と高度分析による意思決定のスピード化・事業全体の最適化を実現されています。しかし、発電所とのデータ連係において、制御システムを納入する OT ベンダーにクラウドへの連係部分のシステムも依存していたため、データとシステム設計を自社で完全にコントロールできていないことに課題がありました。そこで、 AWS Direct Connect による専用接続と AWS Site-to-Site VPN &nbsp;による暗号化の併用に加えて、 AWS Gateway Load Balancer &nbsp; の採用により 、国内電力会社向けセキュリティガイドラインに準拠しつつ、システム更新やデータマネジメントを自社でコントロール可能な構成を構築されました。これにより、自社主導の統一的なデータ収集・活用を実現されています。収集したデータは G-DAC により高度に活用されております。2023 年 9 月時点で、G-DAC は国内外 62 の発電ユニットと連携しており、「予兆管理」「性能管理/診断」「運転最適化」を 3 つの柱としてサービス提供されています。JERA 様が独自ノウハウを活用した予測モデルを構築するために、 Amazon SageMaker &nbsp; を利用した AI/ML の内製化を実現されております。G-DAC により計画外設備停止時間の 10~20% 削減や年間 1 億円超の燃料費削減を実現しております。 AWS IoT を活用した業務用分野におけるエネルギーマネジメントシステムの開発 –&nbsp; 國奥 広伸 様 北海道ガス株式会社 エネルギーシステム部 エネルギーシステムグループ 係長 セッションでは、北海道ガス様の事業部メンバーが主体となって構築したエネルギーマネジメントシステム (以下、EMS) について、PoC 検討からサービスリリースに至るまでの課題や内製化の取組みについてお話いただきました。AWS やIoT に知見のなかった事業部メンバーが、事業構想からサービスリリースまでを主体的に進めた貴重な事例です。 北海道ガス様は、分散型エネルギー社会の実現に向けて、分散型 EMS の導入促進に取組まれています。2023 年 6 月には、お客さまの設備変更や高額な投資を必要とせず導入できる省エネソリューション「 Mys³ (ミース)」をリリースされました。 Mys³&nbsp; の事業検討は 2018 年からスタートしており、レガシー設備の IoT 化による季節や負荷に合わせた柔軟な運用にニーズがあるとの構想がありました。しかし、事業立ち上げ時から大きな初期投資ができず、AWS やIoT に知見がない事業部の 3 名が中心となり、PoC を開始されました。プロトタイプ構築に必要な知見を補うために、部署や部門を超えたコミュニティ活動を通じてボトムアップ的に知識を習得されました。コスト削減のため、AWS のサーバレス/マネージドサービスを活用する方針で検討を進め、 AWS IoT Core 、 AWS Lambda 、 Amazon QuickSight &nbsp; を利用した IoT データ可視化のプロトタイプを 5ヶ月、30 万円で構築されました。PoC 後は、コストダウンに加え、セキュリティとアジリティの改善に取組まれました。セキュリティについては AWS の Well-Architected Framework IoT Lens Checklist を利用して改善し、アジリティについては Amazon CodeCatalyst による CI/CD パイプラインの構築により、環境構築やテストの工数の削減を実現されました。このような取組みにより、当初の事業部メンバー中心のまま Mys³ リリースを実現されました。 メンバー熱意と積極的に社員に任せる組織文化がサービスリリースにつながった好例だと感じました。 関西電力送配電の次世代スマートメーターシステムにおけるAWSクラウド活用 –&nbsp; 児山 一郎 様 関西電力送配電株式会社 情報技術部 設備業務システムグループ マネジャー セッションでは、関西電力送配電様にて推進されている AWS クラウドを活用したスマートメーターシステム開発の取組みについてご紹介いただきました。より詳細な内容を公開しておりますので、下記ブログをご確認ください。 ・関西電力送配電株式会社によるスマートメーターシステムのクラウド採用に向けた取り組みのご紹介 (前半) &nbsp; ・関西電力送配電株式会社によるスマートメーターシステムのクラウド採用に向けた取り組みのご紹介 (後半) &nbsp; クロージングセッション ~ AWSからのご支援 ~ –&nbsp; 丹羽 勝久 アマゾン ウェブ サービス ジャパン合同会社 エンタープライズソリューション本部 ユーティリティソリューション部 ソリューションアーキテクト クロージングセッションでは、AWS の提供するご支援プログラムについてご説明しました。AWS はお客様の企画・構想段階から検証、実現までの全てのフローにおいてご支援可能なメニューを用意しております。セッションでは、複数のプログラムセットの中から DIP (Digital Innovation Program) によるイノベーション創出支援、プロトタイピングによるお客様と共同した AWS 環境の構築支援のプログラムについてご説明しました。また、クラウド標準環境構築・ガイドライン作成などをご支援可能な有償コンサルティングサービスである AWS Professional Services &nbsp;についてもご紹介しました。ご興味あれば担当営業までご連絡ください。 おわりに 日本のエネルギー産業は 5D (Digitalization、De-carbonization、De-centralization、De-population、Deregulation) と呼ばれる大きな変化の波にさらされています。今回の Forum を通じて、その多くの変化が「デジタル」に関係してきている事を実感しました。ご登壇いただいたお客様は、エネルギー業界で先進的に AWS を活されております。セッションでは、検討の背景から実現までのプロセスをお話をいただいたことで、参加者の方々がクラウド活用を進める上で必要な具体的な方針をイメージできたのではないでしょうか。今後も、先進的な取組みを発信されたいお客様にイベント登壇いただき、これから取組みを進める皆様への参考としていただけるように活動を続けて参ります。 著者プロフィール 林 隆太郎 &nbsp;(Ryutaro Hayashi) 大手ガス会社にてガススマートメーター、電力トレーディングのシステム開発を経験した後、総合商社にて全社の IT/DX 推進と国内外のエネルギー領域での事業投資、新規事業開発を担当。現在は AWS 電力・ガス業界のソリューションアーキテクトとして業界知識を活かした AWS 活用に携わる。
アバター