Observação:
- Este tutorial requer acesso ao Oracle Cloud. Para se inscrever em uma conta gratuita, consulte Conceitos Básicos do Oracle Cloud Infrastructure Free Tier.
- Ele usa valores de exemplo para credenciais, tenancy e compartimentos do Oracle Cloud Infrastructure. Ao concluir seu laboratório, substitua esses valores por valores específicos do seu ambiente de nuvem.
Automatize a atualização do Serviço de Metadados da Instância para a versão 2 somente para Instâncias do OCI Compute usando Regras de Eventos e Funções Python
Introdução
Garantir segurança e consistência em ambientes de nuvem é uma prioridade para empresas modernas. No OCI (Oracle Cloud Infrastructure), o IMDS (Instância Metadata Service) fornece informações críticas específicas da instância e a aplicação do uso da versão 2 (IMDSv2) aumenta a segurança exigindo autenticação baseada em sessão. Automatizar o upgrade para o IMDSv2 em todas as instâncias do OCI Compute é uma maneira eficaz de manter esse padrão de segurança, reduzindo a sobrecarga manual.
Este tutorial demonstra como criar um workflow automatizado e orientado a eventos usando regras do OCI Events Service e OCI Functions para impor a atualização IMDSv2. Ao aproveitar a automação baseada em Python, você criará e configurará os recursos necessários da OCI, como grupos dinâmicos, regras de eventos e funções sem servidor, para garantir perfeitamente a conformidade com esse protocolo de segurança aprimorado.
Objetivos
- A automação da atualização do IMDS para a versão 2 na OCI garante melhor segurança e controle sobre o acesso aos metadados da instância. Usando regras de evento e funções Python, você pode criar um workflow automatizado que imponha essa atualização sempre que novas instâncias forem iniciadas. Essa abordagem simplifica o gerenciamento de definições de metadados da instância, mantendo a consistência em seu ambiente de nuvem.
Pré-requisitos
-
Oracle Cloud Infrastructure Command Line Interface (OCI CLI) e Python Software Development Kit (SDK): Instale e configure a OCI CLI e o Python SDK para acesso programático.
-
Políticas do OCI IAM (Oracle Cloud Infrastructure Identity and Access Management): Certifique-se de que as políticas necessárias do OCI IAM estejam em vigor para gerenciar grupos dinâmicos, funções e regras de evento.
-
OCID (Compartment Oracle Cloud Identifier): Obtenha o OCID do compartimento no qual os recursos serão implantados.
-
Ambiente Python: configure o Python com a biblioteca OCI instalada (
pip install oci
). -
Configuração de Funções do OCI: Certifique-se de que o OCI Functions esteja ativado em sua tenancy e de que um ambiente Docker esteja configurado para implantação.
-
Permissões do Usuário: Certifique-se de ter permissões para criar e gerenciar recursos do OCI.
Tarefa 1: Criar um Grupo Dinâmico
Defina um grupo dinâmico para permitir que a função acesse as instâncias de destino. Para usar outros serviços do OCI, sua função deve fazer parte de um grupo dinâmico.
ALL {resource.type = 'fnfunc'}
Ao especificar as regras de correspondência, sugerimos a correspondência de todas as funções em um compartimento com:
ALL {resource.type = 'fnfunc', resource.compartment.id = 'ocid1.compartment.oc1..aaaaaxxxxx'}
Tarefa 2: Definir Políticas do OCI IAM
Crie uma nova política que permita ao grupo dinâmico gerenciar instâncias de computação. Concederemos acesso de gerenciamento a instâncias no compartimento específico.
Allow dynamic-group dmg-for-functions to manage instance-family in compartment Compartment-Name
Allow dynamic-group dmg-for-functions to manage functions-family in compartment Compartment-Name
Allow dynamic-group dmg-for-functions to use virtual-network-family in compartment Compartment-Name
Allow dynamic-group dmg-for-functions to manage instances in compartment Compartment-Name
Allow dynamic-group dmg-for-functions to read repos in compartment Compartment-Name
Tarefa 3: Criar e Implantar as Funções do OCI
Crie, implante e chame a função para atualização do IMDS.
-
Crie um aplicativo na Console do OCI.
Faça log-in na Console do OCI, acesse Developer Services, Functions e clique em Applications. Selecione a região apropriada para o OCI Functions e clique em Criar Aplicativo.
-
Configure o ambiente para implantação de funções, execute a configuração a seguir na sua instância do OCI Cloud Shell ou OCI Compute (executando o Oracle Linux 8) ou em qualquer sistema no qual você planeja criar e implantar a função.
-
Instale os seguintes recursos: Instalando a CLI, Instalando a CLI do Fn Project e Instalando o Oracle Cloud Infrastructure Python SDK.
-
Siga o guia de configuração detalhado no OCI Functions QuickStart em uma Instância do OCI Compute para preparar o ambiente. Essa preparação garante que seu ambiente esteja pronto para criar, implantar e gerenciar perfeitamente o OCI Functions.
Observação: Verifique se você tem um repositório criado no OCI Registry para suas imagens de função.
-
-
Faça log-in na instância do OCI Cloud Shell ou do OCI Compute e acesse o OCI Cloud Shell ou sua instância do OCI Compute na qual você criará a função. Defina o contexto da CLI do OCI Functions para especificar a região na qual a função será implantada.
fn use context <region-name> Replace <region-name> with the appropriate region (e.g., ap-hyderabad-1).
-
Atualize o contexto com o ID do compartimento. Execute o comando a seguir para definir o compartimento no qual o aplicativo residirá.
fn update context oracle.compartment-id <compartment-ocid>
-
Configure o OCI Registry. Informe um prefixo de nome de repositório exclusivo para distinguir suas imagens de função. Execute o seguinte comando para atualizar o registro.
fn update context registry <region-key>.ocir.io/<tenancy-namespace>/<repo-name-prefix> Example: ap-hyderabad-1.ocir.io/namespace/prefix.
-
Gere um token de autenticação na Console do OCI em seu perfil de usuário e execute o comando a seguir para fazer log-in no registro do contêiner usando o token de autenticação.
docker login -u '<tenancy-namespace>/<user-id>' <region-key>.ocir.io
-
Confirme se o aplicativo está configurado corretamente listando os aplicativos. Execute o seguinte comando para listar o aplicativo.
fn list apps
-
Crie uma nova função chamada
imdsupdate
usando o runtime do Python e inicialize a função.fn init --runtime python imdsupdate
-
Execute o comando a seguir para navegar até o diretório criado.
cd imdsupdate
-
Execute o comando
ls
para listar os arquivos gerados.ls
Tarefa 4: Atualizar o Código da Função Python
-
Abra e edite o arquivo Python gerado (por exemplo,
func.py
) no diretório e adicione o seguinte código python ao arquivo de função para a lógica.import io import json import logging from fdk import response import oci def handler(ctx, data: io.BytesIO = None): try: # Authenticate using Instance Principals signer = oci.auth.signers.get_resource_principals_signer() body = json.loads(data.getvalue()) logging.getLogger().info("Event body: " + str(body)) # Extract Required Details From Event Rule instance_id = body["data"]["resourceId"] # Instance OCID action_type = body["eventType"] logging.getLogger().info("Action type: " + action_type) # Proceed only if instance creation event if action_type == "com.oraclecloud.computeapi.launchinstance.end": compute_client = oci.core.ComputeClient(config={}, signer=signer) update_instance_imds(compute_client, instance_id) except (Exception, ValueError) as ex: logging.getLogger().error("Error: " + str(ex)) return response.Response( ctx, response_data=json.dumps({"message": "Error: " + str(ex)}), headers={"Content-Type": "application/json"}, ) return response.Response( ctx, response_data=json.dumps({"message": "Function executed successfully"}), headers={"Content-Type": "application/json"}, ) def update_instance_imds(compute_client, instance_id): """ Updates the instance metadata service (IMDS) configuration to disable legacy endpoints. """ try: # Fetch instance details instance_details = compute_client.get_instance(instance_id).data # Update instance configuration update_details = oci.core.models.UpdateInstanceDetails( instance_options=oci.core.models.InstanceOptions( are_legacy_imds_endpoints_disabled=True # Disable legacy endpoints ) ) response = compute_client.update_instance(instance_id, update_details) logging.getLogger().info( f"Successfully updated IMDS for instance {instance_id}: {response.data}" ) except Exception as ex: logging.getLogger().error("Failed to update IMDS: " + str(ex)) raise
-
Atualize o arquivo
requirements.txt
.fdk>=0.1.86 oci==2.138.0
-
Execute o comando a seguir para implantar a função no aplicativo criado.
fn -v deploy --app <application-name> Example: fn -v deploy --app functionpyth.
Essas etapas garantem que a função seja criada, implantada e pronta para ser chamada para automatizar atualizações de versão do IMDS no OCI.
Tarefa 5: Definir a Regra de Evento
Use o OCI Events Service para detectar quando uma nova instância do OCI Compute é criada.
Para configurar a regra de evento, insira as informações a seguir.
- Origem do Evento: Selecione Instância de Computação.
- Condition: Selecione Event Type como Instance – Launch End.
- Ação: Selecione Acionar uma Função, digite funções, compartimento de funções, aplicativo de funções e a função a ser acionada que você criou na Tarefa 4.
Tarefa 6: Validar o Valor do IMDS da Instância
Inicie uma nova instância para acionar a regra de evento e verificar a configuração do serviço de metadados da instância. Depois que a criação da Máquina Virtual (VM) for concluída, ela definirá automaticamente o valor do IMDS apenas para a versão 2.
Essas configurações são específicas de região e compartimento. Se você quiser chamar a mesma função em outro compartimento, crie uma regra de evento nesse compartimento e defina uma regra para acionar essa função.
Ao concluir essas tarefas, você automatizará o processo de atualização da versão do IMDS para v2 para instâncias do OCI Compute em um compartimento específico.
Links Relacionados
Confirmações
- Autor - Akarsha I K (Arquiteto de Nuvem)
Mais Recursos de Aprendizagem
Explore outros laboratórios em docs.oracle.com/learn ou acesse mais conteúdo de aprendizado gratuito no canal Oracle Learning YouTube. Além disso, visite education.oracle.com/learning-explorer para se tornar um Oracle Learning Explorer.
Para obter a documentação do produto, visite o Oracle Help Center.
Automate the Instance Metadata Service update to version 2 only for OCI Compute Instances using Event Rules and Python Functions
G24780-01
January 2025