Configuração de Rotas e Autenticação em APISIX

Aqui está uma guia para configurar rotas e autenticação em um ambiente de APISIX usando Docker.

Versão do Docker

root@servidor:/opt/docker/apisix# docker version
Cliente:
 Versão:           24.0.5
 API versão:       1.43
 Linguagem Go:        go1.20.3
 Commit Git:       24.0.5-0ubuntu1~22.04.1
 Construído:             Seg Ago 21 19:50:14 2023
 SO/Arquitetura:           linux/amd64
 Contexto:           padrão

Servidor:
 Motor:
  Versão:          24.0.5
  API versão:      1.43 (versão mínima 1.12)
  Linguagem Go:       go1.20.3
  Commit Git:       24.0.5-0ubuntu1~22.04.1
  Construído:            Seg Ago 21 19:50:14 2023
  SO/Arquitetura:          linux/amd64
  Experimental:     falso
 containerd:
  Versão:          1.7.2
  Commit Git:        
 runc:
  Versão:          1.1.7-0ubuntu1~22.04.2
  Commit Git:        
 docker-init:
  Versão:          0.19.0
  Commit Git:  

Versão do Sistema Operacional

root@servidor:/opt/docker/apisix# lsb_release  -a
LSB Versão:    núcleo-11.1.0ubuntu4-sem-arquitetura:segurança-11.1.0ubuntu4-sem-arquitetura
ID Distribuidor: Ubuntu
Descrição:    Ubuntu 22.04.3 LTS
Versão:        22.04
Código:       jammy

Contêineres em Execução

root@servidor:/opt/docker/apisix# docker ps
ID CONTÊINER   IMAGEM                                COMANDO                   CRIADO HÁ        STATUS                  PORTAS                                                                                                                                                                                                                                                             NOMES
abc123def456   apache/apisix:3.9.0-debian            "/docker-entrypoint.…"   17 segundos atrás   Em funcionamento há 15 segundos           0.0.0.0:9080->9080/tcp, :::9080->9080/tcp, 0.0.0.0:9091->9091/tcp, :::9091->9091/tcp, 0.0.0.0:9100->9100/tcp, :::9100->9100/tcp, 0.0.0.0:9180->9180/tcp, :::9180->9180/tcp, 0.0.0.0:9443->9443/tcp, :::9443->9443/tcp, 0.0.0.0:9090->9092/tcp, :::9090->9092/tcp   apisix-inicio
ghi789jkl012   bitnami/etcd:3.5.7                    "/opt/bitnami/script…"   2 minutos atrás    Em funcionamento há cerca de um minuto       2379-2380/tcp                                                                                                                                                                                                                                                      etcd-inicio

Veirficação do Servidor APISIX

root@servidor:/opt/docker/apisix# curl "http://127.0.0.1:9080" --head | grep Server
  % Total    % Recebido % Enviado  Taxa média  Taxa média  Tempo total Tempo parcial  Tempo restante  Velocidade
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
Servidor: APISIX/3.9.0

Configuração de Rotas

root@servidor:/opt/docker/apisix# curl -i "http://127.0.0.1:9180/apisix/admin/routes" -X PUT -d '
{
  "identificador": "inicio-ip",
  "uri": "/ip",
  "upstream": {
    "tipo": "roundrobin",
    "nodos": {
      "httpbin.org:80": 1
    }
  }
}'
HTTP/1.1 201 Criado
Data: Qua, 03 Abr 2024 02:13:24 GMT
Tipo Conteúdo: application/json
Transferindo Codificação: fragmentada
Conexão: manter-viva
Servidor: APISIX/3.9.0
Controle Acesso Origem: *
Controle Acesso Credenciais: verdadeiro
Controle Acesso Expõe Cabeçalhos: *
Controle Acesso Idade Máxima: 3600
Versão API-X: v3

{"chave":"/apisix/routes/inicio-ip","valor":{"identificador":"inicio-ip","status":1,"tempo_atualização":1712110404,"upstream":{"esquema":"http","tipo":"roundrobin","nodos":{"httpbin.org:80":1},"hash_em":"vars","pass_host":"pass"},"tempo_criação":1712110404,"prioridade":0,"uri":"/ip"}}
root@servidor:/opt/docker/apisix# 
root@servidor:/opt/docker/apisix# curl "http://127.0.0.1:9080/ip"
{
  "origem": "172.21.0.1, 117.72.36.203"
}

Chaves Padrão no etcd

I have no name!@ghi789jkl012:/opt/bitnami/etcd/bin$ etcdctl get --prefix --keys-only ""
/apisix/grupos_consumidores/

/apisix/consumidores/

/apisix/info_servidor_plano_dados/b1de8a17-c57c-4228-9b73-ff8519aea650

/apisix/regras_globais/

/apisix/configurações_plugins/

/apisix/metadados_plugins/

/apisix/plugins/

/apisix/protos/

/apisix/rotas/

/apisix/rotas/inicio-ip

/apisix/segredos/

/apisix/serviços/

/apisix/ssl/

/apisix/rotas_stream/

/apisix/upstreams/

Rota Adicionada Recentemente

I have no name!@ghi789jkl012:/opt/bitnami/etcd/bin$ etcdctl get  /apisix/rotas/inicio-ip
/apisix/rotas/inicio-ip
{"identificador":"inicio-ip","status":1,"tempo_atualização":1712110404,"prioridade":0,"tempo_criação":1712110404,"upstream":{"esquema":"http","tipo":"roundrobin","nodos":{"httpbin.org:80":1},"hash_em":"vars","pass_host":"pass"},"uri":"/ip"}

Balanço de Carga

root@servidor:/opt/docker/apisix# curl -i "http://127.0.0.1:9180/apisix/admin/routes" -X PUT -d '
{
  "identificador": "inicio-cabecalhos",
  "uri": "/cabecalhos",
  "upstream" : {
    "tipo": "roundrobin",
    "nodos": {
      "httpbin.org:443": 1,
      "mock.api7.ai:443": 1
    },
    "pass_host": "nodo",
    "esquema": "https"
  }
}'
HTTP/1.1 201 Criado
Data: Qua, 03 Abr 2024 02:25:13 GMT
Tipo Conteúdo: application/json
Transferindo Codificação: fragmentada
Conexão: manter-viva
Servidor: APISIX/3.9.0
Controle Acesso Origem: *
Controle Acesso Credenciais: verdadeiro
Controle Acesso Expõe Cabeçalhos: *
Controle Acesso Idade Máxima: 3600
Versão API-X: v3

{"chave":"/apisix/rotas/inicio-cabecalhos","valor":{"identificador":"inicio-cabecalhos","status":1,"tempo_atualização":1712111113,"upstream":{"esquema":"https","tipo":"roundrobin","nodos":{"httpbin.org:443":1,"mock.api7.ai:443":1},"hash_em":"vars","pass_host":"nodo"},"tempo_criação":1712111113,"prioridade":0,"uri":"/cabecalhos"}}

root@servidor:/opt/docker/apisix# contagem=$(seq 100 | xargs -I {} curl "http://127.0.0.1:9080/cabecalhos" -sL | grep "httpbin" | wc -l); echo httpbin.org: $contagem, mock.api7.ai: $((100 - $contagem))
httpbin.org: 48, mock.api7.ai: 52

Autenticação por Chave

root@servidor:/opt/docker/apisix# curl -i "http://127.0.0.1:9180/apisix/admin/consumidores" -X PUT -d '
{
  "nome_usuario": "joao",
  "plugins": {
    "autenticacao-chave": {
      "chave": "chave-secreta"
    }
  }
}'
HTTP/1.1 201 Criado
Data: Qua, 03 Abr 2024 02:30:41 GMT
Tipo Conteúdo: application/json
Transferindo Codificação: fragmentada
Conexão: manter-viva
Servidor: APISIX/3.9.0
Controle Acesso Origem: *
Controle Acesso Credenciais: verdadeiro
Controle Acesso Expõe Cabeçalhos: *
Controle Acesso Idade Máxima: 3600
Versão API-X: v3

{"chave":"/apisix/consumidores/joao","valor":{"nome_usuario":"joao","tempo_criação":1712111441,"plugins":{"autenticacao-chave":{"chave":"chave-secreta"}},"tempo_atualização":1712111441}}

root@servidor:/opt/docker/apisix# curl -i "http://127.0.0.1:9080/ip"
HTTP/1.1 200 OK
Tipo Conteúdo: application/json
Comprimento Conteúdo: 44
Conexão: manter-viva
Data: Qua, 03 Abr 2024 02:31:32 GMT
Controle Acesso Origem: *
Controle Acesso Credenciais: verdadeiro
Servidor: APISIX/3.9.0

{
  "origem": "172.21.0.1, 117.72.36.203"
}
root@servidor:/opt/docker/apisix# 
root@servidor:/opt/docker/apisix# 
root@servidor:/opt/docker/apisix# curl -i "http://127.0.0.1:9180/apisix/admin/rotas/inicio-ip" -X PATCH -d '
{
  "plugins": {
    "autenticacao-chave": {}
  }
}'
HTTP/1.1 200 OK
Data: Qua, 03 Abr 2024 02:31:41 GMT
Tipo Conteúdo: application/json
Transferindo Codificação: fragmentada
Conexão: manter-viva
Servidor: APISIX/3.9.0
Controle Acesso Origem: *
Controle Acesso Credenciais: verdadeiro
Controle Acesso Expõe Cabeçalhos: *
Controle Acesso Idade Máxima: 3600
Versão API-X: v3

{"chave":"/apisix/rotas/inicio-ip","valor":{"identificador":"inicio-ip","status":1,"prioridade":0,"plugins":{"autenticacao-chave":{"cabeçalho":"apikey","ocultar_credenciais":falso,"consulta":"apikey"}},"tempo_atualização":1712111501,"tempo_criação":1712110404,"upstream":{"esquema":"http","tipo":"roundrobin","nodos":{"httpbin.org:80":1},"hash_em":"vars","pass_host":"pass"},"uri":"/ip"}}
root@servidor:/opt/docker/apisix# 
root@servidor:/opt/docker/apisix# 
root@servidor:/opt/docker/apisix# 
root@servidor:/opt/docker/apisix# curl -i "http://127.0.0.1:9080/ip"
HTTP/1.1 401 Não Autorizado
Data: Qua, 03 Abr 2024 02:31:48 GMT
Tipo Conteúdo: texto/plano; charset=utf-8
Transferindo Codificação: fragmentada
Conexão: manter-viva
Servidor: APISIX/3.9.0

{"mensagem":"Chave API ausente na solicitação"}

root@servidor:/opt/docker/apisix# curl -i "http://127.0.0.1:9080/ip" -H 'apikey: chave-incorreta'
HTTP/1.1 401 Não Autorizado
Data: Qua, 03 Abr 2024 02:32:37 GMT
Tipo Conteúdo: texto/plano; charset=utf-8
Transferindo Codificação: fragmentada
Conexão: manter-viva
Servidor: APISIX/3.9.0

{"mensagem":"Chave API inválida na solicitação"}
root@servidor:/opt/docker/apisix# curl -i "http://127.0.0.1:9080/ip" -H 'apikey: chave-secreta'
HTTP/1.1 200 OK
Tipo Conteúdo: application/json
Comprimento Conteúdo: 44
Conexão: manter-viva
Data: Qua, 03 Abr 2024 02:32:55 GMT
Controle Acesso Origem: *
Controle Acesso Credenciais: verdadeiro
Servidor: APISIX/3.9.0

{
  "origem": "172.21.0.1, 117.72.36.203"
}

root@servidor:/opt/docker/apisix# curl "http://127.0.0.1:9180/apisix/admin/rotas/inicio-ip" -X PATCH -d '
{
  "plugins": {
    "autenticacao-chave": {
      "_meta": {
        "desabilitar": verdadeiro
      }
    }
  }
}'
{"chave":"/apisix/rotas/inicio-ip","valor":{"identificador":"inicio-ip","status":1,"upstream":{"esquema":"http","tipo":"roundrobin","nodos":{"httpbin.org:80":1},"hash_em":"vars","pass_host":"pass"},"tempo_atualização":1712111991,"plugins":{"autenticacao-chave":{"cabeçalho":"apikey","ocultar_credenciais":falso,"_meta":{"desabilitar":verdadeiro},"consulta":"apikey"}},"tempo_criação":1712110404,"prioridade":0,"uri":"/ip"}}
root@servidor:/opt/docker/apisix# 
root@servidor:/opt/docker/apisix# 
root@servidor:/opt/docker/apisix# 
root@servidor:/opt/docker/apisix# curl -i "http://127.0.0.1:9080/ip"
HTTP/1.1 200 OK
Tipo Conteúdo: application/json
Comprimento Conteúdo: 44
Conexão: manter-viva
Data: Qua, 03 Abr 2024 02:40:12 GMT
Controle Acesso Origem: *
Controle Acesso Credenciais: verdadeiro
Servidor: APISIX/3.9.0

{
  "origem": "172.21.0.1, 117.72.36.203"
}

Limitação de Taxa

root@servidor:/opt/docker/apisix# curl -i "http://127.0.0.1:9180/apisix/admin/rotas/inicio-ip" -X PATCH -d '
{
  "plugins": {
    "limite-contagem": {
        "contagem": 2,
        "janela_tempo": 10,
        "codigo_rejeitado": 503
     }
  }
}'
HTTP/1.1 200 OK
Data: Qua, 03 Abr 2024 02:43:39 GMT
Tipo Conteúdo: application/json
Transferindo Codificação: fragmentada
Conexão: manter-viva
Servidor: APISIX/3.9.0
Controle Acesso Origem: *
Controle Acesso Credenciais: verdadeiro
Controle Acesso Expõe Cabeçalhos: *
Controle Acesso Idade Máxima: 3600
Versão API-X: v3

{"chave":"/apisix/rotas/inicio-ip","valor":{"identificador":"inicio-ip","status":1,"prioridade":0,"tempo_atualização":1712112219,"plugins":{"autenticacao-chave":{"cabeçalho":"apikey","ocultar_credenciais":falso,"_meta":{"desabilitar":verdadeiro},"consulta":"apikey"},"limite-contagem":{"política":"local","contagem":2,"janela_tempo":10,"codigo_rejeitado":503,"chave":"endereco_remoto","permitir_degradação":falso,"mostrar_cota_limite_cabeçalho":verdadeiro,"tipo_chave":"var"}},"tempo_criação":1712110404,"upstream":{"esquema":"http","tipo":"roundrobin","nodos":{"httpbin.org:80":1},"hash_em":"vars","pass_host":"pass"},"uri":"/ip"}}

I have no name!@ghi789jkl012:/opt/bitnami/etcd/bin$ etcdctl get /apisix/rotas/inicio-ip
/apisix/rotas/inicio-ip
{"identificador":"inicio-ip","status":1,"upstream":{"esquema":"http","tipo":"roundrobin","nodos":{"httpbin.org:80":1},"hash_em":"vars","pass_host":"pass"},"tempo_atualização":1712112219,"plugins":{"autenticacao-chave":{"cabeçalho":"apikey","ocultar_credenciais":falso,"_meta":{"desabilitar":verdadeiro},"consulta":"apikey"},"limite-contagem":{"contagem":2,"política":"local","codigo_rejeitado":503,"chave":"endereco_remoto","permitir_degradação":falso,"mostrar_cota_limite_cabeçalho":verdadeiro,"janela_tempo":10,"tipo_chave":"var"}},"tempo_criação":1712110404,"prioridade":0,"uri":"/ip"}

root@servidor:/opt/docker/apisix# contagem=$(seq 100 | xargs -I {} curl "http://127.0.0.1:9080/ip" -I -sL | grep "503" | wc -l); echo \"200\": $((100 - $contagem)), \"503\": $contagem
"200": 2, "503": 98
root@servidor:/opt/docker/apisix# curl -i "http://127.0.0.1:9180/apisix/admin/rotas/inicio-ip" -X PATCH -d '
{
    "plugins": {
        "limite-contagem": {
            "_meta": {
                "desabilitar": verdadeiro
            }
        }
    }
}'
HTTP/1.1 200 OK
Data: Qua, 03 Abr 2024 02:45:36 GMT
Tipo Conteúdo: application/json
Transferindo Codificação: fragmentada
Conexão: manter-viva
Servidor: APISIX/3.9.0
Controle Acesso Origem: *
Controle Acesso Credenciais: verdadeiro
Controle Acesso Expõe Cabeçalhos: *
Controle Acesso Idade Máxima: 3600
Versão API-X: v3

{"chave":"/apisix/rotas/inicio-ip","valor":{"identificador":"inicio-ip","status":1,"upstream":{"esquema":"http","tipo":"roundrobin","nodos":{"httpbin.org:80":1},"hash_em":"vars","pass_host":"pass"},"tempo_atualização":1712112336,"plugins":{"autenticacao-chave":{"cabeçalho":"apikey","ocultar_credenciais":falso,"_meta":{"desabilitar":verdadeiro},"consulta":"apikey"},"limite-contagem":{"política":"local","permitir_degradação":falso,"mostrar_cota_limite_cabeçalho":verdadeiro,"codigo_rejeitado":503,"_meta":{"desabilitar":verdadeiro},"chave":"endereco_remoto","contagem":2,"janela_tempo":10,"tipo_chave":"var"}},"tempo_criação":1712110404,"prioridade":0,"uri":"/ip"}}

I have no name!@ghi789jkl012:/opt/bitnami/etcd/bin$ etcdctl get /apisix/rotas/inicio-ip
/apisix/rotas/inicio-ip
{"identificador":"inicio-ip","status":1,"prioridade":0,"tempo_atualização":1712112336,"plugins":{"autenticacao-chave":{"cabeçalho":"apikey","ocultar_credenciais":falso,"_meta":{"desabilitar":verdadeiro},"consulta":"apikey"},"limite-contagem":{"política":"local","permitir_degradação":falso,"mostrar_cota_limite_cabeçalho":verdadeiro,"codigo_rejeitado":503,"_meta":{"desabilitar":verdadeiro},"chave":"endereco_remoto","contagem":2,"janela_tempo":10,"tipo_chave":"var"}},"tempo_criação":1712110404,"upstream":{"esquema":"http","tipo":"roundrobin","nodos":{"httpbin.org:80":1},"hash_em":"vars","pass_host":"pass"},"uri":"/ip"}

root@servidor:/opt/docker/apisix# contagem=$(seq 100 | xargs -i curl "http://127.0.0.1:9080/ip" -I -sL | grep "503" | wc -l); echo \"200\": $((100 - $contagem)), \"503\": $contagem

"200": 100, "503": 0

Tags: APISIX Docker etcd balanço-de-carga autenticacao

Publicado em 8-27 05:02