๋ฐํ์ ์์ญ๊ณผ ์ปจํธ๋กค ํ๋ ์ธ์ด ํต์ ํ๊ฒ ํ๋ ค๋ฉด updateControlPlaneAccess API๋ฅผ ์ฌ์ฉํ์ฌ ๋๊ธฐํ ๋ด๋น์ ๋ฐ ๋ถ์ ๊ฒ์์ ์ก์ธ์ค์ ํ์ํ ๊ถํ์ ์ฌ์ฉ ์ค์ ํด์ผ ํฉ๋๋ค.
์น์ธ ํ ํฐ ๊ฐ์ ธ์ค๊ธฐ
์ด ์ฃผ์ ์ ๋ท ๋ถ๋ถ์ ์ค๋ช ๋ Apigee API ํธ์ถ์ ์ํํ๋ ค๋ฉด Apigee ์กฐ์ง ๊ด๋ฆฌ์ ์ญํ ์ด ์๋ ์น์ธ ํ ํฐ์ ๊ฐ์ ธ์์ผ ํฉ๋๋ค.
- Apigee Hybrid ์กฐ์ง๊ณผ ์ฐ๊ด๋ Google Cloud ํ๋ก์ ํธ์ ์์ ์๊ฐ ์๋ ๊ฒฝ์ฐ Google Cloud ์ฌ์ฉ์ ๊ณ์ ์ roles/apigee.admin(Apigee ์กฐ์ง ๊ด๋ฆฌ์) ์ญํ ์ด ์๋์ง ํ์ธํฉ๋๋ค. ๋ค์ ๋ช
๋ น์ด๋ก ํ ๋น๋ ์ญํ ์ ํ์ธํ ์ ์์ต๋๋ค.
gcloud projects get-iam-policy ${PROJECT_ID} \ --flatten="bindings[].members" \ --format='table(bindings.role)' \ --filter="bindings.members:your_account_email"
์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
gcloud projects get-iam-policy my-project \ --flatten="bindings[].members" \ --format='table(bindings.role)' \ --filter="bindings.members:myusername@example.com"
์ถ๋ ฅ์๋
roles/apigee.admin
์ด ํฌํจ๋์ด์ผ ํฉ๋๋ค. roles/apigee.admin
์ด ์์ผ๋ฉด ์ฌ์ฉ์ ๊ณ์ ์ Apigee ์กฐ์ง ๊ด๋ฆฌ์ ์ญํ ์ ์ถ๊ฐํฉ๋๋ค. ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ญํ ์ ์ฌ์ฉ์ ๊ณ์ ์ ์ถ๊ฐํฉ๋๋ค.gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member user:your_account_email \ --role roles/apigee.admin
์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
gcloud projects add-iam-policy-binding my-project \ --member user:myusername@example.com \ --role roles/apigee.admin
-
๋ช ๋ น์ค์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ
gcloud
์ธ์ฆ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ต๋๋ค.Linux/MacOS
export TOKEN=$(gcloud auth print-access-token)
ํ ํฐ์ด ์ ๋ ฅ๋์๋์ง ํ์ธํ๋ ค๋ฉด ๋ค์ ์์์ ๊ฐ์ด
echo
๋ฅผ ์ฌ์ฉํฉ๋๋ค.echo $TOKEN
๊ทธ๋ฌ๋ฉด ํ ํฐ์ด ์ธ์ฝ๋ฉ๋ ๋ฌธ์์ด๋ก ํ์๋ฉ๋๋ค.
Windows
for /f "tokens=*" %a in ('gcloud auth print-access-token') do set TOKEN=%a
ํ ํฐ์ด ์ ๋ ฅ๋์๋์ง ํ์ธํ๋ ค๋ฉด ๋ค์ ์์์ ๊ฐ์ด
echo
๋ฅผ ์ฌ์ฉํฉ๋๋ค.echo %TOKEN%
๊ทธ๋ฌ๋ฉด ํ ํฐ์ด ์ธ์ฝ๋ฉ๋ ๋ฌธ์์ด๋ก ํ์๋ฉ๋๋ค.
๋๊ธฐํ ๋ด๋น์ ์ก์ธ์ค ์ฌ์ฉ ์ค์
๋๊ธฐํ ๋ด๋น์ ์ก์ธ์ค๋ฅผ ์ฌ์ฉ ์ค์ ํ๋ ค๋ฉด ๋ค์ ์๋ด๋ฅผ ๋ฐ๋ฅด์ธ์.
- ๋๊ธฐํ ๋ด๋น์ ์ก์ธ์ค ๊ถํ์ ๋ถ์ฌํ ์๋น์ค ๊ณ์ ์ ๋ํด ์ด๋ฉ์ผ ์ฃผ์๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
๋นํ๋ก๋์
ํ๊ฒฝ(์ด ํํ ๋ฆฌ์ผ์ ์ค๋ช
์ฐธ์กฐ)์ ๊ฒฝ์ฐ
apigee-non-prod
์ฌ์ผ ํฉ๋๋ค. ํ๋ก๋์ ํ๊ฒฝ์์๋apigee-synchronizer
์ฌ์ผ ํฉ๋๋ค. ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ธ์.gcloud iam service-accounts list --project ${PROJECT_ID} --filter "apigee-synchronizer"
- ๋ค์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ updateControlPlaneAccess API๋ฅผ ํธ์ถํด ๋๊ธฐํ ๋ด๋น์์ ํ์ํ ๊ถํ์ ์ฌ์ฉ ์ค์ ํฉ๋๋ค.
๋ฐ์ดํฐ ์์ฃผ ์์
curl -X PATCH -H "Authorization: Bearer $TOKEN" \ -H "Content-Type:application/json" \ "https://apigee.googleapis.com/v1/organizations/${ORG_NAME}/controlPlaneAccess?update_mask=synchronizer_identities" \ -d "{\"synchronizer_identities\": [\"serviceAccount:apigee-synchronizer@${ORG_NAME}.iam.gserviceaccount.com\"]}"
๊ฐ ํญ๋ชฉ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
${ORG_NAME}
: ํ์ด๋ธ๋ฆฌ๋ ์กฐ์ง์ ์ด๋ฆ์ ๋๋ค.apigee-synchronizer@${ORG_NAME}.iam.gserviceaccount.com
: ์๋น์ค ๊ณ์ ์ ์ด๋ฉ์ผ ์ฃผ์์ ๋๋ค.
๋ฐ์ดํฐ ์์ฃผ
curl -X PATCH -H "Authorization: Bearer $TOKEN" \ -H "Content-Type:application/json" \ "https://$CONTROL_PLANE_LOCATION-apigee.googleapis.com/v1/organizations/${ORG_NAME}/controlPlaneAccess?update_mask=synchronizer_identities" \ -d "{\"synchronizer_identities\": [\"serviceAccount:apigee-synchronizer@${ORG_NAME}.iam.gserviceaccount.com\"]}"
๊ฐ ํญ๋ชฉ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
CONTROL_PLANE_LOCATION
: ํ์ด๋ธ๋ฆฌ๋ ์ค์น์์ ๋ฐ์ดํฐ ์์ฃผ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ปจํธ๋กค ํ๋ ์ธ ๋ฐ์ดํฐ์ ์์น์ ๋๋ค. ํ๋ก์ ๋ฒ๋ค๊ณผ ๊ฐ์ ๊ณ ๊ฐ ํต์ฌ ์ฝํ ์ธ ๊ฐ ์ ์ฅ๋๋ ์์น์ ๋๋ค. ๋ชฉ๋ก์ ์ฌ์ฉ ๊ฐ๋ฅํ Apigee API ์ปจํธ๋กค ํ๋ ์ธ ๋ฆฌ์ ์ ์ฐธ์กฐํ์ธ์.${ORG_NAME}
: ํ์ด๋ธ๋ฆฌ๋ ์กฐ์ง์ ์ด๋ฆ์ ๋๋ค.apigee-synchronizer@${ORG_NAME}.iam.gserviceaccount.com
: ์๋น์ค ๊ณ์ ์ ์ด๋ฉ์ผ ์ฃผ์์ ๋๋ค.
- ์๋น์ค ๊ณ์ ์ด ์ค์ ๋์๋์ง ํ์ธํ๋ ค๋ฉด ๋ค์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ API๋ฅผ ํธ์ถํด ์๋น์ค ๊ณ์ ๋ชฉ๋ก์ ๊ฐ์ ธ์ต๋๋ค.
๋ฐ์ดํฐ ์์ฃผ ์์
curl -X GET -H "Authorization: Bearer $TOKEN" \ -H "Content-Type:application/json" \ "https://apigee.googleapis.com/v1/organizations/${ORG_NAME}/controlPlaneAccess"
๋ฐ์ดํฐ ์์ฃผ
curl -X GET -H "Authorization: Bearer $TOKEN" \ -H "Content-Type:application/json" \ "https://CONTROL_PLANE_LOCATION-apigee.googleapis.com/v1/organizations/${ORG_NAME}/controlPlaneAccess"
์ถ๋ ฅ์ ๋ค์๊ณผ ๋น์ทํ๊ฒ ํ์๋ฉ๋๋ค.
{ "synchronizerIdentities": [ "serviceAccount:apigee-synchronizer@YOUR_ORG_NAME.iam.gserviceaccount.com" ] }
๋ถ์ ๊ฒ์์ ์ก์ธ์ค ์ฌ์ฉ ์ค์
์ฌ๋ฌ Apigee Hybrid ๋ฐํ์ ๊ตฌ์ฑ์์๋ ๋ถ์ ๋ฐ ๋๋ฒ๊ทธ ๋ ์ฝ๋๋ฅผ ๊ฒ์ํ์ฌ ๋ณด๊ณ ์ ๋๋ฒ๊น ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ๋ฐ์ดํฐ ๊ฒ์๋ฅผ ์ฌ์ฉ ์ค์ ํ๋ ค๋ฉด ์ด๋ฌํ Apigee ๊ตฌ์ฑ์์๋ฅผ ์คํํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ปจํธ๋กค ํ๋ ์ธ์ ๊ฒ์ํ๋ ์๋น์ค ๊ณ์ ์ ์ถ๊ฐ ๊ถํ์ ๋ถ์ฌํด์ผ ํฉ๋๋ค.
๋ถ์ ๊ฒ์์ ์ก์ธ์ค๋ฅผ ์ฌ์ฉ ์ค์ ํ๋ ค๋ฉด ๋ค์ ์๋ด๋ฅผ ๋ฐ๋ฅด์ธ์.
- ๋ค์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐํ์ ์๋น์ค ๊ณ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ปจํธ๋กค ํ๋ ์ธ์ ๊ฒ์ํ ์ ์๋ ๊ถํ์ ์ค์ ํฉ๋๋ค.
๋ฐ์ดํฐ ์์ฃผ ์์
curl -X PATCH -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type:application/json" \ "https://apigee.googleapis.com/v1/organizations/$ORG_NAME/controlPlaneAccess?update_mask=analytics_publisher_identities" \ -d "{\"analytics_publisher_identities\": [\"serviceAccount:apigee-runtime@$ORG_NAME.iam.gserviceaccount.com\"]}"
๋ฐ์ดํฐ ์์ฃผ
curl -X PATCH -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type:application/json" \ "https://CONTROL_PLANE_LOCATION-apigee.googleapis.com/v1/organizations/$ORG_NAME/controlPlaneAccess?update_mask=analytics_publisher_identities" \ -d "{\"analytics_publisher_identities\": [\"serviceAccount:apigee-runtime@$ORG_NAME.iam.gserviceaccount.com\"]}"
์๋ต์ ๋ค์๊ณผ ๋น์ทํ๊ฒ ํ์๋ฉ๋๋ค.
{ "name": "organizations/YOUR_ORG_NAME/operations/8316aa78-c137-4733-92ec-cc0d2d92fd29", "metadata": { "@type": "type.googleapis.com/google.cloud.apigee.v1.OperationMetadata", "operationType": "UPDATE", "targetResourceName": "organizations/YOUR_ORG_NAME/controlPlaneAccess", "state": "IN_PROGRESS" } }
- ์
๋ฐ์ดํธ ์๋ต์ name ํ๋์ ์๋ ์๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์์
์ํ๋ฅผ ํ์ธํฉ๋๋ค.
๋ฐ์ดํฐ ์์ฃผ ์์
curl -X GET -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type:application/json" \ "https://apigee.googleapis.com/v1/organizations/$ORG_NAME/operations/$OPERATION_ID"
๋ฐ์ดํฐ ์์ฃผ
curl -X GET -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type:application/json" \ "https://CONTROL_PLANE_LOCATION-apigee.googleapis.com/v1/organizations/$ORG_NAME/operations/$OPERATION_ID"
๋ค์๊ณผ ๊ฐ์ ์๋ต์ด ํ์๋ฉ๋๋ค.
{ "name": "organizations/YOUR_ORG_NAME/operations/$OPERATION_ID", "metadata": { "@type": "type.googleapis.com/google.cloud.apigee.v1.OperationMetadata", "operationType": "UPDATE", "targetResourceName": "organizations/YOUR_ORG_NAME/controlPlaneAccess", "state": "FINISHED" }, "done": true, "response": { "@type": "type.googleapis.com/google.cloud.apigee.v1.ControlPlaneAccess", "name": "organizations/YOUR_ORG_NAME/controlPlaneAccess" } }
- ์กฐ์ง์ ControlPlaneAccess ๊ตฌ์ฑ์ ํ์ธํฉ๋๋ค.
๋ฐ์ดํฐ ์์ฃผ ์์
curl "https://apigee.googleapis.com/v1/organizations/$ORG_NAME/controlPlaneAccess" \ -H "Authorization: Bearer $(gcloud auth print-access-token)"
๋ฐ์ดํฐ ์์ฃผ
curl "https://CONTROL_PLANE_LOCATION-apigee.googleapis.com/v1/organizations/$ORG_NAME/controlPlaneAccess" \ -H "Authorization: Bearer $(gcloud auth print-access-token)"
๋ค์๊ณผ ๊ฐ์ ์๋ต์ด ํ์๋ฉ๋๋ค.
{ "synchronizerIdentities": [ "serviceAccount:apigee-synchronizer@YOUR_ORG_NAME.iam.gserviceaccount.com" ], "analyticsPublisherIdentities": [ "serviceAccount:apigee-runtime@YOUR_ORG_NAME.iam.gserviceaccount.com" ] }
์ด์ Apigee Hybrid ๋ฐํ์ ๋ฐ ๊ด๋ฆฌ ์์ญ์ ์ฌ์ฉํด์ ํต์ ํ ์ ์์ต๋๋ค. ๋ค์์ผ๋ก, Apigee Hybrid๊ฐ ์ธ์ฆ์๋ฅผ ํด์ํ๊ณ ๊ด๋ฆฌํ ์ ์๋๋ก cert-manager๋ฅผ ์ค์นํฉ๋๋ค.