我正在使用 IAM 策略更新项目。在 GCP 部署管理器的模板中,他们使用 python Jinja 文件,但我想添加 IAM 策略(为用户/服务帐户分配一些角色)。有人可以修改 Jinja/ 配置文件并指出我可以如何修改吗?
6 回答
请按照Adam Ocsvari的示例分配 IAM 策略。旧方法是获取所有 IAM 绑定策略,添加一些角色 -> 成员绑定,然后设置所有绑定。他正在提供一种使用'type': 'gcp-types/cloudresourcemanager-v1:virtual.projects.iamMemberBinding'
. 我使用他提供的链接之一来查找分配 IAM 策略绑定的 python 模板。那里的代码有一个嵌套循环。我只需要创建一个服务帐户并分配 1 个绑定:
服务-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-account 并为其分配 Dataflow 管理员角色。确保在开始之前授予 Deployment Manager 设置 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',
查看 Google Cloud 提供的 Cloud Foundation Toolkit 中的以下实现:
Cloud Foundation Toolkit 新存储库 - IAM 绑定
您需要对config.yaml文件的以下部分进行更改,并根据需要在 members 行下添加用户或服务帐户。
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
在适当部分的成员选项卡下添加,使其成为项目的所有者或查看者。
根据 Google 的说法,首选方法是不使用操作。而是使用在部署管理器中引入状态的类型提供程序。有关可用类型的完整列表,请使用以下命令:
gcloud beta deployment-manager types list --project gcp-types
Hil Liao 使用的示例是设置绑定的正确示例。
我的代码向服务帐户添加权限。
{% 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>