
AWS EKS com eksctl e Floci
Essa é uma série de 4 artigos sobre como emular um cluster EKS localmente em um laboratorio de estudos com o Floci, suas vantagens, limitações, problemas enfrentados na implementação deste laboratório e uma comparação com o Localstack
Alguns motivos para usar o Floci
Nos últimos anos vimos um crescimento do interesse na montagem de homelabs, SRE, engenheiros de plataforma e desenvolvedores têm recorrido a esses laboratórios como forma de praticar novas técnicas e avaliar ferramentas com um custo muito menor do que executar esses serviços em nuvens públicas.
Porém, ao estudarmos para uma certificação por exemplo, precisamos realizar laboratórios com os diversos serviços dos provedores de nuvem públicas e esses experimentos no geral terão um custo. O pode ser um impedimento, dependo dos recursos utilzados nos experimentos.
É neste cenário que ferramentas como o Floci brilham, pois ele possibilita que executemos localmente os principais serviços destes provedores, vamos olhar mais de perto que o Floci nos oferece e preparar nosso ambiente para os experimentos com o EKS.
O que o Floci oferece ?
O Floci emula 68 serviços da AWS como RDS, EKS, Route 53 entre outros e não possui limitações como por exemplo a necessidade de se realizar logins ou necessitarmos de assinaturas ou chaves para sua utilização. Outro pontos interessante e que para diversos serviços como Lambda ele executa containers utilizando os runtimes reais da AWS e não um mock da resposta do serviço.
Preparando o ambiente
Para preparar o nosso ambiente, precisaremos de:
- Um container runtime (Docker, Podman)
- AWS cli
- eksctl
Depois de instalarmos as ferramenta acima, criaremos um docker-compose.yaml com o conteúdo abaixo e iniciaremos o Floci
services:
floci:
image: floci/floci:latest
ports:
- "4566:4566"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./data:/app/data
environment:
FLOCI_STORAGE_MODE: hybrid
FLOCI_HOSTNAME: aws-mock
Apos iniciarmos o container do Floci, teremos um endpoint sendo executado na porta 4566

Configurando um novo perfil na AWS cli
Com o Floci rodando corretamente, precisamos configurar um novo perfil na AWS cli para utilização em nossos laboratórios, para isso executaremos o comando a seguir:
❯ aws configure --profile aws-homelab
AWS Access Key ID [None]: test
AWS Secret Access Key [None]: test
Default region name [None]: us-east-1
Default output format [None]: json
Uma vez configurado nosso perfil, criaremos um bucket S3 para verificar nossa configuração.
❯ aws s3 mb s3://terraform-state --profile aws-homelab --endpoint-url http://localhost:4566
make_bucket: terraform-state
Note que neste momento temos que passar a url do floci através do parâmetro endpoint-url, adicione o endpoint do Floci na configuração do perfil executando o seguinte comando:
❯ aws configure set endpoint-url http://localhost:4566 --profile aws-homelab
❯ aws configure get endpoint-url --profile aws-homelab
EKS com eksctl
Com o ambiente configurado, iremos utilizar o eksctl para criar nosso cluster Kubernetes.
O eksctl facilita a tarefa de gerenciar de clusters em escala, ja que automatiza e abstrai muitas das tarefas necessárias na configuracao dos diversos serviços necessários por um cluster EKS como VPC, node groups e security groups através de uma abordagem declarativa como exemplificado abaixo:
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: basic-cluster
region: us-west-2
nodeGroups:
- name: ng-1
instanceType: m5.large
desiredCapacity: 2
minSize: 1
maxSize: 3
ssh:
allow: falseDurante nosso laboratório recoremos regularmente a documentação do ClusterConfig
Mock x Real mode
Um dos recursos mais interessantes do Floci são os modos real - que criara um cluster k3s e expõe a porta (6500-65999) do API server, já no modo mock ele retorna apenas as respostas da API do EKS sem criar um cluster, esse modo e interessante por exemplo em um CI ou outras atividades em que só precisemos das respostas de API.
No nosso laboratório utilizaremos o modo real, que o padrão, uma vez que além de criar e gerenciar o cluster via eksctl, iremos posteriormente executar algumas cargas de trabalho no cluster criado.
Dry run
A configuração acima foi gerada manualmente a fim demonstrar a especificação do ClusterConfig, mas podemos gerar nosso manifesto diretamente pelo eksctl.
$ eksctl create cluster --dry-run --profile aws-homelab
Error: cannot use --profile with --dry-run as this option cannot be represented in ClusterConfig: set the AWS_PROFILE environment variable instead
Executar o comando acima para gerar nossa configuração utilizando nosso perfil para o Floci como visto acima, gerara um erro, pois não existe na spec do CloudConfig uma propriedade para indicarmos o perfil AWS a ser utilizado, sendo necessário passar nosso perfile via variavel de ambiente.
$ AWS_PROFILE=aws-homelab eksctl create cluster --dry-run
Error: checking AWS STS access – cannot get role ARN for current session: operation error STS: GetCallerIdentity, https response error StatusCode: 403, RequestID: 1ffdbb8c-dfca-444c-9637-82ac382eebe1, api error InvalidClientTokenId: The security token included in the request is invalid.
⚠️ Outch!!, got a 403
Apos executar o dry-run, chegamos no ponto onde a diversão começa. Durante o processo, tive alguns problemas devido algumas limitações do emulador e detalharei os desafios encontrados e como foram resolvidos.
Fiquem ligados nas próximas postagens. 📢

