Amazon Lambda@edge を使用したマルチリージョン Nearby アプリケーションの構築

d38e74faf6ad8a81a60a9c325452eab4.gif

まとめ

この記事では、Amazon Lambda@edge と Amazon CloudFront を使用して、マルチリージョンの近隣アクセス アプリケーションを構築し、ユーザー エクスペリエンスを向上させる方法を紹介します。従来のマルチリージョン展開ソリューションとは異なり、このソリューションは Lambda@edge を使用して、オリジン リクエスト ステージでリクエストの特性を変更し、オリジン サイトのドメイン名を動的に変更して、近隣アクセスの目的を達成します。

シナリオ紹介

Web アプリケーションは西アメリカとシンガポールにデプロイされ、静的リソースは S3 を使用してデプロイされます。西アメリカとシンガポールのユーザーは、S3 を通じて写真/テキストなどの静的情報を読み取ります。S3 は現在シンガポールに導入されており、CF は静的リソースをキャッシュできますが、リソースの最初の読み込みやキャッシュの有効期限が切れると、西側のユーザーのアクセス時間が依然として長くなります。複数のリージョン ユーザーのアクセス エクスペリエンスを解決するソリューションを提供したいと考えています。

解決

S3 ストレージ バケットは、西アメリカとシンガポールの両方にデプロイできます。クライアントが CloudFront へのアクセスをリクエストしてからオリジン ソース サイトにアクセスするとき、Lambda@edge を使用して、オリジン リクエストの段階でリクエスト リクエストのドメインとホストを変更できます。機能は、近くのアクセスの目的を達成し、ユーザーエクスペリエンスを向上させるために、ソースサイトのドメイン名を動的に変更します。

建築計画

95453d0c1e58a10c7c4813e899c2a147.jpeg

作業過程

事前作業

1. Lambda@edge に関連付けられたオリジナルリクエストを CloudFront の Behavior に設定し、リクエストがオリジナルリクエストを通過するときに Lambda@edge を通じて変更します。

682168487d4ad4624dc22cef48f2dad1.jpeg

2. 米国西部とシンガポールに S3 バケットを作成し、S3 をターゲットとして CloudFront にオリジンを作成します。

c6df9747a7eefeb425f3c5db4c7e29ef.jpeg

(オプション) : S3 バケットに安全にアクセスする (パブリック アクセスを公開しない) ために、Cloudfront の OAC/OAI 認証方法を通じて S3 にアクセスできます。以下をサポートしているため、OAC (Origin Access Control) を使用することをお勧めします。

Amazon Website Service リージョン内のすべての Amazon S3 バケット (2022 年 12 月以降に利用可能なオプトイン リージョンを含む)。

▪ Amazon S3 は、Amazon KMS (SSE-KMS) によるサーバー側の暗号化を使用します。

Amazon S3 への動的リクエスト ( PUT および DELETE )。

OAC (オプション)の構成は以下のとおりです。

S3 ポリシーで OAC アクセスのみを構成する

{
    "Version": "2012-10-17",
    "Statement": {
        "Sid": "AllowCloudFrontServicePrincipalReadOnly",
        "Effect": "Allow",
        "Principal": {
            "Service": "cloudfront.amazonaws.com"
        },
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::<S3 bucket name>/*",
        "Condition": {
            "StringEquals": {
                "AWS:SourceArn": "arn:aws:cloudfront::<AWS 账户 ID>:distribution/<CloudFront distribution ID>"
            }
        }
    }
}

左にスワイプするとさらに表示されます

CloudFront のオリジンで OAC を有効にする

8438ea069e62f30f4035ec36dd29d856.jpeg

a26b361d1855eed4bfb6b0962c743d91.jpeg

[リクエストの署名] を選択すると、CloudFront は SigV4 を使用して、S3 に送信されるすべてのリクエストに署名します。これには、認証情報、日付、アクション、パラメーターなどが含まれます。これは認可ヘッドの形で S3 に送信され、情報を受け取った S3 はその情報を鍵で署名し、比較します。後処理リクエストを渡します。

最後に、オリジン グループを作成し、CloudFront の動作に関するオリジン設定をオリジン グループに変更します。

076923ee8d725a38faabfe4e22eb8574.jpeg

1c4f9e8cd3008b0085ea04bc10c86f0e.jpeg

具体的なプロセス

1. クライアントは CloudFront にリクエストを送信します。

2. リクエストがキャッシュにミスすると、エッジロケーションで、CloudFront はオリジンリクエストで Lambda@edge を呼び出します。

3. Lambda@edge は現在のリージョンのコードを読み取り、us-west2 または ap-southeast-1 を識別し、コード内のプリセット マップを使用します。リージョンに対応する S3 アドレスを見つけます (注: Route53 の遅延戦略に基づいて最適な S3 バケットの場所を見つけることもできます。リファレンスにはこの方法へのリンクがあります)。

4. Lambda@edge はリクエストのドメイン名アドレスを変更し、リクエストは対応する S3 バケットにルーティングされます。

5. バケットから取得したオブジェクトをクライアントに返します。

Lambda@edge コードは次のとおりです。

import json


us_bucket = "amazon-cloudfront-secure-static-site-s3bucketroot-21aorhazvsj1.s3.amazonaws.com"
ap_bucket = "amazon-cloudfront-sin-s3root.s3.ap-southeast-1.amazonaws.com"
default_bucket = "amazon-cloudfront-secure-static-site-s3bucketroot-21aorhazvsj1.s3.amazonaws.com"




s3Mapping = {
    "us-east-1": us_bucket,
    "us-east-2": us_bucket,
    "eu-central-1": us_bucket,
    "eu-west-2": us_bucket,
    "ap-southeast-1": ap_bucket
}






def lambda_handler(event, context):
   
    request = event['Records'][0]['cf']['request']
    defaultRequest = event['Records'][0]['cf']['request']
  
    print(request['origin'])
    print('req='+json.dumps(request))
    try:
        originKey = list(request['origin'].keys())[0]
        
        if originKey != 's3' 
            return request
    
        currentRegion = context.invoked_function_arn.split(':')[3]
        print("aaa="+currentRegion)
        domainName = s3Mapping.get(currentRegion, default_bucket)
        request['origin']['s3']['domainName'] = domainName
        request['headers']['host'] = [{'key': 'host', 'value': domainName}]
        return request
    except TypeError:
        print('modify s3 domain failure')
    
    return defaultRequest

左にスワイプするとさらに表示されます

要約する

この記事では、Lambda@edge を使用してマルチリージョンの近隣アクセス アプリケーションを構築する方法について説明します。これにより、ソースに戻るレイテンシが削減され、パフォーマンスが向上します。CloudFront で複数のリージョンにオリジン サイトを設定し、Lambda@edge を使用してオリジン リクエストの段階でリクエストの特性を変更し、オリジン サイトのドメイン名を動的に変更することで、近隣アクセスの目的を達成できます。さらに、このスキームには次の利点もあります。

  • 高可用性:オリジンサイトと CloudFront を複数のリージョンにデプロイすることで、特定のリージョンに問題が発生した場合でもアプリケーションに正常にアクセスできる高可用性を実現できます。

  • 高パフォーマンス:静的リソースを複数のリージョンに分散し、最新のリソースをエッジ ノードにキャッシュし、次のリクエストでキャッシュから直接取得することで、ソースに戻る回数と遅延が削減され、パフォーマンスが向上します。

  • 汎用性: S3 オリジン サイトの高速化に加えて、同様のソリューションを API ゲートウェイなどのサービスに適用して、リージョンを越えたアクセスを実現し、遅延を削減することもできます。

Lambda@edgeとCloudFrontを利用してマルチリージョン近傍アクセスアプリケーションを構築することで、ユーザーエクスペリエンスの向上、ソースへのバック遅延の削減、パフォーマンスの向上、高い可用性と汎用性を兼ね備えた、試す価値のあるソリューションです。

参考文献

OAC: Amazon CloudFront が Origin Access Control (OAC) を導入 | ネットワーキング

https://aws.amazon.com/cn/blogs/networking-and-content-delivery/amazon-cloudfront-introduces-origin-access-control-oac/

サインV4:

https://docs.aws.amazon.com/IAM/latest/UserGuide/signing-elements.html

Route53 の遅延ポリシーに基づいて API ゲートウェイを動的に変更します。

https://aws.amazon.com/cn/blogs/china/build-nft-offering-systems-with-cloud-native-components/

この記事の著者

10614d319a9374e379ac2893ff6a817e.jpeg

ヤン・ジュン

Amazon クラウド テクノロジーのシニア ソリューション アーキテクト。Amazon Cloud Technologyに入社する前は、主にEコマースや小売関連のシステム開発に従事し、小売業界での豊富な経験とエンタープライズクラウドの実務経験を有しています。

3b935c85c80c7e0650e149df3c134d92.jpeg

夏寧

Amazon クラウド テクノロジー ソリューション アーキテクトは、かつて Hewlett-Packard Software および Acoustic Network に勤務しており、10 年以上のフロントエンドおよびバックエンドの開発経験があり、さまざまなソフトウェア プロジェクトの設計を主導してきました。モバイルインターネット、オーディオとビデオ、クラウドコンピューティング関連分野に精通しています。

0655df270719fece230f1261773e9c2b.gif

df726c5c11372de45c56350a992685a3.gif

聞いたので、下の 4 つのボタンをクリックしてください

バグに遭遇することはありません!

5ddf80d2f77488ac3803e72f190ce971.gif

おすすめ

転載: blog.csdn.net/u012365585/article/details/132222607
おすすめ