Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Desafio Datarisk #5

Open
wants to merge 24 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
51f7098
Create Terraform.yml
Emanuel-Ribeiro Nov 15, 2023
a7aaee5
adicionando script de VM usando terraform via github actions
Emanuel-Ribeiro Nov 16, 2023
6ccb2c3
arrumando secrets
Emanuel-Ribeiro Nov 16, 2023
e98f403
fixing checkout
Emanuel-Ribeiro Nov 16, 2023
f58a14c
fix directories
Emanuel-Ribeiro Nov 16, 2023
338c12e
fix checkout path
Emanuel-Ribeiro Nov 16, 2023
f4fd174
adicionando o `gitignore`
Emanuel-Ribeiro Nov 16, 2023
90365a8
Atualizando o Terraform State
github-actions[bot] Nov 16, 2023
10e7fb1
Atualizando o Terraform State
github-actions[bot] Nov 16, 2023
9963bab
corrigindo echo do ip publico
Emanuel-Ribeiro Nov 16, 2023
db69b1a
Atualizando o Terraform State
github-actions[bot] Nov 16, 2023
a808cb4
Atualizando o Terraform State
github-actions[bot] Nov 16, 2023
ee9643d
Atualizando o Terraform State
github-actions[bot] Nov 16, 2023
cdf3e3c
melhorias
Emanuel-Ribeiro Nov 16, 2023
8a53a81
Atualizando o Terraform State
github-actions[bot] Nov 16, 2023
c21b1af
adicionando `dockerfile` e registry
Emanuel-Ribeiro Nov 16, 2023
78aa0a4
Merge branch 'master' of https://github.com/Emanuel-Ribeiro/Datapi-De…
Emanuel-Ribeiro Nov 16, 2023
c61b574
pipeline k8s
Emanuel-Ribeiro Nov 17, 2023
b9a4594
pipeline k8s
Emanuel-Ribeiro Nov 17, 2023
e600b4e
auth error
Emanuel-Ribeiro Nov 17, 2023
ae7ff4e
auth error
Emanuel-Ribeiro Nov 17, 2023
9650e0e
fix push
Emanuel-Ribeiro Nov 17, 2023
6ea7297
documentacao
Emanuel-Ribeiro Nov 17, 2023
6f66025
adding `k8s-services.yml`
Emanuel-Ribeiro Nov 17, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
name: deploy das aplicações

on:
workflow_dispatch:
inputs:
env:
description: 'Ambiente para deploy'
required: true
default: 'dev'
options:
- dev
- prod

jobs:

build:
name: Build
runs-on: ubuntu-latest
steps:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1

- name: Logando no registry do github
uses: docker/login-action@v2
with:
registry: ghcr.io
username: emanuel-ribeiro
password: ${{ secrets.PERSONAL_GITHUB_TOKEN }}

- name: builda e faz o push da imagem docker
uses: docker/build-push-action@v3
env:
registry: ghcr.io
username: emanuel-ribeiro
password: ${{ secrets.PERSONAL_GITHUB_TOKEN }}
with:
push: true
tags: |
ghcr.io/emanuel-ribeiro/projeto-fsharp:latest
ghcr.io/emanuel-ribeiro/projeto-fsharp:${{ github.sha }}
cache-from: type=gha
cache-to: type=gha,mode=max

deploy:
name: Deploy
if: github.ref == 'refs/heads/master'
needs: [ build ]
runs-on: ubuntu-latest
steps:
- name: definindo context do k8s
uses: azure/k8s-set-context@v2
with:
method: service-account
k8s-url: <url-do-server>
k8s-secret: ${{ secrets.KUBERNETES_SECRET }}

- name: checkout no codigo
uses: actions/checkout@v3

- name: Deploy no cluster
uses: azure/k8s-deploy@v1
with:
namespace: datarisk
manifests: |
k8s-services.yml
images: |
ghcr.io/emanuel-ribeiro/projeto-fsharp:${{ github.sha }}



15 changes: 15 additions & 0 deletions .github/workflows/registry-teste.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
name: teste do registry do github

on:
workflow_dispatch:

jobs:
buildar_e_publicar:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Builda e sobe a imagem para o registry do github
run: |
docker login --username emanuel-ribeiro --password ${{ secrets.PERSONAL_GITHUB_TOKEN }} ghcr.io
docker build . --tag ghcr.io/emanuel-ribeiro/projeto-fsharp:latest
docker push ghcr.io/emanuel-ribeiro/projeto-fsharp:latest
65 changes: 65 additions & 0 deletions .github/workflows/terraform-apply.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
name: Terraform Apply

on:
workflow_dispatch:
inputs:
wait-time:
description: 'Tempo de espera entre o plan e o apply: 30s, 5m, 1h'
required: true
default: '2m'

jobs:
terraform:
runs-on: ubuntu-20.04
steps:

- name: Instalando terraform
run: |
cd ~
sudo apt update
sudo apt install -y unzip wget
sudo wget https://releases.hashicorp.com/terraform/1.0.8/terraform_1.0.8_linux_amd64.zip
sudo unzip terraform_1.0.8_linux_amd64.zip
sudo chmod +x terraform
terraform --version

- name: Checkout Respository
uses: actions/checkout@v2
with:
ref: master
path: ./repository-files/

- name: Terraform Init
env:
ARM_CLIENT_ID: ${{ secrets.AZURE_AD_CLIENT_ID }}
ARM_CLIENT_SECRET: ${{ secrets.AZURE_AD_CLIENT_SECRET }}
ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
ARM_TENANT_ID: ${{ secrets.AZURE_AD_TENANT_ID }}
run: cd ./repository-files/vm-azure/ && ls -la && ~/terraform init

- name: Terraform Plan
env:
ARM_CLIENT_ID: ${{ secrets.AZURE_AD_CLIENT_ID }}
ARM_CLIENT_SECRET: ${{ secrets.AZURE_AD_CLIENT_SECRET }}
ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
ARM_TENANT_ID: ${{ secrets.AZURE_AD_TENANT_ID }}
run: cd ./repository-files/vm-azure/ && ls -la && ~/terraform plan

- name: Tempo de espera antes do apply
run: sleep "${{ github.event.inputs.wait-time }}" || sleep "2m"

- name: Terraform Apply
env:
ARM_CLIENT_ID: ${{ secrets.AZURE_AD_CLIENT_ID }}
ARM_CLIENT_SECRET: ${{ secrets.AZURE_AD_CLIENT_SECRET }}
ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
ARM_TENANT_ID: ${{ secrets.AZURE_AD_TENANT_ID }}
run: cd ./repository-files/vm-azure/ && ~/terraform apply -auto-approve

- name: Salvando mudanças do Backend TFState
uses: actions-js/push@master
with:
github_token: ${{ secrets.PERSONAL_GITHUB_TOKEN }}
directory: ./repository-files/vm-azure/
message: Atualizando o Terraform State
branch: master
65 changes: 65 additions & 0 deletions .github/workflows/terraform-destroy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
name: Terraform Destroy

on:
workflow_dispatch:
inputs:
wait-time:
description: 'Tempo de espera entre o plan e o destroy: 30s, 5m, 1h'
required: true
default: '2m'

jobs:
terraform:
runs-on: ubuntu-20.04
steps:

- name: Instalando terraform
run: |
cd ~
sudo apt update
sudo apt install -y unzip wget
sudo wget https://releases.hashicorp.com/terraform/1.0.8/terraform_1.0.8_linux_amd64.zip
sudo unzip terraform_1.0.8_linux_amd64.zip
sudo chmod +x terraform
terraform --version

- name: Checkout Respository
uses: actions/checkout@v2
with:
ref: master
path: ./repository-files/

- name: Terraform Init
env:
ARM_CLIENT_ID: ${{ secrets.AZURE_AD_CLIENT_ID }}
ARM_CLIENT_SECRET: ${{ secrets.AZURE_AD_CLIENT_SECRET }}
ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
ARM_TENANT_ID: ${{ secrets.AZURE_AD_TENANT_ID }}
run: cd ./repository-files/vm-azure/ && ls -la && ~/terraform init

- name: Terraform Plan
env:
ARM_CLIENT_ID: ${{ secrets.AZURE_AD_CLIENT_ID }}
ARM_CLIENT_SECRET: ${{ secrets.AZURE_AD_CLIENT_SECRET }}
ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
ARM_TENANT_ID: ${{ secrets.AZURE_AD_TENANT_ID }}
run: cd ./repository-files/vm-azure/ && ls -la && ~/terraform plan -destroy

- name: Tempo de espera antes do destroy
run: sleep "${{ github.event.inputs.wait-time }}" || sleep "2m"

- name: Terraform Destroy
env:
ARM_CLIENT_ID: ${{ secrets.AZURE_AD_CLIENT_ID }}
ARM_CLIENT_SECRET: ${{ secrets.AZURE_AD_CLIENT_SECRET }}
ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
ARM_TENANT_ID: ${{ secrets.AZURE_AD_TENANT_ID }}
run: cd ./repository-files/vm-azure/ && ls -la && ~/terraform destroy -auto-approve

- name: Salvando o Backend TFState
uses: actions-js/push@master
with:
github_token: ${{ secrets.PERSONAL_GITHUB_TOKEN }}
directory: ./repository-files/vm-azure/
message: Atualizando o Terraform State
branch: master
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.terraform*
28 changes: 28 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
FROM mcr.microsoft.com/dotnet/sdk:6.0.413 AS build

WORKDIR /app

# Copiar os arquivos necessários
COPY ./projeto-fsharp .

RUN ls -la

# Restaurar pacotes
RUN chmod +x restore.sh
RUN ./restore.sh

# Compilar a aplicação
RUN dotnet fake run build.fsx -t "Build"

FROM mcr.microsoft.com/dotnet/aspnet:6.0

WORKDIR /app

COPY --from=build /app/src/Server/out .

RUN chmod +x Server

# Expor a porta 8085 para acessar a aplicação
EXPOSE 8085

CMD ["./Server"]
79 changes: 57 additions & 22 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,30 +1,65 @@
# Datapi DevOps Challenge
## README - Projeto de Infraestrutura com Terraform e Docker

Para melhor entendermos o seu nível técnico, nós preparamos este desafio como parte do nosso processo de contratação. Por isso, tenha em mente que não é necessário cumprir com todos os pontos mencionados, nem cumpri-los em uma ordem específica.
Este repositório contém scripts Terraform para provisionar uma infraestrutura na Microsoft Azure, juntamente com um Dockerfile para construir e executar uma aplicação F#. Abaixo estão detalhados os principais componentes do projeto e as decisões tomadas durante a implementação.

O importante é entregar o que você conseguir fazer, com a devida documentação.
### Estrutura do Projeto

# Desafios
- **main.tf**: Define a infraestrutura na Azure, incluindo grupos de recursos, redes virtuais, sub-redes, grupos de segurança de rede, IP público, interface de rede, e uma máquina virtual Linux.

Segue abaixo uma lista de desafios abrangendo várias áreas de responsabilidade para um DevOps no time do Datapi. Nossa sugestão é tentar seguir cada item na ordem apresentada, porém você está livre para atuar nos pontos que quiser e tiver mais familiaridade.
- **Dockerfile**: Descreve a construção da imagem Docker para a aplicação F#.

- Instanciar uma VM numa cloud provider. Recomendação: Microsoft Azure.
- Criar a configuração dessa VM usando uma ferramenta de IaC (Infrastructure as Code). Recomendação: Terraform.
- Criar um job de CI (Continuous Integration) para aplicar a configuração da ferramenta de provisionamento. Recomendação: GitHub Actions.
- Adicionar um Dockerfile à aplicação disponibilizada na pasta `projeto-fsharp/` para containerizar o mesmo. Note que foi utilizada a linguagem F# (.NET) para escrever a aplicação. Para facilitar o entendimento do projeto, adicionamos um README.md com instruções de teste e uso do mesmo localmente. Você deverá ser capaz de traduzir essas instruções para a criação do Dockerfile.
- Criar um job de CI para enviar a imagem gerada para um Docker Registry. Recomendação: GitHub Container Registry.
- Criar os manifestos YAML para hospedar a aplicação usando Kubernetes. Nesse ponto os testes podem ser realizados apenas localmente, porém devem ser apresentados os arquivos YAML criados.
* Utilizar IaC para configurar o Kubernetes. Recomendação: Terraform.
* Configurar a hospedagem a partir do registry gerado na tarefa anterior.
* Caso possua mais familiaridade, sinta-se motivado a customizar mais as configurações (secrets, ingress, etc.).
- Adicionar um README ao projeto detalhando o processo e justificando as decisões tomadas. Recomendação: Markdown. Todos os refinamentos adicionados nos tópicos mencionados anteriormente, e demais ideias que possam melhorar o projeto serão considerados na avaliação da solução.
### Decisões de Implementação

Faça um fork e envie um PR com a sua solução, o tempo de entrega é de no máximo 4 dias e será contabilizado a partir da data do fork.
1. **Azure Resource Group e Localização**:
- Foi criado um grupo de recursos chamado "datarisk-resources" na região "Brazil South".

## Será avaliado:
2. **Rede Virtual e Sub-Rede**:
- Uma rede virtual chamada "datarisk-vnet01" foi criada com o espaço de endereçamento "10.233.0.0/16".
- Uma sub-rede chamada "datarisk-subnet01" foi criada com o prefixo "10.233.1.0/24".

- % do que foi entregue em relação ao que foi pedido.
- Qualidade dos aquivos Terraform.
- Boas práticas de infra e uso do Kubernetes.
- Corretude das tarefas.
- Uso eficiente em relação ao custo de máquina.
3. **Grupo de Segurança de Rede (NSG)**:
- Foi criado um NSG chamado "datarisk-nsg01" com regras para permitir tráfego SSH, HTTP (porta 80), e HTTPS (porta 443).

4. **Associação NSG com Sub-Rede**:
- A sub-rede foi associada ao NSG para aplicar as regras de segurança.

5. **IP Público**:
- Um IP público dinâmico foi criado para a máquina virtual.

6. **Interface de Rede**:
- Foi criada uma interface de rede associada à sub-rede e ao IP público.

7. **Máquina Virtual Linux**:
- Uma máquina virtual chamada "datarisk-vm01" foi criada com a imagem Ubuntu 20.04 LTS.
- O tamanho da VM é "Standard_B2S".
- Foram configuradas credenciais de administração (usuário e senha).

8. **Dockerfile**:
- O Dockerfile utiliza a imagem oficial do SDK do .NET para a fase de construção e a imagem oficial do ASP.NET para a execução da aplicação.
- São copiados os arquivos necessários e os pacotes são restaurados e a aplicação é compilada.
- A porta 8085 é exposta para acessar a aplicação.

### Melhorias Potenciais

1. **Gerenciamento de Credenciais**:
- Utilizar o Azure Key Vault para armazenar e gerenciar as credenciais de forma segura, em vez de mantê-las diretamente no código.

2. **Armazenamento do Estado do Terraform**:
- Descomentar as seções relacionadas ao Azure Storage Account no arquivo `main.tf` para configurar um backend remoto do Terraform, proporcionando uma maior confiabilidade no controle de estado.

3. **Variáveis do Terraform**:
- Utilização de variáveis do Terraform para tornar o código mais flexível e reutilizável.

4. **Automatização de Build e Deploy**:
- Implemente pipelines de CI/CD para automatizar o processo de implantação da infraestrutura incluindo o AKS.

### Execução do Projeto

1. **Pré-requisitos**:
- Instale o Terraform o Docker e o Azure CLI em sua máquina local. Configure as variaveis necessarias para autenticação nos serviços usados

2. **Provisionamento da Infraestrutura**:
- Execute `terraform init` e `terraform apply` no diretório onde o arquivo `main.tf` está localizado. Ou use o action Terraform Apply.

3. **Limpeza da Infraestrutura**:
- Execute `terraform destroy` para descomissionar os recursos provisionados quando não forem mais necessários. Ou use o action Terraform Destroy.
18 changes: 18 additions & 0 deletions aks-azure/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "=3.80.0"
}
}
}

# Definindo o provider
provider "azurerm" {
features {}
}

resource "azurerm_resource_group" "aks-datarisk" {
name = "datarisk-cluster"
location = "Brazil South"
}
Loading