Olá a todos!
No artigo de hoje estarei compartilhando uma solução para realizar o o stop e start de máquinas virtuais via Oracle CLI de seu computador pessoal ou servidor Windows.
Iremos utilizar para esse artigo o seguinte cenário:
Temos a necessidade que a partir de uma instância da Oracle Cloud consigamos realizar o desligamento de algumas VMs de teste fora do horário comercial para que não consuma recurso.
Esse agendamento auxilia no controle de custos para evitar que recursos não utilizados consumam os créditos de seu ambiente de testes ou seu negócio.

Para isso, iremos criar uma rotina para execução de forma autônoma no Windows, com uma conta de serviço com conexão via chave de API.
São necessários os seguintes itens para execução do tutorial:
- 1 Servidor Windows Server
- 1 Usuário de serviço no IAM da Oracle Cloud
- Instalação do Oracle CLI
- Windows PowerShell para execução dos comandos e testes
- Agendador de tarefas do Windows para criação dos agendamentos
Passo 1: Criar uma conta para execução como serviço
Nesse passo iremos criar uma conta de usuário local para utilização no tutorial, porém o cenário é o mesmo para ambientes com Active Directory.
Crie uma conta de usuário no computador, no exemplo irei utilizar o usuário: oci-start-stop
A conta pode ser padrão, sem permissões administrativas, porém para realizar o acesso e conseguir instalar os software coloraremos o usuário no grupo local Administrators.
Essa permissão será revogada ao final da instalação dos pacotes e softwares. Após essa configuração, para realizarmos os acessos utilizaremos os grupos locais Remote Desktop Users e Users
Para garantir que a senha não seja alterada ou expire, selecione as opções:
- User cannot change the password
- Password never expires

Atribua o usuário as permissões de “Logon as a Batch Job”
Abra a política de grupo local (se não estiver em um domínio) e adicione o usuário a política.
Computer Configuration > Windows Settings > Security Settings > User Rights Assignment > Logon as a batch job

Passo 2: Criar grupo, política e usuário de serviço na Oracle Cloud
Nesse processo iremos criar um grupo, uma política e um usuário para utilização dos recursos na Oracle Cloud como serviço.
O usuário terá o mesmo nome criado dentro do Windows, para facilitar o mapeamento e identificação: oci-start-stop, o grupo chamará GP-OCI-Instance-Stop-Start e a política PL-OCI-Instance-Stop-Start
Para garantir a segurança, iremos atribuir somente a política de IAM necessária para o grupo desse usuário:
Allow group GP-OCI-Instance-Stop-Start to manage instance-family in tenancy
Navegue até Identity e Security > Groups

Criaremos o grupo

Agora iremos realizar a configuração da política para que a conta tenha permissão, a política deve ser inserida no root.
Navegue até Identity e Security > Polices

Certifique-se de que o compartimento selecionado seja o root e crie a police
Allow group GP-OCI-Instance-Stop-Start to manage instance-family in tenancy
Obs: No nosso caso iremos utilizar a política para todo tenancy, porém você pode definir para um compartimento específico ou uma região específica.

Com a política finalizada, iremos criar o usuário e atribuir ele ao grupo.
Navegue até Identity e Security > Users
Clique em Create User e clique um usuário de IAM, conforme abaixo (o email é opcional)

Depois de criado você será redirecionado a tela da conta do usuário, desça um pouco a página, clique em Add User to Group e selecione o grupo criado anteriormente: GP-OCI-Instance-Stop-Start

Passo 3: Instalar o Oracle CLI para Windows
Faça logon com o usuário de serviço criado no Windows Server.
Abra o PowerShell como Administrador e execute o comando abaixo:
powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.ps1'))"
Na instalação ele irá perguntar se deseja instalar o Python, digite Y
Ele irá iniciar o processo de download e instalação do Python
Após a finalização do processo, ele irá realizar algumas perguntas sobre diretórios, você pode selecionar todos os diretórios padrões digitando Enter, são 4 perguntas ao todo




Após as perguntas sobre os diretórios, ele irá instalar todos os pacotes e irá realizar uma última pergunta se gostaria de adicionar no caminho PATH do Oracle CLI, digite Y

Para verificar se a instalação foi bem sucedida, digite o comando oci -v ele deve retornar a versão do Oracle CLI, conforme exemplo abaixo:

Caso ele não retorne a versão do Oracle CLI, verifique se o caminho foi adicionado a variável de ambiente, faça logoff e logon novamente, se o erro persistir, reinicie o computador.
Passo 4: Criando a conexão com a Oracle Cloud
A primeira informação que precisamos coletar é o OCID do Tenancy

A segunda informação é o OCID do usuário de serviço.

Com as informações, faça logon no Windows e execute o Powershell
Digite o seguinte comando:
oci setup config
Ele irá questionar qual o local que irá realizar a configuração do arquivo, selecione o padrão informado.

Depois ele irá solicitar que seja informado o OCID do usuário de serviço, cole no PowerShell e digite Enter

Depois o Tenancy OCID

Selecione a região, você deve digitar o número correspondente. Como estou em Vinhedo irei selecionar 19.

No próximo passo serão solicitadas informações sobre a geração de chave para criar uma conexão via API Key, na primeira opção digite Y e deixe todas as opções padrões apertando Enter para confirmar

Após a criação do par de chaves, copie a chave.
Ela ficará salva no caminho em que foi instalado o Oracle CLI chamada oci_api_key_public.pem
Para coletar a chave do exemplo, irei utilizar o comando abaixo
cat C:\Users\oci-start-stop\.oci\oci_api_key_public.pem
Copie a chave

Volte para o Console da Oracle Cloud, vá até a conta de serviço, clique em API Keys, Add API Key, e cole a chave


Para validar a conectividade, volte ao Powershell e digite o comando abaixo, ele deve retornar o endereço do seu Object Storage
oci os ns get

Passo 5: Criando o agendamento de Stop e Start para Instância
Antes de iniciar, recomenda-se remover o usuário do grupo de Administradores locais, ele não precisará mais de permissão para execução elevada.
Você pode colocar ele no grupo de Users e Remote Desktop Users para realizar o acesso.
Após ajustar os grupos, faça logon novamente.
Iremos coletar o OCID da instância para criar 2 arquivos do tipo PowerShell para o cenário, 1 deles será para parar a Instância e o outro será para iniciar a instância.
Na página da instância colete o OCID.

Com OCID em mãos, crie 1 arquivo para parar a instância, exemplo abaixo
oci compute instance action --action SOFTSTOP --instance-id ocid1.instance.oc1.sa-vinhedo-1.an3ggljrisha37qc3xgmoya2ezs6i2kyixvyccmqgixtc663ngaoc6xvafha --wait-for-state STOPPED
E outro para iniciar a instância:
oci compute instance action --action START --instance-id ocid1.instance.oc1.sa-vinhedo-1.an3ggljrisha37qc3xgmoya2ezs6i2kyixvyccmqgixtc663ngaoc6xvafha --wait-for-state RUNNING
Basicamente o comando é dividido da seguinte forma:
oci compute instance action –action [argumento]: será a ação que será realizada
instance-id [ocid]: instância que terá a ação aplciada
–wait-for-state [argumento]: retorno esperado para que o powershell finalize a execução.
As ações são categorizadas da seguinte forma:
START – Inicia a Instância imediatamente
STOP – Para a instância imediatamente
RESET – Reinicia a instância
SOFTSTOP – Envia um comando do shutdown para instância e realiza o desligamento em até 15 minutos
SOFTRESET – Envia o comando de shutdown para a instância e realiza o desligamento em até 15 minutos. Após desligada, ela envia o comando de Start para ela ligar.
Com os 2 arquivos criados, iremos realizar 2 agendamentos no Agendador de Tarefas do Windows, 1 deles para parar a instância e o outro para iniciar.
Crie uma pasta na unidade C:, exemplo: C:\scritps-stop-start e mova os 2 arquivos.

Navegue até o Agendador de Tarefas e crie 2 tarefas, 1 para cada função, siga os exemplos abaixo.
Nota: utilize o usuário de serviço do Windows para executar a tarefa


Em action, no campo argumento aponte caminho do arquivo PowerShell, exemplo:
C:\scripts-stop-start\VMLINUX01-Stop-Instance.ps1


Clique em OK para finalizar as configurações, ao final do processo será solicitada a senha de serviço. Coloque a senha e cloque em OK.

Para fazer o primeiro teste, irei executar a tarefa manualmente, logado no servidor e o resultado foi o abaixo:

Vou realizar agora a criação do agendamento para o Start, usando os mesmos parâmetros anteriormente.
Pronto, agora eu tenho os 2 agendamentos criados, 1 para parar as 21h e outro para iniciar as 21:10h.

Para validar se o processo irá ocorrer normalmente, irei iniciar a Instância manualmente, fazer logoff da sessão do usuário e aguardar as 2 execuções automáticas.
Obs: Nos comandos que foram aplicados no servidor, devido a necessidade de validação foi alterado o comando para STOP ao invés de SOFTSTOP, nesse caso a instância irá parar imediatamente.
STOP aconteceu de forma autônoma as 21h

START aconteceu de forma autônoma as 21:10h

Com isso, conseguimos criar de forma simples agendamentos para evitar a cobrança de recursos de ambientes que não possuem a necessidade de execução 24×7
Obrigado pela atenção e estou a disposição para quaisquer dúvidas.
Você pode consultar a lista de opções para instância no link abaixo:
https://docs.oracle.com/en-us/iaas/tools/oci-cli/3.0.1/oci_cli_docs/cmdref/compute/instance.html
Todos os comandos estão disponíveis em: https://docs.oracle.com/en-us/iaas/tools/oci-cli/3.0.1/oci_cli_docs/index.html