diff --git a/content/blog/enable-global-policies-apicast.md b/content/blog/enable-global-policies-apicast.md new file mode 100644 index 0000000..a8fabf7 --- /dev/null +++ b/content/blog/enable-global-policies-apicast.md @@ -0,0 +1,64 @@ +--- +title: "Enable global policies on Apicast 3.6" +date: 2019-09-10T00:00:00+02:00 +opensource: +- 3scale +--- + +Recent versions of Apicast have a pluggable policy mechanism to apply different treatments to each exposed API. +This is very powerful since each service receives its specific configuration. +However, if the same treatment has to be applied to every service exposed, it becomes an administration overhead. + +Hopefully, Apicast has the concept of *Global Policies* that applies to every service exposed by itself. +An example of a widespread policy, especially during demos, is the CORS policy to allow the API Developer Portal to query the API Gateway directly. + +To configure the *Global Policy Chain*, you will have to provide a custom *Environment file*. +By default, there is one for the [Staging Environment](https://github.com/3scale/APIcast/blob/3.6-stable/gateway/config/staging.lua) and one for the [Production Environment](https://github.com/3scale/APIcast/blob/3.6-stable/gateway/config/production.lua). + +Start from those default *Environment Files* and add a `policy_chain` field with your *Policy* inserted wherever you want in the default *Global Policy Chain*. +The default *Global Policy Chain* can be found in the [`gateway/src/apicast/policy_chain.lua`](https://github.com/3scale/APIcast/blob/b8f7f067dd47936f93bc9bd3e6de224c304d58ea/gateway/src/apicast/policy_chain.lua#L67-L72) file. + +**production.lua:** +```lua +return { + master_process = 'on', + lua_code_cache = 'on', + configuration_loader = 'boot', + configuration_cache = os.getenv('APICAST_CONFIGURATION_CACHE') or 5*60, + timer_resolution = '100ms', + port = { metrics = 9421 }, + policy_chain = require('apicast.policy_chain').build({ + 'apicast.policy.load_configuration', + 'apicast.policy.find_service', + 'apicast.policy.cors', + 'apicast.policy.local_chain', + 'apicast.policy.nginx_metrics' + }), +} +``` + +**staging.lua:** +```lua +return { + master_process = 'on', + lua_code_cache = 'on', + configuration_loader = 'lazy', + configuration_cache = os.getenv('APICAST_CONFIGURATION_CACHE'), + port = { metrics = 9421 }, -- see https://github.com/prometheus/prometheus/wiki/Default-port-allocations, + policy_chain = require('apicast.policy_chain').build({ + 'apicast.policy.load_configuration', + 'apicast.policy.find_service', + 'apicast.policy.cors', + 'apicast.policy.local_chain', + 'apicast.policy.nginx_metrics' + }), +} +``` + +Then, create a ConfigMap from those two files and mount it in `/opt/app-root/src/config`: + +```sh +oc create configmap apicast-cors --from-file=production.lua --from-file=staging.lua +oc set volume dc/apicast-production --add --name=apicast-cors -t configmap --configmap-name=apicast-cors -m /opt/app-root/src/config +oc set volume dc/apicast-staging --add --name=apicast-cors -t configmap --configmap-name=apicast-cors -m /opt/app-root/src/config +```