• tech系
4分で読める

VPCSCでCloud Storage APIを保護している時にCloud BuildからのCloud Functionsデプロイに失敗する問題

こんにちは。

先日Cloud FunctionsをCloud Buildから(重要)デプロイしようとしたら、次のような見慣れたログが流れました。

ERROR: (gcloud.beta.functions.deploy) HTTPError 403: <?xml version='1.0' encoding='UTF-8'?><Error>
<Code>SecurityPolicyViolated</Code><Message>Request violates VPC Service Controls.</Message>
<Details>Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier: 
WEXRqkxuMhUmx_iswqGNFwDCLaeWUvF-RndpE3jG5bmYABVi-eUrLA</Details></Error>

現在VPCSCではCloud Storage APIのみを制限していて、Access Context Managerで次のORルールAccess Levelが設定されています。

- ipSubnetworks:
  - <自宅や社用VPNのIPアドレス>
- members:
  - serviceAccount:<YOUR_PROJECT_NUMBER>@cloudbuild.gserviceaccount.com

突然ですが、問題です。
Access LevelでCloud Buildサービスアカウントを許可しているにも関わらず、VPCSCがCloud Functionsのデプロイを拒否してしまうのはなぜでしょうか?


正解を回りくどく書くと
「gcf-admin-robotサービスアカウントがサービス境界外に対してCloud Storage APIを叩くから」です。

このことは、Loggingで該当のエラーを見にいくとわかります。
一部を下に抜粋します。

authenticationInfo: {
  principalEmail: "service-<YOUR_PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com"
}
...(省略)
ingressViolations: [
  0: {
    source: "projects/985686202211"
    targetResource: "projects/397608059693/buckets/gcf-upload-asia-northeast1-44ded550-83b9-412b-b5b9-  4972948cc1f1/objects/9a55b4b5-5a64-480c-ba13-7be880b20b5c.zip"
    servicePerimeter: "accessPolicies/***/servicePerimeters/restrict_contents_access"
  }
]
...
labels: {
  service: "storage.googleapis.com"
  method: "google.storage.objects.create"
  project_id: "<YOUR_PROJECT_ID>"
}

どうやらCloud Functionsをデプロイする際には、gcf-admin-robotサービスアカウントがサービス境界外であるGoogleが管理しているCloud Storageバケットにオブジェクトを作成しようとしていて、そのAPIリクエストがVPCSCによって拒否されるようです。
該当のサービスアカウントをAccess Levelに加えることでサービス境界外に対してCloud Storage APIがリクエストできるようになり、無事にデプロイができました。

- ipSubnetworks:
  - <自宅や社用VPNのIPアドレス>
- members:
  - serviceAccount:<YOUR_PROJECT_NUMBER>@cloudbuild.gserviceaccount.com
  - serviceAccount:service-<YOUR_PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com

ところで、やりたいことはできたのですが疑問が残りました。
gcf-admin-robotがサービス境界外に対してgoogle.storage.objects.createを呼び出すのは、Cloud Buildかrデプロイをする時だけでした。

対象のバケットは projects/397608059693/buckets/gcf-upload-asia-northeast1-44ded550-83b9-412b-b5b9-4972948cc1f1で表されるリソースなのですが、なぜここにソースファイルを作成する必要があるのかはわかりませんでした。

言い換えると、なぜローカルPCとCloud Buildでソースファイルをアップロードするバケットが異なるのか。
特に知らなくても問題無さそうなのですが、ちょっとした振る舞いの違いがVPCSCでサービス境界を設定していると思わぬエラーを引き起こす事例でした。

 

Google Cloud ならクラウドエース

クラウドエースは Google Cloud に特化したシステムインテグレーターです。国内トップクラス、400社以上の支援実績と知見をもとに、Google Cloudの導入から設計開発まであらゆるご要望にお応えいたします。クラウドに関するご不明点がございましたら、お気軽にご相談ください。

こちらの無料資料では、Google Cloud とクラウドエースについてさらに詳しく記載していますので、ぜひ合わせて御覧ください。

この記事を共有する

合わせて読みたい