camada_em_nevoa - rafaelglima/smarthealth GitHub Wiki

Camada em Névoa - Apache Kafka (Amazon MSK) e AWS Lambda

Configurando o Amazon MSK (Cluster Apache Kafka)

  • Embora seja possível utilizar outro serviço similar como o Amazon Data Kinesis Data Stream, optou-se pelo Apache Kafka gerenciado pela AWS uma vez que é possível definir quais as suas subredes, o que torna o ambiente mais próximo de um cenário Fog e multi plataforma.

  • Foi criado o cluster Amazon MSK utilizando o arquivo via Cloud Formation.

  1. (Arquivo: shdm-item11-msk-sa-east-1.yaml)

Criar o tópico no cluster msk antes de enviar para a função lambda

[Autenticação SASL] (https://docs.aws.amazon.com/pt_br/msk/latest/developerguide/msk-password.html)

[Criando topico] (https://docs.aws.amazon.com/pt_br/msk/latest/developerguide/msk-password.html)

sudo apt-get install openjdk-11-jdk
wget https://archive.apache.org/dist/kafka/3.5.1/kafka_2.13-3.5.1.tgz
tar -xzf kafka_2.13-3.5.1.tgz
cd kafka_2.13-3.5.1/libs
wget https://github.com/aws/aws-msk-iam-auth/releases/download/v1.1.1/aws-msk-iam-auth-1.1.1-all.jar
cd ../bin/
touch client_sasl.properties
vi client_sasl.properties

[Adicione as linhas abaixo no arquivo]
security.protocol=SASL_SSL
sasl.mechanism=AWS_MSK_IAM
sasl.jaas.config=software.amazon.msk.auth.iam.IAMLoginModule required;
sasl.client.callback.handler.class=software.amazon.msk.auth.iam.IAMClientCallbackHandler

# Coletar Informações dos Brokers

aws kafka get-bootstrap-brokers --region sa-east-1 --cluster-arn arn:aws:kafka:sa-east-1:904233115303:cluster/shdm-item11-msk-sa-east-1/1bcf05aa-cb7c-4b77-be53-7a59819ad04f-4

# Criar Tópicos Kafka

./kafka-topics.sh --create --bootstrap-server b-1.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096 --command-config client_sasl.properties --replication-factor 2 --partitions 30 --topic topic-oximetria-pulso

./kafka-topics.sh --create --bootstrap-server b-1.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096 --command-config client_sasl.properties --replication-factor 2 --partitions 30 --topic topic-quedas

./kafka-topics.sh --create --bootstrap-server b-1.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096 --command-config client_sasl.properties --replication-factor 2 --partitions 30 --topic topic-pressao-arterial

./kafka-topics.sh --create --bootstrap-server b-1.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096 --command-config client_sasl.properties --replication-factor 2 --partitions 30 --topic topic-glicemia

./kafka-topics.sh --create --bootstrap-server b-1.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096 --command-config client_sasl.properties --replication-factor 2 --partitions 30 --topic topic-temperatura-ambiente

./kafka-topics.sh --create --bootstrap-server b-1.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096 --command-config client_sasl.properties --replication-factor 2 --partitions 30 --topic topic-frequencia-cardiaca

./kafka-topics.sh --create --bootstrap-server b-1.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096 --command-config client_sasl.properties --replication-factor 2 --partitions 30 --topic topic-frequencia-respiratoria

./kafka-topics.sh --create --bootstrap-server b-1.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096 --command-config client_sasl.properties --replication-factor 2 --partitions 30 --topic topic-umidade-relativa

./kafka-topics.sh --create --bootstrap-server b-1.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096 --command-config client_sasl.properties --replication-factor 2 --partitions 30 --topic topic-temperatura-corporal

./kafka-topics.sh --create --bootstrap-server b-1.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096 --command-config client_sasl.properties --replication-factor 2 --partitions 30 --topic topic-geolocalizacao

# Apagar Tópicos

./kafka-topics.sh --bootstrap-server b-2.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096,b-1.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096 --command-config client_sasl.properties --delete --topic topic-oximetria-pulso

./kafka-topics.sh --bootstrap-server b-2.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096,b-1.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096 --command-config client_sasl.properties --delete --topic topic-quedas

./kafka-topics.sh --bootstrap-server b-2.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096,b-1.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096 --command-config client_sasl.properties --delete --topic topic-pressao-arterial

./kafka-topics.sh --bootstrap-server b-2.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096,b-1.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096 --command-config client_sasl.properties --delete --topic topic-glicemia

./kafka-topics.sh --bootstrap-server b-2.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096,b-1.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096 --command-config client_sasl.properties --delete --topic topic-temperatura-ambiente

./kafka-topics.sh --bootstrap-server b-2.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096,b-1.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096 --command-config client_sasl.properties --delete --topic topic-frequencia-cardiaca

./kafka-topics.sh --bootstrap-server b-2.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096,b-1.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096 --command-config client_sasl.properties --delete --topic topic-frequencia-respiratoria

./kafka-topics.sh --bootstrap-server b-2.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096,b-1.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096 --command-config client_sasl.properties --delete --topic topic-umidade-relativa

./kafka-topics.sh --bootstrap-server b-2.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096,b-1.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096 --command-config client_sasl.properties --delete --topic topic-temperatura-corporal

./kafka-topics.sh --bootstrap-server b-2.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096,b-1.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096 --command-config client_sasl.properties --delete --topic topic-geolocalizacao

# Descrever e Listar Tópicos

./kafka-topics.sh --bootstrap-server b-2.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096,b-1.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096 --command-config client_sasl.properties --describe --topic topic-frequencia-cardiaca

./kafka-topics.sh --bootstrap-server b-2.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096,b-1.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096 --command-config client_sasl.properties --list

# Verificar Quantidade de Mensagens no Tópico Kafka

export KAFKA_OPTS=-Djava.security.auth.login.config=/home/ubuntu/msk/kafka_2.13-3.5.1/bin/users_jaas.conf

./kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list b-2.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096,b-1.shdmitem11msksaeast1.na7egv.c4.kafka.sa-east-1.amazonaws.com:9096 --topic topic-frequencia-cardiaca --time -1 --command-config client_sasl.properties

Observação: Importante definir a quantidade de partições e o caminho do da variável de ambiente.

Criar a rule para rotear mensagens do IoT Core pro MSK.

${get_secret('AmazonMSK_chave', 'SecretString', 'username', 'arn:aws:iam::730335447253:role/iot-role-msk')}

${get_secret('AmazonMSK_chave', 'SecretString', 'password', 'arn:aws:iam::730335447253:role/iot-role-msk')}

Criar o Bucket S3 para representar o repositório (Data Lake) de imagens / arquivos de sistemas médicos que vieram a partir da camada de Usuários

  1. (Arquivo: shdm-item14-buckets3-fog.yaml)
  • Antes de criar o bucket, crie uma chave no KMS e altere no arquivo acima (KMS-KEY-ARN). Ao criar essa chave deve-se atribuir a permissão para a role da função lambda (via console do KMS).
  • Após a criação do Bucket será necessário criar uma função Lambda que será acionada mediante inserção de arquivos no Bucket que foram inseridos pelo Amazon Kinesis Firehose.
  • Essa função Lambda será responsável pela transformação dos dados e envio para a Camada em Nuvem.

Criando a função lambda referente ao envio de arquivos para o Cluster IPFS e informações para o Cluster HapiFhir e Blockchain

mkdir lambda-fog-ipfs
cd lambda-fog-ipfs
mkdir venv
cd venv
virtualenv lambda-fog-ipfs
source lambda-fog-ipfs/bin/activate
cd ..
pip install pytest
pip install chalice
pip install httpx
pip install httpcore
pip install urllib3==1.26.18
pip install requests==2.28.2
pip install boto3
pip install botocore
pip install ipfshttpclient==0.4.12
pip install ipfscluster==0.2.0
chalice new-project
[definir nome lambda-fog-ipfs e escolher S3 Event Handler]
[confira a codificação]
cd lambda-fog-ipfs
chalice deploy

Criando a Layer para adicionar à Função Lambda

mkdir python
pip cache purge
python -m pip install httpx -t python/ && \
python -m pip install httpcore -t python/ && \
python -m pip install urllib3==1.26.18 -t python/ && \
python -m pip install requests==2.28.2 -t python/ && \
python -m pip install boto3 -t python/ && \
python -m pip install botocore -t python/ && \
python -m pip install ipfshttpclient==0.4.12 -t python/ && \
python -m pip install ipfscluster==0.2.0 -t python/

zip -r layer-fog-ipfs.zip python

aws lambda publish-layer-version --layer-name layer-fog-ipfs --zip-file fileb://layer-fog-ipfs.zip --compatible-runtimes python3.10 --region sa-east-1

Definindo as subredes e layer da implantação da função Lambda no arquivo .chalice/config.json

  • Deve-se alterar os ids das subredes, o id do security group e a layer com sua versão.
{
  "version": "2.0",
  "app_name": "lambda-fog-ipfs",
  "stages": {
    "dev": {
      "api_gateway_stage": "api",
      "subnet_ids": ["subnet-07bc3f3031ccf1600","subnet-0651f5557b6a0a0bc","subnet-095efa24bfa61fdef"],
      "layers": ["arn:aws:lambda:sa-east-1:730335447253:layer:layer-fog-ipfs:1"]
    }
  }
}

Criar o processo para receber dados dos sensores IoT da Camada Usuários

  • Após a criação do Amazon MSK (Apache Kafka) deve-se criar as Roles para cada tipo de sensor do IoT Device Simulator no IoT Core (e criar a VPC Destination) para o envio dos dados dos sensores para o Amazon MSK.
  • Além disso, deve-se criar no Amazon MSK a integração de Delivery para AWS Lambda via Pipes do EventBridge.

----

Criando a função lambda referente ao envio de medições para o Cluster HapiFhir e Blockchain

mkdir lambda-fog-ipfs
cd lambda-fog-iot
mkdir venv
cd venv
virtualenv lambda-fog-iot
source lambda-fog-iot/bin/activate
cd ..
pip install pytest
pip install chalice
pip install httpx
pip install httpcore
pip install urllib3==1.26.18
pip install requests==2.28.2
pip install boto3
pip install botocore
chalice new-project
[definir nome lambda-fog-iot e escolher Lambda Functions only]
[confira a codificação]
cd lambda-fog-iot
chalice deploy

Criando a Layer para adicionar à Função Lambda

mkdir python
pip cache purge
python -m pip install httpx -t python/ && \
python -m pip install httpcore -t python/ && \
python -m pip install urllib3==1.26.18 -t python/ && \
python -m pip install requests==2.28.2 -t python/ && \
python -m pip install boto3 -t python/ && \
python -m pip install botocore -t python/

zip -r layer-fog-iot.zip python

aws lambda publish-layer-version --layer-name layer-fog-iot --zip-file fileb://layer-fog-iot.zip --compatible-runtimes python3.10 --region sa-east-1

Definindo as subredes e layer da implantação da função Lambda no arquivo .chalice/config.json

  • Deve-se alterar os ids das subredes, o id do security group e a layer com sua versão.
{
  "version": "2.0",
  "app_name": "lambda-fog-iot",
  "stages": {
    "dev": {
      "api_gateway_stage": "api",
      "subnet_ids": ["subnet-07bc3f3031ccf1600","subnet-0651f5557b6a0a0bc","subnet-095efa24bfa61fdef"],
      "layers": ["arn:aws:lambda:sa-east-1:730335447253:layer:layer-fog-iot:1"]
    }
  }
}

Referências

[Criar Cluster Amazon MSK] (https://docs.aws.amazon.com/pt_br/msk/latest/developerguide/create-cluster.html)

[Criar um tópico no Amazon MSK] (https://docs.aws.amazon.com/pt_br/msk/latest/developerguide/create-topic.html)

[IPFS Cluster API] (https://clearos.gitlab.io/clearfoundation/py-ipfs-cluster-api/client.html)

[Criando uma Layer] (https://repost.aws/knowledge-center/lambda-import-module-error-python)

[Arquivo config.json do Chalice] (https://chalice-fei.readthedocs.io/en/latest/topics/configfile.html)

[Boto3] (https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3.html)

Criando Policy e Role Iot-MSK para VPC Destination