์ก์ธ์ค ๋ชจ๋์ ๋ฐ๋ผ ์ฌ์ฉํ ์ ์๋ ์ธ์ฆ ๋ฐฉ๋ฒ ์ ํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ฌ์ฉ ์ฌ๋ก | ์ธ์ฆ ๋ฐฉ๋ฒ | ์ด ์ธ์ฆ ๋ฐฉ๋ฒ์ ๋ํ ์ ๋ณด |
---|---|---|
์์ด์ ํธ ๋ด์์ ์ง์ ๋ฐ์ดํฐ ์์ค์ ์ก์ธ์คํฉ๋๋ค. | ์๋น์ค ๊ณ์ | ๋ฐฐํฌ๋ ์์ด์ ํธ๋ ์๋น์ค ๊ณ์ ์ ์ก์ธ์ค ๊ถํ์ด ์๋ ๋ชจ๋ ๋ฆฌ์์ค์ ์ก์ธ์คํ ์ ์์ต๋๋ค. |
์์ด์ ํธ ๋ด์์ API ํค๋ฅผ ์ฌ์ฉํ์ฌ ์๋ํฌ์ธํธ๋ก ์์ฒญ์ ์ ์กํฉ๋๋ค. | API ํค | ์ด ์ธ์ฆ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ธฐ ์ ์ ์ฌ์ฉํ๋ ค๋ API์์ API ํค๋ฅผ ์ง์ํ๋์ง ํ์ธํ์ธ์. |
์์ด์ ํธ์ ์ต์ข ์ฌ์ฉ์๋ฅผ ์ํ ์ฌ์ฉ์ ๊ณ์ , ๋ฑ๋ก, ๋ก๊ทธ์ธ ๋๋ ์น์ธ์ ์ฒ๋ฆฌํฉ๋๋ค. | OAuth ํด๋ผ์ด์ธํธ ID | ์์ด์ ํธ๊ฐ ์ฌ์ฉ์์ ๋์๋ฅผ ์์ฒญํ๊ณ ์๋ฝํด์ผ ํฉ๋๋ค. |
์ญํ
Vertex AI Agent Engine์ ๋ฐฐํฌํ๋ ์์ด์ ํธ๋ service-PROJECT_NUMBER@gcp-sa-aiplatform-re.iam.gserviceaccount.com
์ ์ผ์นํ๋ AI Platform Reasoning Engine ์๋น์ค ์์ด์ ํธ ์๋น์ค ๊ณ์ ์ ์ฌ์ฉํ์ฌ ์คํ๋ฉ๋๋ค.
์๋น์ค ๊ณ์ ์๋ ๋ฐฐํฌ๋ ์์ด์ ํธ์ ํ์ํ ๊ธฐ๋ณธ ๊ถํ์ ๋ถ์ฌํ๋ Vertex AI Reasoning Engine ์๋น์ค ์์ด์ ํธ ์ญํ (roles/aiplatform.reasoningEngineServiceAgent
)์ด ์์ต๋๋ค. IAM ๋ฌธ์์์ ๊ธฐ๋ณธ ๊ถํ์ ์ ์ฒด ๋ชฉ๋ก์ ํ์ธํ ์ ์์ต๋๋ค.
๋ฐฐํฌ๋ ์์ด์ ํธ์ ์ญํ ๋์ด
์ฝ์
IAM ํ์ด์ง๋ก ์ด๋ํ์ฌ 'Google ์ ๊ณต ์ญํ ๋ถ์ฌ ํฌํจ' ์ฒดํฌ๋ฐ์ค๋ฅผ ์ ํํฉ๋๋ค.
Google Cloud ํ๋ก์ ํธ์ ํด๋นํ๋ ํ๋ก์ ํธ๋ฅผ ์ ํํฉ๋๋ค.
service-PROJECT_NUMBER@gcp-sa-aiplatform-re.iam.gserviceaccount.com
์ ์ผ์นํ๋ ์ฃผ ๊ตฌ์ฑ์์ ์ฐพ์ต๋๋ค.๋ฐฐํฌ๋ ์์ด์ ํธ์ ์ญํ ์ ์ญํ ์ด์์ ํ์ธํ ์ ์์ต๋๋ค.
gcloud
๋จผ์ gcloud
CLI๋ฅผ ์ค์นํ๊ณ ์ด๊ธฐํํฉ๋๋ค. ๊ทธ๋ฌ๊ณ ๋์ ๋ค์ ๋ช
๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
gcloud projects get-iam-policy PROJECT_ID_OR_NUMBER \
--flatten="bindings[].members" \
--filter="bindings.members:serviceAccount:PRINCIPAL" \
--format="value(bindings.role)"
๊ฐ ํญ๋ชฉ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
PROJECT_ID_OR_NUMBER
: ํ๋ก์ ํธ์ ID ๋๋ ๋ฒํธ์ ๋๋ค.PRINCIPAL
: ์์ด์ ํธ๊ฐ Vertex AI Agent Engine์ ๋ฐฐํฌ๋ ๋ ์์ฑ๋ ์๋น์ค ๊ณ์ ์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค.
์์ธํ ๋ด์ฉ์ IAM ๋ฌธ์ ๋ฐ CLI ์ฐธ์กฐ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
Python
๋จผ์ ๋ค์์ ์คํํ์ฌ ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํฉ๋๋ค.
pip install google-api-python-client
๊ทธ๋ฐ ๋ค์ ์ธ์ฆํ๊ณ ๋ค์์ ์คํํ์ฌ ๋ฐฐํฌ๋ ์์ด์ ํธ์ ์ญํ ์ ๋์ดํฉ๋๋ค.
from google.cloud import resourcemanager_v3
from google.iam.v1 import iam_policy_pb2
project_id = "PROJECT_ID"
principal = "PRINCIPAL"
crm_service = resourcemanager_v3.ProjectsClient()
policy = crm_service.get_iam_policy(iam_policy_pb2.GetIamPolicyRequest(
resource=f"projects/{project_id}"
))
for binding in policy.bindings:
for member in binding.members:
if principal in member:
print(binding.role)
์ฌ๊ธฐ์ PRINCIPAL
์ ์์ด์ ํธ๊ฐ Vertex AI Agent Engine์ ๋ฐฐํฌ๋ ๋ ์์ฑ๋ ์๋น์ค ๊ณ์ ์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค.
๋ฐฐํฌ๋ ์์ด์ ํธ ์ญํ ๋ถ์ฌ
์ฝ์(๊ถ์ฅ)
IAM ํ์ด์ง๋ก ์ด๋ํ์ฌ 'Google ์ ๊ณต ์ญํ ๋ถ์ฌ ํฌํจ' ์ฒดํฌ๋ฐ์ค๋ฅผ ์ ํํฉ๋๋ค.
Google Cloud ํ๋ก์ ํธ์ ํด๋นํ๋ ํ๋ก์ ํธ๋ฅผ ์ ํํฉ๋๋ค.
service-PROJECT_NUMBER@gcp-sa-aiplatform-re.iam.gserviceaccount.com
์ ์ผ์นํ๋ ์ฃผ ๊ตฌ์ฑ์์ ์ฐพ์ต๋๋ค.์์ ๋ฒํผ์ ํด๋ฆญํ์ฌ ์ฃผ ๊ตฌ์ฑ์์ ํ์ํ ์ญํ ์ ์ถ๊ฐํ ํ ์ ์ฅ ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
gcloud
๋จผ์ gcloud
CLI๋ฅผ ์ค์นํ๊ณ ์ด๊ธฐํํฉ๋๋ค. ๊ทธ๋ฌ๊ณ ๋์ ๋ค์ ๋ช
๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
gcloud projects add-iam-policy-binding PROJECT_ID --member=PRINCIPAL --role=ROLE_NAME
๊ฐ ํญ๋ชฉ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
PRINCIPAL
: ์์ด์ ํธ๊ฐ Vertex AI Agent Engine์ ๋ฐฐํฌ๋ ๋ ์์ฑ๋ ์๋น์ค ๊ณ์ ์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค.ROLE_NAME
: ๋ถ์ฌํ ์ญํ ์ ์ด๋ฆ์ ๋๋ค. ์ฌ์ ์ ์๋ ์ญํ ์ ๋ชฉ๋ก์ ์ญํ ์ดํด๋ฅผ ์ฐธ์กฐํ์ธ์.
์์ธํ ๋ด์ฉ์ IAM ๋ฌธ์ ๋ฐ CLI ์ฐธ์กฐ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
Python
๋ฐฐํฌ๋ ์์ด์ ํธ์ ์ญํ ์ ๋ถ์ฌํ๊ฑฐ๋ ์ทจ์ํ๊ธฐ ์ํด ์์ฒด Python ์ฝ๋๋ฅผ ์์ฑํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋์ ์ผํ์ฑ ์์
์๋ Google Cloud ์ฝ์ ๋๋ gcloud
๋ฅผ ์ฌ์ฉํ๊ณ IAM ์ก์ธ์ค ์ ์ด๋ฅผ ํ๋ก๊ทธ๋๋งคํฑ ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํ๋ ค๋ฉด Terraform์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. Python์์ ์๋ช
ํ๋ ค๊ณ ํ๊ฑฐ๋ ์๋ช
ํด์ผ ํ๋ ๊ฒฝ์ฐ IAM ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ธ์.
๋ฐฐํฌ๋ ์์ด์ ํธ์ ์ญํ ์ทจ์
์ฝ์(๊ถ์ฅ)
IAM ํ์ด์ง๋ก ์ด๋ํ์ฌ 'Google ์ ๊ณต ์ญํ ๋ถ์ฌ ํฌํจ' ์ฒดํฌ๋ฐ์ค๋ฅผ ์ ํํฉ๋๋ค.
Google Cloud ํ๋ก์ ํธ์ ํด๋นํ๋ ํ๋ก์ ํธ๋ฅผ ์ ํํฉ๋๋ค.
service-PROJECT_NUMBER@gcp-sa-aiplatform-re.iam.gserviceaccount.com
์ ์ผ์นํ๋ ์ฃผ ๊ตฌ์ฑ์์ ์ฐพ์ต๋๋ค.์์ ๋ฒํผ์ ํด๋ฆญํ์ฌ ์ฃผ ๊ตฌ์ฑ์์์ ์ญํ ์ ์ทจ์ํ๊ณ ํด๋น ์ญํ ์ ์ญ์ ํ ๋ค์ ์ ์ฅ ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
gcloud
๋จผ์ gcloud
CLI๋ฅผ ์ค์นํ๊ณ ์ด๊ธฐํํฉ๋๋ค. ๊ทธ๋ฌ๊ณ ๋์ ๋ค์ ๋ช
๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
gcloud projects remove-iam-policy-binding PROJECT_ID --member=PRINCIPAL --role=ROLE_NAME
๊ฐ ํญ๋ชฉ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
PRINCIPAL
: ์์ด์ ํธ๊ฐ Vertex AI Agent Engine์ ๋ฐฐํฌ๋ ๋ ์์ฑ๋ ์๋น์ค ๊ณ์ ์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค.ROLE_NAME
: ์ทจ์ํ ์ญํ ์ ์ด๋ฆ์ ๋๋ค. ์ฌ์ ์ ์๋ ์ญํ ์ ๋ชฉ๋ก์ ์ญํ ์ดํด๋ฅผ ์ฐธ์กฐํ์ธ์.
์์ธํ ๋ด์ฉ์ IAM ๋ฌธ์ ๋ฐ CLI ์ฐธ์กฐ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
Python
๋ฐฐํฌ๋ ์์ด์ ํธ์ ์ญํ ์ ๋ถ์ฌํ๊ฑฐ๋ ์ทจ์ํ๊ธฐ ์ํด ์์ฒด Python ์ฝ๋๋ฅผ ์์ฑํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋์ ์ผํ์ฑ ์์
์๋ Google Cloud ์ฝ์ ๋๋ gcloud
๋ฅผ ์ฌ์ฉํ๊ณ IAM ์ก์ธ์ค ์ ์ด๋ฅผ ํ๋ก๊ทธ๋๋งคํฑ ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํ๋ ค๋ฉด Terraform์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. Python์์ ์๋ช
ํ๋ ค๊ณ ํ๊ฑฐ๋ ์๋ช
ํด์ผ ํ๋ ๊ฒฝ์ฐ IAM ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ธ์.
๋ณด์ ๋น๋ฐ
๋ณด์ ๋น๋ฐ์๋ ๋ผ๋ฒจ ๋ฐ ๋ณต์ ์ ๋ณด์ ๊ฐ์ ๋ฉํ๋ฐ์ดํฐ์ ํจ๊ป ๋ณด์ ๋น๋ฐ ๋ฒ์ ์ด ํ ๊ฐ ์ด์ ํฌํจ๋ฉ๋๋ค. ๋ณด์ ๋น๋ฐ์ ์ค์ ํ์ด๋ก๋๋ ๋ณด์ ๋น๋ฐ ๋ฒ์ ์ ์ ์ฅ๋ฉ๋๋ค. ๋ณด์ ๋น๋ฐ์ ํ๋ก์ ํธ ์์ค์์ Secret Manager๋ฅผ ํตํด ๊ด๋ฆฌ๋๋ฉฐ ๋ฐฐํฌ๋ ์ฌ๋ฌ ์์ด์ ํธ ๊ฐ์ ๊ณต์ ํ ์ ์์ต๋๋ค. Secret Manager์์ ์์ด์ ํธ์ ์์ํ๋ ๋ณด์ ๋น๋ฐ์ ๋์ดํ๋ ค๋ฉด ๋ผ๋ฒจ์ ์ถ๊ฐํ๊ณ ์ด๋ฅผ ํํฐ๋ง์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ณด์ ๋น๋ฐ ๋ง๋ค๊ธฐ
์ฝ์
Secret Manager ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
Secret Manager ํ์ด์ง์์ ๋ณด์ ๋น๋ฐ ๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
์ด๋ฆ ํ๋์ ๋ณด์ ๋น๋ฐ์ ์ด๋ฆ์ ์ ๋ ฅํฉ๋๋ค(์:
my-secret
).์ ํ์ฌํญ: ์ด๊ธฐ ๋ณด์ ๋น๋ฐ์ ๋ง๋ค ๋ ๋ณด์ ๋น๋ฐ ๋ฒ์ ๋ ์ถ๊ฐํ๋ ค๋ฉด ๋ณด์ ๋น๋ฐ ๊ฐ ํ๋์ ๋ณด์ ๋น๋ฐ์ ๊ฐ์ ์ ๋ ฅํฉ๋๋ค(์:
abcd1234
).๋ผ๋ฒจ๋ก ์ด๋ํ ๋ค์ ๋ผ๋ฒจ ์ถ๊ฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
ํค์ ํด๋น ๊ฐ์ ์ ๋ ฅํ์ฌ ๋ผ๋ฒจ์ ๋ง๋ญ๋๋ค.
๋ณด์ ๋น๋ฐ ๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
gcloud
๋จผ์ gcloud
CLI๋ฅผ ์ค์นํ๊ณ ์ด๊ธฐํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ ๋ช
๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
gcloud secrets create SECRET_ID --replication-policy="automatic"
gcloud secrets versions add SECRET_ID --data-file="FILE_PATH"
๊ฐ ํญ๋ชฉ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
SECRET_ID
: ๋ณด์ ๋น๋ฐ์ ID ๋๋ ๋ณด์ ๋น๋ฐ์ ์ ๊ทํ๋ ์๋ณ์FILE_PATH
: ๋ฒ์ ์ธ๋ถ์ ๋ณด๊ฐ ํฌํจ๋ ํ์ผ์ ์ ์ฒด ๊ฒฝ๋ก(ํ์ผ ์ด๋ฆ ํฌํจ)
์์ธํ ๋ด์ฉ์ ๋ณด์ ๋น๋ฐ ๋ฐ ๋ณด์ ๋น๋ฐ ๋ฒ์ ์ ๋ง๋ค๊ธฐ ์ํ Secret Manager ๋ฌธ์ ๋๋ ๋ณด์ ๋น๋ฐ ๋ฐ ๋ณด์ ๋น๋ฐ ๋ฒ์ ์ ๋ง๋ค๊ธฐ ์ํ CLI ์ฐธ์กฐ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
Python
๋จผ์ ๋ค์์ ์คํํ์ฌ ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํฉ๋๋ค.
pip install google-cloud-secret-manager
๊ทธ๋ฐ ๋ค์ ์ธ์ฆํ๊ณ ๋ค์์ ์คํํฉ๋๋ค.
from google.cloud import secretmanager
import google_crc32c
client = secretmanager.SecretManagerServiceClient()
secret = client.create_secret(request={
"parent": "projects/PROJECT_ID",
"secret_id": "SECRET_ID",
"secret": { # google.cloud.secretmanager_v1.types.Secret
# Required. The replication policy cannot be changed after the Secret has been created.
"replication": {"automatic": {}},
# Optional. Labels to associate with the secret.
"labels": {"type": "api_key", "provider": "anthropic"},
# Optional. The secret's time-to-live in seconds with format (e.g.,
# "900s" for 15 minutes). If specified, the secret versions will be
# automatically deleted upon reaching the end of the TTL period.
"ttl": "TTL",
},
})
anthropic_api_key = "API_KEY" # The secret to be stored.
payload_bytes = anthropic_api_key.encode("UTF-8")
# Optional. Calculate payload checksum.
crc32c = google_crc32c.Checksum()
crc32c.update(payload_bytes)
version = client.add_secret_version(request={
"parent": secret.name,
"payload": {
"data": payload_bytes,
"data_crc32c": int(crc32c.hexdigest(), 16), # Optional.
},
})
print(f"Added secret version: {version.name}")
๋ณด์ ๋น๋ฐ ๊ฐ์ ธ์ค๊ธฐ
์ฝ์
Secret Manager ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
Secret Manager ํ์ด์ง์์ ์ค๋ช ํ ๋ณด์ ๋น๋ฐ์ ์ด๋ฆ์ ํด๋ฆญํฉ๋๋ค.
๋ณด์ ๋น๋ฐ ์ธ๋ถ์ ๋ณด ํ์ด์ง์ ๋ณด์ ๋น๋ฐ์ ๋ํ ์ ๋ณด๊ฐ ๋์ด๋ฉ๋๋ค.
gcloud
๋จผ์ gcloud
CLI๋ฅผ ์ค์นํ๊ณ ์ด๊ธฐํํฉ๋๋ค. ๊ทธ๋ฌ๊ณ ๋์ ๋ค์ ๋ช
๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
gcloud secrets versions describe VERSION_ID --secret=SECRET_ID
๊ฐ ํญ๋ชฉ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
VERSION_ID
: ๋ณด์ ๋น๋ฐ ๋ฒ์ ์ IDSECRET_ID
: ๋ณด์ ๋น๋ฐ์ ID ๋๋ ๋ณด์ ๋น๋ฐ์ ์ ๊ทํ๋ ์๋ณ์
์์ธํ ๋ด์ฉ์ Secret Manager ๋ฌธ์ ๋๋ CLI ์ฐธ์กฐ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
Python
๋จผ์ ๋ค์์ ์คํํ์ฌ ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํฉ๋๋ค.
pip install google-cloud-secret-manager
๊ทธ๋ฐ ๋ค์ ์ธ์ฆํ๊ณ ๋ค์์ ์คํํฉ๋๋ค.
from google.cloud import secretmanager
client = secretmanager.SecretManagerServiceClient()
name = client.secret_path("PROJECT_ID", "SECRET_ID")
response = client.get_secret(request={"name": name})
๋ณด์ ๋น๋ฐ ๋์ด
์ฝ์
Secret Manager ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
๋ณด์ ๋น๋ฐ ํ ์ด๋ธ์์ ํํฐ ํ๋๋ฅผ ํด๋ฆญํฉ๋๋ค.
ํํฐ ์์ฑ๊ณผ ํด๋น ๊ฐ(์:
Location:asia-east1
)์ ์ ํํฉ๋๋ค.ํ ์ด๋ธ์ด ์ ๋ ฅ๋ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์๋์ผ๋ก ํํฐ๋ง๋ฉ๋๋ค.
(์ ํ์ฌํญ) ๋ณด์ ๋น๋ฐ ๋ฒ์ ์ ํํฐ๋งํ๋ ค๋ฉด ๋ฒ์ ์ ์ก์ธ์คํ ๋ณด์ ๋น๋ฐ์ ์ ํํ ํ ๋ฒ์ ํ์์ ํํฐ ์ต์ ์ ์ฌ์ฉํฉ๋๋ค.
gcloud
๋จผ์ gcloud
CLI๋ฅผ ์ค์นํ๊ณ ์ด๊ธฐํํฉ๋๋ค.
ํ๋ก์ ํธ์ ๋ชจ๋ ๋ณด์ ๋น๋ฐ์ ๋์ดํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
gcloud secrets list --filter="FILTER"
์ฌ๊ธฐ์ FILTER
๋ ๋ฌธ์์ด(์: name:asecret OR name:bsecret
) ๋๋ ์ ๊ท ํํ์(์: name ~ "secret_ab.*"
)์
๋๋ค.
๋ณด์ ๋น๋ฐ์ ๋ชจ๋ ๋ฒ์ ์ ๋์ดํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
gcloud secrets versions list SECRET_ID
์ฌ๊ธฐ์ SECRET_ID
๋ ๋ณด์ ๋น๋ฐ์ ID ๋๋ ๋ณด์ ๋น๋ฐ์ ์ ๊ทํ๋ ์๋ณ์์
๋๋ค.
์์ธํ ๋ด์ฉ์ ๋ณด์ ๋น๋ฐ ํํฐ๋ง ๋ฐ ๋ณด์ ๋น๋ฐ ๋ฒ์ ๋์ด์ ๊ดํ Secret Manager ๋ฌธ์ ๋๋ ๋ณด์ ๋น๋ฐ ๋ฐ ๋ณด์ ๋น๋ฐ ๋ฒ์ ์ ๊ฐ๊ฐ ๋์ดํ๋ ๋ฐฉ๋ฒ์ ๊ดํ CLI ์ฐธ์กฐ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
Python
๋จผ์ ๋ค์์ ์คํํ์ฌ ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํฉ๋๋ค.
pip install google-cloud-secret-manager
๊ทธ๋ฐ ๋ค์ ์ธ์ฆํ๊ณ ๋ค์์ ์คํํฉ๋๋ค.
from google.cloud import secretmanager
client = secretmanager.SecretManagerServiceClient()
for secret in client.list_secrets(request={
"parent": "projects/PROJECT_ID",
"filter": "FILTER", # e.g. "labels.provider=anthropic"
}):
print(f"Found secret: {secret.name}")
๋ณด์ ๋น๋ฐ ์ ๋ฐ์ดํธ
์ฝ์
Secret Manager ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
Secret Manager ํ์ด์ง์์ ๋ณด์ ๋น๋ฐ ์ด๋ฆ ์์ ์๋ ์ฒดํฌ๋ฐ์ค๋ฅผ ํด๋ฆญํฉ๋๋ค.
์ ๋ณด ํจ๋์ด ๋ซํ ์์ผ๋ฉด ์ ๋ณด ํจ๋ ํ์๋ฅผ ํด๋ฆญํ์ฌ ํ์ํฉ๋๋ค.
์ ๋ณด ํจ๋์์ ๋ผ๋ฒจ ํญ์ ์ ํํฉ๋๋ค.
๋ผ๋ฒจ ์ถ๊ฐ๋ฅผ ํด๋ฆญํ๊ณ ๋ผ๋ฒจ์ ํค์ ๊ฐ์ ์ ๋ ฅํฉ๋๋ค.
์ ์ฅ์ ํด๋ฆญํฉ๋๋ค.
gcloud
๋จผ์ gcloud
CLI๋ฅผ ์ค์นํ๊ณ ์ด๊ธฐํํฉ๋๋ค. ๊ทธ๋ฌ๊ณ ๋์ ๋ค์ ๋ช
๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
gcloud secrets update SECRET_ID --update-labels=KEY=VALUE
๊ฐ ํญ๋ชฉ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
SECRET_ID
: ๋ณด์ ๋น๋ฐ์ ID ๋๋ ๋ณด์ ๋น๋ฐ์ ์ ๊ทํ๋ ์๋ณ์KEY
: ๋ผ๋ฒจ ํคVALUE
: ๋ผ๋ฒจ์ ํด๋นํ๋ ๊ฐ
์์ธํ ๋ด์ฉ์ Secret Manager ๋ฌธ์ ๋๋ CLI ์ฐธ์กฐ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
Python
๋จผ์ ๋ค์์ ์คํํ์ฌ ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํฉ๋๋ค.
pip install google-cloud-secret-manager
๊ทธ๋ฐ ๋ค์ ์ธ์ฆํ๊ณ ๋ค์์ ์คํํฉ๋๋ค.
from google.cloud import secretmanager
client = secretmanager.SecretManagerServiceClient()
name = client.secret_path("PROJECT_ID", "SECRET_ID")
response = client.update_secret(request={
"secret": {
"name": name,
"labels": {"type": "api_key", "provider": "anthropic"}, # updated labels
},
"update_mask": {"paths": ["labels"]},
})
print(f"Updated secret: {response.name}")
๋ณด์ ๋น๋ฐ ์ญ์
์ฝ์
Secret Manager ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
Secret Manager ํ์ด์ง์ ๋ณด์ ๋น๋ฐ ์์ ์ด์์ ๋๋ณด๊ธฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
๋ฉ๋ด์์ ์ญ์ ๋ฅผ ์ ํํฉ๋๋ค.
๋ณด์ ๋น๋ฐ ์ญ์ ๋ํ์์์ ๋ณด์ ๋น๋ฐ ์ด๋ฆ์ ์ ๋ ฅํฉ๋๋ค.
๋ณด์ ๋น๋ฐ ์ญ์ ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
gcloud
๋จผ์ gcloud
CLI๋ฅผ ์ค์นํ๊ณ ์ด๊ธฐํํฉ๋๋ค.
๋ณด์ ๋น๋ฐ ๋ฒ์ ์ ์ญ์ ํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
gcloud secrets versions destroy VERSION_ID --secret=SECRET_ID
๊ฐ ํญ๋ชฉ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
VERSION_ID
: ๋ณด์ ๋น๋ฐ ๋ฒ์ ์ ๋ฆฌ์์ค ์ด๋ฆSECRET_ID
: ๋ณด์ ๋น๋ฐ์ ID ๋๋ ๋ณด์ ๋น๋ฐ์ ์ ๊ทํ๋ ์๋ณ์
๋ณด์ ๋น๋ฐ ๋ฐ ๋ชจ๋ ๋ฒ์ ์ ์ญ์ ํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
gcloud secrets delete SECRET_ID
์ฌ๊ธฐ์ SECRET_ID
๋ ๋ณด์ ๋น๋ฐ์ ID ๋๋ ๋ณด์ ๋น๋ฐ์ ์ ๊ทํ๋ ์๋ณ์์
๋๋ค.
์์ธํ ๋ด์ฉ์ ๋ณด์ ๋น๋ฐ ์ญ์ ๋ฐ ๋ณด์ ๋น๋ฐ ๋ฒ์ ํ๊ธฐ์ ๊ดํ Secret Manager ๋ฌธ์ ๋๋ ๋ณด์ ๋น๋ฐ ์ญ์ ๋ฐ ๋ณด์ ๋น๋ฐ ๋ฒ์ ํ๊ธฐ์ ๊ดํ CLI ์ฐธ์กฐ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
Python
๋จผ์ ๋ค์์ ์คํํ์ฌ ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํฉ๋๋ค.
pip install google-cloud-secret-manager
๊ทธ๋ฐ ๋ค์ ์ธ์ฆํ๊ณ ๋ค์์ ์คํํฉ๋๋ค.
from google.cloud import secretmanager
client = secretmanager.SecretManagerServiceClient()
name = client.secret_path("PROJECT_ID", "SECRET_ID")
client.delete_secret(request={"name": name})
OAuth ํด๋ผ์ด์ธํธ ๋ฐ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด
ํด๋ผ์ด์ธํธ ID๋ Google OAuth ์๋ฒ์์ ๋จ์ผ ์์ด์ ํธ๋ฅผ ์๋ณํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์์ด์ ํธ๊ฐ ์ฌ๋ฌ ํ๋ซํผ์์ ์คํ๋๋ ๊ฒฝ์ฐ ๊ฐ๊ฐ ์์ฒด ํด๋ผ์ด์ธํธ ID๊ฐ ์์ด์ผ ํฉ๋๋ค. ๋๋ต์ ์ผ๋ก OAuth ๊ธฐ๋ฐ ์์ด์ ํธ๋ฅผ ํตํฉํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์.
OAuth ํด๋ผ์ด์ธํธ ๋ฐ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ง๋ญ๋๋ค.
Secret Manager์ ํด๋ผ์ด์ธํธ ID์ ๋ณด์ ๋น๋ฐ์ ์ ์ฅํฉ๋๋ค. (๋ณด์ ๋น๋ฐ ๋ง๋ค๊ธฐ ์ฐธ๊ณ )
๊ฐ๋ฐ ์ค์ ์์ด์ ํธ์ ๋ณด์ ๋น๋ฐ์ ์ก์ธ์คํฉ๋๋ค.
OAuth ํด๋ผ์ด์ธํธ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด ๋ง๋ค๊ธฐ
Google Cloud ์ฝ์์์ Google Auth Platform > Clients ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
(ํ์ํ ๊ฒฝ์ฐ) ํ๋ฉด์ 'Google ์ธ์ฆ ํ๋ซํผ์ด ์์ง ๊ตฌ์ฑ๋์ง ์์'์ด๋ผ๊ณ ํ์๋๋ฉด ์์ํ๊ธฐ๋ฅผ ํด๋ฆญํ๊ณ ํ๋ก์ ํธ ๊ตฌ์ฑ์ ์์ฑํฉ๋๋ค. (๋์ค์ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.) ํ๋ก๋์ ์ค๋น ์ํ์ ๊ดํ ์์ธํ ๋ด์ฉ์ OAuth 2.0 ์ ์ฑ ์ค์๋ฅผ ์ฐธ๊ณ ํ์ธ์.
ํด๋ผ์ด์ธํธ ๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ํ์
Web application
์ผ๋ก ์ค์ ํฉ๋๋ค.OAuth ํด๋ผ์ด์ธํธ์ ์ด๋ฆ์
OAUTH_CLIENT_DISPLAY_NAME
์ผ๋ก ์ค์ ํฉ๋๋ค.์น์ธ๋ ๋ฆฌ๋๋ ์ URI์์
REDIRECT_URI
์ URI๋ฅผ ์ถ๊ฐํฉ๋๋ค.ํด๋ผ์ด์ธํธ ๋ณด์ ๋น๋ฐ๋ฒํธ์์ 'JSON ๋ค์ด๋ก๋' ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค. ๋ค์ ์ฝํ ์ธ ๊ฐ ํฌํจ๋
client_secret.json
ํ์ผ์ด ๋ค์ด๋ก๋๋ฉ๋๋ค.
{'web': {
'client_id': "CLIENT_ID",
'client_secret': "CLIENT_SECRET",
'project_id': "PROJECT_ID",
'redirect_uris': [REDIRECT_URIs],
'auth_uri': 'https://accounts.google.com/o/oauth2/auth',
'token_uri': 'https://www.googleapis.com/oauth2/v3/token',
'auth_provider_x509_cert_url': 'https://www.googleapis.com/oauth2/v1/certs',
'javascript_origins': "JAVASCRIPT_ORIGINS", # Optional.
}}
- Secret Manager์ ํด๋ผ์ด์ธํธ ID์ ๋ณด์ ๋น๋ฐ์ ์ ์ฅํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
from google.cloud import secretmanager
import google_crc32c
import json
client = secretmanager.SecretManagerServiceClient()
secret = client.create_secret(request={
"parent": "projects/PROJECT_ID",
"secret_id": "OAUTH_SECRET_ID", # e.g. "oauth-client-demo"
"secret": {
"labels": {"type": "oauth_client"},
"replication": {"automatic": {}},
},
})
payload_bytes = json.dumps(cred).encode("UTF-8")
crc32c = google_crc32c.Checksum()
crc32c.update(payload_bytes)
client.add_secret_version(request={
"parent": secret.name,
"payload": {
"data": payload_bytes,
"data_crc32c": int(crc32c.hexdigest(), 16),
},
})
OAuth ํด๋ผ์ด์ธํธ ํ์
Google Cloud ์ฝ์์์ Google Auth Platform > Clients ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
๋ณด์ ํ OAuth ํด๋ผ์ด์ธํธ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๊ฐ ํ์๋ฉ๋๋ค.
OAuth ํด๋ผ์ด์ธํธ ์ญ์
Google Cloud ์ฝ์์์ Google Auth Platform > Clients ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
์ญ์ ํ OAuth ํด๋ผ์ด์ธํธ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ํํ๊ณ ์ญ์ ๋ฅผ ํด๋ฆญํฉ๋๋ค.