1. Ringkasan
Dalam codelab ini, Anda akan berfokus pada penggunaan Secret Manager di Python.
Dengan Secret Manager, Anda dapat menyimpan, mengelola, dan mengakses secret sebagai blob biner atau string teks. Dengan izin yang sesuai, Anda dapat melihat isi rahasia.
Secret Manager berfungsi dengan baik untuk menyimpan informasi konfigurasi seperti sandi database, kunci API, atau sertifikat TLS yang diperlukan oleh aplikasi saat runtime.
Yang akan Anda pelajari
- Cara menggunakan Cloud Shell
- Cara menginstal library klien Secret Manager untuk Python
- Cara membuat dan mengakses secret menggunakan library klien Python
- Cara mengakses secret di Cloud Functions menggunakan library klien Python
Yang Anda butuhkan
Survei
Bagaimana Anda akan menggunakan tutorial ini?
Bagaimana penilaian Anda terhadap pengalaman dengan Python?
Bagaimana penilaian Anda terhadap pengalaman menggunakan layanan Google Cloud?
2. Penyiapan dan Persyaratan
Penyiapan lingkungan mandiri
- Login ke Google Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.
- Project name adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API. Anda dapat memperbaruinya kapan saja.
- Project ID harus unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis membuat string unik; biasanya Anda tidak
peduli tentang apa itu. Di sebagian besar codelab, Anda harus mereferensikan Project ID (biasanya diidentifikasi sebagai
PROJECT_ID
). Jika Anda tidak menyukai ID yang dihasilkan, Anda dapat membuat ID acak lainnya. Atau, Anda dapat mencobanya sendiri dan lihat apakah ID tersebut tersedia. ID tidak dapat diubah setelah langkah ini dan akan tetap ada selama durasi project. - Sebagai informasi, ada nilai ketiga, Project Number yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
- Selanjutnya, Anda harus mengaktifkan penagihan di Konsol Cloud untuk menggunakan resource/API Cloud. Menjalankan operasi dalam codelab ini seharusnya tidak memerlukan banyak biaya, bahkan mungkin tidak sama sekali. Untuk mematikan resource agar tidak menimbulkan penagihan di luar tutorial ini, Anda dapat menghapus resource yang dibuat atau menghapus seluruh project. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.
Mulai Cloud Shell
Meskipun Google Cloud dapat dioperasikan dari jarak jauh menggunakan laptop Anda, dalam codelab ini, Anda akan menggunakan Google Cloud Shell, lingkungan command line yang berjalan di Cloud.
Mengaktifkan Cloud Shell
- Dari Cloud Console, klik Aktifkan Cloud Shell .
Jika belum pernah memulai Cloud Shell, Anda akan melihat layar perantara (di paruh bawah) yang menjelaskan apa itu Cloud Shell. Jika demikian, klik Lanjutkan (dan Anda tidak akan pernah melihatnya lagi). Berikut tampilan layar sekali-tampil tersebut:
Perlu waktu beberapa saat untuk penyediaan dan terhubung ke Cloud Shell.
Mesin virtual ini dimuat dengan semua alat pengembangan yang Anda butuhkan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Sebagian besar pekerjaan Anda dalam codelab ini dapat dilakukan hanya dengan browser atau Chromebook.
Setelah terhubung ke Cloud Shell, Anda akan melihat bahwa Anda sudah diautentikasi dan project sudah ditetapkan ke project ID Anda.
- Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa Anda telah diautentikasi:
gcloud auth list
Output perintah
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa perintah gcloud mengetahui project Anda:
gcloud config list project
Output perintah
[core] project = <PROJECT_ID>
Jika tidak, Anda dapat menyetelnya dengan perintah ini:
gcloud config set project <PROJECT_ID>
Output perintah
Updated property [core/project].
3. Mengaktifkan Secret Manager API
Sebelum dapat mulai menggunakan Secret Manager API, Anda harus mengaktifkan API tersebut. Dengan Cloud Shell, Anda dapat mengaktifkan API dengan perintah berikut:
gcloud services enable secretmanager.googleapis.com
Anda akan melihat output seperti ini:
Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.
4. Menginstal library klien Secret Manager untuk Python
Instal Library Klien Secret Manager:
pip3 install --user google-cloud-secret-manager==2.10.0
5. Memulai Python Interaktif
Untuk bagian tutorial ini, Anda akan menggunakan penafsir Python interaktif yang disebut IPython, yang sudah terinstal dalam Cloud Shell. Mulai sesi dengan menjalankan ipython
di Cloud Shell:
ipython
Anda akan melihat sesuatu seperti ini:
Python 3.9.2 (default, Feb 28 2021, 17:03:44) Type 'copyright', 'credits' or 'license' for more information IPython 8.3.0 -- An enhanced Interactive Python. Type '?' for help. In [1]:
6. Membuat Secret
Rahasia berisi satu atau beberapa versi secret. Skrip ini dapat dibuat menggunakan command line gcloud
, tetapi juga dapat dibuat menggunakan Python.
Untuk menggunakan rahasia, Anda harus terlebih dahulu membuat rahasia dengan nama rahasia, lalu menambahkan versi rahasia, yang menjadi nilai rahasia tersebut.
Tetapkan Project ID Anda dalam IPython:
PROJECT_ID = "<PROJECT_ID>"
Membuat secret
Salin kode berikut ke dalam sesi IPython:
from google.cloud import secretmanager
def create_secret(secret_id):
# Create the Secret Manager client.
client = secretmanager.SecretManagerServiceClient()
# Build the resource name of the parent project.
parent = f"projects/{PROJECT_ID}"
# Build a dict of settings for the secret
secret = {'replication': {'automatic': {}}}
# Create the secret
response = client.create_secret(secret_id=secret_id, parent=parent, secret=secret)
# Print the new secret name.
print(f'Created secret: {response.name}')
Panggil fungsi untuk membuat secret baru bernama my_secret_value
:
create_secret("my_secret_value")
Anda akan melihat output berikut:
Created secret: projects/<PROJECT_NUM>/secrets/my_secret_value
Menambahkan versi rahasia
Setelah rahasia itu dibuat, Anda dapat menetapkan nilai padanya dengan membuat versi.
Salin kode berikut ke dalam sesi IPython:
def add_secret_version(secret_id, payload):
# Create the Secret Manager client.
client = secretmanager.SecretManagerServiceClient()
# Build the resource name of the parent secret.
parent = f"projects/{PROJECT_ID}/secrets/{secret_id}"
# Convert the string payload into a bytes. This step can be omitted if you
# pass in bytes instead of a str for the payload argument.
payload = payload.encode('UTF-8')
# Add the secret version.
response = client.add_secret_version(parent=parent, payload={'data': payload})
# Print the new secret version name.
print(f'Added secret version: {response.name}')
Panggil fungsi untuk membuat versi secret baru:
add_secret_version("my_secret_value", "Hello Secret Manager")
Anda akan melihat output berikut:
Added secret version: projects/<PROJECT_NUM>/secrets/my_secret_value/versions/1
Rahasia dapat memiliki beberapa versi. Panggil lagi fungsi tersebut dengan nilai yang berbeda:
add_secret_version("my_secret_value", "Hello Again, Secret Manager")
Anda akan melihat output berikut:
Added secret version: projects/<PROJECT_NUM>/secrets/my_secret_value/versions/2
Perhatikan bagaimana versi baru rahasia kita secara signifikan lebih panjang daripada versi aslinya. Atribut ini akan dirujuk nanti.
7. Mengakses secret
Mengakses versi secret akan menampilkan konten rahasia, serta metadata tambahan tentang versi secret tersebut. Saat mengakses versi secret, Anda dapat menentukan versi tertentu, atau cukup meminta versi terbaru dengan menentukan "latest".
Rahasia harus dirahasiakan. Menyimpan kredensial database sebagai rahasia, lalu menggunakannya untuk mengautentikasi, atau menyimpan sertifikasi dan menggunakannya; tetapi jangan langsung mencetak rahasia Anda, karena hal ini menggagalkan tujuan dari merahasiakannya.
Anda akan melakukan operasi pada secret kita, menilai nilainya tanpa mencetaknya secara langsung. Sebagai gantinya, Anda akan mencetak hash dari nilai rahasia.
Salin kode berikut ke dalam sesi IPython:
def access_secret_version(secret_id, version_id="latest"):
# Create the Secret Manager client.
client = secretmanager.SecretManagerServiceClient()
# Build the resource name of the secret version.
name = f"projects/{PROJECT_ID}/secrets/{secret_id}/versions/{version_id}"
# Access the secret version.
response = client.access_secret_version(name=name)
# Return the decoded payload.
return response.payload.data.decode('UTF-8')
import hashlib
def secret_hash(secret_value):
# return the sha224 hash of the secret value
return hashlib.sha224(bytes(secret_value, "utf-8")).hexdigest()
Panggil fungsi untuk mengambil rahasia sebagai hash nilainya:
secret_hash(access_secret_version("my_secret_value"))
Anda akan melihat output yang menyerupai hash (nilai persisnya mungkin tidak cocok dengan output ini):
83f8a4edb555cde4271029354395c9f4b7d79706ffa90c746e021d11
Karena Anda tidak menentukan versi, nilai terbaru diambil.
Panggil fungsi yang menambahkan nomor versi yang diharapkan untuk mengonfirmasi:
secret_hash(access_secret_version("my_secret_value", version_id=2))
Anda akan melihat output yang sama seperti perintah terakhir:
83f8a4edb555cde4271029354395c9f4b7d79706ffa90c746e021d11
Panggil lagi fungsi tersebut, tetapi kali ini tentukan versi pertamanya:
secret_hash(access_secret_version("my_secret_value", version_id=1))
Anda akan melihat hash yang berbeda kali ini, yang menunjukkan output yang berbeda:
9a3fc8b809ddc611c82aee950c636c7557e220893560ec2c1eeeb177
8. Menggunakan Secret Manager dengan Cloud Functions
Anda dapat menggunakan secret di banyak bagian Google Cloud. Di bagian ini, Anda akan berfokus pada Cloud Functions, yaitu penawaran komputasi serverless berbasis peristiwa dari Google.
Jika tertarik menggunakan Python di Cloud Functions, Anda dapat mengikuti Codelab Google Cloud Functions HTTP di Python.
Tutup IPython dengan memanggil fungsi exit
:
exit
Anda akan kembali ke Cloud Shell:
yourname@cloudshell:~ (<PROJECT_ID>)$
Sebelum dapat mulai menggunakan Cloud Functions API, Anda harus mengaktifkan API. Dengan Cloud Shell, Anda dapat mengaktifkan API dengan perintah berikut:
gcloud services enable cloudfunctions.googleapis.com cloudbuild.googleapis.com
Buat folder baru untuk membangun fungsi, membuat file kosong sebagai tempat penulisan:
mkdir secret-manager-api-demo cd secret-manager-api-demo touch main.py touch requirements.txt
Buka editor kode dari sisi kanan atas Cloud Shell:
Buka file main.py
di dalam folder secret-manager-api-demo
. Di sinilah Anda akan menempatkan semua kode.
9. Menulis Cloud Function untuk mengakses secret
Meskipun menyimpan dan mengambil nilai secret dari baris perintah atau terminal IPython berguna, akan jauh lebih berguna untuk mengakses secret ini dalam suatu fungsi.
Dengan menggunakan fungsi access_secret_version
yang Anda buat sebelumnya, Anda dapat menggunakannya sebagai dasar untuk Cloud Function Anda.
Salin kode berikut ke dalam file main.py
:
main.py
import os
from google.cloud import secretmanager
project_id = os.environ["PROJECT_ID"]
client = secretmanager.SecretManagerServiceClient()
name = f"projects/{project_id}/secrets/my_secret_value/versions/latest"
response = client.access_secret_version(name=name)
my_secret_value = response.payload.data.decode("UTF-8")
def secret_hello(request):
if "Again" in my_secret_value:
return "We meet again!\n"
return "Hello there.\n"
Sebelum dapat men-deploy fungsi, Anda perlu menyelesaikan penyiapan lingkungan. Hal ini mengharuskan Anda menyiapkan dependensi fungsi.
Buat file baru bernama requirements.txt
, lalu tambahkan paket google-cloud-secret-manager
ke dalamnya:
requirements.txt
google-cloud-secret-manager==2.10.0
Sekarang Anda seharusnya memiliki folder yang hanya berisi main.py
dan requirements.txt
.
Mengizinkan akses ke secret Anda
Sebelum dapat men-deploy fungsi, Anda harus mengizinkan Cloud Functions untuk mengakses secret Anda.
Beralih kembali ke terminal:
Berikan akses ke Akun Layanan Cloud Functions untuk mengakses secret Anda:
export PROJECT_ID=$(gcloud config get-value core/project) gcloud secrets add-iam-policy-binding my_secret_value \ --role roles/secretmanager.secretAccessor \ --member serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com
Anda akan melihat output berikut:
Updated IAM policy for secret [my_secret_value]. bindings: - members: - serviceAccount:<PROJECT_ID>@appspot.gserviceaccount.com role: roles/secretmanager.secretAccessor etag: BwWiRUt2oB4= version: 1
10. Men-deploy Cloud Function Anda
Mengingat penyiapan Anda di bagian sebelumnya, sekarang Anda dapat men-deploy dan menguji Cloud Function Anda.
Dalam folder yang hanya berisi dua file yang Anda buat, deploy fungsi:
gcloud functions deploy secret_hello \ --runtime python39 \ --set-env-vars PROJECT_ID=${PROJECT_ID} \ --trigger-http \ --allow-unauthenticated
Anda akan melihat output berikut (terpotong):
Deploying function (may take a while - up to 2 minutes)...done. ... entryPoint: secret_hello httpsTrigger: url: https://<REGION>-<PROJECT_ID>.cloudfunctions.net/secret_hello ... status: ACTIVE ...
Ambil URL fungsi Anda (metadata httpsTrigger.url
) dengan perintah berikut:
FUNCTION_URL=$(gcloud functions describe secret_hello --format 'value(httpsTrigger.url)')
Sekarang, uji fungsi yang dapat diakses menggunakan nilai hasil yang diharapkan, dengan memanggil fungsi Anda:
curl $FUNCTION_URL
Anda akan melihat output berikut:
We meet again!
Fungsi ini merujuk ke secret versi terbaru, yang ditetapkan untuk berisi string "Lagi", sehingga fungsi ini beroperasi seperti yang diharapkan.
11. Selamat!
Anda telah mempelajari cara menggunakan Secret Manager API dengan Python.
Pembersihan
Agar tidak menimbulkan tagihan ke akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini:
- Di Cloud Console, buka halaman Mengelola resource.
- Dalam daftar project, pilih project Anda lalu klik Delete.
- Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.
Pelajari lebih lanjut
- Secret Manager: https://cloud.google.com/secret-manager/
- Python di Google Cloud: https://cloud.google.com/python/
- Library Klien Cloud untuk Python: https://googlecloudplatform.github.io/google-cloud-python/
Lisensi
Karya ini dilisensikan berdasarkan Lisensi Umum Creative Commons Attribution 2.0.