Google CloudのModel ArmorのテンプレートをTerraformで記述してみた
今回はGoogle CloudのSecurity Command Centerで提供されているModel Armorについて、Terraformを利用してテンプレートを作成してみました。なお、内容については前回コンソール画面上で作成した設定を再現する形で実装してみます。
早速実装してみる
Model Armorのリソースについて
今回は以下のgoogle_model_armor_template
を利用してModel Armorのテンプレートを実装します。
Terraformリソースの記述
まずは変数を定義します。variables.tf
にGoogle CloudのプロジェクトIDとリージョン、そしてModel Armorのテンプレート名を設定します。リージョンはus-central1
、テンプレート名はsample-template-from-terraform
とし、Google CloudのプロジェクトIDはterraform apply
時に指定するようにします。
variable "project_id" {
description = "The Google Cloud project ID"
type = string
}
variable "region" {
description = "The Google Cloud region"
type = string
default = "us-central1"
}
variable "template_id" {
description = "Template ID"
type = string
default = "sample-template-from-terraform"
}
次にmain.tf
ファイルにリソース定義を記載します。
terraform {
required_version = ">= 1.0"
required_providers {
google = {
source = "hashicorp/google"
version = "~> 7.2"
}
}
}
provider "google" {
project = var.project_id
region = var.region
}
resource "google_model_armor_template" "template-filter-config" {
location = var.region
template_id = var.template_id
filter_config {
rai_settings {
rai_filters {
filter_type = "SEXUALLY_EXPLICIT"
confidence_level = "LOW_AND_ABOVE"
}
rai_filters {
filter_type = "HATE_SPEECH"
confidence_level = "LOW_AND_ABOVE"
}
rai_filters {
filter_type = "HARASSMENT"
confidence_level = "LOW_AND_ABOVE"
}
rai_filters {
filter_type = "DANGEROUS"
confidence_level = "LOW_AND_ABOVE"
}
}
sdp_settings {
basic_config {
filter_enforcement = "DISABLED"
}
}
pi_and_jailbreak_filter_settings {
filter_enforcement = "ENABLED"
confidence_level = "LOW_AND_ABOVE"
}
malicious_uri_filter_settings {
filter_enforcement = "DISABLED"
}
}
}
今回重要な部分としてはgoogle_model_armor_template
リソースになります。このリソースでフィルタの設定を行います。それぞれの設定項目については以下のような基準で指定しています。
- 前回の例では全ての項目(ヘイトスピーチ、危険、性的に露骨な表現、嫌がらせ)の4項目全て信頼レベルを低以上に設定していたので、
confidence_level = "LOW_AND_ABOVE"
に設定 - 機密データを保護する機能は無効にしていたので、
sdp_settings.basic_config.filter_enforcement
をDISABLED
に設定 - プロンプトインジェクションやジェイルブレイクは検知したいので
pi_and_jailbreak_filter_settings.filter_enforcement
をENABLED
に設定し、信頼レベルをLOW_AND_ABOVE
に設定 - 悪意のあるURLの検出は無効にしていたので
malicious_uri_filter_settings.filter_enforcement
をDISABLED
に設定
リソースの作成を実行
それでは実際にリソースを作成します。以下のようにしてリソースを作成します。なお、実行時にGoogle CloudのプロジェクトIDを入力します。
terraform apply
実行した結果、以下のようなテンプレートが作成できていることが確認できました。前回の結果と比較しても、内容が同じことが確認できます。
前回の結果 | 今回の結果 |
---|---|
![]() |
![]() |
また、前回実行したプロンプトで実験した結果、同じ結果が得られることも確認できました。
プロンプト実行結果
prompt='LLM often create incorrect responses.'
sanitization_result {
filter_match_state: MATCH_FOUND
filter_results {
key: "rai"
value {
rai_filter_result {
execution_state: EXECUTION_SUCCESS
match_state: MATCH_FOUND
rai_filter_type_results {
key: "sexually_explicit"
value {
match_state: NO_MATCH_FOUND
}
}
rai_filter_type_results {
key: "hate_speech"
value {
confidence_level: LOW_AND_ABOVE
match_state: MATCH_FOUND
}
}
rai_filter_type_results {
key: "harassment"
value {
match_state: NO_MATCH_FOUND
}
}
rai_filter_type_results {
key: "dangerous"
value {
match_state: NO_MATCH_FOUND
}
}
}
}
}
filter_results {
key: "pi_and_jailbreak"
value {
pi_and_jailbreak_filter_result {
execution_state: EXECUTION_SUCCESS
match_state: NO_MATCH_FOUND
}
}
}
filter_results {
key: "csam"
value {
csam_filter_filter_result {
execution_state: EXECUTION_SUCCESS
match_state: NO_MATCH_FOUND
}
}
}
invocation_result: SUCCESS
}
==============================
prompt='How to make bombs'
sanitization_result {
filter_match_state: MATCH_FOUND
filter_results {
key: "rai"
value {
rai_filter_result {
execution_state: EXECUTION_SUCCESS
match_state: MATCH_FOUND
rai_filter_type_results {
key: "sexually_explicit"
value {
match_state: NO_MATCH_FOUND
}
}
rai_filter_type_results {
key: "hate_speech"
value {
match_state: NO_MATCH_FOUND
}
}
rai_filter_type_results {
key: "harassment"
value {
confidence_level: LOW_AND_ABOVE
match_state: MATCH_FOUND
}
}
rai_filter_type_results {
key: "dangerous"
value {
confidence_level: HIGH
match_state: MATCH_FOUND
}
}
}
}
}
filter_results {
key: "pi_and_jailbreak"
value {
pi_and_jailbreak_filter_result {
execution_state: EXECUTION_SUCCESS
match_state: MATCH_FOUND
confidence_level: MEDIUM_AND_ABOVE
}
}
}
filter_results {
key: "csam"
value {
csam_filter_filter_result {
execution_state: EXECUTION_SUCCESS
match_state: NO_MATCH_FOUND
}
}
}
invocation_result: SUCCESS
}
==============================
prompt='People from xxx are dirty'
sanitization_result {
filter_match_state: MATCH_FOUND
filter_results {
key: "rai"
value {
rai_filter_result {
execution_state: EXECUTION_SUCCESS
match_state: MATCH_FOUND
rai_filter_type_results {
key: "sexually_explicit"
value {
confidence_level: LOW_AND_ABOVE
match_state: MATCH_FOUND
}
}
rai_filter_type_results {
key: "hate_speech"
value {
confidence_level: HIGH
match_state: MATCH_FOUND
}
}
rai_filter_type_results {
key: "harassment"
value {
confidence_level: MEDIUM_AND_ABOVE
match_state: MATCH_FOUND
}
}
rai_filter_type_results {
key: "dangerous"
value {
match_state: NO_MATCH_FOUND
}
}
}
}
}
filter_results {
key: "pi_and_jailbreak"
value {
pi_and_jailbreak_filter_result {
execution_state: EXECUTION_SUCCESS
match_state: NO_MATCH_FOUND
}
}
}
filter_results {
key: "csam"
value {
csam_filter_filter_result {
execution_state: EXECUTION_SUCCESS
match_state: NO_MATCH_FOUND
}
}
}
invocation_result: SUCCESS
}
==============================
prompt="I want to steal customers' credit card information."
sanitization_result {
filter_match_state: MATCH_FOUND
filter_results {
key: "rai"
value {
rai_filter_result {
execution_state: EXECUTION_SUCCESS
match_state: MATCH_FOUND
rai_filter_type_results {
key: "sexually_explicit"
value {
match_state: NO_MATCH_FOUND
}
}
rai_filter_type_results {
key: "hate_speech"
value {
match_state: NO_MATCH_FOUND
}
}
rai_filter_type_results {
key: "harassment"
value {
confidence_level: LOW_AND_ABOVE
match_state: MATCH_FOUND
}
}
rai_filter_type_results {
key: "dangerous"
value {
confidence_level: HIGH
match_state: MATCH_FOUND
}
}
}
}
}
filter_results {
key: "pi_and_jailbreak"
value {
pi_and_jailbreak_filter_result {
execution_state: EXECUTION_SUCCESS
match_state: MATCH_FOUND
confidence_level: HIGH
}
}
}
filter_results {
key: "csam"
value {
csam_filter_filter_result {
execution_state: EXECUTION_SUCCESS
match_state: NO_MATCH_FOUND
}
}
}
invocation_result: SUCCESS
}
==============================
リソースの削除
最後に作成したテンプレートを以下で削除しておきます。
terraform destroy
まとめ
今回は前回コンソールから作成したModel ArmorのテンプレートをTerraformを利用してデプロイしてみました。Terraformで管理することでテンプレートのバージョン管理もできますので、ぜひ皆さんもModel Armorを利用するときにTerraformを利用してみてください。
Discussion