Posted on:March 17, 2024 at 02:30 AM

Tyk API Gateway 오픈소스 설정하기

Tyk API Gateway 오픈소스 설정하기

1. 소개

tyk는 API 게이트웨이 솔루션인데, 오픈소스 버전이 강력하고 기능이 많아서 다른 대체제들이 비교하면 무료로 API gateway를 설정하고 API를 관리할 수 있다.

  1. tyk gateway 설정하기
  2. tyk pump 설정하기
  3. elasticsearch, kibana 설정하기

모두 docker compose로 진행할 예정이다.

2. 설정하기

docker compos로 만들 것인데 아래와 같은 것들이 필요하다.

redis:latest
tykio/tyk-gateway:v5.6.1
tykio/tyk-pump-docker-pub:v1.11.1
elasticsearch:7.17.26
docker.elastic.co/kibana/kibana:7.17.26

얘들을 다 담은 docker compose파일을 하나 만들고, 각각에 필요한 설정들은 따로 준비하자.

1. redis

compose.yaml 파일에 다음 블록을 넣어준다.

services:
  redis:
    image: redis:latest
    network_mode: host
    environment:
      - REDIS_PASSWORD=${REDIS_PASSWORD}
    volumes:
      - ./mnt:/bitnami/redis/data
    restart: always

redis에 보안을 추가하기 위해서 redis 비밀번호를 .env 파일에 셋팅했고, 접근할 때 비밀번호를 알아야 한다.

2. tyk gateway

services:
  tyk-gateway:
    image: tykio/tyk-gateway:v5.6.1
    network_mode: host
    environment:
      - TYK_GW_SECRET=${TYK_GW_SECRET}
      - TYK_GW_ENABLEHASHEDKEYSLISTING=true
      - TYK_DB_REDISPASSWORD=${REDIS_PASSWORD}
    volumes:
      - ./config/tyk.standalone.conf:/opt/tyk-gateway/tyk.conf
      - ./config/apps:/opt/tyk-gateway/apps
      - ./config/policies:/opt/tyk-gateway/policies

이 파일 이외에 3개 파일이 필요하다.

tyk.conf

tyk의 전체적인 동작을 위해서 필요한 설정파일이다.

{
  "log_level": "info",
  "listen_port": 8080,
  "secret": "352d20ee67be67f6340b4c0605b044b7",
  "template_path": "/opt/tyk-gateway/templates",
  "tyk_js_path": "/opt/tyk-gateway/js/tyk.js",
  "middleware_path": "/opt/tyk-gateway/middleware",
  "use_db_app_configs": false,
  "app_path": "/opt/tyk-gateway/apps/",
  "storage": {
    "type": "redis",
    "host": "127.0.0.1",
    "port": 6379,
    "username": "",
    "database": 10,
    "optimisation_max_idle": 2000,
    "optimisation_max_active": 4000
  },
  "enable_analytics": true,
  "analytics_config": {
    "enable_detailed_recording": true,
    "type": "",
    "ignored_ips": []
  },
  "health_check": {
    "enable_health_checks": false,
    "health_check_value_timeouts": 60
  },
  "enable_non_transactional_rate_limiter": true,
  "enable_sentinel_rate_limiter": false,
  "enable_redis_rolling_limiter": false,
  "allow_master_keys": false,
  "policies": {
    "policy_source": "file",
    "policy_path": "/opt/tyk-gateway/policies"
  },
  "hash_keys": false,
  "close_connections": false,
  "http_server_options": {
    "enable_websockets": true
  },
  "allow_insecure_configs": true,
  "coprocess_options": {
    "enable_coprocess": true,
    "coprocess_grpc_server": ""
  },
  "enable_bundle_downloader": true,
  "bundle_base_url": "",
  "global_session_lifetime": 100,
  "force_global_session_lifetime": false,
  "max_idle_connections_per_host": 500,
  "enable_jsvm": true
}

policies.json

{
	"my-policy": {
		"active": true,
		"name": "my-policy",
		"rate": 1000,
		"per": 1,
		"quota_max": 10000,
		"quota_renewal_rate": 3600,
		"access_rights": {
			"api-version": {
				"api_name": "api-version",
				"api_id": "api-version",
				"versions": [
					"Default"
				],
				"allowed_urls": [],
				"limit": null,
				"allowance_scope": ""
			}
		},
		"tags": [
			"Startup Users"
		]
	}
}

apps

apps 디렉토리에 필요한 api 설정을 넣어둔다

{
	"name": "my-api-version",
	"api_id": "my-api-version",
	"org_id": "onec",
	"definition": {
		"location": "header",
		"key": "version"
	},
	"auth": {
		"auth_header_name": "my-api-token"
	},
	"version_data": {
		"not_versioned": true,
		"versions": {
			"Default": {
				"name": "Default"
			}
		}
	},
	"proxy": {
		"listen_path": "/version",
		"target_url": "https://myapp/version/",
		"strip_listen_path": true
	}
}

3. API key 관리하기

API키는 tyk gateway api에 새로운 key를 등록하고, 키를 받아둔다. 여기에서 Rate Limiting 같은 것들을 설정할 수 있다. Gateway API에 사용할 payload는 다음과 같다.

{
	"allowance": 1000,
	"rate": 500,
	"per": 1,
	"expires": -1,
	"quota_max": -1,
	"quota_renews": 1449051461,
	"quota_remaining": -1,
	"quota_renewal_rate": 60,
	"org_id": "onec",
	"access_rights": {
			"my-api-version": {
					"api_name": "api-version",
					"api_id": "api-version",
					"versions": [
							"Default"
					],
					"allowed_urls": [],
					"limit": null,
					"allowance_scope": ""
			}
    }
	}
}

3. tyk pump

API를 분석하고, 사용자에게 과금을 하기 위해서는 어떤 API가 호출되는지를 알아야 하는데 pump는 누군가가 API Call을 하면 그 내용을 다른 서비스에 전달해주는 역할을 한다.

compose.yaml

  tyk-pump:
    image: tykio/tyk-pump-docker-pub:v1.11.1
    network_mode: host
    environment:
      - TYK_PMP_LOGLEVEL=info
      - TYK_DB_REDISPASSWORD=${REDIS_PASSWORD}
    volumes:
      - ./config/pump.conf:/opt/tyk-pump/pump.conf
      - ./mnt:/mnt
    user: 1000:1000

pump의 동작은 pump.conf파일에서 설정할 수 있는데 이 예제에서는 결과를 elastic serach로 보내는 것으로 설정했다.

pump.conf

{
  "analytics_storage_type": "redis",
  "analytics_storage_config": {
    "type": "redis",
    "host": "127.0.0.1",
    "port": 6379,
    "hosts": null,
    "username": "",
    "database": 10,
    "optimisation_max_idle": 100,
    "optimisation_max_active": 100,
    "enable_cluster": false
  },
  "purge_delay": 2,
  "pumps": {
    "elasticsearch": {
      "type": "elasticsearch",
      "meta": {
        "index_name": "tyk_analytics",
        "elasticsearch_url": "http://elasticsearch:9200",
        "enable_sniffing": false,
        "document_type": "tyk_analytics",
        "rolling_index": false,
        "extended_stats": true,
        "decode_base64": true,
        "version": "7",
        "bulk_config": {
          "workers": 2,
          "flush_interval": 60
        }
      }
    }
  },
  "dont_purge_uptime_data": true
}

4. Elasticsearch

ElasticSearch는 pump에서 데이터를 받아서 검색하기 좋게 처리를 한다.

compose.yaml

services:
  elasticsearch:
    image: elasticsearch:7.17.26
    network_mode: host
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - ./mnt:/usr/share/elasticsearch/data

설정은 따로하지 않고 환경변수로 몇가지 셋팅했다.

4. Kibana

kibana는 elasticsearch에서 받은 데이터를 보기 좋게 바꾸는 용도로 사용된다.

compose

services:
  kibana:
    image: docker.elastic.co/kibana/kibana:7.17.26
    network_mode: host
    environment:
      - ELASTICSEARCH_HOSTS=http://127.0.0.1:9200
      - ELASTICSEARCH_URL=http://127.0.0.1:9200
      # - KIBANA_PASSWORD=${KIBANA_PASSWORD}
      - SERVERNAME=kibana
      - SERVER_PUBLICBASEURL=https://kibana.mycompany.com
    volumes:
      - ./config/kibana.yaml:/usr/share/kibana/config/kibana.yml

kibana.yaml

server.port: 5601

모든게 다 잘 되면 kibana에 다음과 같은 화면을 볼 수 있다. Tyk Gateway Kibana Dashboard

3. 결론

docker compose로 무료로 간단히 사용할 수 있는 tyk gateway를 설정하고, API 사용결과를 pump를 통해서 kibana로 확인해 봤다.