2024-04-28|閱讀時間 ‧ 約 27 分鐘

AWS CloudFront + multi S3 架構實驗

    實驗目的:Lambda@Edge (L@E) 讓 CLoudFront (CF) 回源時,自動選擇較近的 S3 region 回源

    讓我們接續此文,來實作看看~

    AWS CloudFront + multi S3 架構需求

    這裡準備 4 組 S3 buckets 分別為

    美國東部 (維吉尼亞北部) us-east-1,接近美洲用戶
    歐洲 (愛爾蘭) eu-west-1,接近歐洲用戶
    亞太區域 (東京) ap-northeast-1,接近亞洲用戶
    美國西部 (奧勒岡) us-west-2,其他區域所預設的


    buckets 會使用 index.html 檔案, 來區分不同區域
    如virginia用戶會看到virginia-us畫面


    CloudFront 設置

    Origins 加入這些 S3 buckets


    注意到這裡使用的Origin access 是 origin-access-identity 而不是採用 Origin Access Control (OAC) 的 S3 驗證方式


    當前使用 L@E 做多 region S3 動態回源時,必須使用舊的 OAI (Origin Accwess Identity) 來做驗證,才支援切換不同 region。

    這部分在 L@E 文件中有隱晦的提到 [1],指定不同 region S3 時,在 origin request 的 object 中,需指定 authMethod 為 origin-access-identity,並指定 region 參數



    如何建立OAI
    到Security > Origin access 選擇 Identities (legacy) 並建立


    套用在 Origin access - Legacy access identities 選項


    其他Origin重複此步驟即可

    behavior 中 Origin and origin groups 將設置為 我們預設的檔案區域


    接者我們要建置 Origin request Lambda function,注意該Lambda function 需要在us-east-1 建立


    這裡以 Python 3.8 示範[2]

    import json

    us_bucket = "mybucket-us.amazonaws.com"
    eu_bucket = "mybucket-eu.amazonaws.com"
    ap_bucket = "mybucket-ap.amazonaws.com"
    default_bucket = "mydefaultbucket-us.amazonaws.com"


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


    def lambda_handler(event, context):
    request = event['Records'][0]['cf']['request']

    origin_key = list(request['origin'].keys())[0]
    custom_headers = request['origin'][origin_key].get('customHeaders', {})


    if origin_key != 's3' in custom_headers:

    return request

    # Identify edge region
    lambda_region = context.invoked_function_arn.split(':')[3]

    # Get S3 bucket based on regions mapping
    domain_name = regions_mapping.get(lambda_region, default_bucket)
    #add
    bucket_region = domain_name.split('.')[2]


    # Update origin request object
    request['origin']['s3']['authMethod'] = "origin-access-identity"
    request['origin']['s3']['domainName'] = domain_name
    request['origin']['s3']['region'] = bucket_region
    request['headers']['host'] = [{'key': 'host', 'value': domain_name}]

    return request


    Deploy 後,接者要來部署 Lambda@Edge


    選擇 Distribution 與 behavior

    event 為 Origin request,就可以部署


    稍等CloudFront部署,在對應的 behavior 可以看到設置完成


    現在來檢視成果



    未來 OAI 將來廢除後如何達成這個需求。 雖然 OAI 被歸類於舊的功能,但是目前尚未有公開將 OAI 廢除的計畫,同時 OAI 仍被許多客戶使用中,此類重要功能如果預計廢除,一般官方會在 2~3 年前開始公告,並提供相關文件描述配套措施及轉移方式,同時也會提供移轉的緩沖期。 因此目前仍可以放心使用 OAI 來達成這項功能,且這是目前唯一可行的方式。謝謝Support Oscar 説明


    參考:
    [1] Lambda@Edge event structure - Request event fieldshttps://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-event-structure.html#request-event-fields

    [2] Lambda Function Demo Python Code

    https://aws.amazon.com/tw/blogs/networking-and-content-delivery/using-amazon-cloudfront-and-amazon-s3-to-build-multi-region-active-active-geo-proximity-applications/





    分享至
    成為作者繼續創作的動力吧!
    嗨嗨 https://www.linkedin.com/in/puff666/
    © 2024 vocus All rights reserved.