翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
AWS Amplify、Angular、および Module Federation を使用してマイクロフロントエンドのポータルを作成する
作成者: Milena Godau (AWS) と Pedro Garcia (AWS)
コードリポジトリ: Angular Micro-frontend Portal | 環境:PoC またはパイロット | テクノロジー: ウェブおよびモバイルアプリ、インフラストラクチャ、ネットワーキング、モダナイゼーション |
ワークロード: オープンソース | AWS サービス: AWS Amplify; AWS CLI |
[概要]
マイクロフロントエンドアーキテクチャを使用すると、複数のチームがフロントエンドアプリケーションのさまざまな部分を独立して作業できます。各チームは、アプリケーションの他の部分を中断することなく、フロントエンドのフラグメントを開発、構築、デプロイできます。エンドユーザーの観点からは、単一のまとまりのあるアプリケーションであるように見えます。ただし、異なるチームによって公開されるいくつかの独立したアプリケーションとやり取りしています。
このドキュメントでは、、Angular フロントエンドフレームワークAWS Amplify、および Module Federation を使用してマイクロフロントエンドアーキテクチャを作成する方法について説明します。このパターンでは、マイクロフロントエンドは、シェル (または親 ) アプリケーションによってクライアント側で結合されます。シェルアプリケーションは、マイクロフロントエンドを取得、表示、統合するコンテナとして機能します。シェルアプリケーションは、さまざまなマイクロフロントエンドをロードするグローバルルーティングを処理します。@angular-architects/module-federation プラグインは、Module Federation を Angular と統合します。を使用して、シェルアプリケーションとマイクロフロントエンドをデプロイします AWS Amplify。エンドユーザーは、ウェブベースのポータルからアプリケーションにアクセスします。
ポータルは垂直に分割されます。つまり、マイクロフロントエンドはビュー全体またはビューのグループであり、同じビューの一部ではありません。したがって、シェルアプリケーションは一度に 1 つのマイクロフロントエンドのみをロードします。
マイクロフロントエンドはリモートモジュールとして実装されます。シェルアプリケーションはこれらのリモートモジュールを遅延してロードし、マイクロフロントエンドの初期化が必要になるまで延期します。このアプローチは、必要なモジュールのみをロードすることで、アプリケーションのパフォーマンスを最適化します。これにより、初期ロード時間が短縮され、全体的なユーザーエクスペリエンスが向上します。さらに、ウェブパック設定ファイル (webpack.config.js) を介してモジュール間で共通の依存関係を共有します。このプラクティスは、コードの再利用を促進し、重複を減らし、バンドルプロセスを合理化します。
前提条件と制限
前提条件
製品バージョン
制約事項
マイクロフロントエンドアーキテクチャは、スケーラブルで回復力のあるウェブアプリケーションを構築するための強力なアプローチです。ただし、このアプローチを採用する前に、以下の潜在的な課題を理解することが重要です。
統合 – 主な課題の 1 つは、モノリシックフロントエンドと比較して複雑さが増す可能性があることです。複数のマイクロフロントエンドのオーケストレーション、それらの間の通信の処理、共有依存関係の管理は、より複雑になる場合があります。さらに、マイクロフロントエンド間の通信に関連するパフォーマンスオーバーヘッドが発生する場合があります。この通信により、レイテンシーが増加し、パフォーマンスが低下する可能性があります。これは、効率的なメッセージングメカニズムとデータ共有戦略を通じて対処する必要があります。
コードの重複 – 各マイクロフロントエンドは個別に開発されるため、共通機能または共有ライブラリのコードが重複するリスクがあります。これにより、アプリケーション全体のサイズが拡大し、メンテナンス上の課題が発生する可能性があります。
調整と管理 – 複数のマイクロフロントエンドで開発とデプロイプロセスを調整することは難しい場合があります。分散アーキテクチャでは、一貫したバージョニングの確保、依存関係の管理、コンポーネント間の互換性の維持がより重要になります。シームレスなコラボレーションと配信には、明確なガバナンス、ガイドライン、自動化されたテストとデプロイパイプラインを確立することが不可欠です。
テスト – マイクロフロントエンドアーキテクチャのテストは、モノリシックフロントエンドのテストよりも複雑になる場合があります。コンポーネント間の統合テスト end-to-endとテストを実行し、複数のマイクロフロントエンドにわたって一貫したユーザーエクスペリエンスを検証するには、追加の労力と特殊なテスト戦略が必要です。
マイクロフロントエンドアプローチにコミットする前に、 でのマイクロフロントエンドの理解と実装 AWSを確認することをお勧めします。
アーキテクチャ
マイクロフロントエンドアーキテクチャでは、各チームが個別に機能を開発およびデプロイします。次の図は、複数の DevOps チームが連携する方法を示しています。ポータルチームはシェルアプリケーションを開発します。シェルアプリケーションはコンテナとして機能します。他の DevOps チームによって発行されたマイクロフロントエンドアプリケーションを取得、表示、統合します。を使用して AWS Amplify 、シェルアプリケーションとマイクロフロントエンドアプリケーションを公開します。
以下は、アーキテクチャ図を示しています。
ポータルチームは、シェルアプリケーションを開発および維持します。シェルアプリケーションは、ポータル全体を構成するために、マイクロフロントエンドの統合とレンダリングを調整します。
チーム A と B は、ポータルに統合されている 1 つ以上のマイクロフロントエンドまたは機能を開発および維持します。各チームは、それぞれのマイクロフロントエンドで個別に作業できます。
エンドユーザーは Amazon Cognito を使用して認証します。
エンドユーザーはポータルにアクセスし、シェルアプリケーションがロードされます。ユーザーがナビゲートすると、シェルアプリケーションはルーティングを処理し、リクエストされたマイクロフロントエンドを取得し、バンドルをロードします。
AWS のサービス
AWS Amplify は、フロントエンドのウェブデベロッパーとモバイルデベロッパーが でフルスタックアプリケーションをすばやく構築するのに役立つ、専用のツールと機能のセットです AWS。このパターンでは、Amplify を使用して CLI Amplify マイクロフロントエンドアプリケーションをデプロイします。
AWS Command Line Interface (AWS CLI) は、コマンドラインシェルのコマンド AWS のサービス を使用して とやり取りするのに役立つオープンソースツールです。
その他のツール
@angular-architects/module-federation は、Angular を Module Federation と統合するプラグインです。
Angular は、モダンでスケーラブル、かつテスト可能な単一ページアプリケーションを構築するためのオープンソースのウェブアプリケーションフレームワークです。これは、コードの再利用とメンテナンスを促進するモジュラーおよびコンポーネントベースのアーキテクチャに従います。
Node.js は、スケーラブルなネットワークアプリケーションを構築するために設計されたイベント駆動型の JavaScript ランタイム環境です。
「npm」は Node.js 環境で動作するソフトウェアレジストリで、パッケージの共有や借用、プライベートパッケージのデプロイ管理に使用されます。
Webpack Module Federation は、マイクロフロントエンドやプラグインなど、個別にコンパイルおよびデプロイされたコードをアプリケーションにロードするのに役立ちます。
コードリポジトリ
このパターンのコードは、Angular および Module Federation リポジトリを使用して Micro-frontend ポータル GitHub で使用できます。このリポジトリには、次の 2 つのフォルダが含まれます。
ベストプラクティス
マイクロフロントエンドアーキテクチャには多くの利点がありますが、複雑さも生じます。以下は、スムーズな開発、高品質のコード、優れたユーザーエクスペリエンスのためのベストプラクティスです。
計画とコミュニケーション – コラボレーションを合理化するには、事前の計画、設計、明確なコミュニケーションチャネルに投資します。
設計の一貫性 – 設計システム、スタイルガイド、コンポーネントライブラリを使用して、マイクロフロントエンド全体に一貫したビジュアルスタイルを適用します。これにより、一貫したユーザーエクスペリエンスが提供され、開発が加速されます。
依存関係管理 – マイクロフロントエンドは独立して進化するため、標準化された契約とバージョニング戦略を採用して依存関係を効果的に管理し、互換性の問題を防止します。
マイクロフロントエンドアーキテクチャ – 独立した開発とデプロイを可能にするには、各マイクロフロントエンドにカプセル化された機能に対する明確で明確な責任が必要です。
統合と通信 – スムーズな統合を促進し、競合を最小限に抑えるには、APIs、イベント、共有データモデルなど、マイクロフロントエンド間の明確な契約と通信プロトコルを定義します。
テストと品質保証 – マイクロフロントエンドのテスト自動化と継続的統合パイプラインを実装します。これにより、全体的な品質が向上し、手動テストの労力が削減され、マイクロフロントエンドインタラクション間の機能を検証できます。
パフォーマンスの最適化 – パフォーマンスメトリクスを継続的にモニタリングし、マイクロフロントエンド間の依存関係を追跡します。これにより、ボトルネックを特定し、最適なアプリケーションパフォーマンスを維持できます。この目的には、パフォーマンスモニタリングと依存関係分析ツールを使用します。
デベロッパーエクスペリエンス – 明確なドキュメント、ツール、例を提供することで、デベロッパーエクスペリエンスに焦点を当てます。これにより、開発を合理化し、新しいチームメンバーをオンボーディングできます。
エピック
タスク | 説明 | 必要なスキル |
---|
シェルアプリケーションを作成します。 | Angular でCLI、次のコマンドを入力します。 ng new shell --routing
次のコマンドを入力して、プロジェクトフォルダに移動します。 cd shell
注: シェルとマイクロフロントエンドアプリケーションのフォルダとプロジェクト構造は完全に独立している可能性があります。これらは独立した Angular アプリケーションとして処理できます。
| アプリ開発者 |
プラグインをインストールします。 | Angular でCLI、次のコマンドを入力して @angular-architects/module-federation プラグインをインストールします。 ng add @angular-architects/module-federation --project shell --port 4200
| アプリ開発者 |
マイクロフロントエンドを環境変数URLとして追加します。 | environment.ts ファイルを開きます。 environment オブジェクトmfe1URL: 'http://localhost:5000' に を追加します。
export const environment = {
production: false,
mfe1URL: 'http://localhost:5000',
};
environment.ts ファイルを保存して閉じます。
| アプリ開発者 |
ルーティングを定義します。 | app-routing.module.ts ファイルを開きます。 Angular でCLI、次のコマンドを入力して、@angular-architects/module-federation プラグインからloadRemoteModule モジュールをインポートします。 import { loadRemoteModule } from '@angular-architects/module-federation';
デフォルトルートを次のように設定します。 {
path: '',
pathMatch: 'full',
redirectTo: 'mfe1'
},
マイクロフロントエンドのルートを設定します。 {
path: 'mfe1',
loadChildren: () => loadRemoteModule({
type: 'module',
remoteEntry: `${environment.mfe1URL}/remoteEntry.js`,
exposedModule: './Module'
})
.then(m => m.Mfe1Module)
},
app-routing.module.ts ファイルを保存して閉じます。
| アプリ開発者 |
mfe1 モジュールを宣言します。
| src フォルダで、decl.d.ts という名前の新しいファイルを作成します。
decl.d.ts ファイルを開きます。 ファイルに以下を追加します。 declare module 'mfe1/Module';
decl.d.ts ファイルを保存して閉じます。
| アプリ開発者 |
マイクロフロントエンドのプリロードを準備します。 | マイクロフロントエンドをプリロードすると、ウェブパックは共有ライブラリとパッケージを適切にネゴシエートできます。 main.ts ファイルを開きます。 コンテンツを以下に置き換えます。 import { loadRemoteEntry } from '@angular-architects/module-federation';
Promise.all([
loadRemoteEntry(`${environment.mfe1URL}/remoteEntry.js`, 'mfe1'),
])
.catch(err => console.error('Error loading remote entries', err))
.then(() => import('./bootstrap'))
.catch(err => console.error(err));
main.ts ファイルを保存して閉じます。
| アプリ開発者 |
HTML コンテンツを調整します。 | app.component.html ファイルを開きます。 コンテンツを以下に置き換えます。 <h1>Shell application is running!</h1>
<router-outlet></router-outlet>
app.component.html ファイルを保存して閉じます。
| アプリ開発者 |
タスク | 説明 | 必要なスキル |
---|
マイクロフロントエンドを作成します。 | Angular でCLI、次のコマンドを入力します。 ng new mfe1 --routing
次のコマンドを入力して、プロジェクトフォルダに移動します。 cd mfe1
| アプリ開発者 |
プラグインをインストールします。 | 次のコマンドを入力して、@angular-architects/module-federation プラグインをインストールします。 ng add @angular-architects/module-federation --project mfe1 --port 5000
| アプリ開発者 |
モジュールとコンポーネントを作成します。 | 次のコマンドを入力してモジュールとコンポーネントを作成し、リモートエントリモジュールとしてエクスポートします。 ng g module mfe1 --routing
ng g c mfe1
| アプリ開発者 |
デフォルトのルーティングパスを設定します。 | mfe-routing.module.ts ファイルを開きます。 デフォルトルートを次のように設定します。 {
path: '',
component: Mfe1Component
},
mfe-routing.module.ts ファイルを保存して閉じます。
| アプリ開発者 |
mfe1 ルートを追加します。
| app-routing.module.ts ファイルを開きます。 デフォルトルートを次のように設定します。 {
path: '',
pathMatch: 'full',
redirectTo: 'mfe1'
},
次のmfe1 ルートを追加します。 {
path: 'mfe1',
loadChildren: () =>
import('./mfe1/mfe1.module').then((m) => m.Mfe1Module),
},
app-routing.module.ts ファイルを保存して閉じます。
| アプリ開発者 |
webpack.config.js ファイルを編集します。 | webpack.config.js ファイルを開きます。 For remotes セクションを編集して、以下と一致させます。
// For remotes (please adjust)
name: "mfe1",
filename: "remoteEntry.js",
exposes: {
'./Module': './src/app/mfe1/mfe1.module.ts',
},
shared セクションで、mfe1 アプリケーションがシェルアプリケーションと共有している依存関係を追加します。
shared: share({
"@angular/core": { singleton: true, strictVersion: true, requiredVersion: 'auto' },
"@angular/common": { singleton: true, strictVersion: true, requiredVersion: 'auto' },
"@angular/common/http": { singleton: true, strictVersion: true, requiredVersion: 'auto' },
"@angular/router": { singleton: true, strictVersion: true, requiredVersion: 'auto' },
...sharedMappings.getDescriptors()
})
webpack.config.js ファイルを保存して閉じます。
| アプリ開発者 |
HTML コンテンツを調整します。 | app.component.html ファイルを開きます。 内容を以下に置き換えます。 <router-outlet></router-outlet>
app.component.html ファイルを保存して閉じます。
| アプリ開発者 |
タスク | 説明 | 必要なスキル |
---|
mfe1 アプリケーションを実行します。
| 次のコマンドを入力してmfe1 アプリケーションを起動します。 npm start
ウェブブラウザで、 にアクセスしますhttp://localhost:5000 。 マイクロフロントエンドをスタンドアロンで実行できることを確認します。mfe1 アプリケーションはエラーなしで適切にレンダリングする必要があります。
| アプリ開発者 |
シェルアプリケーションを実行します。 | 次のコマンドを入力して、シェルアプリケーションを起動します。 npm start
ウェブブラウザで、 にアクセスしますhttp://localhost:4200/mfe1 。 mfe1 マイクロフロントエンドがシェルアプリケーションに埋め込まれていることを確認します。ポータルアプリケーションはエラーなしで適切にレンダリングされ、mfe1 アプリケーションはその中に埋め込まれている必要があります。
| アプリ開発者 |
タスク | 説明 | 必要なスキル |
---|
モジュールとコンポーネントを作成します。 | シェルアプリケーションのルートフォルダで、次のコマンドを入力して、エラーページのモジュールとコンポーネントを作成します。 ng g module error-page --routing
ng g c error-page
| アプリ開発者 |
HTML コンテンツを調整します。 | error-page.component.html ファイルを開きます。 内容を以下に置き換えます。 <p>Sorry, this page is not available.</p>
error-page.component.html ファイルを保存して閉じます。
| アプリ開発者 |
デフォルトのルーティングパスを設定します。 | error-page-routing.module.ts ファイルを開きます。 デフォルトルートを次のように設定します。 {
path: '',
component: ErrorPageComponent
},
error-page-routing.module.ts ファイルを保存して閉じます。
| アプリ開発者 |
マイクロフロントエンドをロードする関数を作成します。 | app-routing.module.ts ファイルを開きます。 次の関数を作成します。 function loadMFE(url: string) {
return loadRemoteModule({
type: 'module',
remoteEntry: `${url}/remoteEntry.js`,
exposedModule: './Module'
})
.then(m => m.Mfe1Module)
.catch(
() => import('./error-page/error-page.module').then(m => m.ErrorPageModule)
);
}
mfe1 ルートを次のように変更します。
{
path: 'mfe1',
loadChildren: () => loadMFE(environment.mfe1URL)
},
app-routing.module.ts ファイルを保存して閉じます。
| アプリ開発者 |
エラー処理をテストします。 | まだ実行されていない場合は、次のコマンドを入力してシェルアプリケーションを起動します。 npm start
ウェブブラウザで、 にアクセスしますhttp://localhost:4200/mfe1 。 エラーページがレンダリングされていることを確認します。次のテキストが表示されます。 Sorry, this page is not available.
| アプリ開発者 |
タスク | 説明 | 必要なスキル |
---|
マイクロフロントエンドをデプロイします。 | Amplify でCLI、マイクロフロントエンドアプリケーションのルートフォルダに移動します。 Amplify を初期化するには、次のコマンドを入力します。 amplify init
Amplify プロジェクトの名前を入力するように求められたら、Enter を押します。これにより、package.json ファイルの名前が再利用されます。 上記の設定でプロジェクトを初期化するように求められたら、 を入力しますYes 。 認証方法を選択するように求められたら、 を選択しますAWS Profile 。 使用するプロファイルを選択します。 Amplify がプロジェクトを初期化するのを待ちます。このプロセスが完了すると、ターミナルに確認メッセージが表示されます。 次のコマンドを入力して、Amplify ホスティングカテゴリをマイクロフロントエンドに追加します。 amplify add hosting
プラグインモジュールを選択するように求められたら、 を選択しますHosting with Amplify Console 。 タイプを選択するように求められたら、 を選択しますManual deployment 。 次のコマンドを入力して、プロジェクトの npm 依存関係をインストールします。 npm install
次のコマンドを入力して、アプリケーションを Amplify コンソールに発行します。 amplify publish -y
パブリッシュが完了すると、Amplify はマイクロフロントエンドURLの を返します。 をコピーしますURL。シェルアプリケーションを更新するには、この値が必要です。
| アプリデベロッパー、 AWS DevOps |
シェルアプリケーションをデプロイします。 | src/app/environments フォルダで environment.prod.ts ファイルを開きます。 mfe1URL 値をデプロイされたマイクロフロントエンドURLの に置き換えます。
export const environment = {
production: true,
mfe1URL: 'https://<env>.<Amplify-app-ID>.amplifyapp.com'
};
environment.prod.ts ファイルを保存して閉じます。 Amplify でCLI、シェルアプリケーションのルートフォルダに移動します。 Amplify を初期化するには、次のコマンドを入力します。 amplify init
Amplify プロジェクトの名前を入力するように求められたら、Enter を押します。これにより、package.json ファイルの名前が再利用されます。 上記の設定でプロジェクトを初期化するように求められたら、 と入力しますYes 。 認証方法を選択するように求められたら、 を選択しますAWS Profile 。 使用するプロファイルを選択します。 Amplify がプロジェクトを初期化するのを待ちます。このプロセスが完了すると、ターミナルに確認メッセージが表示されます。 Amplify ホスティングカテゴリをシェルアプリケーションに追加します。 amplify add hosting
プラグインモジュールを選択するように求められたら、 を選択しますHosting with Amplify Console 。 タイプを選択するように求められたら、 を選択しますManual deployment 。 次のコマンドを入力して、プロジェクトの npm 依存関係をインストールします。 npm install
次のコマンドを入力して、シェルアプリケーションを Amplify コンソールに発行します。 amplify publish -y
公開が完了すると、Amplify はURLデプロイされたシェルアプリケーションの を返します。 シェルアプリケーションの URLを書き留めます。
| アプリ開発者、アプリオーナー |
を有効にしますCORS。 | シェルとマイクロフロントエンドアプリケーションは異なるドメインで個別にホストされるため、マイクロフロントエンドでクロスオリジンリソース共有 (CORS) を有効にする必要があります。これにより、シェルアプリケーションは別のオリジンからコンテンツをロードできます。を有効にするにはCORS、カスタムヘッダーを追加します。 Amplify でCLI、マイクロフロントエンドのルートフォルダに移動します。 次のコマンドを入力します。 amplify configure hosting
カスタム設定を設定するように求められたら、 と入力しますY 。 にサインインし AWS Management Console、Amplify コンソール を開きます。 マイクロフロントエンドを選択します。 ナビゲーションペインで、ホスティング を選択し、カスタムヘッダー を選択します。 [編集] を選択します。 カスタムヘッダーの編集ウィンドウで、次のように入力します。 customHeaders:
- pattern: '*.js'
headers:
- key: Access-Control-Allow-Origin
value: '*'
- key: Access-Control-Allow-Methods
value: 'GET, OPTIONS'
- key: Access-Control-Allow-Headers
value: '*'
[Save] を選択します。 マイクロフロントエンドを再デプロイして、新しいカスタムヘッダーを適用します。
| アプリデベロッパー、 AWS DevOps |
シェルアプリケーションに書き換えルールを作成します。 | Angular シェルアプリケーションは、HTML5ルーティングを使用するように設定されています。ユーザーがハード更新を実行すると、Amplify は現在の からページをロードしようとしますURL。これにより、403 エラーが生成されます。これを回避するには、Amplify コンソールに書き換えルールを追加します。 書き換えルールを作成するには、次の手順に従います。 Amplify でCLI、シェルアプリケーションのルートフォルダに移動します。 次のコマンドを入力します。 amplify configure hosting
カスタム設定を設定するように求められたら、 と入力しますY 。 Amplify コンソールを開きます。 シェルアプリケーションを選択します。 ナビゲーションペインで、ホスティング を選択し、書き換えとリダイレクト を選択します。 書き換えとリダイレクトページで、リダイレクトの管理 を選択します。 テキストエディタを開く を選択します。 JSON エディタで、次のリダイレクトを入力します。 [
{
"source": "/<*>",
"target": "/index.html",
"status": "404-200",
"condition": null
}
]
[Save] を選択します。
| アプリデベロッパー、 AWS DevOps |
ウェブポータルをテストします。 | ウェブブラウザで、URLデプロイされたシェルアプリケーションの を入力します。 シェルアプリケーションとマイクロフロントエンドが正しくロードされていることを確認します。
| アプリ開発者 |
タスク | 説明 | 必要なスキル |
---|
アプリケーションを削除します。 | シェルとマイクロフロントエンドアプリケーションが不要になった場合は、削除します。これにより、使用していないリソースの料金を防ぐことができます。 にサインインし AWS Management Console、Amplify コンソール を開きます。 マイクロフロントエンドを選択します。 ナビゲーションペインで、アプリケーション設定 を選択し、全般設定 を選択します。 [Delete app] (アプリの削除) を選択します。 確認ウィンドウで と入力しdelete 、アプリの削除 を選択します。 シェルアプリケーションを削除するには、以下の手順を繰り返します。
| 全般 AWS |
トラブルシューティング
問題 | ソリューション |
---|
amplify init コマンドの実行時にプロファイルを AWS 使用できません
| AWS プロファイルが設定されていない場合でも、 amplify init コマンドを続行できます。ただし、認証方法の入力を求められた場合は、 AWS access keys オプションを選択する必要があります。 AWS アクセスキーとシークレットキーを使用可能にします。 または、 の名前付きプロファイルを設定することもできます AWS CLI。手順については、 AWS CLI ドキュメントの「設定と認証情報ファイルの設定」を参照してください。 |
リモートエントリのロードエラー | シェルアプリケーションの main.ts ファイルにリモートエントリをロードするときにエラーが発生した場合は、environment.mfe1URL 変数が正しく設定されていることを確認してください。この変数の値は、マイクロフロントエンドURLの である必要があります。 |
マイクロフロントエンドへのアクセス時の 404 エラー | などのローカルマイクロフロントエンドにアクセスしようとすると 404 エラーが発生した場合http://localhost:4200/mfe1 は、以下を確認してください。 シェルアプリケーションの場合、app-routing.module.ts ファイル内のルーティング設定が正しく設定されていること、およびloadRemoteModule 関数がマイクロフロントエンドを適切に呼び出していることを確認します。 マイクロフロントエンドの場合、webpack.config.js ファイルが正しくexposes 設定されていること、および remoteEntry.js ファイルが正しく生成されていることを確認します。
|
追加情報
AWS ドキュメント
その他のリファレンス