setIamPolicy アクションをサポートされているリソースタイプに置き換える

アクション機能は、Deployment Manager が呼び出すことができる API メソッドの範囲を拡張するアルファ版の機能です。この機能はサポートされていないため、アクションの既存の使用をサポートされている代替のものに移行することをおすすめします。よく使用されるアクション storage.buckets.setIamPolicy は、既存の Deployment Manager リソースタイプ virtual.buckets.iamMemberBinding に対応しており、これは、リソースタイプを置き換えることができます。

storage.buckets.setIamPolicy から virtual.buckets.iamMemberBinding へのデプロイの移行

virtual.buckets.iamMemberBinding リソースは、Identity and Access Management(IAM)ポリシー バインディングを表す仮想リソースです。完全な型は gcp-types/storage-v1:virtual.buckets.iamMemberBinding です。

virtual.buckets.iamMemberBinding は、Deployment Manager バックエンドから作成、読み取り、更新、削除(CRUD)オペレーションがカスタム実装されています。アクション storage.buckets.setIamPolicy で呼び出されるメソッドと同様のメソッドを呼び出しますが、アクションではなく通常のリソースとしてモデル化され、通常のリソースタイプと同じライフサイクルを守ってます。

デプロイを移行するには、すべてのデプロイ構成ファイルで、アクション storage.buckets.setIamPolicy の使用をリソース virtual.buckets.iamMemberBinding に置き換えます。複数のバインディングがある場合は、複数のリソースにわたり同じロジックを実装するために複数のリソースが必要になる場合があります。仮想タイプは、リソースの既存のバインディングを置き換えずに、新しいものにパッチを適用します。

手動移行の使用例

移行を手動で完了するには、以下の使用例をご覧ください。複数の IAM バインディングを適用する場合などの特定の場合には、metadata.dependsOn または他のリソースへの参照を iamMemberBinding リソースに追加して、競合状態などの状況を回避する必要がある場合があります。

YAML + Jinja

YAML 構成ファイルで setIamPolicy アクションを使用する方法の例を次に示します。このアプローチはサポートされていないため、iamMemberBinding 仮想リソースの使用に置き換える必要があります。

- name: patch-iam-policy
  action: gcp-types/storage-v1:storage.buckets.setIamPolicy
  properties:
    bucket:
    policy: # existing policy, e.g. from a getIamPolicyAction
    gcpIamPolicyPatch:
      add:

次のサンプルでは、YAML および Jinja テンプレートで iamMemberBinding 仮想リソースを使用することを推奨しています。

{% set BUCKETNAME = "bucket-" + env["deployment"] %}

resources:
- type: gcp-types/storage-v1:buckets
  name: {{ BUCKETNAME }}
  properties:
  location: US
    storageClass: STANDARD
- type: gcp-types/storage-v1:virtual.buckets.iamMemberBinding
  name: test-bucket-iam
  properties:
    bucket: $(ref.{{ BUCKETNAME }}.name)
    member: projectEditor:{{ env["project"] }}
    role: roles/storage.admin

Python

Python テンプレートで setIamPolicy アクションを使用する方法の例を次に示します。このアプローチはサポートされていないため、iamMemberBinding 仮想リソースの使用に置き換える必要があります。

resources.append({
        'name': 'add-iam-policy',
        'action': 'gcp-types/storage-v1:storage.buckets.setIamPolicy',
        'properties': {
            'bucket': gcs_bucket,
            'userProject': project,
            'policy': '$(ref.get-iam-policy)',
            'gcpIamPolicyPatch': {
                'add': [{
                    'roles':
                        'roles/storage.objectViewer',
                    'members': [
                        'serviceAccount:$(ref.%s.serviceAccount)' % tpu_name
                    ]
                }]
            }
        }
    })

次のサンプルでは、Python テンプレートで iamMemberBinding 仮想リソースを使用することを推奨しています。

iam_policy_resource = {
    'name': policy_name,
    'type': 'gcp-types/storage-v1:virtual.buckets.iamMemberBinding',
    'properties':
        {
           'bucket': '$(ref.{}.name)'.format(context.env['name']),
           'role': role['role'],
           'member': member,
         }
}

gcs-bucket.py テンプレートに関連するその他のサンプルは、GitHub の cloud-foundation-toolkit リポジトリにあります。gcs-bucket.py テンプレートを、アクション setIamPolicy の使用から仮想リソース iamMemberBinding の使用に変換するプロセスの詳細なデモについては、変換の例をご覧ください。変換されたテンプレートの使用例もご覧ください。