Membongkar data dari klaster Amazon Redshift di seluruh akun ke Amazon S3 - AWS Prescriptive Guidance

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

Membongkar data dari klaster Amazon Redshift di seluruh akun ke Amazon S3

Andrew Kamel, Amazon Web Services

Ringkasan

Saat Anda menguji aplikasi, akan sangat membantu jika memiliki data produksi di lingkungan pengujian Anda. Menggunakan data produksi dapat memberi Anda penilaian yang lebih akurat tentang aplikasi yang sedang Anda kembangkan.

Pola ini mengekstrak data dari klaster Amazon Redshift di lingkungan produksi ke bucket Amazon Simple Storage Service (Amazon S3) di lingkungan pengembangan di Amazon Web Services ().AWS

Pola langkah-langkah melalui pengaturan akun DEV dan PROD, termasuk yang berikut:

  • Sumber daya yang dibutuhkan

  • AWS Identity and Access Management Peran (IAM)

  • Penyesuaian jaringan untuk subnet, grup keamanan, dan virtual private cloud (VPC) untuk mendukung koneksi Amazon Redshift

  • Contoh AWS Lambda fungsi dengan runtime Python untuk menguji arsitektur

Untuk memberikan akses ke klaster Amazon Redshift, pola tersebut digunakan AWS Secrets Manager untuk menyimpan kredensil yang relevan. Manfaatnya adalah memiliki semua informasi yang diperlukan untuk terhubung langsung ke cluster Amazon Redshift tanpa perlu mengetahui di mana cluster Amazon Redshift berada. Selain itu, Anda dapat memantau penggunaan rahasia.

Rahasia yang disimpan di Secrets Manager mencakup host cluster Amazon Redshift, nama database, port, dan kredenal yang relevan.

Untuk informasi tentang pertimbangan keamanan saat menggunakan pola ini, lihat bagian Praktik terbaik.

Prasyarat dan batasan

Prasyarat

Batasan

  • Bergantung pada jumlah data yang ingin Anda kueri, fungsi Lambda mungkin habis waktu.

    Jika proses Anda membutuhkan waktu lebih lama daripada batas waktu maksimum Lambda (15 menit), gunakan pendekatan asinkron untuk kode Lambda Anda. Contoh kode untuk pola ini menggunakan pustaka psycopg2 untuk Python, yang saat ini tidak mendukung pemrosesan asinkron.

  • Beberapa Layanan AWS tidak tersedia di semua Wilayah AWS. Untuk ketersediaan Wilayah, lihat Layanan AWS berdasarkan Wilayah. Untuk titik akhir tertentu, lihat halaman titik akhir dan kuota Layanan, dan pilih tautan untuk layanan.

Arsitektur

Diagram berikut menunjukkan arsitektur target, dengan akun DEV dan PROD.

VPC Lambda di akun DEV dan VPC Amazon Redshift di akun PROD.

Diagram menunjukkan alur kerja berikut:

  1. Fungsi Lambda di akun DEV mengasumsikan peran IAM yang diperlukan untuk mengakses kredensil Amazon Redshift di Secrets Manager di akun PROD.

    Fungsi Lambda kemudian mengambil rahasia cluster Amazon Redshift.

  2. Fungsi Lambda di akun DEV menggunakan informasi untuk terhubung ke cluster Amazon Redshift di akun PROD melalui peered. VPCs

    Fungsi Lambda kemudian mengirimkan perintah unload untuk menanyakan cluster Amazon Redshift di akun PROD.

  3. Cluster Amazon Redshift di akun PROD mengasumsikan peran IAM yang relevan untuk mengakses bucket S3 di akun DEV.

    Cluster Amazon Redshift membongkar data kueri ke bucket S3 di akun DEV.

Meminta data dari Amazon Redshift

Diagram berikut menunjukkan peran yang digunakan untuk mengambil kredenal Amazon Redshift dan terhubung ke cluster Amazon Redshift. Alur kerja diprakarsai oleh fungsi Lambda.

Proses tiga langkah untuk mengasumsikan peran di seluruh akun.

Diagram menunjukkan alur kerja berikut:

  1. CrossAccount-SM-Read-RoleDalam akun DEV mengasumsikan SM-Read-Role di akun PROD.

  2. SM-Read-RolePeran menggunakan kebijakan terlampir untuk mengambil rahasia dari Secrets Manager.

  3. Kredensialnya digunakan untuk mengakses kluster Amazon Redshift.

Mengunggah data ke Amazon S3

Diagram berikut menunjukkan proses baca-tulis lintas akun untuk mengekstrak data dan mengunggahnya ke Amazon S3. Alur kerja diprakarsai oleh fungsi Lambda. Pola ini merantai peran IAM di Amazon Redshift. Perintah unload yang berasal dari cluster Amazon Redshift mengasumsikan, dan kemudian CrossAccount-S3-Write-Role mengasumsikan. S3-Write-Role Rantai peran ini memberi Amazon Redshift akses ke Amazon S3.

Peran yang mendapatkan kredensil, mengakses Amazon Redshift, dan mengunggah data ke Amazon S3.

Alur kerja mencakup langkah-langkah berikut:

  1. CrossAccount-SM-Read-RoleDalam akun DEV mengasumsikan SM-Read-Role di akun PROD.

  2. Ini SM-Read-Role mengambil kredensi Amazon Redshift dari Secrets Manager.

  3. Fungsi Lambda terhubung ke cluster Amazon Redshift dan mengirimkan kueri.

  4. Cluster Amazon Redshift mengasumsikan. CrossAccount-S3-Write-Role

  5. CrossAccount-S3-Write-RoleMengasumsikan S3-Write-Role di akun DEV.

  6. Hasil kueri diturunkan ke bucket S3 di akun DEV.

Alat

Layanan AWS

  • AWS Key Management Service (AWS KMS) membantu Anda membuat dan mengontrol kunci kriptografi untuk membantu melindungi data Anda.

  • AWS Lambdaadalah layanan komputasi yang membantu Anda menjalankan kode tanpa perlu menyediakan atau mengelola server. Ini menjalankan kode Anda hanya bila diperlukan dan skala secara otomatis, jadi Anda hanya membayar untuk waktu komputasi yang Anda gunakan.

  • Amazon Redshift adalah layanan gudang data skala petabyte terkelola di AWS Cloud.

  • AWS Secrets Managermembantu Anda mengganti kredensi hardcode dalam kode Anda, termasuk kata sandi, dengan panggilan API ke Secrets Manager untuk mengambil rahasia secara terprogram.

  • Amazon Simple Storage Service (Amazon S3) adalah layanan penyimpanan objek berbasis cloud yang membantu Anda menyimpan, melindungi, dan mengambil sejumlah data.

Repositori kode

Kode untuk pola ini tersedia di repositori GitHub unload-redshift-to-s3-python.

Praktik terbaik

Penafian keamanan

Sebelum Anda menerapkan solusi ini, pertimbangkan rekomendasi keamanan penting berikut:

  • Ingatlah bahwa menghubungkan akun pengembangan dan produksi dapat meningkatkan cakupan dan menurunkan postur keamanan secara keseluruhan. Kami merekomendasikan untuk menerapkan solusi ini hanya sementara, mengekstrak bagian data yang diperlukan dan kemudian segera menghancurkan sumber daya yang digunakan. Untuk menghancurkan sumber daya, Anda harus menghapus fungsi Lambda, menghapus peran dan kebijakan IAM yang dibuat untuk solusi ini, dan mencabut akses jaringan apa pun yang diberikan di antara akun.

  • Konsultasikan dengan tim keamanan dan kepatuhan Anda sebelum menyalin data apa pun dari produksi ke lingkungan pengembangan. Informasi identitas pribadi (PII), Informasi kesehatan yang dilindungi (PHI), dan data rahasia atau teregulasi lainnya umumnya tidak boleh disalin dengan cara ini. Salin hanya informasi non-rahasia yang tersedia untuk umum (misalnya, data stok publik dari frontend toko). Pertimbangkan untuk mentokenisasi atau menganonimkan data, atau menghasilkan data uji sintetis, alih-alih menggunakan data produksi bila memungkinkan. Salah satu prinsip AWS keamanan adalah menjauhkan orang dari data. Dengan kata lain, pengembang tidak boleh melakukan operasi di akun produksi.

  • Batasi akses ke fungsi Lambda di akun pengembangan karena dapat membaca data dari cluster Amazon Redshift di lingkungan produksi.

  • Untuk menghindari gangguan lingkungan produksi, terapkan rekomendasi berikut:

    • Gunakan akun pengembangan khusus yang terpisah untuk kegiatan pengujian dan pengembangan.

    • Menerapkan kontrol akses jaringan yang ketat dan membatasi lalu lintas antar akun hanya untuk apa yang diperlukan.

    • Memantau dan mengaudit akses ke lingkungan produksi dan sumber data.

    • Menerapkan kontrol akses dengan hak istimewa paling rendah untuk semua sumber daya dan layanan yang terlibat.

    • Tinjau dan putar kredenal secara teratur, seperti AWS Secrets Manager rahasia dan kunci akses peran IAM.

  • Lihat dokumentasi keamanan berikut untuk layanan yang digunakan dalam artikel ini:

Keamanan adalah prioritas utama saat mengakses data dan sumber daya produksi. Selalu ikuti praktik terbaik, terapkan kontrol akses dengan hak istimewa, dan tinjau dan perbarui langkah-langkah keamanan Anda secara teratur.

Epik

TugasDeskripsiKeterampilan yang dibutuhkan

Buat rahasia untuk cluster Amazon Redshift.

Untuk membuat rahasia untuk cluster Amazon Redshift, lakukan hal berikut:

  1. Di akun PROD, masuk ke AWS Management Console, dan buka konsol Secrets Manager di https://console.aws.amazon.com/secretsmanager/.

  2. Pilih Simpan Rahasia baru.

  3. Pilih Kredensial untuk gudang data Amazon Redshift.

  4. Untuk nama Pengguna dan Kata Sandi, masukkan nilai untuk instans Anda, dan konfirmasikan atau pilih nilai untuk kunci Enkripsi.

  5. Pilih gudang data Amazon Redshift yang akan diakses rahasia Anda.

  6. Masukkan Redshift-Creds-Secret nama rahasianya.

  7. Selesaikan langkah-langkah pembuatan yang tersisa dengan pilihan default, lalu pilih Store.

  8. Lihat rahasia Anda, dan catat nilai Rahasia ARN yang dihasilkan untuk mengidentifikasi rahasia.

DevOps insinyur

Buat peran untuk mengakses Secrets Manager.

Untuk membuat peran, lakukan hal berikut:

  1. Di akun PROD, buka konsol IAM di. https://console.aws.amazon.com/iam/

  2. Pilih Policies (Kebijakan).

  3. Pilih Buat kebijakan.

  4. Pilih tab JSON, lalu masukkan kebijakan IAM seperti berikut ini:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetResourcePolicy", "secretsmanager:GetSecretValue", "secretsmanager:DescribeSecret", "secretsmanager:ListSecretVersionIds" ], "Resource": [ "<Redshift-Creds-Secret-ARN>" ] }, { "Effect": "Allow", "Action": "secretsmanager:ListSecrets", "Resource": "*" } ] }

    Ganti Redshift-Creds-Secret-ARN dengan Amazon Resource Name (ARN) dari rahasia Secrets Manager yang berisi informasi dan kredensil untuk cluster Amazon Redshift.

DevOps insinyur
TugasDeskripsiKeterampilan yang dibutuhkan

Buat peran untuk mengakses bucket S3.

Untuk membuat peran untuk mengakses bucket S3, lakukan hal berikut:

  1. Di akun DEV, buka konsol IAM.

  2.  Pilih Policies (Kebijakan).

  3. Pilih Buat kebijakan.

  4.  Pilih tab JSON, lalu masukkan kebijakan IAM seperti berikut ini:

    { "Version": "2012-10-17", "Statement": [ { "Sid": "kmsstmt", "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:Encrypt", "kms:GenerateDataKey" ], "Resource": [ "<kms-key-arn>" ] }, { "Sid": "s3stmt", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:Get*", "s3:List*" ], "Resource": [ "arn:aws:s3:::mybucket", "arn:aws:s3:::mybucket/*" ] } ] }

    Ganti mybucket dengan nama bucket S3 yang ingin Anda akses. Juga, jika bucket S3 dienkripsi, ganti kms-key-arn dengan ARN dari kunci AWS Key Management Service (AWS KMS) yang digunakan untuk mengenkripsi bucket S3. Jika tidak, Anda tidak memerlukan AWS KMS bagian dalam kebijakan.

  5. Pilih Kebijakan tinjauan, masukkan S3-Write-Policy sebagai nama kebijakan, lalu pilih Buat kebijakan.

  6. Di panel navigasi, pilih Peran.

  7.  Pilih Buat peran.

  8. Untuk peran entitas tepercaya, pilih Kebijakan kepercayaan khusus.

  9. Pilih Berikutnya: Izin, lalu pilih kebijakan S3-Write-Policy yang Anda buat.

  10. Masukkan S3-Write-Role sebagai nama peran, lalu pilih Buat peran.

DevOps insinyur

Buat peran Amazon Redshift.

Untuk membuat peran Amazon Redshift, lakukan hal berikut:

  1. Di akun PROD, buka konsol IAM.

  2. Pilih Policies (Kebijakan).

  3. Pilih Buat kebijakan.

  4. Pilih tab JSON, lalu masukkan kebijakan IAM seperti berikut ini:

    { "Version": "2012-10-17", "Statement": [ { "Sid": "CrossAccountPolicy", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "S3-Write-Role-ARN" } ] }

    Ganti S3-Write-Role-ARN dengan ARN untuk S3-Write-Role di akun DEV.

  5. Pilih Kebijakan tinjauan, masukkan S3-Write-Role-Assume-Policy sebagai nama kebijakan, lalu pilih Buat kebijakan.

  6. Di panel navigasi, pilih Peran, lalu pilih Buat peran.

  7. Pilih layanan AWS sebagai jenis entitas tepercaya Anda, lalu pilih Redshift, Redshift - Customizable.

  8. Pilih Berikutnya: Izin, lalu pilih kebijakan S3-Write-Role-Assume-Policy yang Anda buat.

  9. Masukkan CrossAccount-S3-Write-Role sebagai nama peran, lalu pilih Buat peran.

  10. Kaitkan peran IAM dengan cluster Amazon Redshift Anda.

DevOps insinyur
TugasDeskripsiKeterampilan yang dibutuhkan

Menyebarkan fungsi Lambda.

Untuk menerapkan fungsi Lambda di VPC peered, lakukan hal berikut:

  1. Buka konsol Lambda di. https://console.aws.amazon.com/lambda/

  2. Pilih Fungsi.

  3. Pilih Buat fungsi.

  4. Di bawah Informasi Dasar, untuk Nama fungsi, masukkan nama untuk fungsi Anda.

  5. Untuk Runtime, pilih Python 3.8.

  6. Perluas Ubah peran eksekusi default, lalu lakukan hal berikut:

    1. Pilih Gunakan peran yang ada.

    2. Untuk peran yang ada, pilih peran Lambda CrossAccount-RM-baca-peran yang Anda buat sebelumnya.

  7. Perluas Pengaturan lanjutan, dan lakukan hal berikut:

    1. Pilih kotak centang Aktifkan VPC.

    2. Untuk VPC, pilih VPC peered di akun DEV.

    3. Untuk Subnet, pilih subnet pribadi.

    4. Untuk grup Keamanan, pilih grup keamanan default.

  8. Pilih Buat fungsi.

  9. Tambahkan pustaka psycopg2 sebagai lapisan ke fungsi Lambda.

    catatan

    Anda dapat menggunakan layer yang sudah diterapkan dari repositori psycopg2-lambda-layer. Pastikan untuk menggunakan URL berdasarkan runtime Anda Wilayah AWS dan Python.

DevOps insinyur
TugasDeskripsiKeterampilan yang dibutuhkan

Impor sumber daya yang dibutuhkan.

Untuk mengimpor sumber daya yang diperlukan, jalankan perintah berikut:

import ast import boto3 import psycopg2 import base64 from botocore.exceptions import ClientError
Pengembang aplikasi

Jalankan fungsi handler Lambda.

Fungsi Lambda menggunakan AWS Security Token Service (AWS STS) untuk akses lintas akun dan manajemen kredensi sementara. Fungsi ini menggunakan operasi AssumeRole API untuk sementara mengasumsikan izin peran sm_read_role IAM.

Untuk menjalankan fungsi Lambda, gunakan kode contoh berikut:

def lambda_handler(event, context): sts_client = boto3.client('sts') # Secrets Manager Configurations secret_name = "redshift_creds" sm_region = "eu-west-1" sm_read_role = "arn:aws:iam::PROD_ACCOUNT_NUMBER:role/SM-Read-Role" # S3 Bucket Configurations s3_bucket_path = "s3://mybucket/" s3_bucket_region = "eu-west-1" s3_write_role = "arn:aws:iam::DEV_ACCOUNT_NUMBER:role/S3-Write-Role" # Redshift Configurations sql_query = "select * from category" redshift_db = "dev" redshift_s3_write_role = "arn:aws:iam::PROD_ACCOUNT_NUMBER:role/CrossAccount-S3-Write-Role" chained_s3_write_role = "%s,%s" % (redshift_s3_write_role, s3_write_role) assumed_role_object = sts_client.assume_role( RoleArn=sm_read_role, RoleSessionName="CrossAccountRoleAssumption", ExternalId="YOUR_EXTERNAL_ID", ) credentials = assumed_role_object['Credentials'] secret_dict = ast.literal_eval(get_secret(credentials, secret_name, sm_region)) execute_query(secret_dict, sql_query, s3_bucket_path, chained_s3_write_role, s3_bucket_region, redshift_db) return { 'statusCode': 200 }
Pengembang aplikasi

Dapatkan rahasianya.

Untuk mendapatkan rahasia Amazon Redshift, gunakan kode contoh berikut:

def get_secret(credentials, secret_name, sm_region): # Create a Secrets Manager client session = boto3.session.Session() sm_client = session.client( service_name='secretsmanager', aws_access_key_id=credentials['AccessKeyId'], aws_secret_access_key=credentials['SecretAccessKey'], aws_session_token=credentials['SessionToken'], region_name=sm_region ) try: get_secret_value_response = sm_client.get_secret_value( SecretId=secret_name ) except ClientError as e: print(e) raise e else: if 'SecretString' in get_secret_value_response: return get_secret_value_response['SecretString'] else: return base64.b64decode(get_secret_value_response['SecretBinary'])
Pengembang aplikasi

Jalankan perintah bongkar muat.

Untuk membongkar data ke bucket S3, gunakan kode contoh berikut.

def execute_query(secret_dict, sql_query, s3_bucket_path, chained_s3_write_role, s3_bucket_region, redshift_db): conn_string = "dbname='%s' port='%s' user='%s' password='%s' host='%s'" \ % (redshift_db, secret_dict["port"], secret_dict["username"], secret_dict["password"], secret_dict["host"]) con = psycopg2.connect(conn_string) unload_command = "UNLOAD ('{}') TO '{}' IAM_ROLE '{}' DELIMITER '|' REGION '{}';" \ .format(sql_query, s3_bucket_path + str(datetime.datetime.now()) + ".csv", chained_s3_write_role, s3_bucket_region) # Opening a cursor and run query cur = con.cursor() cur.execute(unload_command) print(cur.fetchone()) cur.close() con.close()
Pengembang aplikasi
TugasDeskripsiKeterampilan yang dibutuhkan

Hapus fungsi Lambda.

Untuk menghindari biaya yang tidak direncanakan, hapus sumber daya dan koneksi antara akun DEV dan PROD.

Untuk menghapus fungsi Lambda, lakukan hal berikut:

  1. Buka AWS Lambda konsol di https://console.aws.amazon.com/lambda/.

  2. Cari dan pilih fungsi Lambda yang Anda buat.

  3. Pilih Tindakan, lalu pilih Hapus.

  4. Konfirmasi penghapusan.

DevOps insinyur

Hapus peran dan kebijakan IAM.

Hapus peran dan kebijakan IAM dari akun DEV dan PROD.

Di akun DEV, lakukan hal berikut:

  1. Buka konsol IAM.

  2. Hapus peran berikut:

    • S3-Write-Role

    • CrossAccount-RM-Read-Role(Peran Lambda)

  3. Hapus kebijakan terkait:

    • S3-Write-Policy

    • CrossAccount Kebijakan untuk mengasumsikan peran akun PROD

Di akun PROD, lakukan hal berikut:

  1. Buka konsol IAM.

  2. Hapus peran berikut:

    • SM-Read-Role

    • CrossAccount-S3-Write-Role

  3. Hapus kebijakan terkait:

    • CrossAccount Kebijakan untuk mengakses Secrets Manager

    • S3-Write-Role-Assume-Policy

DevOps insinyur

Hapus rahasia di Secrets Manager.

Untuk menghapus rahasia, lakukan hal berikut:

  1. Di akun PROD, buka konsol Secrets Manager.

  2. Cari dan pilih rahasia bernamaRedshift-Creds-Secret.

  3. Pilih Tindakan, lalu pilih Hapus rahasia.

  4. Konfirmasi penghapusan.

DevOps insinyur

Hapus peering VPC dan aturan grup keamanan.

Untuk menghapus aturan VPC peering dan grup keamanan, lakukan hal berikut:

  1. Di akun PROD, buka EC2 konsol Amazon di https://console.aws.amazon.com/ec2/.

  2. Arahkan ke Grup Keamanan.

  3. Temukan grup keamanan yang digunakan oleh cluster Amazon Redshift.

  4. Edit aturan masuk, dan hapus aturan yang mengizinkan koneksi dari VPC Lambda akun DEV.

  5. Arahkan ke VPC Peering Connections, dan hapus koneksi peering.

DevOps insinyur

Hapus data dari bucket S3.

Untuk menghapus data dari Amazon S3, lakukan hal berikut:

  1. Di akun DEV, buka konsol Amazon S3 di. https://console.aws.amazon.com/s3/

  2. Temukan bucket yang Anda gunakan untuk penyimpanan data.

  3. Hapus objek di dalam ember, atau hapus seluruh bucket jika tidak diperlukan lagi.

DevOps insinyur

Bersihkan AWS KMS kunci.

Jika Anda membuat AWS KMS kunci khusus untuk enkripsi, lakukan hal berikut:

  1. Buka AWS KMS konsol di https://console.aws.amazon.com/kms/.

  2. Temukan kunci apa pun yang dibuat untuk pola ini.

  3. Jadwalkan kunci untuk dihapus. (Ada masa tunggu wajib untuk penghapusan kunci).

DevOps insinyur

Tinjau dan hapus CloudWatch log Amazon.

Untuk menghapus CloudWatch log, lakukan hal berikut:

  1. Buka CloudWatch konsol di https://console.aws.amazon.com/cloudwatch/.

  2. Periksa grup log apa pun yang dibuat oleh fungsi Lambda Anda atau cluster Amazon Redshift.

  3. Hapus grup log ini jika tidak lagi diperlukan.

DevOps insinyur

Sumber daya terkait

Informasi tambahan

Setelah Anda membongkar data dari Amazon Redshift ke Amazon S3, Anda dapat menganalisisnya dengan menggunakan Amazon Athena.

Amazon Athena adalah layanan kueri data besar yang bermanfaat ketika Anda perlu mengakses data dalam jumlah besar. Anda dapat menggunakan Athena tanpa harus menyediakan server atau database. Athena mendukung kueri yang kompleks, dan Anda dapat menjalankannya pada objek yang berbeda.

Seperti kebanyakan Layanan AWS, manfaat utama menggunakan Athena adalah memberikan fleksibilitas yang besar dalam cara Anda menjalankan kueri tanpa kerumitan tambahan. Saat Anda menggunakan Athena, Anda dapat menanyakan tipe data yang berbeda, seperti CSV dan JSON, di Amazon S3 tanpa mengubah tipe data. Anda dapat meminta data dari berbagai sumber, termasuk di luar AWS. Athena mengurangi kompleksitas karena Anda tidak perlu mengelola server. Athena membaca data langsung dari Amazon S3 tanpa memuat atau mengubah data sebelum Anda menjalankan kueri.