7๋‹จ๊ณ„: ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ์•ก์„ธ์Šค ์‚ฌ์šฉ ์„ค์ •

๋Ÿฐํƒ€์ž„ ์˜์—ญ๊ณผ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์ด ํ†ต์‹ ํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด updateControlPlaneAccess API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™๊ธฐํ™” ๋‹ด๋‹น์ž ๋ฐ ๋ถ„์„ ๊ฒŒ์‹œ์ž ์•ก์„ธ์Šค์— ํ•„์š”ํ•œ ๊ถŒํ•œ์„ ์‚ฌ์šฉ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์Šน์ธ ํ† ํฐ ๊ฐ€์ ธ์˜ค๊ธฐ

์ด ์ฃผ์ œ์˜ ๋’ท ๋ถ€๋ถ„์— ์„ค๋ช…๋œ Apigee API ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด Apigee ์กฐ์ง ๊ด€๋ฆฌ์ž ์—ญํ• ์ด ์žˆ๋Š” ์Šน์ธ ํ† ํฐ์„ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. 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์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  2. 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
  3. ๋ช…๋ น์ค„์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 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%

    ๊ทธ๋Ÿฌ๋ฉด ํ† ํฐ์ด ์ธ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋™๊ธฐํ™” ๋‹ด๋‹น์ž ์•ก์„ธ์Šค ์‚ฌ์šฉ ์„ค์ •

๋™๊ธฐํ™” ๋‹ด๋‹น์ž ์•ก์„ธ์Šค๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. ๋™๊ธฐํ™” ๋‹ด๋‹น์ž ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์„œ๋น„์Šค ๊ณ„์ •์— ๋Œ€ํ•ด ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋น„ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ(์ด ํŠœํ† ๋ฆฌ์–ผ์˜ ์„ค๋ช… ์ฐธ์กฐ)์˜ ๊ฒฝ์šฐ apigee-non-prod์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” apigee-synchronizer์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
    gcloud iam service-accounts list --project ${PROJECT_ID} --filter "apigee-synchronizer"
  2. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 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: ์„œ๋น„์Šค ๊ณ„์ •์˜ ์ด๋ฉ”์ผ ์ฃผ์†Œ์ž…๋‹ˆ๋‹ค.
  3. ์„œ๋น„์Šค ๊ณ„์ •์ด ์„ค์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 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 ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์— ๊ฒŒ์‹œํ•˜๋Š” ์„œ๋น„์Šค ๊ณ„์ •์— ์ถ”๊ฐ€ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ถ„์„ ๊ฒŒ์‹œ์ž ์•ก์„ธ์Šค๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Ÿฐํƒ€์ž„ ์„œ๋น„์Šค ๊ณ„์ •์— ๋ฐ์ดํ„ฐ๋ฅผ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์— ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    ๋ฐ์ดํ„ฐ ์ƒ์ฃผ ์—†์Œ

    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"
      }
    }
    
  2. ์—…๋ฐ์ดํŠธ ์‘๋‹ต์˜ 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"
      }
    }
    
  3. ์กฐ์ง์˜ 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๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„

1 2 3 4 5 6 7 (๋‹ค์Œ) 8๋‹จ๊ณ„: cert-manager ์„ค์น˜ 9 10 11