{"id":316,"date":"2021-02-09T01:53:33","date_gmt":"2021-02-09T01:53:33","guid":{"rendered":"https:\/\/adrianotanaka.com.br\/?p=316"},"modified":"2022-03-11T19:17:45","modified_gmt":"2022-03-11T19:17:45","slug":"oci-events-e-functions-para-atribuir-politica-de-backup-automaticamente","status":"publish","type":"post","link":"https:\/\/adrianotanaka.com.br\/index.php\/2021\/02\/09\/oci-events-e-functions-para-atribuir-politica-de-backup-automaticamente\/","title":{"rendered":"OCI &#8211; Events e Functions para atribuir politica de backup automaticamente"},"content":{"rendered":"\n<p>Uma das coisas que mais gosto de estudar \u00e9 sobre como proteger o ambiente dos clientes, seja na cloud ou OnP, <a href=\"https:\/\/adrianotanaka.com.br\/index.php\/2020\/12\/05\/criando-backups-no-oci-de-hora-em-hora\/\">aqui<\/a>   j\u00e1 falei um pouco sobre como usar o oci cli para gerar backups de hora em hora e no meu <a href=\"https:\/\/github.com\/adrianotanaka\/scripts\/blob\/master\/oci\/cli\/disk-auto-assign-backup.sh\">github  <\/a>voc\u00ea pode encontrar um script que atribui a politica de backup Gold em todos os boot\/block volume em um determinado compartimento.<\/p>\n\n\n\n<p>Hoje venho falar de como usar dois recursos interessantes do OCI para aumentar a seguran\u00e7a do seu ambiente, com o uso do Events (para gerar uma a\u00e7\u00e3o) e o Functions (para executar um script), podemos atribuir de forma autom\u00e1tica uma politica de backup em todos os discos criados, <a href=\"https:\/\/adrianotanaka.com.br\/index.php\/2020\/08\/10\/monitorando-logins-no-oci-com-notifications-e-events\/\">aqui <\/a> eu falo um pouco sobre o Events e vou usar o mesmo Notification que criei para esse exemplo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Functions<\/h2>\n\n\n\n<p>O recurso Function do OCI \u00e9 bem interessante, ele \u00e9 a alternativa da Oracle para o lambda da AWS, com ele \u00e9 poss\u00edvel rodar c\u00f3digos em diversas linguagens de forma &#8220;serverless&#8221; , recomendo que leia a <a href=\"https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Functions\/Concepts\/functionsprerequisites.htm\">documenta\u00e7\u00e3o do Functions<\/a>   para entender melhor como fazer a sua configura\u00e7\u00e3o inicial, abaixo vou listar de forma bem resumida os passos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">IAM<\/h2>\n\n\n\n<p>Um dos passos em que quebrei bastante a cabe\u00e7a foi a permiss\u00e3o para a Function ser executada como instance principal, aqui criei uma police que libera ela ser chamada de qualquer lugar e tamb\u00e9m gerenciar qualquer recurso do meu ambiente(em um ambiente de produ\u00e7\u00e3o, recomendo que essas permiss\u00f5es sejam mais restritas).<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"435\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-1024x435.png\" alt=\"\" class=\"wp-image-320\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-1024x435.png 1024w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-300x127.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-768x326.png 768w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image.png 1112w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>ALL {resource.type = &#8216;fnfunc&#8217;}<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"750\" height=\"457\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-1.png\" alt=\"\" class=\"wp-image-321\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-1.png 750w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-1-300x183.png 300w\" sizes=\"auto, (max-width: 750px) 100vw, 750px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Functions<\/h2>\n\n\n\n<p>Indo no menu Developer Services -&gt; Functions, voc\u00ea precisa criar a sua aplica\u00e7\u00e3o, no meu caso estou usando a op\u00e7\u00e3o Cloud Shell e os passos j\u00e1 s\u00e3o apresentados na tela:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"436\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-2-1024x436.png\" alt=\"\" class=\"wp-image-323\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-2-1024x436.png 1024w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-2-300x128.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-2-768x327.png 768w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-2.png 1204w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Arquitetura de uma Function<\/h3>\n\n\n\n<p>A function possui alguns arquivos b\u00e1sicos como por exemplo o func.yaml que especifica os detalhes da sua Function, aqui no nosso exemplo ele cont\u00e9m o seguinte:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">adriano_ta@cloudshell:auto-assign-bkp-org (sa-saopaulo-1)$ cat func.yaml \nschema_version: 20180708\nname: auto-assign-bkp\nversion: 0.0.3\nruntime: python\nentrypoint: \/python\/bin\/fdk \/function\/func.py handler\nmemory: 256<\/pre>\n\n\n\n<p>Perceba que ele aponta por exemplo qual o nome da Function, quantidade de mem\u00f3ria e caminho para execu\u00e7\u00e3o.<\/p>\n\n\n\n<p>Ap\u00f3s isso temos o arquivo func.py que cont\u00e9m o c\u00f3digo da nossa function:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># auto-assign-bkp\n# This script runs after Block Volume Creation and assing the Gold backup pol.\n# This is based on https:\/\/github.com\/oracle\/oracle-functions-samples\/tree\/master\/samples\/oci-stop-untagged-instance-python\n\n\nimport io\nimport json\nfrom fdk import response\n\nimport oci\n\nvolume_backup_policy = \"ocid1.volumebackuppolicy.oc1..aaaaaaaagcremuefit7dpcnjpdrtphjk4bwm3emm55t6cghctt2m6iyyjdva\"\n\n\ndef handler(ctx, data: io.BytesIO = None):\n\n    resp = None\n\n    try:\n        body = json.loads(data.getvalue())\n        jsondata = body.get(\"data\")\n\n        print(\"Event          : \" + body[\"eventType\"], flush=True)\n        print(\"Disk ID        : \" +\n              body[\"data\"][\"resourceId\"], flush=True)\n        print(\"Disk Name       : \" +\n              body[\"data\"][\"resourceName\"], flush=True)\n        print(\"When : \" + body[\"eventTime\"], flush=True)\n\n        print(json.dumps(body, indent=4), flush=True)\n\n        instanceId = body[\"data\"][\"resourceId\"]\n        signer = oci.auth.signers.get_resource_principals_signer()\n\n        resp = do(signer, instanceId)\n\n        return response.Response(\n            ctx, response_data=json.dumps(resp),\n            headers={\"Content-Type\": \"application\/json\"}\n        )\n    except (Exception, ValueError) as e:\n        print(\"Error \" + str(e), flush=True)\n\n\ndef do(signer, instanceId):\n\n    print(\"Assigning Bkp pol\", flush=True)\n\n    block_storage_client = oci.core.BlockstorageClient({}, signer=signer)\n    create_response = block_storage_client.create_volume_backup_policy_assignment(\n        oci.core.models.CreateVolumeBackupPolicyAssignmentDetails(\n            asset_id=instanceId,\n            policy_id=volume_backup_policy\n        )\n    )<\/pre>\n\n\n\n<p class=\"has-small-font-size\"><a href=\"https:\/\/github.com\/adrianotanaka\/scripts\/blob\/master\/oci\/functions\/auto-assign-bkp\/func.py\">https:\/\/github.com\/adrianotanaka\/scripts\/blob\/master\/oci\/functions\/auto-assign-bkp\/func.py<\/a><\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"423\" height=\"118\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-3.png\" alt=\"\" class=\"wp-image-324\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-3.png 423w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-3-300x84.png 300w\" sizes=\"auto, (max-width: 423px) 100vw, 423px\" \/><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Deploy<\/h2>\n\n\n\n<p>Ap\u00f3s ter colocado o c\u00f3digo dentro de um diret\u00f3rio do Cloud Shel e tamb\u00e9m ter criado a aplica\u00e7\u00e3o via fn, vamos fazer o deploy rodando o seguinte comando dentro do diret\u00f3rio onde o c\u00f3digo est\u00e1:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">fn -v deploy --app auto-assign-bkp<\/pre>\n\n\n\n<p>Ele vai gerar um docker com o c\u00f3digo, basta esperar o deploy finalizar, uma dica \u00e9 ativar a op\u00e7\u00e3o de logs para verificar se a fun\u00e7\u00e3o est\u00e1 executando e quais os par\u00e2metros que ela est\u00e1 recebendo:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"184\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-4-1024x184.png\" alt=\"\" class=\"wp-image-334\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-4-1024x184.png 1024w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-4-300x54.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-4-768x138.png 768w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-4.png 1339w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Events<\/h2>\n\n\n\n<p>Agora que j\u00e1 temos a nossa Function implementada, precisamos criar ou usar um Event j\u00e1 existente para disparar a execu\u00e7\u00e3o da Function, aqui criei uma &#8220;trigger&#8221; baseado no evento que sinaliza o fim da cria\u00e7\u00e3o do disco:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"408\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-5-1024x408.png\" alt=\"\" class=\"wp-image-335\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-5-1024x408.png 1024w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-5-300x119.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-5-768x306.png 768w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-5.png 1077w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n\n<p>Perceba que tamb\u00e9m estou usando a Notification que criei no outro post para verificar se o evento est\u00e1 sendo disparado.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Testando<\/h2>\n\n\n\n<p>Agora que temos tudo criado com sucesso, basta criar um novo disco e verificar se a politica de backup foi atribu\u00edda a ele, essa verifica\u00e7\u00e3o pode ser feita tanto no disco quanto no servi\u00e7o de log por exemplo:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"972\" height=\"543\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-6.png\" alt=\"\" class=\"wp-image-336\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-6.png 972w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-6-300x168.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-6-768x429.png 768w\" sizes=\"auto, (max-width: 972px) 100vw, 972px\" \/><\/figure><\/div>\n\n\n\n<p>Na tela de m\u00e9tricas da Function:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"443\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-7-1024x443.png\" alt=\"\" class=\"wp-image-338\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-7-1024x443.png 1024w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-7-300x130.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-7-768x332.png 768w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/02\/image-7.png 1144w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Uma das coisas que mais gosto de estudar \u00e9 sobre como proteger o ambiente dos clientes, seja na cloud ou OnP, aqui j\u00e1 falei um pouco sobre como usar o oci cli para gerar backups de hora em hora e no meu github voc\u00ea pode encontrar um script que atribui a politica de backup Gold [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":340,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"material-hide-sections":[],"footnotes":""},"categories":[8,6,1],"tags":[29],"class_list":["post-316","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oci","category-oracle","category-uncategorized","tag-cloud"],"_links":{"self":[{"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/posts\/316","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/comments?post=316"}],"version-history":[{"count":15,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/posts\/316\/revisions"}],"predecessor-version":[{"id":339,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/posts\/316\/revisions\/339"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/media\/340"}],"wp:attachment":[{"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/media?parent=316"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/categories?post=316"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/tags?post=316"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}