Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Membatasi akses ke AWS Lambda fungsi URL asal
CloudFront menyediakan kontrol akses asal (OAC) untuk membatasi akses ke sumber URL fungsi Lambda.
Buat OAC baru
Selesaikan langkah-langkah yang dijelaskan dalam topik berikut untuk menyiapkan OAC baru di CloudFront.
penting
Jika Anda menggunakan POST metode PUT atau dengan URL fungsi Lambda, pengguna Anda harus menghitung SHA256 dari tubuh dan menyertakan nilai hash payload dari isi permintaan di x-amz-content-sha256 header saat mengirim permintaan ke. CloudFront Lambda tidak mendukung payload yang tidak ditandatangani.
Prasyarat
Sebelum Anda membuat dan mengatur OAC, Anda harus memiliki CloudFront distribusi dengan URL fungsi Lambda sebagai asal. Untuk menggunakan OAC, Anda harus menentukan AWS_IAM sebagai nilai untuk AuthType parameter. Untuk informasi selengkapnya, lihat Gunakan URL fungsi Lambda.
Ber CloudFront ikan izin untuk mengakses URL fungsi Lambda
Sebelum Anda membuat OAC atau mengaturnya dalam CloudFront distribusi, pastikan itu CloudFront memiliki izin untuk mengakses URL fungsi Lambda. Lakukan ini setelah Anda membuat CloudFront distribusi, tetapi sebelum Anda menambahkan OAC ke URL fungsi Lambda dalam konfigurasi distribusi.
catatan
Untuk memperbarui kebijakan IAM untuk URL fungsi Lambda, Anda harus menggunakan AWS Command Line Interface ()AWS CLI. Mengedit kebijakan IAM di konsol Lambda saat ini tidak didukung.
Per AWS CLI intah berikut memberikan akses CloudFront service principal (cloudfront.amazonaws.com) ke URL fungsi Lambda Anda. ConditionElemen dalam kebijakan memungkinkan CloudFront untuk mengakses Lamb da hanya jika permintaan atas nama CloudFront distribusi yang berisi URL fungsi Lambda. Ini adalah distribusi dengan fungsi Lambda URL asal yang ingin Anda tambahkan OAC.
contoh: AWS CLI perintah untuk memperbarui kebijakan untuk mengizinkan akses baca-saja untuk CloudFront distribusi dengan OAC diaktifkan
Per AWS CLI intah berikut memungkinkan CloudFront distribusi () akses ke Lambda E1PDK09ESKHJWT Anda.FUNCTION_URL_NAME
aws lambda add-permission \ --statement-id "AllowCloudFrontServicePrincipal" \ --action "lambda:InvokeFunctionUrl" \ --principal "cloudfront.amazonaws.com" \ --source-arn "arn:aws:cloudfront::123456789012:distribution/E1PDK09ESKHJWT" \ --function-nameFUNCTION_URL_NAME
aws lambda add-permission \ --statement-id "AllowCloudFrontServicePrincipalInvokeFunction" \ --action "lambda:InvokeFunction" \ --principal "cloudfront.amazonaws.com" \ --source-arn "arn:aws:cloudfront::123456789012:distribution/E1PDK09ESKHJWT" \ --function-nameFUNCTION_URL_NAME
catatan
Jika Anda membuat distribusi dan tidak memiliki izin ke URL fungsi Lambda Anda, Anda dapat memilih Sal in perintah CLI dari CloudFront konsol, lalu masukkan perintah ini dari terminal baris perintah Anda. Untuk informasi selengkapnya, lihat Memberikan akses fungsi ke Layanan AWS dalam Panduan AWS Lambda Pengembang.
Buat OAC
Untuk membuat OAC, Anda dapat menggunakan Konsol Manajemen AWS, CloudFormation, AWS CLI, atau CloudFront API.
Pengaturan lanjutan untuk kontrol akses asal
Fitur CloudFront OAC mencakup pengaturan lanjutan yang dimaksudkan hanya untuk kasus penggunaan tertentu. Gunakan pengaturan yang disarankan kecuali Anda memiliki kebutuhan khusus untuk pengaturan lanjutan.
OAC berisi pengaturan bernama Perilaku penandatanganan (di konsol), atau SigningBehavior (di API, CLI, dan CloudFormation). Pengaturan ini menyediakan opsi berikut:
- Selalu tanda tangani permintaan asal (pengaturan yang disarankan)
-
Sebaiknya gunakan setelan ini, bernama Permintaan tanda tangani (disarankan) di konsol, atau
alwaysdi API, CLI, dan CloudFormation. Dengan pengaturan ini, CloudFront selalu menandatangani semua permintaan yang dikirim ke URL fungsi Lambda. - Jangan pernah menandatangani permintaan asal
-
Setelan ini diberi nama Jangan menandatangani permintaan di konsol, atau
neverdi API, CLI, dan CloudFormation. Gunakan pengaturan ini untuk mematikan OAC untuk semua asal di semua distribusi yang menggunakan OAC ini. Ini dapat menghemat waktu dan tenaga dibandingkan dengan menghapus OAC dari semua asal dan distribusi yang menggunakannya, satu per satu. Dengan pengaturan ini, CloudFront tidak menandatangani permintaan apa pun yang dikirim ke URL fungsi Lambda.Awas
Untuk menggunakan pengaturan ini, URL fungsi Lambda harus dapat diakses publik. Jika Anda menggunakan setelan ini dengan URL fungsi Lambda yang tidak dapat diakses publik, tidak CloudFront dapat mengakses asal. URL fungsi Lambda mengembalikan kesalahan ke CloudFront dan meneruskan CloudFront kesalahan tersebut ke pemirsa. Untuk informasi selengkapnya, lihat Model keamanan dan autentikasi untuk URL fungsi Lambda di Panduan AWS Lambda Pengguna.
- Jangan mengganti header penampil (klien)
Authorization -
Pengaturan ini diberi nama Jangan mengganti header otorisasi di konsol, atau
no-overridedi API, CLI, dan. CloudFormation Gunakan pengaturan ini jika Anda CloudFront ingin menandatangani permintaan asal hanya jika permintaan penampil yang sesuai tidak menyertakanAuthorizationheader. Dengan pengaturan ini CloudFront , meneruskanAuthorizationheader dari permintaan penampil ketika ada, tetapi menandatangani permintaan asal (menambahkanAuthorizationheader sendiri) ketika permintaan penampil tidak menyertakanAuthorizationheader.Awas
-
Jika Anda menggunakan setelan ini, Anda harus menentukan tanda tangan versi 4 penandatanganan untuk URL fungsi Lambda alih-alih nama CloudFront distribusi atau CNAME. Saat CloudFront meneruskan
Authorizationheader dari permintaan penampil ke URL fungsi Lambda, Lambda akan memvalidasi tanda tangan terhadap host domain URL Lambda. Jika tanda tangan tidak didasarkan pada domain URL Lambda, host dalam tanda tangan tidak akan cocok dengan host yang digunakan oleh asal URL Lambda. Ini berarti permintaan akan gagal, mengakibatkan kesalahan validasi tanda tangan.
-
Untuk meneruskan
Authorizationheader dari permintaan penampil, Anda harus menambahkanAuthorizationheader ke kebijakan cache untuk semua perilaku cache yang menggunakan URL fungsi Lambda yang terkait dengan kontrol akses asal ini.
-
Contoh kode template
Jika CloudFront asal Anda adalah URL fungsi Lambda yang terkait dengan OAC, Anda dapat menggunakan skrip Python berikut untuk mengunggah file ke fungsi Lambda dengan metode tersebut. POST
Kode ini mengasumsikan bahwa Anda mengonfigurasi OAC dengan perilaku penandatanganan default yang disetel ke Sel alu tanda tang ani permintaan asal dan bahwa Anda tidak memilih setelan Do not override otorisasi header.
Konfigurasi ini memungkinkan OAC mengelola otorisasi SIGv4 dengan benar dengan Lambda dengan menggunakan nama host Lambda. Payload ditandatangani dengan menggunakan SIGv4 dari identitas IAM yang diotorisasi untuk URL fungsi Lambda, yang ditetapkan sebagai tipe. IAM_AUTH
Template menunjukkan cara menangani nilai hash payload yang ditandatangani di x-amz-content-sha256 header untuk POST permintaan dari sisi klien. Secara khusus, template ini dirancang untuk mengelola muatan data formulir. Template memungkinkan unggahan file aman ke URL fungsi Lambda melalui CloudFront, dan menggunakan mekanisme AWS otentikasi untuk memastikan bahwa hanya permintaan resmi yang dapat mengakses fungsi Lambda.
Kode mencakup fungsionalitas berikut:
-
Memenuhi persyaratan untuk memasukkan hash payload di header x-amz-content-sha256
-
Menggunakan otentikasi SIGv4 untuk akses aman Layanan AWS
-
Mendukung upload file dengan menggunakan data formulir multi-bagian
-
Termasuk penanganan kesalahan untuk pengecualian permintaan
import boto3 from botocore.auth import SigV4Auth from botocore.awsrequest import AWSRequest import requests import hashlib import os def calculate_body_hash(body): return hashlib.sha256(body).hexdigest() def sign_request(request, credentials, region, service): sigv4 = SigV4Auth(credentials, service, region) sigv4.add_auth(request) def upload_file_to_lambda(cloudfront_url, file_path, region): # AWS credentials session = boto3.Session() credentials = session.get_credentials() # Prepare the multipart form-data boundary = "------------------------boundary" # Read file content with open(file_path, 'rb') as file: file_content = file.read() # Get the filename from the path filename = os.path.basename(file_path) # Prepare the multipart body body = ( f'--{boundary}\r\n' f'Content-Disposition: form-data; name="file"; filename="{filename}"\r\n' f'Content-Type: application/octet-stream\r\n\r\n' ).encode('utf-8') body += file_content body += f'\r\n--{boundary}--\r\n'.encode('utf-8') # Calculate SHA256 hash of the entire body body_hash = calculate_body_hash(body) # Prepare headers headers = { 'Content-Type': f'multipart/form-data; boundary={boundary}', 'x-amz-content-sha256': body_hash } # Create the request request = AWSRequest( method='POST', url=cloudfront_url, data=body, headers=headers ) # Sign the request sign_request(request, credentials, region, 'lambda') # Get the signed headers signed_headers = dict(request.headers) # Print request headers before sending print("Request Headers:") for header, value in signed_headers.items(): print(f"{header}: {value}") try: # Send POST request with signed headers response = requests.post( cloudfront_url, data=body, headers=signed_headers ) # Print response status and content print(f"\nStatus code: {response.status_code}") print("Response:", response.text) # Print response headers print("\nResponse Headers:") for header, value in response.headers.items(): print(f"{header}: {value}") except requests.exceptions.RequestException as e: print(f"An error occurred: {e}") # Usage cloudfront_url = "https://d111111abcdef8.cloudfront.net" file_path = r"filepath" region = "us-east-1" # example: "us-west-2" upload_file_to_lambda(cloudfront_url, file_path, region)