5๋‹จ๊ณ„: ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋Ÿฐํƒ€์ž„ ์„ค์น˜

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

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

  1. Google Cloud ์„œ๋น„์Šค ๊ณ„์ •์„ ๋งŒ๋“ค๊ณ  ์ด ๊ณ„์ •์— Apigee ์กฐ์ง ๊ด€๋ฆฌ์ž ์—ญํ• ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ์„œ๋น„์Šค ๊ณ„์ •์€ ์ดํ›„ ๋‹จ๊ณ„์—์„œ ์ˆ˜ํ–‰ํ•  API ํ˜ธ์ถœ์„ ์ธ์ฆํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. GCP Console์„ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋น„์Šค ๊ณ„์ •์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ GCP ๋ฌธ์„œ์˜ ์„œ๋น„์Šค ๊ณ„์ • ๋งŒ๋“ค๊ธฐ ๋ฐ ๊ด€๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

    ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ gcloud ๋ช…๋ น์–ด๋Š” ์„œ๋น„์Šค ๊ณ„์ •์„ ๋งŒ๋“ค๊ณ  Apigee ์กฐ์ง ๊ด€๋ฆฌ์ž ์—ญํ• ์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

    1. ๊ณ„์ •์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
      gcloud iam service-accounts create apigee-org-admin \
          --display-name="apigee-org-admin"

      ์—ฌ๊ธฐ์„œ apigee-org-admin์€ ๋งŒ๋“ค๋ ค๋Š” ์„œ๋น„์Šค ๊ณ„์ •์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” 'apigee-org-admin'์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

    2. ์„œ๋น„์Šค ๊ณ„์ •์— Apigee ์กฐ์ง ๊ด€๋ฆฌ์ž ์—ญํ• ์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
      gcloud projects add-iam-policy-binding $PROJECT_ID \
          --member="serviceAccount:apigee-org-admin@$PROJECT_ID.iam.gserviceaccount.com" \
          --role="roles/apigee.admin"

      ๊ฐ ํ•ญ๋ชฉ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      • $PROJECT_ID๋Š” 2๋‹จ๊ณ„: Google Cloud ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๊ธฐ์—์„œ ๋งŒ๋“  Google Cloud ํ”„๋กœ์ ํŠธ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
      • apigee-org-admin์€ ๋ฐฉ๊ธˆ ๋งŒ๋“  ์„œ๋น„์Šค ๊ณ„์ •์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
      • roles/apigee.admin์€ Apigee ์กฐ์ง ๊ด€๋ฆฌ์ž ์—ญํ• ์ž…๋‹ˆ๋‹ค.
  2. ์„œ๋น„์Šค ๊ณ„์ • ํ‚ค๋ฅผ ์‹œ์Šคํ…œ์— ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‚ค๋ฅผ service-accounts/ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ GCP ๋ฌธ์„œ์˜ ์„œ๋น„์Šค ๊ณ„์ • ํ‚ค ๋งŒ๋“ค๊ธฐ์˜ ์•ˆ๋‚ด๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
    1. ํ˜„์žฌ ์œ„์น˜๊ฐ€ /hybrid-base-directory/hybrid-files/ ๋””๋ ‰ํ„ฐ๋ฆฌ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    2. ํ‚ค๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
      gcloud iam service-accounts keys create ./service-accounts/$PROJECT_ID-apigee-org-admin.json \
        --iam-account apigee-org-admin@$PROJECT_ID.iam.gserviceaccount.com

      ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

      created key [a0b1c2d3e4f5a0b1c2d3e4f5a0b1c2d3e4f5a0b1] of type [json] as [./service-accounts/hybrid-
      example-apigee-org-admin.json] for [apigee-org-admin@my-hybrid.iam.gserviceaccount.com]
      $ 
  3. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Apigee ์กฐ์ง ๊ด€๋ฆฌ์ž ์„œ๋น„์Šค ๊ณ„์ • ํ‚ค์˜ ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    ls service-accounts/*admin*

    ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    service-accounts/hybrid-example-apigee-org-admin.json
  4. ํ‚ค ํŒŒ์ผ ์ด๋ฆ„์œผ๋กœ ORG_ADMIN_ACCOUNT ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    export ORG_ADMIN_ACCOUNT="hybrid-example-2-apigee-org-admin.json"
  5. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ† ํฐ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
    export GOOGLE_APPLICATION_CREDENTIALS=./service-accounts/$ORG_ADMIN_ACCOUNT
    export TOKEN=$(gcloud auth application-default print-access-token)
  6. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ apigee-synchronizer ์„œ๋น„์Šค ๊ณ„์ •์˜ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
    gcloud iam service-accounts list --filter "apigee-synchronizer"

    apigee-synchronizer$ORG_NAME.iam.gserviceaccount.com ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ ์ด ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  7. ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ setSyncAuthorization API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋™๊ธฐํ™” ๋‹ด๋‹น์ž์— ํ•„์š”ํ•œ ๊ถŒํ•œ์„ ์‚ฌ์šฉ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    curl -X POST -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type:application/json" \
      "https://apigee.googleapis.com/v1/organizations/$ORG_NAME:setSyncAuthorization" \
       -d '{"identities":["'"serviceAccount:apigee-synchronizer@$ORG_NAME.iam.gserviceaccount.com"'"]}'
    

    ๊ฐ ํ•ญ๋ชฉ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    • $ORG_NAME: ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์กฐ์ง์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    • apigee-synchronizer$ORG_NAME.iam.gserviceaccount.com: apigee-syncnronizer ์„œ๋น„์Šค ๊ณ„์ •์˜ ์ด๋ฉ”์ผ ์ฃผ์†Œ์ž…๋‹ˆ๋‹ค.
  8. ์„œ๋น„์Šค ๊ณ„์ •์ด ์„ค์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์„œ๋น„์Šค ๊ณ„์ • ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
    curl -X POST -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type:application/json" \
      "https://apigee.googleapis.com/v1/organizations/$ORG_NAME:getSyncAuthorization" \
       -d ''
    

    ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

    {
       "identities":[
          "serviceAccount:my-synchronizer-manager-service_account@my_project_id.iam.gserviceaccount.com"
       ],
       "etag":"BwWJgyS8I4w="
    }

ํด๋Ÿฌ์Šคํ„ฐ์— ๊ตฌ์„ฑ ์ ์šฉ

๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ผ ํด๋Ÿฌ์Šคํ„ฐ์— Apigee Hybrid๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

  1. ํ˜„์žฌ ์œ„์น˜๊ฐ€ hybrid-base-directory/hybrid-files ๋””๋ ‰ํ„ฐ๋ฆฌ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  2. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ kubectl์ด ์˜ฌ๋ฐ”๋ฅธ ์ปจํ…์ŠคํŠธ๋กœ ์„ค์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ปจํ…์ŠคํŠธ๋ฅผ Apigee Hybrid๋ฅผ ๋ฐฐํฌํ•˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    kubectl config get-contexts
  3. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ KUBECONFIG ๋ณ€์ˆ˜๊ฐ€ ์„ค์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ ์š”๊ฑด์„ ์ฐธ์กฐํ•˜์„ธ์š”.
    echo $KUBECONFIG
  4. ํ…Œ์ŠคํŠธ ์‹คํ–‰์„ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. --dry-run ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ init ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์‹คํ–‰์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์ „์— ์˜ค๋ฅ˜๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ฒ„์ „ 1.3์—์„œ --dry-run ํ”Œ๋ž˜๊ทธ ๋ฌธ๋ฒ•์€ ์‹คํ–‰ ์ค‘์ธ kubectl ๋ฒ„์ „์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ kubectl ๋ฒ„์ „์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    kubectl version

    kubectl ๋ฒ„์ „ 1.17 ์ดํ•˜:

    $APIGEECTL_HOME/apigeectl init -f overrides/overrides.yaml --dry-run=true

    kubectl ๋ฒ„์ „ 1.18 ์ด์ƒ:

    $APIGEECTL_HOME/apigeectl init -f overrides/overrides.yaml --dry-run=client
  5. ์˜ค๋ฅ˜๊ฐ€ ์—†์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด init ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    $APIGEECTL_HOME/apigeectl init -f overrides/overrides.yaml

    init ๋ช…๋ น์–ด๋Š” Apigee ๋ฐฐํฌ ์„œ๋น„์Šค Apigee ๋ฐฐํฌ ์ปจํŠธ๋กค๋Ÿฌ์™€ Apigee ํ—ˆ์šฉ ์›นํ›…์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

  6. ๋ฐฐํฌ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
    $APIGEECTL_HOME/apigeectl check-ready -f overrides/overrides.yaml
    kubectl get pods -n apigee-system
    kubectl get pods -n istio-system

    ํฌ๋“œ๊ฐ€ ์ค€๋น„๋˜๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

  7. ํ…Œ์ŠคํŠธ ์‹คํ–‰์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. --dry-run ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ apply ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    kubectl ๋ฒ„์ „ 1.17 ์ดํ•˜:

    $APIGEECTL_HOME/apigeectl apply -f overrides/overrides.yaml --dry-run=true

    kubectl ๋ฒ„์ „ 1.18 ์ด์ƒ:

    $APIGEECTL_HOME/apigeectl apply -f overrides/overrides.yaml --dry-run=client
  8. ์˜ค๋ฅ˜๊ฐ€ ์—†์œผ๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์— Apigee๋ณ„ ๋Ÿฐํƒ€์ž„ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    $APIGEECTL_HOME/apigeectl apply -f overrides/overrides.yaml
  9. ๋ฐฐํฌ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”.
    $APIGEECTL_HOME/apigeectl check-ready -f overrides/overrides.yaml

    ํฌ๋“œ๊ฐ€ ๋ชจ๋‘ ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ ์ด ๋‹จ๊ณ„๋ฅผ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค. pod๊ฐ€ ์‹œ์ž‘๋˜๋Š” ๋ฐ ๋ช‡ ๋ถ„ ์ •๋„ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Apigee Connect ์‚ฌ์šฉ ์„ค์ •

Apigee Connect๋Š” ๋Ÿฐํƒ€์ž„ ์˜์—ญ์˜ Apigee ๊ด€๋ฆฌ ์˜์—ญ๊ณผ MART ๊ฐ„์˜ ํ†ต์‹ ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Apigee Connect ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

Apigee Connect๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋‹ค์Œ ์˜ˆ์‹œ์™€ ๊ฐ™์ด ๋ช…๋ น์ค„์—์„œ gcloud ์ธ์ฆ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

    TOKEN=$(gcloud auth print-access-token)

    ํ† ํฐ์ด ์ž…๋ ฅ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ์˜ˆ์‹œ์™€ ๊ฐ™์ด echo๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    echo $TOKEN

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

    ์ž์„ธํ•œ ๋‚ด์šฉ์€ gcloud ๋ช…๋ น์ค„ ๋„๊ตฌ ๊ฐœ์š”๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

  2. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ์ง์— Apigee Connect๊ฐ€ ์‚ฌ์šฉ ์„ค์ •๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    curl -H "Authorization: Bearer $TOKEN" \
      "https://apigee.googleapis.com/v1/organizations/$ORG_NAME"

    ์—ฌ๊ธฐ์„œ $ORG_NAME์€ ์กฐ์ง์˜ ID์ž…๋‹ˆ๋‹ค.

    ์ถœ๋ ฅ์— ๋‹ค์Œ์ด ํฌํ•จ๋˜๋ฉด

          "name" : "features.mart.connect.enabled",
          "value" : "true"

    Apigee Connect๊ฐ€ ์‚ฌ์šฉ ์„ค์ •๋˜์—ˆ์œผ๋ฉฐ ์ด ์„น์…˜์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์„ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Apigee Connect๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    curl -H "Authorization: Bearer $TOKEN" -X PUT \
      -H "Content-Type: application/json" \
      -d '{
        "name" : "'"$ORG_NAME"'",
        "properties" : {
          "property" : [ {
            "name" : "features.hybrid.enabled",
            "value" : "true"
          }, {
            "name" : "features.mart.connect.enabled",
            "value" : "true"
          } ]
        }
      }' \
      "https://apigee.googleapis.com/v1/organizations/$ORG_NAME"
    

    ์ถœ๋ ฅ์— ๋‹ค์Œ ์†์„ฑ์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด Apigee Connect๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์‚ฌ์šฉ ์„ค์ •๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

          {
            "name": "features.mart.connect.enabled",
            "value": "true"
          },
          {
            "name": "features.hybrid.enabled",
            "value": "true"
          }
    

    ์ถœ๋ ฅ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    {
      "name": "hybrid-example-2",
      "createdAt": "1594409699772",
      "lastModifiedAt": "1594776283697",
      "environments": [
        "example-env"
      ],
      "properties": {
        "property": [
          {
            "name": "features.mart.connect.enabled",
            "value": "true"
          },
          {
            "name": "features.hybrid.enabled",
            "value": "true"
          }
        ]
      },
      "analyticsRegion": "us-central1",
      "runtimeType": "HYBRID",
      "subscriptionType": "TRIAL"
    }