

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Batasi akses ke asal URL AWS Lambda fungsi
<a name="private-content-restricting-access-to-lambda"></a>

CloudFront menyediakan *kontrol akses asal* (OAC) untuk membatasi akses ke asal URL fungsi Lambda.

**Topics**
+ [Buat OAC baru](#create-oac-overview-lambda)
+ [Pengaturan lanjutan untuk kontrol akses asal](#oac-advanced-settings-lambda)
+ [Contoh kode template](#example-template-code-lambda-oac)

## Buat OAC baru
<a name="create-oac-overview-lambda"></a>

Selesaikan langkah-langkah yang dijelaskan dalam topik berikut untuk menyiapkan OAC baru. CloudFront

**penting**  
Jika Anda menggunakan `PUT` atau `POST` metode dengan URL fungsi Lambda Anda, pengguna Anda harus menghitung isi dan menyertakan nilai hash payload dari badan permintaan di `x-amz-content-sha256` header saat mengirim permintaan ke. SHA256 CloudFront Lambda tidak mendukung muatan yang tidak ditandatangani.

**Topics**
+ [Prasyarat](#oac-prerequisites-lambda)
+ [Berikan CloudFront izin untuk mengakses URL fungsi Lambda](#oac-permission-to-access-lambda)
+ [Buat OAC](#create-oac-lambda)

### Prasyarat
<a name="oac-prerequisites-lambda"></a>

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](DownloadDistS3AndCustomOrigins.md#concept_lambda_function_url).

### Berikan CloudFront izin untuk mengakses URL fungsi Lambda
<a name="oac-permission-to-access-lambda"></a>

Sebelum Anda membuat OAC atau mengaturnya dalam CloudFront distribusi, pastikan bahwa 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 tidak didukung saat ini.

 AWS CLI Perintah berikut memberikan akses CloudFront service principal (`cloudfront.amazonaws.com`) ke URL fungsi Lambda Anda. `Condition`Elemen dalam kebijakan memungkinkan CloudFront untuk mengakses Lambda *hanya* jika permintaan atas nama CloudFront distribusi yang berisi URL fungsi Lambda. Ini adalah distribusi dengan asal URL fungsi Lambda yang ingin Anda tambahkan OAC.

**Example : AWS CLI perintah untuk memperbarui kebijakan untuk mengizinkan akses hanya-baca untuk CloudFront distribusi dengan OAC diaktifkan**  
 AWS CLI Perintah berikut memungkinkan CloudFront distribusi (`E1PDK09ESKHJWT`) akses ke Lambda *`FUNCTION_URL_NAME`* Anda.

```
aws lambda add-permission \
--statement-id "AllowCloudFrontServicePrincipal" \
--action "lambda:InvokeFunctionUrl" \
--principal "cloudfront.amazonaws.com" \
--source-arn "arn:aws:cloudfront::123456789012:distribution/E1PDK09ESKHJWT" \
--function-name FUNCTION_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-name FUNCTION_URL_NAME
```

**catatan**  
Jika Anda membuat distribusi dan tidak memiliki izin ke URL fungsi Lambda Anda, Anda dapat memilih Salin perintah **CLI dari CloudFront konsol, lalu masukkan perintah** ini dari terminal baris perintah Anda. Untuk informasi selengkapnya, lihat [Memberikan akses fungsi Layanan AWS](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html#permissions-resource-serviceinvoke) di *Panduan AWS Lambda Pengembang*. 

### Buat OAC
<a name="create-oac-lambda"></a>

Untuk membuat OAC, Anda dapat menggunakan Konsol Manajemen AWS CloudFormation, AWS CLI, atau CloudFront API.

------
#### [ Console ]

**Untuk membuat OAC**

1. Masuk ke Konsol Manajemen AWS dan buka CloudFront konsol di[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home).

1. Di panel navigasi, pilih **Akses asal**.

1. Pilih **Buat pengaturan kontrol**.

1. Pada formulir **Create new OAC**, lakukan hal berikut:

   1. Masukkan **Nama** dan (opsional) **Deskripsi** untuk OAC.

   1. Untuk **perilaku Penandatanganan**, sebaiknya Anda meninggalkan pengaturan default (**Permintaan tanda tangan (disarankan)**). Untuk informasi selengkapnya, lihat [Pengaturan lanjutan untuk kontrol akses asal](#oac-advanced-settings-lambda).

1. Untuk **tipe Origin**, pilih **Lambda**. 

1. Pilih **Buat**.
**Tip**  
Setelah Anda membuat OAC, catat **Nama**. Anda membutuhkan ini dalam prosedur berikut.

**Untuk menambahkan kontrol akses asal ke URL fungsi Lambda dalam distribusi**

1. Buka CloudFront konsol di[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home).

1. **Pilih distribusi dengan URL fungsi Lambda yang ingin Anda tambahkan OAC, lalu pilih tab Origins.**

1. **Pilih URL fungsi Lambda yang ingin Anda tambahkan OAC, lalu pilih Edit.**

1. Pilih **HTTPS hanya** untuk **Protokol** asal Anda.

1. Dari menu tarik-turun **kontrol akses Origin**, pilih nama OAC yang ingin Anda gunakan.

1. Pilih **Simpan perubahan**.

Distribusi mulai menyebar ke semua lokasi CloudFront tepi. Ketika lokasi tepi menerima konfigurasi baru, ia menandatangani semua permintaan yang dikirim ke URL fungsi Lambda.

------
#### [ CloudFormation ]

Untuk membuat OAC dengan CloudFormation, gunakan jenis `AWS::CloudFront::OriginAccessControl` sumber daya. Contoh berikut menunjukkan sintaks CloudFormation template, dalam format YAMAL, untuk membuat OAC.

```
Type: AWS::CloudFront::OriginAccessControl
Properties: 
  OriginAccessControlConfig: 
      Description: An optional description for the origin access control
      Name: ExampleOAC
      OriginAccessControlOriginType: lambda
      SigningBehavior: always
      SigningProtocol: sigv4
```

Untuk informasi selengkapnya, lihat [AWS::CloudFront::OriginAccessKontrol](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-originaccesscontrol.html) di *Panduan AWS CloudFormation Pengguna*.

------
#### [ CLI ]

Untuk membuat kontrol akses asal dengan AWS Command Line Interface (AWS CLI), gunakan **aws cloudfront create-origin-access-control** perintah. Anda dapat menggunakan file input untuk memberikan parameter input untuk perintah, daripada menentukan setiap parameter individu sebagai input baris perintah.

**Untuk membuat kontrol akses asal (CLI dengan file input)**

1. Gunakan perintah berikut untuk membuat file yang diberi nama`origin-access-control.yaml`. File ini berisi semua parameter input untuk **create-origin-access-control** perintah.

   ```
   aws cloudfront create-origin-access-control --generate-cli-skeleton yaml-input > origin-access-control.yaml
   ```

1. Buka `origin-access-control.yaml` file yang baru saja Anda buat. Edit file untuk menambahkan nama untuk OAC, deskripsi (opsional), dan ubah `SigningBehavior` ke`always`. Kemudian simpan filenya.

   Untuk informasi tentang pengaturan OAC lainnya, lihat[Pengaturan lanjutan untuk kontrol akses asal](#oac-advanced-settings-lambda).

1. Gunakan perintah berikut untuk membuat kontrol akses asal menggunakan parameter input dari `origin-access-control.yaml` file.

   ```
   aws cloudfront create-origin-access-control --cli-input-yaml file://origin-access-control.yaml
   ```

   Catat `Id` nilai dalam output perintah. Anda membutuhkannya untuk menambahkan OAC ke URL fungsi Lambda dalam CloudFront distribusi.

**Untuk melampirkan OAC ke URL fungsi Lambda dalam distribusi yang ada (CLI dengan file input)**

1. Gunakan perintah berikut untuk menyimpan konfigurasi distribusi untuk CloudFront distribusi yang ingin Anda tambahkan OAC. Distribusi harus memiliki URL fungsi Lambda sebagai asal.

   ```
   aws cloudfront get-distribution-config --id <CloudFront distribution ID> --output yaml > dist-config.yaml
   ```

1. Buka file yang diberi nama `dist-config.yaml` yang baru saja Anda buat. Edit file akan membuat perubahan berikut:
   + Di `Origins` objek, tambahkan ID OAC ke bidang yang diberi `OriginAccessControlId` nama.
   + Hapus nilai dari bidang yang diberi nama`OriginAccessIdentity`, jika ada.
   + Ubah nama `ETag` bidang menjadi`IfMatch`, tetapi jangan ubah nilai bidang.

   Simpan file setelah selesai.

1. Gunakan perintah berikut untuk memperbarui distribusi untuk menggunakan kontrol akses asal.

   ```
   aws cloudfront update-distribution --id <CloudFront distribution ID> --cli-input-yaml file://dist-config.yaml
   ```

Distribusi mulai menyebar ke semua lokasi CloudFront tepi. Ketika lokasi tepi menerima konfigurasi baru, ia menandatangani semua permintaan yang dikirim ke URL fungsi Lambda.

------
#### [ API ]

Untuk membuat OAC dengan CloudFront API, gunakan [CreateOriginAccessControl](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateOriginAccessControl.html). Untuk informasi selengkapnya tentang bidang yang Anda tentukan dalam panggilan API ini, lihat dokumentasi referensi API untuk AWS SDK atau klien API lainnya.

Setelah membuat OAC, Anda dapat melampirkannya ke URL fungsi Lambda dalam distribusi, menggunakan salah satu panggilan API berikut:
+ Untuk melampirkannya ke distribusi yang ada, gunakan [UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html).
+ Untuk melampirkannya ke distribusi baru, gunakan [CreateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateDistribution.html).

Untuk kedua panggilan API ini, berikan ID OAC di `OriginAccessControlId` bidang, di dalam asal. Untuk informasi selengkapnya tentang bidang lain yang Anda tentukan dalam panggilan API ini, lihat dan dokumentasi referensi API untuk AWS SDK atau klien API lainnya.

------

## Pengaturan lanjutan untuk kontrol akses asal
<a name="oac-advanced-settings-lambda"></a>

Fitur CloudFront OAC mencakup pengaturan lanjutan yang ditujukan hanya untuk kasus penggunaan tertentu. Gunakan pengaturan yang disarankan kecuali Anda memiliki kebutuhan khusus untuk pengaturan lanjutan.

OAC berisi setelan bernama **Perilaku penandatanganan** (di konsol), atau `SigningBehavior` (di API, CLI, CloudFormation dan). Pengaturan ini menyediakan opsi berikut:

**Selalu tandatangani permintaan asal (pengaturan yang disarankan)**  
Sebaiknya gunakan pengaturan ini, bernama **Permintaan tanda (disarankan)** di konsol, atau `always` di API, CLI, dan. CloudFormation Dengan pengaturan ini, CloudFront selalu tandatangani semua permintaan yang dikirimkan ke URL fungsi Lambda.

**Jangan pernah menandatangani permintaan asal**  
Pengaturan ini diberi nama **Jangan menandatangani permintaan** di konsol, atau `never` di 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 dikirimkan ke URL fungsi Lambda.  
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 CloudFront meneruskan kesalahan tersebut ke pemirsa. Untuk informasi selengkapnya, lihat [Model keamanan dan autentikasi untuk URLs fungsi Lambda](https://docs.aws.amazon.com/lambda/latest/dg/urls-auth.html) di Panduan Pengguna *AWS Lambda .*

**Jangan mengganti header penampil (klien) `Authorization`**  
Pengaturan ini diberi nama **Jangan timpa header otorisasi** di konsol, atau `no-override` di API, CLI, dan. CloudFormation Gunakan setelan ini saat Anda CloudFront ingin menandatangani permintaan asal hanya jika permintaan penampil yang sesuai tidak menyertakan `Authorization` header. Dengan pengaturan ini, CloudFront meneruskan `Authorization` header dari permintaan penampil saat ada, tetapi menandatangani permintaan asal (menambahkan tajuknya sendiri`Authorization`) saat permintaan penampil tidak menyertakan `Authorization` header.  
+ Jika Anda menggunakan setelan ini, Anda harus menentukan penandatanganan Tanda Tangan Versi 4 untuk URL fungsi Lambda, bukan nama CloudFront distribusi atau CNAME. Saat CloudFront meneruskan `Authorization` header 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, menghasilkan kesalahan validasi tanda tangan.
+ Untuk meneruskan `Authorization` header dari permintaan penampil, Anda *harus* menambahkan `Authorization` header ke [kebijakan cache](controlling-the-cache-key.md) untuk semua perilaku cache yang menggunakan fungsi Lambda yang URLs terkait dengan kontrol akses asal ini.

## Contoh kode template
<a name="example-template-code-lambda-oac"></a>

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 **Selalu menandatangani permintaan asal** dan Anda tidak memilih setelan header **Jangan timpa otorisasi**.

Konfigurasi ini memungkinkan OAC untuk 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 CloudFront melalui, dan AWS menggunakan mekanisme otentikasi untuk memastikan bahwa hanya permintaan resmi yang dapat mengakses fungsi Lambda.

**Kode ini mencakup fungsionalitas berikut:**  
Memenuhi persyaratan untuk memasukkan hash payload di header x-amz-content-sha256
Menggunakan otentikasi SiGv4 untuk akses aman Layanan AWS 
Mendukung unggahan 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)
```