OCI – Events e Functions para atribuir politica de backup automaticamente

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).

ALL {resource.type = ‘fnfunc’}

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:

chevron_left
chevron_right