Traffine I/O

Bahasa Indonesia

2022-10-05

Presigned URL di Amazon S3

Apa itu Presigned URL

Presigned URL (Presigned URLs) adalah fitur unik yang ditawarkan oleh Amazon S3 yang memungkinkan akses sementara dan aman ke objek pribadi dalam ember S3 Anda. URL ini membawa informasi otentikasi yang diperlukan di dalamnya dan dihasilkan menggunakan kredensial keamanan AWS milik pemilik ember S3.

Pada dasarnya, Presigned URL adalah URL untuk objek di Amazon S3 yang ditambahkan dengan parameter tambahan untuk kredensial keamanan dan waktu kedaluwarsa. Setelah URL ini dihasilkan, siapa pun yang menerimanya dapat menggunakannya untuk mengakses objek tersebut. Hal ini tetap berlaku meskipun objeknya sebenarnya bersifat pribadi dan tidak dapat diakses oleh pengguna.

Presigned URL
AWS S3 Presigned URL Upload Tutorial in Python

Mengapa Menggunakan Presigned URL

Presigned URL (Presigned URLs) memberikan solusi yang efisien untuk berbagai kasus penggunaan. Salah satu alasan utama menggunakannya adalah ketika Anda perlu memberikan akses sementara ke objek pribadi. Hal ini berguna, misalnya, ketika Anda perlu membagikan file dengan seseorang, tetapi Anda tidak ingin mengubah izin objek tersebut atau mengelola daftar kontrol akses yang kompleks.

Kasus penggunaan umum lainnya adalah ketika Anda ingin membiarkan pengguna mengunggah atau mengunduh file ke/dari ember S3 Anda tanpa memerlukan mereka untuk memiliki akun AWS atau mengakses langsung kredensial AWS Anda. Misalnya, Anda dapat menghasilkan Presigned URL untuk operasi unggah dan memberikannya kepada pengguna. Pengguna kemudian dapat mengunggah file secara langsung ke ember S3 Anda menggunakan URL ini, dan semuanya dapat dilakukan tanpa mereka perlu mengetahui kunci akses AWS Anda.

Presigned URL (Presigned URLs) juga memiliki peran penting dalam pengembangan web. Mereka memungkinkan penyediaan tautan unduh langsung dari situs web atau aplikasi web tanpa perlu kode sisi server untuk mengambil file, yang dapat menghemat bandwidth dan meningkatkan kinerja.

Menggunakan Presigned URL di Amazon S3

Proses pembuatan Presigned URL bervariasi tergantung pada bahasa pemrograman dan SDK AWS yang Anda gunakan. Pada bab ini, saya akan mengilustrasikan proses tersebut menggunakan AWS SDK untuk Python yang dikenal sebagai Boto3.

Untuk operasi pengunduhan, kode Python berikut menghasilkan Presigned URL:

python
import boto3
from botocore.exceptions import NoCredentialsError

def create_presigned_url(bucket_name, object_name, expiration=3600):
    """Generate a presigned URL to share an S3 object

    :param bucket_name: string
    :param object_name: string
    :param expiration: Time in seconds for the presigned URL to remain valid
    :return: Presigned URL as string. If error, returns None.
    """

    # Generate a presigned URL for the S3 object
    s3_client = boto3.client('s3')
    try:
        response = s3_client.generate_presigned_url('get_object',
                                                    Params={'Bucket': bucket_name,
                                                            'Key': object_name},
                                                    ExpiresIn=expiration)
    except NoCredentialsError:
        return None

    # The response contains the presigned URL
    return response

Untuk operasi unggah, Anda dapat menghasilkan Presigned URL seperti berikut:

python
def create_presigned_post(bucket_name, object_name, fields=None, conditions=None, expiration=3600):
    """Generate a presigned URL S3 POST request to upload a file

    :param bucket_name: string
    :param object_name: string
    :param fields: Dictionary of prefilled form fields
    :param conditions: List of conditions to include in the policy
    :param expiration: Time in seconds for the presigned URL to remain valid
    :return: Dictionary with the following keys:
        url: URL to post to
        fields: Dictionary of form fields and values to submit with the post
    """

    # Generate a presigned S3 POST URL
    s3_client = boto3.client('s3')
    try:
        response = s3_client.generate_presigned_post(bucket_name,
                                                     object_name,
                                                     Fields=fields,
                                                     Conditions=conditions,
                                                     ExpiresIn=expiration)
    except NoCredentialsError:
        return None

    # The response contains the presigned URL and required fields
    return response

Setelah menjalankan kode ini dengan nama ember S3 dan kunci objek yang sesuai, Anda akan menerima respons yang terlihat seperti ini:

{
  "url": "https://mybucket.s3.amazonaws.com/",
  "fields": {
    "key": "myobjectkey",
    "AWSAccessKeyId": "AKIAIOSFODNN7EXAMPLE",
    "policy": "eyJleHBpcmF0aW9uIjogIjIwMjAtMDktMjlUMTk6MzA6MjBaIiwgImNv...",
    "signature": "b5cc6dc8dd2700d2a35f4e6a39c6b2b44b0215f5ecee0630..."
  }
}

Respons ini mencakup URL yang harus dikirimkan ke klien untuk POST dan bidang-bidang yang harus dimasukkan oleh klien dalam form-data permintaan POST.

Pada kedua contoh ini, Anda perlu menggantikan bucket_name dan object_name dengan nama ember S3 Anda dan kunci objek yang ingin Anda bagikan, secara berturut-turut.

Referensi

https://aws.amazon.com/blogs/storage/using-presigned-urls-to-identify-per-requester-usage-of-amazon-s3/
https://medium.com/@aidan.hallett/securing-aws-s3-uploads-using-presigned-urls-aa821c13ae8d
https://beabetterdev.com/2021/09/30/aws-s3-presigned-url-upload-tutorial-in-python/?noamp=mobile

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!