- tech系
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 とクラウドエースについてさらに詳しく記載していますので、ぜひ合わせて御覧ください。
この記事を共有する