1. 소개
tyk는 API 게이트웨이 솔루션인데, 오픈소스 버전이 강력하고 기능이 많아서 다른 대체제들이 비교하면 무료로 API gateway를 설정하고 API를 관리할 수 있다.
- tyk gateway 설정하기
- tyk pump 설정하기
- 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에 다음과 같은 화면을 볼 수 있다.
3. 결론
docker compose로 무료로 간단히 사용할 수 있는 tyk gateway를 설정하고, API 사용결과를 pump를 통해서 kibana로 확인해 봤다.