Менеджер по развертыванию Google, назначающий политики IAM в проекте

Я использую для обновления проекта с политиками IAM. в шаблонах менеджера развертывания GCP они используют файл Jinja python, но я бы хотел добавить политику IAM (назначить учетной записи пользователя / службы какую-то роль). Может ли кто-нибудь изменить файл Jinja/ config и указать, как я могу изменить?

https://github.com/GoogleCloudPlatform/deploymentmanager-samples/blob/master/examples/v2/project_creation/config.yaml

https://github.com/GoogleCloudPlatform/deploymentmanager-samples/blob/master/examples/v2/project_creation/project.py

2 ответа

Следуйте примеру Адама Оксвари, чтобы назначить политику IAM. Старый метод заключался в том, чтобы получить все политики привязки IAM, добавить несколько ролей -> привязок членов, а затем установить все привязки. Он предоставляет новый метод, используя 'type': 'gcp-types/cloudresourcemanager-v1:virtual.projects.iamMemberBinding', Я использовал одну из предоставленных им ссылок, чтобы найти шаблон python, который назначил привязки политики IAM. Код там имеет вложенный цикл. Мне нужно было только создать одну учетную запись службы и назначить 1 привязку:

service-accounts.py

def GenerateConfig(context):
    project_id = context.env['project']
    service_account = context.properties['service-account']

    resources = [
        {
            'name': service_account,
            'type': 'iam.v1.serviceAccount',
            'properties': {
                'accountId': service_account,
                'displayName': service_account,
                'projectId': project_id
            }
        },
        {
            'name': 'bind-iam-policy',
            'type': 'gcp-types/cloudresourcemanager-v1:virtual.projects.iamMemberBinding',
            'properties': {
                'resource': project_id,
                'role': 'roles/dataflow.admin',
                'member': 'serviceAccount:$(ref.' + service_account + '.email)'
            },
            'metadata': {
                'dependsOn': [service_account]
            }
        }
    ]

    return {'resources': resources}

сервис-accounts.yaml

imports:
  - path: service-accounts.py

resources:
  - name: service-accounts
    type: service-accounts.py
    properties:
      project: [*YOUR_PROJECT_ID*]
      service-account: k8s-service-account

В этом примере создается учетная запись k8s-service и назначается ему роль администратора потока данных. Убедитесь, что вы предоставили администратору развертывания разрешение на установку политик IAM перед началом работы.

Вот фрагмент кода jinja, который создает новую учетную запись службы и добавляет ее в качестве владельца в существующий проект. Для этого требуется назначить администратору развертывания правильный доступ для управления IAM для проекта.

{% set deployment = env['deployment'] %}
{% set project = env['project'] %}

resources:
- name: {{ deployment }}-svc-account
  type: iam.v1.serviceAccount
  properties:
    accountId: {{ deployment }}-svc-account
    displayName: {{ deployment }}-svc-account

- name: get-iam-policy
  action: gcp-types/cloudresourcemanager-v1:cloudresourcemanager.projects.getIamPolicy
  properties:
    resource: {{ project }}
  metadata:
    runtimePolicy:
    - 'UPDATE_ALWAYS'

- name: patch-iam-policy
  action: gcp-types/cloudresourcemanager-v1:cloudresourcemanager.projects.setIamPolicy
  properties:
    resource: {{ project }}
    policy: $(ref.get-iam-policy)
    gcpIamPolicyPatch:
      add:
      - role: roles/owner
        members:
        - serviceAccount:$(ref.{{ deployment }}-svc-account.email)

Пожалуйста, избегайте использования этих решений:

gcp-types/cloudresourcemanager-v1:cloudresourcemanager.projects.getIamPolicy
gcp-types/cloudresourcemanager-v1:cloudresourcemanager.projects.setIamPolicy

Это может привести к одновременным ошибкам обновления политики IAM. Команда Deployment Manager предоставляет новый тип, связывающий эти 2 действия вместе:

  'type': 'gcp-types/cloudresourcemanager-v1:virtual.projects.iamMemberBinding',

Ознакомьтесь со следующими реализациями в составе Cloud Foundation Toolkit, предоставляемого Google Cloud:

Cloud Foundation Toolkit НОВЫЙ репозиторий - привязка IAM

Cloud Foundation Toolkit OLD repo - привязка IAM

Cloud Foundation Toolkit NEW repo - Фабрика создания проектов

Вам необходимо внести изменения в приведенную ниже часть файла config.yaml и добавить учетные записи пользователей или служб в соответствии с вашими потребностями в строке членов.

 iam-policy:
      bindings:
      - role: roles/owner
        members:
        - serviceAccount:98765432111@cloudservices.gserviceaccount.com
        - serviceAccount:98765432100@cloudservices.gserviceaccount.com
      - role: roles/viewer
        members:
        - user:iamtester@deployment-manager.net

Например: вы можете добавить -user:foo@bar.com под вкладкой участников в соответствующем разделе, чтобы сделать его владельцем или зрителем проекта.

Мой код для добавления разрешений на учетную запись службы.

{% set deployment = env['deployment'] %}
{% set project = env['project'] %}

resources:
- name: get-iam-policy
  action: gcp-types/cloudresourcemanager-v1:cloudresourcemanager.projects.getIamPolicy
  properties:
    resource: {{ project }}
  metadata:
    runtimePolicy:
    - 'UPDATE_ALWAYS'
- name: patch-iam-policy
  action: gcp-types/cloudresourcemanager-v1:cloudresourcemanager.projects.setIamPolicy
  properties:
    resource: {{ project }}
    policy: $(ref.get-iam-policy)
    gcpIamPolicyPatch:
      add:
      - role: roles/bigquery.dataEditor
        members:
        - serviceAccount: <service account>

Согласно Google, предпочтительным способом является НЕ использовать действия. Вместо этого используйте поставщиков типов, которые вводят состояние в диспетчере развертывания. Чтобы получить полный список доступных типов, используйте следующую команду:

gcloud beta deployment-manager types list --project gcp-types

Пример, который использует Хиль Ляо, является правильным для установки привязок.

Другие вопросы по тегам