Observação:
- Este tutorial requer acesso ao Oracle Cloud. Para se inscrever e obter 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.
Anexe um IP Reservado a uma Instância do Oracle Cloud Infrastructure Compute usando o Terraform e o Script cloud-init
Introdução
No mundo da infraestrutura como código (IaC), automatizar o provisionamento e a configuração de instâncias de computação é essencial para implementações de nuvem eficientes e escaláveis. Quando se trata de anexar endereços IP Reservados às Instâncias de Computação do OCI (Oracle Cloud Infrastructure), o Terraform e o cloud-init fornecem uma combinação avançada.
No módulo Terraform do OCI Compute, não há opção para Anexar um IP Reservado a uma Instância do serviço Compute enquanto a instância é criada. Só podemos anexar IP Reservado após a criação da Instância. Neste post no blog, exploraremos como aproveitar o Terraform e o script cloud-init para anexar perfeitamente um IP reservado a uma instância do OCI Compute.
Objetivo
Anexe um IP reservado a uma instância do OCI Compute sem problemas usando o Terraform e o script cloud-init.
O que é um IP Reservado?
Um endereço IP Reservado é um IP estático designado a uma instância de computação dentro de uma rede virtual. Ele garante conectividade consistente para aplicativos que exigem um IP fixo e simplifica a administração de rede. IPs reservados geralmente são usados em cenários como balanceamento de carga, regras de firewall e comunicação segura com a rede.
Pré-requisitos
Primeiro, você precisa acessar um ambiente do OCI. Se você não tiver um, poderá criar facilmente sua instância Always Free, que vem com muita capacidade gratuita e US$ 300 em créditos de avaliação.
Quando você tiver um ambiente, certifique-se de que seu usuário tenha sido designado a um grupo com permissões para gerenciar os recursos da família de instâncias e da família de armazenamento. Uma melhor prática de segurança criou um usuário, em vez de usar um usuário da Console que já tenha permissões designadas a ele. Se precisar de ajuda, confira os documentos para criar um grupo e conceder permissões adequadas aos usuários.
- Conta do OCI
- Acesso ao Terraform. Consulte este link para obter mais detalhes.
- Sub-rede Pública, em que a instância será iniciada. Isso deve ser anexado a um Gateway de Internet.
- Sub-rede Privada, na qual a VNIC secundária é criada e designa o IP Reservado. Isso deve ser anexado a um Gateway de Serviço.
- Grupo Dinâmico no qual os Recursos do grupo requerem as permissões para gerenciar a Família de Rede.
- As políticas devem ser configuradas para Autenticação do Controlador de Instâncias.
Tarefa 1: Configurar um Script Terraform
Aqui, vamos adicionar um script cloud-init como metadados a um módulo Criar Instância de Computação do OCI Terraform. Além disso, informaremos o OCID do IP Reservado e o OCID da Sub-rede Privada para a VM de Computação como tags de formato livre.
resource "oci_core_public_ip" "pubip" {
# In case of Multiple Instances has to be created, Provide the count in the vars file.
# This block creates a Reserved Public IP from Oracle IP Pool
count = var.instance_count
compartment_id = var.compartment_id
display_name = var.res_ip_display_name
lifetime = "RESERVED"
private_ip_id = ""
}
resource "oci_core_instance" "pubiptest" {
count = var.instance_count
compartment_id = var.compartment_id
availability_domain = data.oci_identity_availability_domains.ads.availability_domains[0].name
display_name = var.display_name
shape = var.shape
# We will pass Reserved Public IP OCID and Private Subnet OCID as a freeform tags to the instance
freeform_tags = {
"publicIP" = resource.oci_core_public_ip.pubip[count.index].id
"SubnetId" = var.private_subnet_id
}
create_vnic_details {
display_name = var.vnic_display_name
assign_public_ip = true
subnet_id = var.public_subnet_id
}
source_details {
source_type = var.source_type
source_id = var.source_id
}
metadata = {
ssh_authorized_keys = var.pub_key
user_data = "${base64encode(file("./cloud-init.sh"))}"
}
}
O script acima criará um IP Reservado (considerando o valor da variável de contagem) e girará uma Instância do Serviço Compute com IP Efêmero, que é anexada à VNIC Principal.
Nos Metadados de Computação, passaremos no script cloud-init, que designará o IP Reservado substituindo o IP Efêmero existente.
Tarefa 2: Compreender o Script cloud-init
Tarefa 2.1: Instalar a CLI do OCI e outras ferramentas necessárias
Use o comando a seguir para instalar a CLI e o jq do OCI (Parsing JSON).
`sudo yum install -y python36-oci-cli jq`
Tarefa 2.2: Recuperar Metadados da Instância
-
Use o serviço de metadados da instância, que fornece informações sobre uma instância em execução de Rede, Volumes etc. Isso recupera o OCID da Instância, o ID do Compartimento, subnetID (OCID da Sub-rede Privada informado como tag de formato livre) e publicIP (IPOCID Reservado informado como tag de formato livre) usando o serviço de metadados da instância que também inclui valores de tags de formato livre.
metadata=$(curl -H 'Authorization: Bearer Oracle' http://169.254.169.254/opc/v2/instance) instanceid=$(echo $metadata | jq -r '.id') compartmentid=$(echo $metadata | jq -r '.compartmentId') subnetid=$(echo $metadata | jq -r '.freeformTags.SubnetId') publicIp=$(echo $metadata | jq -r '.freeformTags.publicIP')
-
Recuperar o OCID da VNIC Principal, o OCID (ID do IP Privado designado à VNIC Principal), o IP Público Efêmero e o OCID do IP Público Efêmero usando
oci-cli
primaryvnicid=$(curl -H 'Authorization: Bearer Oracle' http://169.254.169.254/opc/v1/vnics/ | jq -r '.[].vnicId') privateIpId=$(oci network private-ip list --vnic-id $primaryvnicid --auth instance_principal | jq -r '.data[].id') ephpublicIp=$(oci network vnic get --vnic-id $primaryvnicid --auth instance_principal | jq -r '.data."public-ip"') ephpublicIpId=$( oci network public-ip get --auth instance_principal --public-ip-address $ephpublicIp | jq -r '.data.id')
Tarefa 2.3: Anexar VNIC Secundária
Anexe a VNIC Secundária à VM de Computação que usará a Sub-rede Privada executando o comando a seguir.
oci compute instance attach-vnic --instance-id $instanceid --subnet-id $subnetid --auth instance_principal --wait
Tarefa 2.4: Configurar Rotas
-
Depois que a VNIC Secundária for criada e anexada à VM, vamos configurar a VNIC Secundária e adicioná-la às rotas. Para configurar as rotas, usaremos o Script fornecido pela Oracle.
wget https://docs.oracle.com/en-us/iaas/Content/Resources/Assets/secondary_vnic_all_configure.sh sudo chmod u+x ./secondary_vnic_all_configure.sh sudo ./secondary_vnic_all_configure.sh -c
-
Quando a configuração estiver concluída, você verá a nova rota adicionada às rotas de VM. Você pode verificar o mesmo usando o comando
sudo route -n
.
Tarefa 2.5: Fazer a rota VNIC Secundária como rota Padrão
-
Obtenha o IP do Gateway para a VNIC Secundária usando o IDMS. Isso será adicionado à Tabela de Roteamento de Instâncias.
gatewayIP=$(curl http://169.254.169.254/opc/v1/vnics/ | jq -c '.[] | ( select(.vnicId=="'$secondaryvnicid'" ))' | jq -r '.virtualRouterIp')
-
Obtenha a Interface de Rede Padrão usando o comando abaixo.
iname=$(sudo ./secondary_vnic_all_configure.sh | awk '{print $8}' | awk 'END{print}')
-
Execute o comando abaixo para adicionar a rota padrão para ser VNIC Secundária.
sudo route add default gw $gatewayIP dev $iname
-
Confirme novamente usando o comando
sudo route -n
.
Tarefa 2.6: Excluir IP Público Efêmero
-
Exclua o IP Público Efêmero que está anexado à VM. Como fizemos a VNIC Secundária como a rota padrão e a sub-rede que tem VNIC secundária, ela tem um gateway de serviço anexado a ela para que possa conversar com outros serviços do OCI (VCN nesse caso).
delpubIp=$(oci network public-ip delete --force --auth instance_principal --public-ip-id $ephpublicIpId --wait-for-state TERMINATED)
-
Use o comando abaixo para verificar se o IP Efêmero foi excluído com sucesso.
checkIp=$(oci network vnic get --vnic-id $primaryvnicid --auth instance_principal | jq -r '.data."public-ip"')
Tarefa 2.7: Anexar IP Reservado
Temos o OCID do IP Público de tags de formato livre e excluímos o IP Ephermeral, para que possamos anexar o IP Reservado à VNIC Principal. O comando a seguir anexa o IP Reservado à VNIC Principal da instância.
assign=$(oci network public-ip update --force --auth instance_principal --public-ip-id $publicIp --private-ip-id $privateIpId --wait-for-state ASSIGNED)
Tarefa 2.8: Desanexar VNIC Secundária
-
Anexamos Reservado Público à VNIC Principal e agora somos bons para desanexar a VNIC Secundária. Use o comando abaixo para desanexar a VNIC secundária e atualizar as regras de roteamento de acordo.
detach=$(oci compute instance detach-vnic --compartment-id $compartmentid --vnic-id $secondaryvnicid --force --auth instance_principal) sudo ./secondary_vnic_all_configure.sh -d
-
O script a seguir mostra todas as etapas juntas. Este script repetiu até 3 vezes em caso de falha e podemos configurar a notificação de falha usando o serviço OCI Events.
#!/bin/bash # coding: utf-8 sudo yum install -y python36-oci-cli function getdetails() { # Fetch data using instance principal authentication metadata=$(curl -H 'Authorization: Bearer Oracle' http://169.254.169.254/opc/v2/instance) instanceid=$(echo $metadata | jq -r '.id') compartmentid=$(echo $metadata | jq -r '.compartmentId') subnetid=$(echo $metadata | jq -r '.freeformTags.SubnetId') publicIp=$(echo $metadata | jq -r '.freeformTags.publicIP') primaryvnicid=$(curl -H 'Authorization: Bearer Oracle' http://169.254.169.254/opc/v1/vnics/ | jq -r '.[].vnicId') privateIpId=$(oci network private-ip list --vnic-id $primaryvnicid --auth instance_principal | jq -r '.data[].id') ephpublicIp=$(oci network vnic get --vnic-id $primaryvnicid --auth instance_principal | jq -r '.data."public-ip"') ephpublicIpId=$( oci network public-ip get --auth instance_principal --public-ip-address $ephpublicIp | jq -r '.data.id') if [[ -z "$subnetid" || "$subnetid" == "" || ${#subnetid} == 0 || -z "$publicIp" || ${#publicIp} == 0 || -z "$instanceid" || -z "$compartmentid" || -z "$publicIpData" || -z "$privateIpId" || -z "$primaryvnicid" || -z "$ephpublicIp" || -z "$ephpublicIpId" ]]; then echo "Missing some details, retrying..." return 1 fi return 0 } # Retry the `getdetails` function thrice attachVNIC() { attachvnic=$(oci compute instance attach-vnic --instance-id $instanceid --subnet-id $subnetid --auth instance_principal --wait) } for i in {1..3}; do getdetails if [[ $? -eq 0 ]]; then attachVNIC if [[ -n "$attachvnic" ]]; then secondaryvnicid=$(echo $attachvnic | jq -r '.data.id') echo $secondaryvnicid check2VNICs=$(oci compute instance list-vnics --instance-id $instanceid --auth instance_principal | jq -r '.data[].id') echo $check2VNICs gatewayIP=$(curl http://169.254.169.254/opc/v1/vnics/ | jq -c '.[] | ( select(.vnicId=="'$secondaryvnicid'" ))' | jq -r '.virtualRouterIp') if [[ (-n "$gatewayIP") ]]; then echo $gatewayIP wget https://docs.oracle.com/en-us/iaas/Content/Resources/Assets/secondary_vnic_all_configure.sh sudo chmod u+x ./secondary_vnic_all_configure.sh sudo ./secondary_vnic_all_configure.sh -c iname=$(sudo ./secondary_vnic_all_configure.sh | awk '{print $8}' | awk 'END{print}') echo $iname sudo route add default gw $gatewayIP dev $iname route oci os ns get --auth instance_principal delpubIp=$(oci network public-ip delete --force --auth instance_principal --public-ip-id $ephpublicIpId --wait-for-state TERMINATED) checkIp=$(oci network vnic get --vnic-id $primaryvnicid --auth instance_principal | jq -r '.data."public-ip"') if [[ -z "$checkIp" || "$checkIp" == "null" ]]; then echo "Assigning Reserved IP" assign=$(oci network public-ip update --force --auth instance_principal --public-ip-id $publicIp --private-ip-id $privateIpId --wait-for-state ASSIGNED) detach=$(oci compute instance detach-vnic --compartment-id $compartmentid --vnic-id $secondaryvnicid --force --auth instance_principal) sudo ./secondary_vnic_all_configure.sh -d checkIp2=$(oci network vnic get --vnic-id $primaryvnicid --auth instance_principal | jq -r '.data."public-ip"') echo "Reserved IP $checkIp2" if [[ -z "$checkIp2" ]]; then oci compute instance update --instance-id $instanceid --freeform-tags '{"errorStatus":"Reserved IP Not Assigned","SubnetId":"'$subnetid'","publicIP":"'$publicIp'"}' --force --auth instance_principal exit; fi else oci compute instance update --instance-id $instanceid --freeform-tags '{"errorStatus":"Ephemeral IP Not Deleted","SubnetId":"'$subnetid'","publicIP":"'$publicIp'"}' --force --auth instance_principal exit; fi break; else oci compute instance update --instance-id $instanceid --freeform-tags '{"errorStatus":"Gateway IP not fetched","SubnetId":"'$subnetid'","publicIP":"'$publicIp'"}' --force --auth instance_principal exit; fi else break; fi fi done if [[ -z "$attachvnic" ]]; then echo "Failed" oci compute instance update --instance-id $instanceid --freeform-tags '{"errorStatus":"Secondary VNIC not attached","SubnetId":"'$subnetid'","publicIP":"'$publicIp'"}' --force --auth instance_principal exit fi checkVNICs2=$(oci compute instance list-vnics --instance-id $instanceid --auth instance_principal | jq -r '.data | length') if [[ "$checkVNICs2" > 1 ]]; then echo "Detaching Secondary VNIC Failed" oci compute instance update --instance-id $instanceid --freeform-tags '{"errorStatus":"Detaching Secondary VNIC Failed","SubnetId":"'$subnetid'","publicIP":"'$publicIp'"}' --force --auth instance_principal exit fi oci compute instance update --instance-id $instanceid --freeform-tags '{"SubnetId":"'$subnetid'","publicIP":"'$publicIp'"}' --force --auth instance_principal
Próximas Etapas
Esta é uma implementação de amostra e faz as alterações correspondentes antes de usar isso como um script cloud-init. Isso foi testado com o Oracle Linux 8.
Se você escolher qualquer outro Linux Flavor, o procedimento de instalação oci-cli
será alterado. Para obter mais detalhes, consulte Instalando a CLI.
Links Relacionados
Aquisições
Autor - Rithesh Subramanian (OCI Cloud Architect)
Mais Recursos de Aprendizagem
Explore outros laboratórios no site docs.oracle.com/learn ou acesse mais conteúdo de aprendizado gratuito no canal YouTube do Oracle Learning. 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.
Attach a Reserved IP to an Oracle Cloud Infrastructure Compute Instance using Terraform and cloud-init Script
F82850-01
June 2023
Copyright © 2023, Oracle and/or its affiliates.