Como compartilhar imagens e snapshots

É possível compartilhar imagens e snapshots com usuários fora do projeto ou da sua organização. Os usuários com acesso de leitura a esses recursos podem usá-los para concluir operações em outros projetos e organizações. Por exemplo, se você conceder a um usuário acesso de leitura a uma imagem ou a um snapshot no projeto, ele poderá usar esses recursos para criar discos permanentes nos próprios projetos. Use papéis do IAM para compartilhar o acesso de leitura a imagens e snapshots.

Em algumas ocasiões, convém dar a usuários autorizados acesso a recursos de armazenamento apenas quando forem usá-los na organização ou em determinados projetos. Para limitar os projetos em que usuários podem usar suas imagens e snapshots para criar recursos, defina a restrição de uso do recurso de armazenamento como uma política da organização.

Para saber mais sobre papéis de IAM, leia a documentação do IAM.

Para saber sobre as políticas de IAM no nível do recurso que permitem conceder acesso a recursos específicos, como imagens em vez de um projeto inteiro, consulte Como conceder acesso aos recursos do Compute Engine.

Antes de começar

Limitações

O compartilhamento de recursos de armazenamento tem as restrições a seguir:

  • É possível atribuir papéis ao valor allAuthenticatedUsers para permitir o acesso a imagens ou snapshots. No entanto, não é possível atribuir papéis para permitir o acesso a esses recursos com o valor allUsers.

  • A restrição constraints/compute.storageResourceUseRestrictions pode ser definida somente no nível da organização.

  • É preciso usar a API Compute Engine para criar imagens ou snapshots de recursos fora do projeto. Por exemplo, faça referência a imagens e snapshots em projetos remotos ao executar métodos que exijam que você especifique um caminho para uma imagem ou instantâneo. Veja abaixo alguns exemplos desses métodos:

Como compartilhar recursos de armazenamento entre projetos e organizações

Para compartilhar o acesso a imagens e snapshots com outros usuários atribua a eles os seguintes papéis ou permissões de IAM para envolvidos no projeto ou no nível de recurso, pasta ou organização.

  • Imagens: o papel roles/compute.imageUser ou a permissão compute.images.useReadOnly.
  • Snapshots: o papel roles/compute.storageAdmin ou a permissão compute.snapshots.useReadOnly.

Esses papéis e permissões permitem compartilhar imagens e snapshots com outros membros de equipe que não fazem parte do projeto que contém essas imagens e snapshots. Por exemplo, a empresa pode ter um projeto específico com imagens qualificadas que o restante da empresa pode usar. É possível conceder o papel roles/compute.imageUser no nível do projeto aos membros da equipe, o que lhes permite usar essas imagens nos próprios projetos.

Para atribuir o papel de compartilhamento de imagem, use o Console do Google Cloud, a ferramenta de linha de comando da gcloud ou a API. Para saber como usar o IAM, leia a documentação dele.

Console

  1. Acesse a página "IAM" no Console do Cloud.

    Acessar a página "IAM"

  2. Se solicitado, selecione o projeto.
  3. Para adicionar um novo usuário:
    1. Clique em Adicionar na parte superior da página.
    2. Forneça um ou mais endereços de e-mail da conta a que você quer conceder acesso.
    3. Conceda um ou mais papéis ao membro.
      • Imagens: selecione Compute Engine > Usuário de imagens do Compute no seletor de papéis.
      • Snapshots: selecione Compute Engine > Administrador do armazenamento do Compute no seletor de papéis.
  4. Salve as alterações.

gcloud

Usando a ferramenta de linha de comando gcloud, adicione uma vinculação à política do Cloud IAM referente à imagem ou ao projeto da imagem. No exemplo a seguir, adicionamos uma vinculação ao projeto.

gcloud projects add-iam-policy-binding [PROJECT_ID] \
    --member [MEMBER_TYPE]:[ACCOUNT] --role [ROLE]

em que:

  • [PROJECT_ID] é o ID do projeto que contém as imagens a serem compartilhadas;
  • [MEMBER_TYPE] é o tipo de conta à qual está sendo concedido acesso. Por exemplo, use user para usuários individuais, serviceAccount para uma conta de serviço e group para um grupo do Google;
  • [ACCOUNT] é o endereço de e-mail da conta à qual você quer conceder esse papel. Por exemplo, para uma conta de serviço, pode ser my-sa@my-project-123.iam.gserviceaccount.com;
  • [ROLE] é o papel que você quer conceder ao usuário. Para imagens, especifique roles/compute.imageUser. Para snapshots, especifique roles/compute.storageAdmin.

Por exemplo, o comando a seguir atribui o papel roles/compute.imageUser a john@example.com, para que esse usuário possa acessar imagens em um projeto denominado database-images:

gcloud projects add-iam-policy-binding database-images \
    --member user:john@example.com --role roles/compute.imageUser

API

Na API, faça uma solicitação POST para o URL a seguir, em que [PROJECT_ID] é o ID do projeto em que estão as imagens que você pretende compartilhar.

POST https://cloudresourcemanager.googleapis.com/v1/projects/[PROJECT_ID]:setIamPolicy

O corpo da solicitação precisa conter a lista de vinculações que você quer aplicar a esse projeto. O papel precisa fazer parte da vinculação. Exemplo:

{
   "policy": {
       "version": "0",
       "bindings": [
       {
           "role": "roles/compute.admin",
           "members": [
               "user:example@gmail.com"
           ]
       },
       {
           "role": "roles/compute.imageUser",
           "members": [
               "user:john@gmail.com"
           ]
       }
       ]
   }

}

Como conceder acesso a imagens ao grupo de instâncias gerenciadas

O Compute Engine permite criar grupos de instâncias gerenciadas ou não gerenciadas. Se você criar um grupo de instâncias gerenciadas, o Compute Engine usará a conta de serviço das APIs do Google para chamar a API Google Compute Engine e realizar ações relevantes relacionadas ao grupo, como recriar instâncias não íntegras e atualizar instâncias. Se você quiser criar um grupo de instâncias gerenciadas usando uma imagem de outro projeto, conceda o papel compute.imageUser à conta de serviço das APIs pertencente ao projeto que está criando o grupo de instâncias gerenciadas.

Por exemplo, suponha que o Projeto A queira criar grupos de instâncias gerenciadas usando imagens de propriedade do Projeto B. O proprietário do Projeto B precisa conceder à conta de serviço de APIs do Google do Projeto A o papel compute.imageUser no Projeto B. Isso concede à conta a capacidade de usar as imagens do Projeto B para criar grupos de instâncias gerenciadas no Projeto A.

Depois de conceder o papel compute.imageUser, forneça o URL da imagem específica ao criar o modelo de instância do grupo.

Siga estas etapas para receber o e-mail da conta de serviço e conceder acesso à ela:

  1. Acesse a página "IAM" no Console do Cloud do projeto em que você quer criar grupos de instâncias gerenciadas.

    Acessar a página "IAM"

  2. Caso solicitado, selecione o projeto na lista.
  3. Procure a conta de serviço das APIs do Google, que tem o endereço de e-mail no formato a seguir:

    [PROJECT_NUMBER]@cloudservices.gserviceaccount.com
    
  4. Anote o endereço de e-mail acima. Depois, conceda acesso à conta do projeto que contém as imagens.

    Console

    1. Ainda no Console do Google Cloud, acesse a página "IAM" do projeto que contém as imagens que você quer acessar.

      Acessar a página "IAM"

    2. Selecione o projeto na lista de projetos.
    3. Clique no botão Adicionar para incluir um novo membro.
    4. Na caixa Membros, digite o endereço de e-mail da conta de serviço.
    5. Expanda a lista suspensa Papéis e selecione Compute Engine > Usuário do Google Compute Image (Beta).
    6. Clique em Adicionar para incluir a conta.

    gcloud

    Usando a ferramenta de linha de comando gcloud, adicione uma vinculação à política do Cloud IAM referente à imagem ou ao projeto de imagem. O exemplo a seguir adiciona uma vinculação no nível do projeto.

    gcloud projects add-iam-policy-binding [PROJECT_ID] \
        --member serviceAccount:[SERVICE_ACCOUNT_EMAIL] --role roles/compute.imageUser

    em que:

    • [PROJECT_ID] é o ID do projeto que contém as imagens a serem compartilhadas;
    • [SERVICE_ACCOUNT_EMAIL] é o e-mail da conta de serviço.

    Por exemplo:

    gcloud projects add-iam-policy-binding database-images \
        --member serviceAccount:123456789012@cloudservices.gserviceaccount.com  \
        --role roles/compute.imageUser

    API

    Na API, faça uma solicitação POST para o URL a seguir, em que [PROJECT_ID] é o ID do projeto em que estão as imagens que você pretende compartilhar.

    POST https://cloudresourcemanager.googleapis.com/v1/projects/$[PROJECT_ID]:setIamPolicy
    

    O corpo da solicitação precisa conter a lista de vinculações que você quer aplicar a esse projeto. É preciso que o papel roles/compute.imageUser faça parte da vinculação. Por exemplo:

    {
       "policy": {
           "version": "0",
           "bindings": [
           {
               "role": "roles/owner",
               "members": [
                   "user:example@gmail.com"
               ]
           },
           {
               "role": "roles/compute.imageUser",
               "members": [
                   "serviceAccount:123456789012@cloudservices.gservbiceaccount.com"
               ]
           }
           ]
       }
    }
    

Como restringir o uso de imagens e snapshots compartilhados

Depois de compartilhar imagens e snapshots com outros usuários, será possível controlar onde eles usam esses recursos. Defina a restrição constraints/compute.storageResourceUseRestrictions para definir os projetos em que os usuários têm permissão para usar seus recursos de armazenamento.

Você precisa ter permissão para modificar as políticas da organização a fim de definir essas restrições. Por exemplo, o papel resourcemanager.organizationAdmin tem permissão para definir essas restrições.

  1. Encontre o ID da sua organização.

    gcloud organizations list
    
  2. Identifique as configurações de política atuais para o projeto.

    gcloud beta resource-manager org-policies describe \
        compute.storageResourceUseRestrictions \
        --organization [ORGANIZATION_ID] > org-policy.yaml
    

    [ORGANIZATION_ID] é o ID da organização.

  3. Abra o arquivo org-policy.yaml em um editor de texto e modifique a restrição compute.storageResourceUseRestrictions. Adicione as restrições necessárias ou remova as restrições de que você não precisa mais. Quando terminar de editar o arquivo, salve as alterações. Por exemplo, defina a entrada de restrição a seguir no arquivo de política:

    constraint: compute.storageResourceUseRestrictions
    listPolicy:
      allowedValues:
        - under:organization/[ORGANIZATION_ID]
    
  4. Aplique o arquivo policy.yaml à sua organização.

    gcloud beta resource-manager org-policies set-policy
    --organization [ORGANIZATION_ID] org-policy.yaml
    

    [ORGANIZATION_ID] é o ID da organização.

Quando terminar de configurar as restrições na política da organização, teste-as para garantir que elas estão atendendo às suas necessidades.

Como usar imagens de outro projeto

Se alguém tiver concedido a você o papel compute.imageUser, acesse as imagens no projeto especificando o projeto de imagem em suas solicitações. Por exemplo, para ver uma lista das imagens disponíveis:

gcloud compute images list --project [IMAGE_PROJECT_ID]

Leia Como criar e iniciar uma instância para aprender a usar imagens para gerar novos recursos, como criar instâncias.

Por exemplo, o comando a seguir cria uma instância usando uma imagem chamada database-image-a do projeto database-images:

gcloud compute instances create test-instance --image database-image-a --image-project database-images

Da mesma forma, use a imagem para criar discos permanentes. Para mais informações, consulte Como criar um disco permanente raiz independente.

Como usar snapshots de outro projeto

Se alguém concedeu a você o papel compute.snapshots.useReadOnly relativo a um snapshot em um projeto específico, especifique o ID do projeto nas suas solicitações para acessar o snapshot. Se alguém lhe concedeu o papel compute.storageAdmin em um projeto específico, especifique o ID do projeto nas suas solicitações para acessar os snapshots nesse projeto. Por exemplo, execute o comando a seguir e receba uma lista de snapshots disponíveis para você no projeto [SNAPSHOT_PROJECT_ID]:

gcloud compute snapshots list --project [SNAPSHOT_PROJECT_ID]

Compartilhe snapshots com usuários em outros projetos para migrar dados de disco entre projetos.

Por exemplo, para mover os dados do disco disk-1 em project-a para um novo disco disk-2 em project-b, execute as etapas a seguir. Neste exemplo, disk-1 está localizado na zona us-west2-a e instance-1 está localizado na zona us-west2-b.

gcloud

  1. Crie um snapshot de disk-1:

    gcloud --project project-a compute disks snapshot disk-1 --snapshot-names snapshot-1
    
  2. Crie um disco novo em project-b com base no snapshot:

    gcloud --project project-b beta compute disks create disk-2 --source-snapshot projects/project-a/global/snapshots/snapshot-1
    
  3. Anexe o disco novo à instância instance-1 em project-b. O disco precisa estar na mesma zona da instância:

    gcloud --project project-b compute instances attach-disk instance-1 --disk disk-2
    
  4. Ative o disco. Consulte as etapas 5 a 7 de Como formatar e ativar um disco permanente.

API

  1. Para criar um snapshot de disk-1, faça uma solicitação POST ao método disks.createSnapshot.

    POST https://compute.googleapis.com/compute/v1/projects/project-a/zones/us-west2-a/disks/disk-1/createSnapshot
    
    {
     "name": "snapshot-1"
    }
    
  2. Crie um novo disco disk-2 em project-b com base no snapshot. Elabore uma solicitação POST para criar um disco permanente zonal usando o método disks.insert.

    POST https://compute.googleapis.com/compute/v1/projects/project-b/zones/us-west2-b/disks
    
    {
     "name": "disk-2",
     "sizeGb": [DISK_SIZE],
     "type": "zones/us-west2-b/diskTypes/[DISK_TYPE]"
     "sourceSnapshot": "projects/project-a/global/snapshots/snapshot-1"
    }
    

    em que:

    • [DISK_SIZE] é o tamanho do disco novo em GB;
    • [DISK_TYPE] é o tipo de disco permanente. Esse tipo é pd-standard ou pd-ssd.
  3. Anexe o disco novo à instância instance-1 em project-b. O disco precisa estar na mesma zona da instância. Elabore uma solicitação POST para o método instances.attachDisk e inclua o URL do disco permanente zonal que você acabou de criar.

    POST https://compute.googleapis.com/compute/v1/projects/project-b/zones/us-west2-b/instances/instance-1/attachDisk
    
    {
     "source": "/compute/v1/projects/project-b/zones/us-west2-b/disks/disk-2"
    }
    
  4. Ative o disco. Consulte as etapas 5 a 7 de Como formatar e ativar um disco permanente.

A seguir