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
  • Pemahaman dalam 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 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.
  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. 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

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

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 Lanjutkan (dan Anda tidak akan pernah melihatnya lagi). Berikut tampilan layar sekali-tampil tersebut:

9c92662c6a846a5c.pngS

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

9f0e51b578fecce5.pngS

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.

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

7651a97c51e11a24.pngS

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:

c5b686edf94b5222.png

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

Lisensi

Karya ini dilisensikan berdasarkan Lisensi Umum Creative Commons Attribution 2.0.