Observação:

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

Atualização do IMDS da Instância

Pré-requisitos

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'}

Grupo Dinâmico

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

Políticas

Tarefa 3: Criar e Implantar as Funções do OCI

Crie, implante e chame a função para atualização do IMDS.

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

    OCI Functions

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

  3. 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).
    
  4. 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>
    
  5. 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.
    
  6. 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
    
  7. Confirme se o aplicativo está configurado corretamente listando os aplicativos. Execute o seguinte comando para listar o aplicativo.

    fn list apps
    
  8. Crie uma nova função chamada imdsupdate usando o runtime do Python e inicialize a função.

    fn init --runtime python imdsupdate
    
  9. Execute o comando a seguir para navegar até o diretório criado.

    cd imdsupdate
    
  10. Execute o comando ls para listar os arquivos gerados.

    ls
    

Tarefa 4: Atualizar o Código da Função Python

  1. 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
    
  2. Atualize o arquivo requirements.txt.

    fdk>=0.1.86
    oci==2.138.0
    
  3. 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.

Atualização do Código de Função

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.

Regra de Eventos

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.

Confirmações

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.