Pelajari cara memanggil Cloud Functions yang diautentikasi

1. Pengantar

Ringkasan

Cloud Functions adalah solusi komputasi ringan bagi developer untuk membuat fungsi mandiri dengan tujuan tunggal yang dapat dipicu menggunakan HTTPS atau merespons CloudEvents tanpa perlu mengelola lingkungan server atau runtime.

Ada dua pendekatan utama untuk mengontrol pemanggilan ke Cloud Functions: mengamankan akses berdasarkan identitas dan mengamankan akses menggunakan kontrol akses berbasis jaringan. Codelab ini berfokus pada pendekatan pertama dan memandu Anda melalui 3 skenario guna mengamankan akses berdasarkan identitas untuk memanggil Function:

  1. Gunakan token identitas gcloud Anda untuk memanggil Function dalam pengembangan lokal & tujuan pengujian
  2. Meniru identitas akun layanan saat mengembangkan dan menguji secara lokal untuk menggunakan kredensial yang sama seperti dalam produksi
  3. Menggunakan library klien Google untuk menangani autentikasi ke Google Cloud API, misalnya saat layanan perlu memanggil Function

Yang akan Anda pelajari

  • Cara mengonfigurasi autentikasi di Cloud Function dan memastikan autentikasi telah dikonfigurasi dengan benar
  • Panggil fungsi terautentikasi dari lingkungan pengembangan lokal dengan memberikan token untuk identitas gcloud Anda
  • Cara membuat akun layanan dan memberinya peran yang sesuai untuk memanggil fungsi
  • Cara meniru identitas layanan dari lingkungan pengembangan lokal yang memiliki peran yang sesuai untuk mengaktifkan suatu fungsi

2. Penyiapan dan Persyaratan

Prasyarat

  • Anda sudah login ke Konsol Cloud
  • Anda sebelumnya telah men-deploy Cloud Function generasi ke-2 yang dipicu HTTP
  • (opsional) Untuk skenario ke-3, codelab ini menggunakan Node.js dan npm sebagai contoh, tetapi Anda dapat menggunakan runtime apa pun yang didukung oleh library klien Google Auth.

Mengaktifkan Cloud Shell

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

55efc1aaa7a4d3ad.png

Jika ini pertama kalinya Anda memulai Cloud Shell, Anda akan melihat layar perantara yang menjelaskan apa itu Cloud Shell. Jika Anda melihat layar perantara, klik Lanjutkan.

9c92662c6a846a5c.pngS

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

9f0e51b578fecce5.pngS

Mesin virtual ini dimuat dengan semua alat pengembangan yang dibutuhkan. 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 dengan browser.

Setelah terhubung ke Cloud Shell, Anda akan melihat bahwa Anda telah 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. Membuat dan menguji Cloud Function yang diautentikasi

Codelab ini mengikuti petunjuk yang sama untuk Panduan Memulai Konsol untuk Cloud Functions dengan satu pengecualian penting: Function Anda memerlukan autentikasi.

Mewajibkan autentikasi berarti bahwa prinsip yang memanggil Fungsi harus memiliki peran Invoker Cloud Functions (dan Cloud Run Invoker untuk generasi ke-2); jika tidak, Function akan menampilkan error 403 Forbidden. Codelab ini akan menunjukkan cara memberikan peran Invoker yang sesuai ke suatu prinsip.

Membuat fungsi terautentikasi

Berikut langkah-langkah untuk menggunakan Konsol Cloud:

  1. Buka halaman Cloud Functions Overview lalu klik Create Function
  2. Di bagian opsi Lingkungan, pilih generasi ke-2
  3. Beri nama Fungsi my-authenticated-function
  4. Di kolom Authentication, tetapkan nilai defaultnya sebagai Wajibkan autentikasi

936eee0d5930d12b.pngS

  1. Klik Berikutnya
  2. Untuk codelab ini, Anda dapat memilih bahasa apa pun
  3. Lalu, tekan Deploy.

Perlu waktu sekitar 1 menit untuk men-deploy Function Anda.

Menyiapkan variabel lingkungan lokal untuk perintah gcloud yang disederhanakan

Pertama, Anda akan membuat beberapa variabel lingkungan untuk meningkatkan keterbacaan perintah gcloud yang digunakan dalam codelab ini.

Anda perlu menentukan region untuk Function. Contoh ini menggunakan us-central1.

REGION="us-central1"

lalu Anda dapat menyimpan URL Function sebagai variabel lingkungan untuk digunakan nanti.

PROJECT_ID=$(gcloud config get-value project)
FUNCTION_URL="$(gcloud functions describe my-authenticated-function --gen2 --region us-central1 --format='get(serviceConfig.uri)')"

Verifikasi bahwa fungsi memerlukan autentikasi dengan mencoba memanggil sebagai penelepon anonim

Anda akan memanggil fungsi tanpa autentikasi untuk memverifikasi bahwa Anda menerima error 403 yang diharapkan.

Dari command line, jalankan perintah curl berikut:

curl $FUNCTION_URL

Anda akan melihat hasil berikut:

<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>403 Forbidden</title>
</head>
<body text=#000000 bgcolor=#ffffff>
<h1>Error: Forbidden</h1>
<h2>Your client does not have permission to get URL <code>/</code> from this server.</h2>
<h2></h2>
</body></html>

Sekarang Anda siap untuk menjalankan 3 skenario yang memungkinkan Anda memanggil Function dengan memberikan autentikasi.

4. Skenario 1: Menggunakan token identitas gcloud

Sebagai developer, Anda mungkin menginginkan cara untuk menguji fungsi saat mengembangkannya secara lokal. Di bagian ini, Anda akan melakukan uji cepat untuk memverifikasi bahwa fungsi diautentikasi dengan benar menggunakan identitas Anda.

Pastikan Anda sudah diautentikasi menggunakan gcloud dengan menjalankan perintah berikut:

gcloud auth list

Anda akan melihat tanda bintang di samping identitas aktif Anda, misalnya:

Credentialed Accounts
ACTIVE  ACCOUNT

*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`

Setelah memastikan bahwa Anda menggunakan identitas yang benar, Anda akan menyimpan email akun ke variabel lingkungan.

ACCOUNT_EMAIL=$(gcloud auth list --filter=status:ACTIVE --format="value(account)")

Anda dapat menemukan informasi selengkapnya tentang menyiapkan gcloud init dan gcloud auth login di dokumen.

Selanjutnya, panggil Function dan teruskan token identitas Anda.

curl $FUNCTION_URL -H "Authorization: bearer $(gcloud auth print-identity-token)"

Sekarang Anda akan melihat hasilnya:

Hello World!

Pemecahan masalah

Jika Anda menerima error 403 Forbidden, pastikan identitas Anda memiliki peran Cloud Functions Invoker atau Cloud Run Invoker role untuk fungsi generasi ke-2. Anda dapat menggunakan Konsol IAM untuk memverifikasi peran yang diberikan ke akun utama.

Meskipun menggunakan token identitas Anda sendiri adalah cara cepat untuk menguji fungsi selama pengembangan, pemanggil fungsi terautentikasi akan memerlukan peran yang sesuai; jika tidak, pemanggil akan menerima pesan {i> 403 Forbidden error<i}.

Anda harus mengikuti prinsip hak istimewa terendah dengan membatasi jumlah identitas dan akun layanan yang memiliki peran untuk memanggil fungsi.

membuat akun layanan baru dan memberikan peran yang diperlukan.

5. Skenario 2: Meniru identitas akun layanan

Dalam skenario ini, Anda akan meniru identitas (yaitu mengasumsikan izin) akun layanan untuk memanggil fungsi saat melakukan pengembangan dan pengujian secara lokal. Dengan meniru akun layanan, Anda dapat menguji kredensial yang sama seperti dalam produksi.

Dengan melakukan hal ini, Anda tidak hanya memverifikasi peran, tetapi juga mengikuti prinsip hak istimewa terendah dengan tidak harus memberikan peran Invoker Cloud Function ke identitas lain hanya untuk tujuan pengujian lokal.

Untuk tujuan codelab ini, Anda akan membuat akun layanan baru yang hanya memiliki peran untuk memanggil fungsi yang dibuat di codelab ini.

Buat akun layanan baru

Pertama, Anda akan membuat beberapa variabel lingkungan tambahan untuk mewakili akun layanan yang digunakan dalam perintah gcloud.

SERVICE_ACCOUNT_NAME="invoke-functions-codelab"
SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com

Selanjutnya, Anda akan membuat akun layanan.

gcloud iam service-accounts create $SERVICE_ACCOUNT_NAME \
  --display-name="Cloud Function Authentication codelab"

Berikan peran invoker Cloud Function ke akun layanan

gcloud functions add-iam-policy-binding my-authenticated-function \
  --region=us-central1 --gen2 \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role='roles/cloudfunctions.invoker'

Memanggil fungsi dengan meniru akun layanan

Untuk itu, Anda akan meniru identitas akun layanan yang baru dibuat dengan mendapatkan token ID-nya.

Tambahkan peran yang diperlukan untuk peniruan identitas

Untuk meniru identitas akun layanan, akun pengguna Anda harus memiliki peran Service Account Token Creator (roles/iam.serviceAccountTokenCreator) untuk membuat token ID untuk akun layanan.

gcloud iam service-accounts add-iam-policy-binding $SERVICE_ACCOUNT_ADDRESS  \
  --member user:$ACCOUNT_EMAIL \
  --role='roles/iam.serviceAccountTokenCreator'

Menggunakan token ID akun layanan

Sekarang, Anda dapat memanggil Function dengan meneruskan token ID akun layanan.

curl $FUNCTION_URL -H "Authorization: bearer $(gcloud auth print-identity-token --impersonate-service-account $SERVICE_ACCOUNT_ADDRESS)" 

Dan Anda akan melihat hal berikut:

WARNING: This command is using service account impersonation. All API calls will be executed as [invoke-functions-codelab@<project-id>.iam.gserviceaccount.com].
Hello World!

6. Skenario 3: Menggunakan library klien Google

Untuk bagian terakhir codelab ini, Anda akan menjalankan layanan kecil secara lokal guna membuat token ID untuk akun layanan, lalu memanggil Function secara terprogram menggunakan library klien Google Auth dan Kredensial Default Aplikasi (ADC). Anda dapat membaca selengkapnya tentang library klien Google di bagian penjelasan library klien pada dokumentasi.

Menggunakan ADC sangat penting ketika Anda ingin menulis dan menguji Function secara lokal (misalnya di laptop, di Cloud Shell, dll.) saat berinteraksi dengan resource Google Cloud lainnya (misalnya Cloud Storage, Vision API, dll.) Untuk contoh ini, Anda akan melihat cara membuat layanan memanggil Function lain yang memerlukan autentikasi. Untuk mengetahui informasi selengkapnya tentang ADC dan pengembangan lokal, baca postingan blog Cara mengembangkan dan menguji Cloud Functions secara lokal | Blog Google Cloud

Menjalankan perintah gcloud untuk meniru identitas akun layanan

ADC otomatis menemukan kredensial berdasarkan lingkungan aplikasi dan menggunakan kredensial tersebut untuk melakukan autentikasi ke Google Cloud API. Tanda –impersonate-service-account memungkinkan Anda meniru identitas akun layanan menggunakan identitasnya untuk melakukan autentikasi terhadap Google Cloud API.

Untuk meniru identitas akun layanan, Anda dapat menjalankan perintah berikut:

gcloud auth application-default login --impersonate-service-account=$SERVICE_ACCOUNT_ADDRESS

Sekarang Anda menjalankan perintah gcloud sebagai akun layanan tersebut, bukan sebagai identitas Anda.

Membuat dan menjalankan layanan untuk memanggil fungsi terautentikasi

Setiap runtime memiliki library klien Google Auth sendiri yang dapat Anda instal. Codelab ini memandu Anda dalam membuat dan menjalankan aplikasi Node.js secara lokal.

Berikut adalah langkah-langkah untuk Node.js:

  1. Membuat aplikasi Node.js baru
npm init
  1. Menginstal library klien Google Auth
npm install google-auth-library
  1. Membuat file index.js
  2. Ambil URL Cloud Function Anda, yang akan ditambahkan ke kode pada langkah berikut.
echo $FUNCTION_URL
  1. Tambahkan kode berikut ke index.js. Pastikan untuk mengubah variabel targetAudience ke URL Cloud Function Anda.

index.js

// Cloud Functions uses your function's url as the `targetAudience` value

const targetAudience = '<YOUR-CLOUD-FUNCTION-URL>';

// For Cloud Functions, endpoint(`url`) and `targetAudience` should be equal

const url = targetAudience;

const { GoogleAuth } = require('google-auth-library');
const auth = new GoogleAuth();

async function request() {
    console.info(`request ${url} with target audience ${targetAudience}`);

    // this call retrieves the ID token for the impersonated service account
    const client = await auth.getIdTokenClient(targetAudience);

    const res = await client.request({ url });
    console.info(res.data);
}

request().catch(err => {
    console.error(err.message);
    process.exitCode = 1;
});
  1. Menjalankan aplikasi
node index.js

Anda akan melihat pesan "Hello World!" yang muncul

Pemecahan masalah

Jika Anda melihat pesan error Izin 'iam.serviceAccounts.getOpenIdToken' ditolak pada resource (atau mungkin tidak ada)., harap tunggu beberapa menit hingga peran Service Account Token Creator diterapkan.

Jika Anda menerima error Tidak dapat mengambil token ID di lingkungan ini, gunakan GCE atau tetapkan variabel lingkungan GOOGLE_APPLICATION_CREDENTIALS ke file JSON kredensial akun layanan, Anda mungkin lupa menjalankan perintah tersebut

gcloud auth application-default login --impersonate-service-account=$SERVICE_ACCOUNT_ADDRESS

7. Selamat!

Selamat, Anda telah menyelesaikan codelab!

Sebaiknya tinjau dokumentasi tentang cara mengamankan Cloud Functions.

Kami juga merekomendasikan postingan blog tentang pengembangan lokal dengan Cloud Functions untuk mempelajari cara mengembangkan dan menguji Cloud Function di lingkungan developer lokal Anda.

Yang telah kita bahas

  • Cara mengonfigurasi autentikasi di Cloud Function dan memastikan autentikasi telah dikonfigurasi dengan benar
  • Panggil fungsi terautentikasi dari lingkungan pengembangan lokal dengan memberikan token untuk identitas gcloud Anda
  • Cara membuat akun layanan dan memberinya peran yang sesuai untuk memanggil fungsi
  • Cara meniru identitas layanan dari lingkungan pengembangan lokal yang memiliki peran yang sesuai untuk mengaktifkan suatu fungsi

8. Pembersihan

Untuk menghindari tagihan yang tidak disengaja, (misalnya, Cloud Function ini secara tidak sengaja dipanggil lebih sering daripada alokasi pemanggilan Cloud Function bulanan di paket gratis), Anda dapat menghapus Cloud Function atau menghapus project yang Anda buat di Langkah 2.

Untuk berhenti meniru akun layanan, Anda dapat login ulang menggunakan identitas Anda:

gcloud auth application-default login

Untuk menghapus Cloud Function, buka Konsol Cloud Cloud Function di https://console.cloud.google.com/functions/ Pastikan project yang Anda buat di langkah 2 adalah project yang sedang dipilih.

Pilih my-authenticated-function yang Anda deploy sebelumnya. Lalu, tekan Delete.

Jika memilih untuk menghapus seluruh project, Anda dapat membuka https://console.cloud.google.com/cloud-resource-manager, pilih project yang dibuat pada Langkah 2, lalu pilih Hapus. Jika project dihapus, Anda harus mengubah project di Cloud SDK. Anda dapat melihat daftar semua project yang tersedia dengan menjalankan gcloud projects list.