---
# System prepended metadata

title: Agocean index 遊戲工作室建立腳本
tags: [elasticsearch]

---

---
tags: elasticsearch
---
# Agocean index 遊戲工作室建立腳本
## !!注意!! 只限於建立新的遊戲工作室 index，不要重複建立舊的遊戲工作室 index
```
#!/bin/bash
# Elasticsearch 初始化建立 Template index
#----------------------------------------------ENV------------------------------------------------

#運作環境
# PROJECT_ENV
PROJECT_ENV="aceclub";
#遊戲工作室
# GAME_STUDIOS
GAME_STUDIOS=${GAMESTUDIO:='
  [
    {"gameStudio":"ht"}
  ]
'};
#系統服務(待補充)
#ELK 連線資料
# ELASTICSEARCH_HOST
# ELASTIC_USER
# ELASTIC_TOKEN
TMP_RESPNOSE_FILE="response.txt";

## prod ace-club
ELASTICSEARCH_HOST="https://0a17b4e3ae7a444e819820c279b3e02a.asia-east1.gcp.elastic-cloud.com:9243/";
ELASTIC_USER="elastic";
ELASTIC_TOKEN="KSHu7q82lVsBAzHBQfLlJZx2";

## dev、stage、sandbox
# ELASTICSEARCH_HOST="https://e8878ca4e297419c800c5a81e0b53411.asia-east1.gcp.elastic-cloud.com:9243/";
# ELASTIC_USER="elastic";
# ELASTIC_TOKEN="QGjn8pOnEvymkMiYrVP6X34E";


#------------------------------------------------ILM---------------------------------------------#
# ILM 設定
# HOT: after 3 Day
# WARM: after 31 Day
# COLD: after 93 Day
# DELETE: after 105 Day
ELK_ILM_POLICY="_ilm/policy/agocean-$PROJECT_ENV-ilm";
ELK_COMMON_GAMERECORD_ILM_POLICY="_ilm/policy/agocean-$PROJECT_ENV-game-ilm";
ELASTICSEARCH_HOST_ILM="$ELASTICSEARCH_HOST""$ELK_ILM_POLICY";
# Common Service
ILM_HOT_KEEP="24h";
ILM_WARM_KEEP="24h";
ILM_COLD_KEEP="31d";
ILM_DELETE_KEEP="93d";
# Game Record
ILM_GAMERECORD_HOT_KEEP="24h";
ILM_GAMERECORD_WARM_KEEP="24h";
ILM_GAMERECORD_COLD_KEEP="31d";
ILM_GAMERECORD_DELETE_KEEP="93d";


#CREATE COMMON ILM
ILM_API_DATA='{"policy": {"phases": {"hot": {"min_age": "0ms","actions": {"rollover": {"max_age": "'$ILM_HOT_KEEP'","max_size": "50gb"},"set_priority": {"priority": 100}}},"warm": {"min_age": "'$ILM_WARM_KEEP'","actions": {"allocate": {"require": {"data": "warm"},"number_of_replicas": 1},"shrink": {"number_of_shards": 1},"set_priority": {"priority": 50}}},"cold": {"min_age": "'$ILM_COLD_KEEP'","actions": {"freeze": {},"set_priority": {"priority": 0}}},"delete": {"min_age": "'$ILM_DELETE_KEEP'","actions": {"delete": {"delete_searchable_snapshot": true}}}}}}';
curl \
--silent \
--write-out %{http_code} \
--user $ELASTIC_USER:$ELASTIC_TOKEN \
--request PUT \
--header "Content-Type: application/json" \
--data "$ILM_API_DATA" \
$ELASTICSEARCH_HOST_ILM

echo " $ELK_ILM_POLICY response";


#CREATE GAME_RECORD ILM
ELASTICSEARCH_HOST_ILM="$ELASTICSEARCH_HOST""$ELK_COMMON_GAMERECORD_ILM_POLICY";
ILM_API_DATA='{"policy": {"phases": {"hot": {"min_age": "0ms","actions": {"rollover": {"max_age": "'$ILM_GAMERECORD_HOT_KEEP'","max_size": "50gb"},"set_priority": {"priority": 100}}},"warm": {"min_age": "'$ILM_GAMERECORD_WARM_KEEP'","actions": {"allocate": {"require": {"data": "warm"},"number_of_replicas": 1},"shrink": {"number_of_shards": 1},"set_priority": {"priority": 50}}},"cold": {"min_age": "'$ILM_GAMERECORD_COLD_KEEP'","actions": {"freeze": {},"set_priority": {"priority": 0}}},"delete": {"min_age": "'$ILM_GAMERECORD_DELETE_KEEP'","actions": {"delete": {"delete_searchable_snapshot": true}}}}}}';
curl \
--silent \
--write-out %{http_code} \
--user $ELASTIC_USER:$ELASTIC_TOKEN \
--request PUT \
--header "Content-Type: application/json" \
--data "$ILM_API_DATA" \
$ELASTICSEARCH_HOST_ILM

echo " $ELK_COMMON_GAMERECORD_ILM_POLICY response";

#--------------------------------------------TEMPLATE-------------------------------------------------#
# TEMPLATE 設定
ELK_COMMON_TEMPLATE="_template/agocean-$PROJECT_ENV";
ELK_COMMON_GAME_TEMPLATE="_template/agocean-$PROJECT_ENV-game";
ELK_COMMON_GAME_EVENT_TEMPLATE="_template/agocean-$PROJECT_ENV-game-event";


#CREATE COMMON TEMPLATE
ELASTICSEARCH_HOST_TEMPLATE="$ELASTICSEARCH_HOST""$ELK_COMMON_TEMPLATE";
TEMPLATE_DATA='{"order" : 1,"index_patterns" : ["agocean-'$PROJECT_ENV'-*"],"settings" : {"index" : {"lifecycle": {"name": "agocean-'$PROJECT_ENV'-ilm","rollover_alias": "agocean-'$PROJECT_ENV'"},"codec" : "best_compression","mapping" : {"total_fields" : {"limit" : "2000"},"ignore_malformed" : "true"},"number_of_shards" : "3","number_of_replicas" : "1","max_docvalue_fields_search" : "1000"}},"mappings" : {"_routing" : {"required" : false},"numeric_detection" : false,"dynamic_date_formats" : ["strict_date_optional_time","yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z"],"_meta" : { },"_source" : {"excludes" : [ ],"includes" : [ ],"enabled" : true},"dynamic" : true,"dynamic_templates" : [{"integers": {"mapping": {"scaling_factor": 10000,"type": "scaled_float"},"path_unmatch": "log.*","match_mapping_type": "long"}},{"floats": {"mapping": {"scaling_factor": 10000,"type": "scaled_float"},"path_unmatch": "log.*","match_mapping_type": "double"}}],"date_detection" : true},"aliases" : { }}';

curl \
--silent \
--write-out %{http_code} \
--user $ELASTIC_USER:$ELASTIC_TOKEN \
--request PUT \
--header "Content-Type: application/json" \
--data "$TEMPLATE_DATA" \
$ELASTICSEARCH_HOST_TEMPLATE

echo " $ELK_COMMON_TEMPLATE response";

#CREATE GAME TEMPLATE
ELASTICSEARCH_HOST_GAME_TEMPLATE="$ELASTICSEARCH_HOST""$ELK_COMMON_GAME_TEMPLATE";
TEMPLATE_DATA='{"order" : 50,"index_patterns" : ["agocean-'$PROJECT_ENV'-game-*"],"settings" : {"index" : {"lifecycle": {"name": "agocean-'$PROJECT_ENV'-game-ilm"},"codec" : "best_compression","mapping" : {"ignore_malformed" : "true"},"number_of_shards" : "3","number_of_replicas" : "1","max_docvalue_fields_search" : "1000"}}}';

curl \
--silent \
--write-out %{http_code} \
--user $ELASTIC_USER:$ELASTIC_TOKEN \
--request PUT \
--header "Content-Type: application/json" \
--data "$TEMPLATE_DATA" \
$ELASTICSEARCH_HOST_GAME_TEMPLATE

echo " $ELK_COMMON_GAME_TEMPLATE response";


#CREATE GAME TEMPLATE
ELASTICSEARCH_HOST_GAME_EVENT_TEMPLATE="$ELASTICSEARCH_HOST""$ELK_COMMON_GAME_EVENT_TEMPLATE";
TEMPLATE_DATA='{"order" : 100,"index_patterns" : ["agocean-'$PROJECT_ENV'-game-event-*"]}';

curl \
--silent \
--write-out %{http_code} \
--user $ELASTIC_USER:$ELASTIC_TOKEN \
--request PUT \
--header "Content-Type: application/json" \
--data "$TEMPLATE_DATA" \
$ELASTICSEARCH_HOST_GAME_EVENT_TEMPLATE

echo " $ELK_COMMON_GAME_EVENT_TEMPLATE response";

#----------------------------------------------INDEX-----------------------------------------------------
#----------------------------------------------default
ELK_DEFAULT_TEMPLATE="_template/agocean-$PROJECT_ENV-default";
ELASTICSEARCH_HOST_TEMPLATE="$ELASTICSEARCH_HOST""$ELK_DEFAULT_TEMPLATE";
TEMPLATE_DATA='{"order" : 150,"index_patterns" : ["agocean-'$PROJECT_ENV'-default-*"],"settings": {"index": {"lifecycle.rollover_alias": "agocean-'$PROJECT_ENV'-default"}}}';

## template
curl \
--silent \
--write-out %{http_code} \
--user $ELASTIC_USER:$ELASTIC_TOKEN \
--request PUT \
--header "Content-Type: application/json" \
--data "$TEMPLATE_DATA" \
$ELASTICSEARCH_HOST_TEMPLATE

echo " $ELASTICSEARCH_HOST_TEMPLATE response";
## index
ELK_COMMON_INDEX="agocean-$PROJECT_ENV-default-000001";
ELASTICSEARCH_HOST_INDEX="$ELASTICSEARCH_HOST""$ELK_COMMON_INDEX";
INDEX_DATA='{"aliases": {"agocean-'$PROJECT_ENV'-default": {"is_write_index": true}}}}';

curl \
--silent \
--write-out %{http_code} \
--user $ELASTIC_USER:$ELASTIC_TOKEN \
--request PUT \
--header "Content-Type: application/json" \
--data "$INDEX_DATA" \
$ELASTICSEARCH_HOST_INDEX

echo " $ELK_COMMON_INDEX response";
#----------------------------------------------AccountSystem
#common
ELK_ACCOUNTSYSTEM_INDEX="agocean-$PROJECT_ENV-accountsystem-000001";
ELK_ACCOUNTSYSTEM_TEMPLATE="_template/agocean-$PROJECT_ENV-accountsystem";
ELASTICSEARCH_HOST_INDEX="$ELASTICSEARCH_HOST""$ELK_ACCOUNTSYSTEM_INDEX";
ELASTICSEARCH_HOST_TEMPLATE="$ELASTICSEARCH_HOST""$ELK_ACCOUNTSYSTEM_TEMPLATE";
INDEX_DATA='{"aliases": {"agocean-'$PROJECT_ENV'-accountsystem": {"is_write_index": true}}}';
TEMPLATE_DATA='{"order" : 150,"index_patterns" : ["agocean-'$PROJECT_ENV'-accountsystem-*"],"settings": {"index": {"lifecycle.rollover_alias": "agocean-'$PROJECT_ENV'-accountsystem"}}}';

## template
curl \
--silent \
--write-out %{http_code} \
--user $ELASTIC_USER:$ELASTIC_TOKEN \
--request PUT \
--header "Content-Type: application/json" \
--data "$TEMPLATE_DATA" \
$ELASTICSEARCH_HOST_TEMPLATE

echo " $ELASTICSEARCH_HOST_TEMPLATE response";
## index
curl \
--silent \
--write-out %{http_code} \
--user $ELASTIC_USER:$ELASTIC_TOKEN \
--request PUT \
--header "Content-Type: application/json" \
--data "$INDEX_DATA" \
$ELASTICSEARCH_HOST_INDEX

echo " $ELK_ACCOUNTSYSTEM_INDEX response";

#event
ELK_ACCOUNTSYSTEM_INDEX="agocean-$PROJECT_ENV-accountsystem-event-000001";
ELK_ACCOUNTSYSTEM_TEMPLATE="_template/agocean-$PROJECT_ENV-accountsystem-event";
ELASTICSEARCH_HOST_INDEX="$ELASTICSEARCH_HOST""$ELK_ACCOUNTSYSTEM_INDEX";
ELASTICSEARCH_HOST_TEMPLATE="$ELASTICSEARCH_HOST""$ELK_ACCOUNTSYSTEM_TEMPLATE";
INDEX_DATA='{"aliases": {"agocean-'$PROJECT_ENV'-accountsystem-event": {"is_write_index": true}}}';
TEMPLATE_DATA='{"order" : 200,"index_patterns" : ["agocean-'$PROJECT_ENV'-accountsystem-event-*"],"settings": {"index": {"lifecycle.rollover_alias": "agocean-'$PROJECT_ENV'-accountsystem-event"}}}';

## template
curl \
--silent \
--write-out %{http_code} \
--user $ELASTIC_USER:$ELASTIC_TOKEN \
--request PUT \
--header "Content-Type: application/json" \
--data "$TEMPLATE_DATA" \
$ELASTICSEARCH_HOST_TEMPLATE

echo " $ELK_ACCOUNTSYSTEM_TEMPLATE response";
## index
curl \
--silent \
--write-out %{http_code} \
--user $ELASTIC_USER:$ELASTIC_TOKEN \
--request PUT \
--header "Content-Type: application/json" \
--data "$INDEX_DATA" \
$ELASTICSEARCH_HOST_INDEX

echo " $ELK_ACCOUNTSYSTEM_INDEX response";


#----------------------------------------------api-inbound
##common
ELK_API_INBOUND_INDEX="agocean-$PROJECT_ENV-api-inbound-000001";
ELK_API_INBOUND_TEMPLATE="_template/agocean-$PROJECT_ENV-api-inbound";
ELASTICSEARCH_HOST_INDEX="$ELASTICSEARCH_HOST""$ELK_API_INBOUND_INDEX";
ELASTICSEARCH_HOST_TEMPLATE="$ELASTICSEARCH_HOST""$ELK_API_INBOUND_TEMPLATE";
INDEX_DATA='{"aliases": {"agocean-'$PROJECT_ENV'-api-inbound": {"is_write_index": true}}}';
TEMPLATE_DATA='{"order" : 150,"index_patterns" : ["agocean-'$PROJECT_ENV'-api-inbound-*"],"settings": {"index": {"lifecycle.rollover_alias": "agocean-'$PROJECT_ENV'-api-inbound"}}}';

### template
curl \
--silent \
--write-out %{http_code} \
--user $ELASTIC_USER:$ELASTIC_TOKEN \
--request PUT \
--header "Content-Type: application/json" \
--data "$TEMPLATE_DATA" \
$ELASTICSEARCH_HOST_TEMPLATE

echo " $ELK_API_INBOUND_TEMPLATE response";
### index
curl \
--silent \
--write-out %{http_code} \
--user $ELASTIC_USER:$ELASTIC_TOKEN \
--request PUT \
--header "Content-Type: application/json" \
--data "$INDEX_DATA" \
$ELASTICSEARCH_HOST_INDEX

echo " $ELK_API_INBOUND_INDEX response";

##event
ELK_API_INBOUND_INDEX="agocean-$PROJECT_ENV-api-inbound-event-000001";
ELK_API_INBOUND_TEMPLATE="_template/agocean-$PROJECT_ENV-api-inbound-event";
ELASTICSEARCH_HOST_INDEX="$ELASTICSEARCH_HOST""$ELK_API_INBOUND_INDEX";
ELASTICSEARCH_HOST_TEMPLATE="$ELASTICSEARCH_HOST""$ELK_API_INBOUND_TEMPLATE";
INDEX_DATA='{"aliases": {"agocean-'$PROJECT_ENV'-api-inbound-event": {"is_write_index": true}}}';
TEMPLATE_DATA='{"order" : 200,"index_patterns" : ["agocean-'$PROJECT_ENV'-api-inbound-event-*"],"settings": {"index": {"lifecycle.rollover_alias": "agocean-'$PROJECT_ENV'-api-inbound-event"}}}';

### template
curl \
--silent \
--write-out %{http_code} \
--user $ELASTIC_USER:$ELASTIC_TOKEN \
--request PUT \
--header "Content-Type: application/json" \
--data "$TEMPLATE_DATA" \
$ELASTICSEARCH_HOST_TEMPLATE

echo " $ELK_API_INBOUND_TEMPLATE response";
### index
curl \
--silent \
--write-out %{http_code} \
--user $ELASTIC_USER:$ELASTIC_TOKEN \
--request PUT \
--header "Content-Type: application/json" \
--data "$INDEX_DATA" \
$ELASTICSEARCH_HOST_INDEX

echo " $ELK_API_INBOUND_INDEX response";

#----------------------------------------------dummy-integrator
#common
ELK_DUMMY_INTEGRATOR_INDEX="agocean-$PROJECT_ENV-dummy-integrator-000001";
ELK_DUMMY_INTEGRATOR_TEMPLATE="_template/agocean-$PROJECT_ENV-dummy-integrator";
ELASTICSEARCH_HOST_INDEX="$ELASTICSEARCH_HOST""$ELK_DUMMY_INTEGRATOR_INDEX";
ELASTICSEARCH_HOST_TEMPLATE="$ELASTICSEARCH_HOST""$ELK_DUMMY_INTEGRATOR_TEMPLATE";
INDEX_DATA='{"aliases": {"agocean-'$PROJECT_ENV'-dummy-integrator": {"is_write_index": true}}}';
TEMPLATE_DATA='{"order" : 150,"index_patterns" : ["agocean-'$PROJECT_ENV'-dummy-integrator-*"],"settings": {"index": {"lifecycle.rollover_alias": "agocean-'$PROJECT_ENV'-dummy-integrator"}}}';

### template
curl \
--silent \
--write-out %{http_code} \
--user $ELASTIC_USER:$ELASTIC_TOKEN \
--request PUT \
--header "Content-Type: application/json" \
--data "$TEMPLATE_DATA" \
$ELASTICSEARCH_HOST_TEMPLATE

echo " $ELK_DUMMY_INTEGRATOR_TEMPLATE response";
### index
curl \
--silent \
--write-out %{http_code} \
--user $ELASTIC_USER:$ELASTIC_TOKEN \
--request PUT \
--header "Content-Type: application/json" \
--data "$INDEX_DATA" \
$ELASTICSEARCH_HOST_INDEX

echo " $ELK_DUMMY_INTEGRATOR_INDEX response";

##event
ELK_DUMMY_INTEGRATOR_EVENT_INDEX="agocean-$PROJECT_ENV-dummy-integrator-event-000001";
ELK_DUMMY_INTEGRATOR_TEMPLATE="_template/agocean-$PROJECT_ENV-dummy-integrator-event";
ELASTICSEARCH_HOST_INDEX="$ELASTICSEARCH_HOST""$ELK_DUMMY_INTEGRATOR_EVENT_INDEX";
ELASTICSEARCH_HOST_TEMPLATE="$ELASTICSEARCH_HOST""$ELK_DUMMY_INTEGRATOR_TEMPLATE";
INDEX_DATA='{"aliases": {"agocean-'$PROJECT_ENV'-dummy-integrator-event": {"is_write_index": true}}}';
TEMPLATE_DATA='{"order" : 200,"index_patterns" : ["agocean-'$PROJECT_ENV'-dummy-integrator-event-*"],"settings": {"index": {"lifecycle.rollover_alias": "agocean-'$PROJECT_ENV'-dummy-integrator-event"}}}';

### template
curl \
--silent \
--write-out %{http_code} \
--user $ELASTIC_USER:$ELASTIC_TOKEN \
--request PUT \
--header "Content-Type: application/json" \
--data "$TEMPLATE_DATA" \
$ELASTICSEARCH_HOST_TEMPLATE

echo " $ELK_DUMMY_INTEGRATOR_TEMPLATE response";
### index
curl \
--silent \
--write-out %{http_code} \
--user $ELASTIC_USER:$ELASTIC_TOKEN \
--request PUT \
--header "Content-Type: application/json" \
--data "$INDEX_DATA" \
$ELASTICSEARCH_HOST_INDEX

echo " $ELK_DUMMY_INTEGRATOR_EVENT_INDEX response";

#----------------------------------------------grpcbridge
#common
ELK_GRPCBRIDGE_INDEX="agocean-$PROJECT_ENV-grpcbridge-000001";
ELK_GRPCBRIDGE_TEMPLATE="_template/agocean-$PROJECT_ENV-grpcbridge";
ELASTICSEARCH_HOST_INDEX="$ELASTICSEARCH_HOST""$ELK_GRPCBRIDGE_INDEX";
ELASTICSEARCH_HOST_TEMPLATE="$ELASTICSEARCH_HOST""$ELK_GRPCBRIDGE_TEMPLATE";
INDEX_DATA='{"aliases": {"agocean-'$PROJECT_ENV'-grpcbridge": {"is_write_index": true}}}';
TEMPLATE_DATA='{"order" : 150,"index_patterns" : ["agocean-'$PROJECT_ENV'-grpcbridge-*"],"settings": {"index": {"lifecycle.rollover_alias": "agocean-'$PROJECT_ENV'-grpcbridge"}}}';

### template
curl \
--silent \
--write-out %{http_code} \
--user $ELASTIC_USER:$ELASTIC_TOKEN \
--request PUT \
--header "Content-Type: application/json" \
--data "$TEMPLATE_DATA" \
$ELASTICSEARCH_HOST_TEMPLATE

echo " $ELK_GRPCBRIDGE_TEMPLATE response";
### index
curl \
--silent \
--write-out %{http_code} \
--user $ELASTIC_USER:$ELASTIC_TOKEN \
--request PUT \
--header "Content-Type: application/json" \
--data "$INDEX_DATA" \
$ELASTICSEARCH_HOST_INDEX

echo " $ELK_GRPCBRIDGE_INDEX response";

#event
ELK_GRPCBRIDGE_INDEX="agocean-$PROJECT_ENV-grpcbridge-event-000001";
ELK_GRPCBRIDGE_TEMPLATE="_template/agocean-$PROJECT_ENV-grpcbridge-event";
ELASTICSEARCH_HOST_INDEX="$ELASTICSEARCH_HOST""$ELK_GRPCBRIDGE_INDEX";
ELASTICSEARCH_HOST_TEMPLATE="$ELASTICSEARCH_HOST""$ELK_GRPCBRIDGE_TEMPLATE";
INDEX_DATA='{"aliases": {"agocean-'$PROJECT_ENV'-grpcbridge-event": {"is_write_index": true}}}';
TEMPLATE_DATA='{"order" : 200,"index_patterns" : ["agocean-'$PROJECT_ENV'-grpcbridge-event-*"],"settings": {"index": {"lifecycle.rollover_alias": "agocean-'$PROJECT_ENV'-grpcbridge-event"}}}';

### template
curl \
--silent \
--write-out %{http_code} \
--user $ELASTIC_USER:$ELASTIC_TOKEN \
--request PUT \
--header "Content-Type: application/json" \
--data "$TEMPLATE_DATA" \
$ELASTICSEARCH_HOST_TEMPLATE

echo " $ELK_GRPCBRIDGE_TEMPLATE response";
### index
curl \
--silent \
--write-out %{http_code} \
--user $ELASTIC_USER:$ELASTIC_TOKEN \
--request PUT \
--header "Content-Type: application/json" \
--data "$INDEX_DATA" \
$ELASTICSEARCH_HOST_INDEX

echo " $ELK_GRPCBRIDGE_INDEX response";

#----------------------------------------------canal-gameeventreporter-push
#common
ELK_GRPCBRIDGE_INDEX="agocean-$PROJECT_ENV-canal-gameeventreporter-push-000001";
ELK_GRPCBRIDGE_TEMPLATE="_template/agocean-$PROJECT_ENV-canal-gameeventreporter-push";
ELASTICSEARCH_HOST_INDEX="$ELASTICSEARCH_HOST""$ELK_GRPCBRIDGE_INDEX";
ELASTICSEARCH_HOST_TEMPLATE="$ELASTICSEARCH_HOST""$ELK_GRPCBRIDGE_TEMPLATE";
INDEX_DATA='{"aliases": {"agocean-'$PROJECT_ENV'-canal-gameeventreporter-push": {"is_write_index": true}}}';
TEMPLATE_DATA='{"order" : 150,"index_patterns" : ["agocean-'$PROJECT_ENV'-canal-gameeventreporter-push-*"],"settings": {"index": {"lifecycle.rollover_alias": "agocean-'$PROJECT_ENV'-canal-gameeventreporter-push"}}}';

### template
curl \
--silent \
--write-out %{http_code} \
--user $ELASTIC_USER:$ELASTIC_TOKEN \
--request PUT \
--header "Content-Type: application/json" \
--data "$TEMPLATE_DATA" \
$ELASTICSEARCH_HOST_TEMPLATE

echo " $ELK_GRPCBRIDGE_TEMPLATE response";
### index
curl \
--silent \
--write-out %{http_code} \
--user $ELASTIC_USER:$ELASTIC_TOKEN \
--request PUT \
--header "Content-Type: application/json" \
--data "$INDEX_DATA" \
$ELASTICSEARCH_HOST_INDEX

echo " $ELK_GRPCBRIDGE_INDEX response";

#event
ELK_GRPCBRIDGE_INDEX="agocean-$PROJECT_ENV-canal-gameeventreporter-push-event-000001";
ELK_GRPCBRIDGE_TEMPLATE="_template/agocean-$PROJECT_ENV-canal-gameeventreporter-push-event";
ELASTICSEARCH_HOST_INDEX="$ELASTICSEARCH_HOST""$ELK_GRPCBRIDGE_INDEX";
ELASTICSEARCH_HOST_TEMPLATE="$ELASTICSEARCH_HOST""$ELK_GRPCBRIDGE_TEMPLATE";
INDEX_DATA='{"aliases": {"agocean-'$PROJECT_ENV'-canal-gameeventreporter-push-event": {"is_write_index": true}}}';
TEMPLATE_DATA='{"order" : 200,"index_patterns" : ["agocean-'$PROJECT_ENV'-canal-gameeventreporter-push-event-*"],"settings": {"index": {"lifecycle.rollover_alias": "agocean-'$PROJECT_ENV'-canal-gameeventreporter-push-event"}}}';

### template
curl \
--silent \
--write-out %{http_code} \
--user $ELASTIC_USER:$ELASTIC_TOKEN \
--request PUT \
--header "Content-Type: application/json" \
--data "$TEMPLATE_DATA" \
$ELASTICSEARCH_HOST_TEMPLATE

echo " $ELK_GRPCBRIDGE_TEMPLATE response";
### index
curl \
--silent \
--write-out %{http_code} \
--user $ELASTIC_USER:$ELASTIC_TOKEN \
--request PUT \
--header "Content-Type: application/json" \
--data "$INDEX_DATA" \
$ELASTICSEARCH_HOST_INDEX

echo " $ELK_GRPCBRIDGE_INDEX response";
#---------------------------------------------------------------初始化遊戲工作室 index----------------------------------------------------------

for index in $(jq 'keys | .[]' <<< $GAME_STUDIOS); do
#   deleteResponseTxt;
  rm -f $TMP_RESPNOSE_FILE;
  CONFIG=$(jq -r ".[$index]" <<< $GAME_STUDIOS);
  GAMESTUDIONAME=$(jq -r '.gameStudio' <<< $CONFIG);

  ELASTICSEARCH_HOST_COMMON_TEMPLATE="$ELASTICSEARCH_HOST"_template/agocean-"$PROJECT_ENV"-game-"$GAMESTUDIONAME";
  ELASTICSEARCH_HOST_COMMON="$ELASTICSEARCH_HOST"agocean-"$PROJECT_ENV"-game-"$GAMESTUDIONAME"-000001;
  ELASTICSEARCH_HOST_EVENT_TEMPLATE="$ELASTICSEARCH_HOST"_template/agocean-"$PROJECT_ENV"-game-event-"$GAMESTUDIONAME";
  ELASTICSEARCH_HOST_EVENT="$ELASTICSEARCH_HOST"agocean-"$PROJECT_ENV"-game-event-"$GAMESTUDIONAME"-000001;
  # objectString="$ROITING_TYPE/$ROUTING_PATH@$BRIDGE_PATH";

  printf '\n';
  echo "===============start"
  echo "registry count $index: $GAMESTUDIONAME";
  echo "full index api: $ELASTICSEARCH_HOST_FULL";
  printf '\n';

  # https://curl.se/docs/manpage.html
  ## common studio template
  CODE=$(curl \
    --silent \
    --output $TMP_RESPNOSE_FILE \
    --write-out %{http_code} \
    --user $ELASTIC_USER:$ELASTIC_TOKEN \
    --request PUT \
    --header "Content-Type: application/json" \
    --data '{"order" : 150,"index_patterns" : ["agocean-'$PROJECT_ENV'-game-'$GAMESTUDIONAME'-*"],"settings": {"index": {"lifecycle.rollover_alias": "agocean-'$PROJECT_ENV'-game-'$GAMESTUDIONAME'"}},"mappings":{"properties": {"s_p":{"properties":{"detail":{"type":"flattened"},"meta":{"type":"flattened"},"result":{"type":"flattened"},"input":{"type":"flattened"},"output":{"type":"flattened"}}}}}}' \
    $ELASTICSEARCH_HOST_COMMON_TEMPLATE)

  ## common studio index
  CODE=$(curl \
    --silent \
    --output $TMP_RESPNOSE_FILE \
    --write-out %{http_code} \
    --user $ELASTIC_USER:$ELASTIC_TOKEN \
    --request PUT \
    --header "Content-Type: application/json" \
    --data '{"aliases": {"agocean-'$PROJECT_ENV'-game-'$GAMESTUDIONAME'": {"is_write_index": true}}}' \
    $ELASTICSEARCH_HOST_COMMON)

  # echo "vvvvvvvv";
  # echo "wtf$CODE";
  # echo "^^^^^^^^";
  if ! [[ "$CODE" =~ ^2 ]]; then
    echo "HTTP_CODE: $CODE";

    PATTERN_OBJECT_EXIST="resource_already_exists_exception";
    if grep -q "$PATTERN_OBJECT_EXIST" $TMP_RESPNOSE_FILE
    then
        echo "RESPONSE: $(grep "$PATTERN_OBJECT_EXIST" response.txt)";
        code if found
    else
      cat response.txt
      printf "\n";
      echo "FATAL ERROR, EXIT REGISTRY."
      exit 1;
        # code if not found
    fi
  else
    echo "add $GAMESTUDIONAME success."
  fi
  ## event studio template
  CODE=$(curl \
    --silent \
    --output $TMP_RESPNOSE_FILE \
    --write-out %{http_code} \
    --user $ELASTIC_USER:$ELASTIC_TOKEN \
    --request PUT \
    --header "Content-Type: application/json" \
    --data '{"order" : 200,"index_patterns" : ["agocean-'$PROJECT_ENV'-game-event-'$GAMESTUDIONAME'-*"],"settings": {"index": {"lifecycle.rollover_alias": "agocean-'$PROJECT_ENV'-game-event-'$GAMESTUDIONAME'"}},"mappings":{"properties": {"s_p":{"properties":{"detail":{"type":"flattened"},"meta":{"type":"flattened"},"result":{"type":"flattened"},"input":{"type":"flattened"},"output":{"type":"flattened"}}}}}}' \
    $ELASTICSEARCH_HOST_EVENT_TEMPLATE)

  ## event studio index
  CODE=$(curl \
    --silent \
    --output $TMP_RESPNOSE_FILE \
    --write-out %{http_code} \
    --user $ELASTIC_USER:$ELASTIC_TOKEN \
    --request PUT \
    --header "Content-Type: application/json" \
    --data '{"aliases": {"agocean-'$PROJECT_ENV'-game-event-'$GAMESTUDIONAME'": {"is_write_index": true}}}' \
    $ELASTICSEARCH_HOST_EVENT)

  # echo "vvvvvvvv";
  # echo "wtf$CODE";
  # echo "^^^^^^^^";
  if ! [[ "$CODE" =~ ^2 ]]; then
    echo "HTTP_CODE: $CODE";

    PATTERN_OBJECT_EXIST="resource_already_exists_exception";
    if grep -q "$PATTERN_OBJECT_EXIST" $TMP_RESPNOSE_FILE
    then
        echo "RESPONSE: $(grep "$PATTERN_OBJECT_EXIST" response.txt)";
        code if found
    else
      cat response.txt
      printf "\n";
      echo "FATAL ERROR, EXIT REGISTRY."
      exit 1;
        # code if not found
    fi
  else
    echo "add $GAMESTUDIONAME success."
  fi
  echo "==============="
done
# deleteResponseTxt;
  rm -f $TMP_RESPNOSE_FILE;
printf "\n";
echo "JOB FINISHED."
exit 0;
Select a repo
```