Skip to content
This repository has been archived by the owner on Oct 2, 2023. It is now read-only.

feat/add iac aws #539

Open
wants to merge 10 commits into
base: main
Choose a base branch
from

Conversation

EzzioMoreira
Copy link

@EzzioMoreira EzzioMoreira commented Sep 11, 2022

Titulo

Migra projeto Maria Quitéria para ECS AWS.

  • Garanta que seu topic/feature/bugfix branch tenha uma branch nomeada e não a sua branch main esteja no PR
  • Dê um titulo que expresse o objetivo do PR
  • Associe seu PR a uma Issue criada no repositósito. Caso seja uma correção de linguagem ou pequenas correções, não é necessário
  • Descreva o objetivo do PR
  • Inclua links relevantes para a sua modificação/sugestão/correção
  • Descreva um passo-a-passo para testar o seu PR

Issue

Objetivo

Migra projeto da infraestrutura on-primese para AWS.

  • Cria um cluster ECS para projeto Maria Quitéria.
  • Cria um loadbalance.
  • Cria containers no cluster.
  • Cria um banco de dados RDS para projeto Maria Quitéria.

Referências

Estamos utilizando os seguintes projetos:

Como testar

Será preciso definir secrets no repositório do projeto Maria Quitéria para testar os códigos terraform:
Para criar secrets no github siga essa documentação -> Documentação Github secrets
Esses são os segredos que precisamos criar no github:

  • DOCKER_LOGIN
  • TOKEN_DOCKERHUB
  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • AWS_DEFAULT_REGION

Após configurar as secrets será preciso definir o valor das variavéis do arquivo terrafile.tf.

  • subnet_ids = ["id-subnet1", "id-subnet2"]
  • vpc_id = "id-vpc"

TO DO

  • Precisamos alterar o arquivo settings.py para pegar os valores das variavel de ambiente:
default_db = postgres://POSTGRES_USER:$POSTGRES_PASSWORD@POSTGRES_ENDPOINT:5432/POSTGRES_NAME

Comment on lines +78 to +86
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'POSTGRES_ENDPOINT': os.getenv('POSTGRES_ENDPOINT'),
'POSTGRES_NAME': os.getenv('POSTGRES_NAME'),
'POSTGRES_USER': os.getenv('POSTGRES_USER'),
'POSTGRES_PASSWORD': os.getenv('POSTGRES_PASSWORD'),
}
}
Copy link
Author

@EzzioMoreira EzzioMoreira Sep 11, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Não sei se essa é maneira mais elegante para utilizar variaveis de ambiente.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tá OK pra mim isso 👍

Uma outra opção seria usar o dj-database-url para parsear uma variável DATABASE_URL que é geralmente usada em serviços, mas não é necessário.

Copy link

@lgfa29 lgfa29 Sep 11, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Acabei de notar que o dj-database-url já está sendo utilizado em prod, então eu acho que só precisa definir a variável de ambiente DATABASE_URL.

@@ -153,7 +162,7 @@ class Common(Configuration):

class Dev(Common):
DEBUG = True
ALLOWED_HOSTS = ["localhost", "127.0.0.1", "[::1]", "0.0.0.0"]
ALLOWED_HOSTS = ["localhost", "127.0.0.1", "[::1]", "0.0.0.0", "load-balance-mentoria-1815320676.us-east-1.elb.amazonaws.com"]
Copy link
Author

@EzzioMoreira EzzioMoreira Sep 11, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Talvez conseguimos resolver o allow_host utilizando a URL do site.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Eu acabei não vendo esse comentário. Eu acho que dá para só definir a variável ALLOWED_HOSTS que a versão em prod carrega automaticamennte.

O problema que você estava tendo é rodando local?

Copy link

@lgfa29 lgfa29 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A maioria é só sugestão, mas está bem legal 🙂

@@ -18,3 +18,5 @@ RUN apt-get update && \
COPY . .

RUN python manage.py collectstatic --no-input

CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seria bom ler a porta de uma variável de ambiente, assim daria para fazer o bind e uma porta especificada pelo usuário.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Vamos tentar fazer o uso do CMD durante do build da imagem docker.

],
"environment": [
{
"name": "AWESOME_ENV_VAR",
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isso era para ser um exemplo? 😄

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sim, vou criar uma variável no pipeline que fará a substituição por production ou staging.

iac/container_definitions.json Outdated Show resolved Hide resolved
Comment on lines +13 to +18
data "template_file" "container_definitions" {
template = file("./container_definitions.json")
vars = {
IMAGE = var.image
}
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Esse provider foi depreciado. Você pode usar a função templatefile no lugar:

module "ecs_mentoria" {
  # ...
  container_definitions = templatefile("${path.module}/container_definitions.json", {
    IMAGE = var.image,
  })
  # ...
}

Usar path.module também torna o acesso a arquivos mais fácil, já que fica relativo ao lugar onde a expressão foi definida.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Boa, vou fazer o ajuste e testar.

iac/terrafile.tf Outdated Show resolved Hide resolved
iac/terrafile.tf Outdated Show resolved Hide resolved
name = "sentry_dsn",
description = "Parâmetro referente à variável de ambiente SENTRY_DSN",
type = "String",
value = " "
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Não conheço de RDS, então posso estar falando besteira, mas a ideia aqui é uma string com um espaço em branco como valor ou uma string vazia? É importante notar que são duas coisas diferentes.

(A mesma coisa para os outros valores).

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Esse recurso é referente ao parameter store da aws ele é semelhante a um cofre que pode armazenar valores de variáveis ou segredos. Vou analisar junto com a equipe do projeto Dados Abertos de Feira de Santana quais variáveis de ambiente serão criadas no projeto Maria Quitéria.

iac/terrafile.tf Outdated Show resolved Hide resolved
iac/terrafile.tf Outdated Show resolved Hide resolved
Comment on lines +78 to +86
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'POSTGRES_ENDPOINT': os.getenv('POSTGRES_ENDPOINT'),
'POSTGRES_NAME': os.getenv('POSTGRES_NAME'),
'POSTGRES_USER': os.getenv('POSTGRES_USER'),
'POSTGRES_PASSWORD': os.getenv('POSTGRES_PASSWORD'),
}
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tá OK pra mim isso 👍

Uma outra opção seria usar o dj-database-url para parsear uma variável DATABASE_URL que é geralmente usada em serviços, mas não é necessário.


on: [ push, pull_request ]
env:
TF_VAR_image: ezmom/mariaquiteria:latest
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Essa imagem vai ficar em uma conta do pessoal de Feira de Santana?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Estou utilizando essa para teste, ainda não tenho o nome do registrer do projeto Maria Quitéria. Assim que conseguir faço o ajuste.

@anapaulagomes
Copy link
Contributor

Oi, pessoas! Precisam de ajuda aqui? @EzzioMoreira @lgfa29

@EzzioMoreira
Copy link
Author

@anapaulagomes tudo bem? No momento não precisamos de ajuda. Ainda estamos em recesso na Mentoria DevOps. Vou ver direitinho quando podemos voltar aos trabalhos e consequentemente vamos conseguir avançar na migração da aplicação para ECS.

@anapaulagomes
Copy link
Contributor

Massa, muito obrigada, @EzzioMoreira! 🚀

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants