Uma das coisas que mais gosto de estudar é sobre como proteger o ambiente dos clientes, seja na cloud ou OnP, aqui já falei um pouco sobre como usar o oci cli para gerar backups de hora em hora e no meu github você pode encontrar um script que atribui a politica de backup Gold em todos os boot/block volume em um determinado compartimento.
Hoje venho falar de como usar dois recursos interessantes do OCI para aumentar a segurança do seu ambiente, com o uso do Events (para gerar uma ação) e o Functions (para executar um script), podemos atribuir de forma automática uma politica de backup em todos os discos criados, aqui eu falo um pouco sobre o Events e vou usar o mesmo Notification que criei para esse exemplo.
Functions
O recurso Function do OCI é bem interessante, ele é a alternativa da Oracle para o lambda da AWS, com ele é possível rodar códigos em diversas linguagens de forma “serverless” , recomendo que leia a documentação do Functions para entender melhor como fazer a sua configuração inicial, abaixo vou listar de forma bem resumida os passos.
IAM
Um dos passos em que quebrei bastante a cabeça foi a permissão para a Function ser executada como instance principal, aqui criei uma police que libera ela ser chamada de qualquer lugar e também gerenciar qualquer recurso do meu ambiente(em um ambiente de produção, recomendo que essas permissões sejam mais restritas).
Functions
Indo no menu Developer Services -> Functions, você precisa criar a sua aplicação, no meu caso estou usando a opção Cloud Shell e os passos já são apresentados na tela:
Arquitetura de uma Function
A function possui alguns arquivos básicos como por exemplo o func.yaml que especifica os detalhes da sua Function, aqui no nosso exemplo ele contém o seguinte:
adriano_ta@cloudshell:auto-assign-bkp-org (sa-saopaulo-1)$ cat func.yaml schema_version: 20180708 name: auto-assign-bkp version: 0.0.3 runtime: python entrypoint: /python/bin/fdk /function/func.py handler memory: 256
Perceba que ele aponta por exemplo qual o nome da Function, quantidade de memória e caminho para execução.
Após isso temos o arquivo func.py que contém o código da nossa function:
# auto-assign-bkp # This script runs after Block Volume Creation and assing the Gold backup pol. # This is based on https://github.com/oracle/oracle-functions-samples/tree/master/samples/oci-stop-untagged-instance-python import io import json from fdk import response import oci volume_backup_policy = "ocid1.volumebackuppolicy.oc1..aaaaaaaagcremuefit7dpcnjpdrtphjk4bwm3emm55t6cghctt2m6iyyjdva" def handler(ctx, data: io.BytesIO = None): resp = None try: body = json.loads(data.getvalue()) jsondata = body.get("data") print("Event : " + body["eventType"], flush=True) print("Disk ID : " + body["data"]["resourceId"], flush=True) print("Disk Name : " + body["data"]["resourceName"], flush=True) print("When : " + body["eventTime"], flush=True) print(json.dumps(body, indent=4), flush=True) instanceId = body["data"]["resourceId"] signer = oci.auth.signers.get_resource_principals_signer() resp = do(signer, instanceId) return response.Response( ctx, response_data=json.dumps(resp), headers={"Content-Type": "application/json"} ) except (Exception, ValueError) as e: print("Error " + str(e), flush=True) def do(signer, instanceId): print("Assigning Bkp pol", flush=True) block_storage_client = oci.core.BlockstorageClient({}, signer=signer) create_response = block_storage_client.create_volume_backup_policy_assignment( oci.core.models.CreateVolumeBackupPolicyAssignmentDetails( asset_id=instanceId, policy_id=volume_backup_policy ) )
https://github.com/adrianotanaka/scripts/blob/master/oci/functions/auto-assign-bkp/func.py
Deploy
Após ter colocado o código dentro de um diretório do Cloud Shel e também ter criado a aplicação via fn, vamos fazer o deploy rodando o seguinte comando dentro do diretório onde o código está:
fn -v deploy --app auto-assign-bkp
Ele vai gerar um docker com o código, basta esperar o deploy finalizar, uma dica é ativar a opção de logs para verificar se a função está executando e quais os parâmetros que ela está recebendo:
Events
Agora que já temos a nossa Function implementada, precisamos criar ou usar um Event já existente para disparar a execução da Function, aqui criei uma “trigger” baseado no evento que sinaliza o fim da criação do disco:
Perceba que também estou usando a Notification que criei no outro post para verificar se o evento está sendo disparado.
Testando
Agora que temos tudo criado com sucesso, basta criar um novo disco e verificar se a politica de backup foi atribuída a ele, essa verificação pode ser feita tanto no disco quanto no serviço de log por exemplo:
Na tela de métricas da Function: