Menggunakan Secret Manager dengan Python

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

  • Project Google Cloud
  • Browser, seperti Chrome atau Firefox
  • Kemampuan menggunakan Python 3

Survei

Bagaimana Anda akan menggunakan tutorial ini?

Hanya membacanya Membacanya dan menyelesaikan latihan

Bagaimana penilaian Anda terhadap pengalaman dengan Python?

Pemula Menengah Mahir

Bagaimana penilaian Anda terhadap pengalaman menggunakan layanan Google Cloud?

Pemula Menengah Mahir

2. Penyiapan dan Persyaratan

Penyiapan lingkungan mandiri

  1. 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.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 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 mementingkan kata-katanya. Di sebagian besar codelab, Anda harus merujuk Project ID-nya (biasanya diidentifikasi sebagai PROJECT_ID). Jika tidak suka dengan ID yang dibuat, Anda dapat membuat ID acak lainnya. Atau, Anda dapat mencobanya sendiri dan melihat 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.
  1. 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. Guna 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

  1. Dari Cloud Console, klik Aktifkan Cloud Shell 853e55310c205094.png.

55efc1aaa7a4d3ad.png

Jika belum pernah memulai Cloud Shell, Anda akan melihat layar perantara (di paruh bawah) yang menjelaskan apa itu Cloud Shell. Jika demikian, klik Continue (dan Anda tidak akan pernah melihatnya lagi). Berikut tampilan layar sekali-tampil tersebut:

9c92662c6a846a5c.png

Perlu waktu beberapa saat untuk menyediakan dan terhubung ke Cloud Shell.

9f0e51b578fecce5.png

Virtual machine ini dimuat dengan semua alat pengembangan yang Anda perlukan. 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.

  1. 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`
  1. 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. Menggunakan 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 Secret Manager Client Library:

pip3 install --user google-cloud-secret-manager==2.10.0

5. Memulai Python Interaktif

Untuk sebagian tutorial ini, Anda akan menggunakan penafsir Python interaktif yang disebut IPython, yang telah diinstal sebelumnya di Cloud Shell. Mulai sesi dengan menjalankan ipython di Cloud Shell:

ipython

Anda akan melihat yang 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

Secret berisi satu atau beberapa versi secret. Objek ini dapat dibuat menggunakan command line gcloud, tetapi juga dapat dibuat menggunakan Python.

Untuk menggunakan secret, Anda harus membuat secret terlebih dahulu dengan nama secret, lalu menambahkan versi secret, yang merupakan nilai secret.

Tetapkan Project ID Anda dalam IPython:

PROJECT_ID = "<PROJECT_ID>"

Membuat secret

Salin kode berikut ke sesi IPython Anda:

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 secret

Setelah secret ada, Anda dapat menetapkan nilai dengan membuat versi.

Salin kode berikut ke sesi IPython Anda:

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 dan menambahkan versi rahasia 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

Secret dapat memiliki beberapa versi. Panggil kembali fungsi 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 jauh lebih panjang daripada versi aslinya. Atribut ini akan dirujuk nanti.

7. Mengakses secret

Mengakses versi rahasia akan menampilkan konten rahasia, serta metadata tambahan tentang versi rahasia. Saat mengakses versi rahasia, Anda dapat menentukan versi tertentu, atau cukup meminta versi terbaru dengan menentukan "latest".

Rahasia harus dirahasiakan. Simpan kredensial database sebagai rahasia, lalu gunakan untuk melakukan autentikasi, atau simpan sertifikasi dan gunakan; tetapi jangan mencetak rahasia Anda secara langsung, karena hal ini akan menggagalkan tujuan untuk menjaga kerahasiaannya.

Anda akan melakukan operasi pada secret kami, menilai nilainya tanpa mencetaknya secara langsung. Sebagai gantinya, Anda akan mencetak hash dari nilai rahasia.

Salin kode berikut ke sesi IPython Anda:

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 secret sebagai hash nilainya:

secret_hash(access_secret_version("my_secret_value"))

Anda akan melihat output yang menyerupai hash (nilai persisnya mungkin tidak sama dengan output ini):

83f8a4edb555cde4271029354395c9f4b7d79706ffa90c746e021d11

Karena Anda tidak menentukan versi, nilai terbaru akan 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 fungsi lagi, tetapi kali ini tentukan versi pertama:

secret_hash(access_secret_version("my_secret_value", version_id=1))

Kali ini Anda akan melihat hash yang berbeda, yang menunjukkan output yang berbeda:

9a3fc8b809ddc611c82aee950c636c7557e220893560ec2c1eeeb177

8. Menggunakan Secret Manager dengan Cloud Functions

Anda dapat menggunakan rahasia di banyak bagian Google Cloud. Di bagian ini, Anda akan berfokus pada Cloud Functions, penawaran komputasi serverless berbasis peristiwa dari Google.

Jika Anda tertarik menggunakan Python di Cloud Functions, Anda dapat mengikuti Codelab HTTP Google Cloud Functions 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 tersebut. Menggunakan Cloud Shell, Anda dapat mengaktifkan API dengan perintah berikut:

gcloud services enable cloudfunctions.googleapis.com cloudbuild.googleapis.com

Buat folder baru untuk membangun fungsi kita, dengan membuat file kosong untuk ditulis:

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:

7651a97c51e11a24.png

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 rahasia dari command line atau terminal IPython berguna, akan lebih berguna jika dapat mengakses rahasia ini dalam 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 harus 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 akan 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 mengakses secret Anda.

Beralih kembali ke terminal:

c5b686edf94b5222.png

Beri Akun Layanan Cloud Functions akses untuk mengakses rahasia 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

Dengan penyiapan di bagian sebelumnya, Anda kini dapat men-deploy dan menguji Cloud Function.

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 (dipangkas):

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 dapat diakses dengan nilai hasil yang diharapkan, dengan memanggil fungsi Anda:

curl $FUNCTION_URL

Anda akan melihat output berikut:

We meet again!

Fungsi ini mereferensikan versi terbaru secret, yang ditetapkan untuk berisi string "Again", sehingga fungsi ini beroperasi seperti yang diharapkan.

11. Selamat!

Anda telah mempelajari cara menggunakan Secret Manager API menggunakan 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

Lisensi

Karya ini dilisensikan berdasarkan Lisensi Umum Creative Commons Attribution 2.0.