AWSãšã³ãžãã¢ã®ããã®GCP: AWSã®çŽæãã©ã掻ãããïŒãããŠã©ãã§éçšããªããïŒ
AWSã§ã¢ã«ãŠã³ããæŽçããæš©éãä»äžããã¹ããŒããããŒãã¹ãã©ããããæ¹æ³ã¯ãåç¥ã§ããããGoogle Cloudã§åãããšãè¡ãæ¹æ³ - ãããã«ãããã³ã°ãããæŠå¿µãšãAWSã®çèã®èšæ¶ãç©æ¥µçã«èª€è§£ãæã4ã€ã®ãã€ã³ããã玹ä»ããŸãã
AWSã«ç²ŸéããŠããŠãä»Google CloudãèŠã€ããŠãããªããæå ±ã§ããçŽæã®çŽ80%ã¯çŽæ¥ç§»è¡ã§ããŸããç©äºãæŽçããããã®éå±€ãã¢ã¯ã»ã¹ãä»äžããããã®ããŒã«ããŒã¹ã®æ¹æ³ãããŒã¬ã¹CIã®ããã®OIDCã®ä»çµã¿ããããŠãã¹ããŒãããã¯ãšã³ããã³ãŒã«ãã¹ã¿ãŒããããããŒãã¹ãã©ããã®ããã»ã¹ããããŸããæªããã¥ãŒã¹ã¯æ®ãã®20%ã§ããããã¯ãAWSæµã®ããæ¹ããããšãæçœãªãšã©ãŒã§ã¯ãªããæ··ä¹±ãæãæåŠãçºçãããããã€ãã®ãã©ãã£ãã¯ã®å€ãå Žæã«éäžããŠããŸãããã®èšäºã¯ç¿»èš³ã¬ã€ã€ãŒã§ããAWSã§è¡ãã®ãšåãäœæ¥ãGCPã§è¡ãããã®èœãšãç©ŽãææããŸãã
ãã1ã€ã®æ®µèœã ãèªããªããçãããŒãžã§ã³ã¯æ¬¡ã®ãšããã§ããGCPã®éå±€ïŒorganization -> folder -> project -> resourceïŒã¯ãAWS Organizations -> OU -> account -> resourceã«ãããã«ãããã³ã°ãããŸããã3ã€ã®ç¹ã§çèã®èšæ¶ãéçšããŸãããIAMã¯ãªãœãŒã¹ããªãŒã«ãã€ã³ããããäžäœã«ç¶æ¿ãããèš±å¯ã®ã¿ã®ããªã·ãŒã§ããããŠãŒã¶ãŒã«ããªã·ãŒã¯ã¢ã¿ãããããŸããããããžã§ã¯ãã®ãµãŒãã¹APIã¯ãã¹ãŠåæç¶æ ã§ãªãã«ãªã£ãŠããããããããæå¹ã«ãããŸã§äœãæ©èœããŸããããããŠãããŒã«ãã¢ã·ã¥ãŒã ããã®ã§ã¯ãªãããµãŒãã¹ã¢ã«ãŠã³ããåœè£ ããŸãããµãŒãã¹ã¢ã«ãŠã³ãèªäœãç¬èªã®ã¢ã¯ã»ã¹ããªã·ãŒãæã€ãªãœãŒã¹ã§ãã 以äžã§ã¯ããããã詳ãã説æããŸãã
æå€§ã®å€å: æš©éã¯ã¢ã€ãã³ãã£ãã£ã§ã¯ãªãããªãŒã«ååšãã
AWSã§ã¯ãã¡ã³ã¿ã«ã¢ãã«ã¯ãããªã·ãŒãã¢ã€ãã³ãã£ãã£ã«ã¢ã¿ãããããã§ãããŠãŒã¶ãŒãŸãã¯ããŒã«ãäœæããããã«JSONããããã¹æ¢ããããšãæš©éã¯ããªã³ã·ãã«ãšãšãã«ç§»åããŸãããªãœãŒã¹ããªã·ãŒã¯ååšããŸãããã¢ã€ãã³ãã£ãã£ã«ã¢ã¿ãããããããªã·ãŒãäžå¿ã§ãã
GCPã¯ãããé転ãããŸããIAMããªã·ãŒã¯ããªãœãŒã¹éå±€ã®ããŒãïŒorganizationãfolderãprojectããŸãã¯åã
ã®ãªãœãŒã¹ïŒã«ã¢ã¿ããããããã€ã³ãã£ã³ã° - (member, role) ã®ã㢠- ã®ã»ããã§ãã ããªã·ãŒã¯ã¢ã¯ã»ã¹ããããã®ã«ååšããã¢ã¯ã»ã¹ãè¡ãã¢ã€ãã³ãã£ãã£ã«ã¯ååšããŸãããä»»æã®æç¹ã§ã®å®å¹ã¢ã¯ã»ã¹ã¯ãã«ãŒããããã®ããŒããŸã§ç¶æ¿ããããã¹ãŠã®ãã€ã³ãã£ã³ã°ã®çµåã§ãããã©ã«ãã¬ãã«ã®ã°ã«ãŒãã« roles/compute.admin ãä»äžãããšããã®ãã©ã«ãé
äžã®ãã¹ãŠã®ãããžã§ã¯ãããããç¶æ¿ããŸãã
Azure RBACã«è§Šããããšããããªããããã¯éŠŽæã¿æ·±ãæããã§ããã - äžæ¹ç¶æ¿ã䌎ãã¹ã³ãŒãããšã®ããŒã«ã§ããããªããæãã«ãŒã«:
GCPãäœããæåŠããå ŽåãããŠãŒã¶ãŒã®ããªã·ãŒããæ¢ãã®ããããŠãã ãããorgãfolderãprojectããŸãã¯resourceã®ãã€ã³ãã£ã³ã°ãæ¢ãããããäžäœã«ç¶æ¿ãããããšãèŠããŠãããŠãã ããããããã£ãŠãéèŠãªä»äžã¯3ã¬ãã«äžã«ãããããããŸããã
AWSãšã¯ç°ãªãããã€ãã®å ·äœçãªç¹:
- ããŒã«ã«ã¯3ã€ã®çš®é¡ããããŸãã ããªããã£ãããŒã«ïŒ
roles/ownerãroles/editorãroles/viewerïŒã¯ãç²ãã¬ã¬ã·ãŒãª3ã€ã®ããŒã«ã§ã - å®éã®ç°å¢ã§ã¯é¿ããŠãã ãããäºåå®çŸ©ããŒã«ã¯ãå®éã«äœ¿çšãã¹ããã现ãããµãŒãã¹ããšã®ããŒã«ã§ãïŒroles/storage.objectViewerãroles/compute.instanceAdmin.v1ã...ïŒãã«ã¹ã¿ã ããŒã«ã¯ãäºåå®çŸ©ãããã»ãããåºãããå Žåã«èªåã§äœæãããã®ã§ãã - åºæ¬ã¢ãã«ã¯å ç®çã§èš±å¯ã®ã¿ã§ãã AWSã®ããã«ããã¹ãŠã®ããªã·ãŒã«ã¹ããŒãã¡ã³ãããšã®
Effect: Denyãç¹ã蟌ãŸããŠããããã§ã¯ãããŸãããå®å¹ã¢ã¯ã»ã¹ã¯ãèš±å¯ã®çµåã«ãããŸããã - æåŠã¯å¥ã®ã¬ã€ã€ãŒã§ãã ãä»äžã«é¢ããããæ±ºããŠèš±å¯ããªãããšãã峿 ŒãªèŠä»¶ãããå ŽåãIAMæåŠããªã·ãŒãäœæããŸã - ããã¯org/folder/projectã«ã¢ã¿ãããããåå¥ã®ãªããžã§ã¯ãã§ãèš±å¯ã®åã«è©äŸ¡ãããŸããããã¯ã€ã³ã©ã€ã³ã®
Denyã¹ããŒãã¡ã³ãã«æãè¿ããã®ã§ãããæå³çã«åž¯åå€ã«ãããŸãã - ã¬ãŒãã¬ãŒã«ã¯ããã«å¥ã®ãã®ã§ã: Organization Policy Serviceã§ãã
constraints/compute.vmExternalIpAccessãconstraints/iam.disableServiceAccountKeyCreationã®ãããªå¶çŽã¯ãGCPã«ãããSCPsã®ã¢ããã°ã§ãããããã¯org/folder/projectã«ã¢ã¿ãããããäžäœã«ç¶æ¿ããã誰ãäœãåŒã³åºãããã§ã¯ãªããäœãååšã§ãããããŸãã¯èšå®ã§ããããå¶éããŸãããSCPã®ãããªã¬ãŒãã¬ãŒã«ããšèããŠãã ããããIAMããŒã«ãã§ã¯ãããŸããã
ã€ãŸããAWSãIAMå ã§1ã€ã®èš±å¯/æåŠã®ææ³ãæäŸããã®ã«å¯ŸããGCPã¯èš±å¯ãã€ã³ãã£ã³ã°ãæåŠããªã·ãŒãããã³çµç¹ããªã·ãŒã®å¶çŽã«ãã®åœ¹å²ã忣ãããŸããçµæã¯åãã§ãããã¡ã«ããºã ã¯3ã€ãããŸãã
ãã¹ãŠããããžã§ã¯ã - ãããŠãã®APIã¯ãªãããå§ãŸã
ãããžã§ã¯ãã¯GCPã®åºæ¬çãªåäœã§ããããã¯AWSã¢ã«ãŠã³ãã®ããããã®ã¢ããã°ã§ããåé¢å¢çãIAMã¹ã³ãŒããããã³èª²éã¿ãŒã²ãããå
ŒãåããŠããŸãããããããããžã§ã¯ãã¯ã¢ã«ãŠã³ããããã¯ããã«è»œéã§ã - äœæãå®äŸ¡ã§ãåé€ã容æã§ã倿°äœæãããããšãæå³ããŠããŸããæ
£çšçãªãã¿ãŒã³ã¯ãç°å¢ããšã«ã¯ãŒã¯ããŒãããšã«1ã€ã®ãããžã§ã¯ãïŒapp-qaãapp-prodïŒã§ãããã¿ã°ã§åå²ãããå°æ°ã®å
±æã¢ã«ãŠã³ãã§ã¯ãããŸããã
ãããžã§ã¯ãã«é¢ãã3ã€ã®ç¹ã¯ãAWSã«ãããã«çžåœãããã®ã¯ãããŸããã
- ãããžã§ã¯ãã«ã¯3ã€ã®èå¥åãããããã®éããåé¡ã«ãªããŸãã ãããžã§ã¯ãIDã¯ãã°ããŒãã«ã«äžæã§äººéãéžæããäžå€ã®æååïŒ
acme-app-prod-7f3aïŒã§ã - ã»ãšãã©ãã¹ãŠã®ã³ãã³ããšãªãœãŒã¹ãã¹ã«å ¥åãããã®ã§ãããããžã§ã¯ãçªå·ã¯ãGCPãå²ãåœãŠãã°ããŒãã«ã«äžæã®æŽæ°ã§ãã衚瀺åã¯å€æŽå¯èœã§è£ 食çãªãã®ã§ããIDã¯æ éã«éžæããŠãã ãããäžåºŠèšå®ãããšå€æŽã§ããŸããã - ãµãŒãã¹APIã¯ããã©ã«ãã§ãªãã§ãã ããã¯ãåæ¥ã«æããããã倱æã§ããVMãäœæããåã«
compute.googleapis.comãæå¹ã«ãããã±ãããäœæããåã«storage.googleapis.comãæå¹ã«ãããªã©ããããžã§ã¯ãããšã«è¡ããŸããGCPã§ã®æåã®ãæåŠãã¯ãéåžžãIAMããŒã«ã®äžè¶³ã§ã¯ãªããAPI [compute.googleapis.com] not enabled on projectã§ããAWSã§ã¯ããµãŒãã¹ã¯åã«ååšããŸããGCPã§ã¯ããã¹ãŠã®ãããžã§ã¯ãã¯çœçŽã®ç¶æ ã§ããã䜿çšããäºå®ã®ãµãŒãã¹ã®ã¿ãæå¹ã«ããŸããïŒTerraformã§ã¯google_project_serviceãCLIããã¯gcloud services enableã䜿çšããŸããïŒ - ãããžã§ã¯ãã¯èªç¶ãªççºååŸãšã¯ã©ãŒã¿ã®å¢çã§ãã ã¯ã©ãŒã¿ãäºç®ãããã³ã»ãšãã©ã®ããã©ã«ãã¯ãããžã§ã¯ãããšã§ãããããå®éšã®ããã«æ°ãããããžã§ã¯ããç«ã¡äžããã®ã¯ãAWSã¢ã«ãŠã³ãã®ãããªååŒã§ã¯ãªããéåžžã®å®äŸ¡ãªè¡åã§ãã
ãµãŒãã¹ã¢ã«ãŠã³ã: åœè£ ããã®ã§ãã£ãŠãã¢ã·ã¥ãŒã ããã®ã§ã¯ãããŸãã
AWSã§ã¯ãããŒã«ã¯ããªã³ã·ãã«ãSTSãéããŠã¢ã·ã¥ãŒã ããæš©éã®ã»ããã§ãããä¿¡é Œããªã·ãŒã«ãã£ãŠã²ãŒããããŸããGCPã§ã¯ãåçã®äž»åã¯**ãµãŒãã¹ã¢ã«ãŠã³ãïŒSAïŒ**ã§ããããã¹ãŠã®AWSãšã³ãžãã¢ãæžæãããæ¹æ³ã§åäœãç°ãªããŸãã
ãµãŒãã¹ã¢ã«ãŠã³ãã¯ã¢ã€ãã³ãã£ãã£ãšãªãœãŒã¹ã®äž¡æ¹ã§ããã¡ãŒã«ã¢ãã¬ã¹ïŒdeployer@acme-app-prod.iam.gserviceaccount.comïŒãæã¡ããããžã§ã¯ãå
ã«ååšãããã㊠- 決å®çã«éèŠãªããšã§ãã - 誰ãããã䜿çšã§ãããã管çããç¬èªã®IAMããªã·ãŒãæã£ãŠããŸãã ãã®åŸåã¯ãAWSã®åå°ç¥çµãéçšããªãéšåã§ãã
- ãµãŒãã¹ã¢ã«ãŠã³ããšããŠæ©èœããã«ã¯ãããªã³ã·ãã«ã¯SAèªäœã«ããŒã«ãå¿
èŠã§ã -
roles/iam.serviceAccountTokenCreatorïŒçåœã®ããŒã¯ã³ãçºè¡ããŠåœè£ ããããïŒãŸãã¯roles/iam.serviceAccountUserïŒVMãCloud RunãµãŒãã¹ãªã©ãäœæãããªãœãŒã¹ã«ã¢ã¿ããããããïŒãããã¯AWSã®äººãå¿ããã¡ãªäž¡é¢ä»äžã§ããCIããªã³ã·ãã«ã«åºç¯ãªãããžã§ã¯ãæš©éãäžããŠãããããã€ã€ãŒSAã«ãªããªãã®ã§ããã°ç¡æå³ã§ãã - SAãåœè£
ããã«ã¯ãä¿¡é Œããªã·ãŒã®ãã³ãã·ã§ã€ã¯ã§ããŒã«ãã¢ã·ã¥ãŒã ããã®ã§ã¯ãªããããŒã¯ã³ãèŠæ±ããŸãïŒ
generateAccessTokenïŒãåœè£ ããæš©éã¯ãSAãªãœãŒã¹äžã®éåžžã®IAMãã€ã³ãã£ã³ã°ãšããŠååšããåå¥ã®ä¿¡é Œããã¥ã¡ã³ãã¯ãããŸããã - ãµãŒãã¹ã¢ã«ãŠã³ãããŒã¯ååšããŸãããã»ãšãã©ã®å Žåé¿ããã¹ãã§ãã ããŠã³ããŒããããJSONããŒã¯é·æéæå¹ãªèªèšŒæ å ±ã§ãããå€å žçãªæŒæŽ©çµè·¯ã§ããå€ãã®çµç¹ã§ã¯ãåè¿°ã®å¶çŽãéããŠçµç¹å šäœã§ããŒã®äœæãç¡å¹ã«ããŠããŸããããŒã¬ã¹ã®ä»£æ¿ææ®µã䜿çšãã¹ãã§ãã
- ããŒã¬ã¹CIã¯Workload Identity Federationã§ã - AWSã®OIDCãã§ãã¬ãŒã·ã§ã³ãšåãOIDCã®èãæ¹ã§ããGitHub ActionsãŸãã¯å€éšã¯ãŒã¯ããŒããOIDCããŒã¯ã³ãæç€ºããã¯ãŒã¯ããŒãã¢ã€ãã³ãã£ãã£ããŒã«ãçºè¡è ãä¿¡é ŒãããšãGCPã¯SAã®çåœãªèªèšŒæ å ±ãè¿ããŸããç§å¯ã¯ä¿åãããŸãããïŒGKEå ã§ã¯ãã¢ããã°ã¯Workload Identityã§ãããKubernetesãµãŒãã¹ã¢ã«ãŠã³ããGoogleãµãŒãã¹ã¢ã«ãŠã³ãã«ãã€ã³ãããŸã - AWSã®IRSAã®çŽæ¥ã®å¯Ÿå¿ç©ã§ããïŒ
äžè¡ã§ç¿»èš³ãããšïŒä¿¡é Œããªã·ãŒãéããŠã¢ã·ã¥ãŒã ããAWSããŒã«ã¯ãSAäžã®ããŒã¯ã³äœæè ãã€ã³ãã£ã³ã°ãéããŠåœè£ ããGCPãµãŒãã¹ã¢ã«ãŠã³ãã«ãªããŸãã
ã¢ã€ãã³ãã£ãã£ãã¡ã€ã³: Cloud IdentityãWorkspaceãããã³çµç¹
GCPã¯ã¢ã€ãã³ãã£ãã£ãšãªãœãŒã¹ãåé¢ããŸãããAzureãããã¯ããã«ç©ããã§ããçµç¹ããŒãã¯ãCloud IdentityãŸãã¯Google Workspaceã¢ã«ãŠã³ããææããæ€èšŒæžã¿ãã¡ã€ã³ã«å¯ŸããŠäœæãããŸãããã®ãã£ã¬ã¯ã㪠- ãŠãŒã¶ãŒãšã°ã«ãŒã - ã¯ããªãœãŒã¹ã管çããCloudã³ã³ãœãŒã«ãšã¯ç°ãªãç»é¢ã§ããAdminã³ã³ãœãŒã«ïŒadmin.google.comïŒã§ç®¡çãããŸãã
- ãŠãŒã¶ãŒãšã°ã«ãŒãã¯ãã£ã¬ã¯ããªã§äœæãããã¢ã¯ã»ã¹ã¯IAMã§ä»äžãããŸãã AWSã§IAMãŠãŒã¶ãŒãäœæããããã«ãGCPãŠãŒã¶ãŒããäœæããããšã¯ãããŸããã人éã¯Cloud Identity/Workspaceã«ååšãïŒãŸãã¯IdPãããã§ãã¬ãŒã·ã§ã³ããïŒããªãœãŒã¹ããªãŒäžã®IAMãã€ã³ãã£ã³ã°ã§ãçæ³çã«ã¯ã°ã«ãŒããšããŠåç §ããŸãããã¹ããã©ã¯ãã£ã¹ã¯ãåã ã®ãŠãŒã¶ãŒã§ã¯ãªãã°ã«ãŒããžã®ãã€ã³ãã£ã³ã°ã§ãã
- AWSã®ãããªç¬ç«ãããIAMãŠãŒã¶ãŒãã¹ãã¢ã¯ãããŸããã å€éšIdPïŒOktaãEntra IDãªã©ïŒã¯Cloud Identityã«ãã§ãã¬ãŒã·ã§ã³ãããŸãããããåŸæ¥å¡ã®ã¢ã¯ã»ã¹ã«ãããæšæºã§ãã
- èŠããŠããã¹ã2ã€ã®èœãšã穎: ç¹å¥ãªã¡ã³ããŒ
allUsersïŒæåéãã€ã³ã¿ãŒãããäžã®èª°ã§ããèªèšŒãªãïŒãšallAuthenticatedUsersïŒä»»æã®Googleã¢ã«ãŠã³ããæã€èª°ã§ãïŒã§ããã©ã¡ããã«ããŒã«ããã€ã³ããããšããã±ããã誀ã£ãŠå ¬éãããŠããŸããŸããS3ãã±ããããªã·ãŒã®Principal: "*"ãšåãããã«æ±ã£ãŠãã ããã
倧ãŸããªé¡æšïŒçµç¹ãšãã®Cloud Identityãã¡ã€ã³ã¯ããããããIAM Identity Centerã®ãã£ã¬ã¯ããªãšèåããAWS Organizationãã§ã - ããããæ¥åžžã®ãªãœãŒã¹äœæ¥ã¯ãã¢ã€ãã³ãã£ãã£ã«ã¢ã¿ãããããããªã·ãŒã§ã¯ãªããããªãŒäžã®IAMãã€ã³ãã£ã³ã°ãéããŠè¡ãããŸãã
è«æ±ã¯ãããžã§ã¯ãã«ãªã³ã¯ããå¥ã®ãªããžã§ã¯ã
GCPã®è«æ±ã¢ã«ãŠã³ãã¯ããèªäœããªãœãŒã¹ã§ãããorg -> folder -> projectã®éå±€ã®ããŒãã§ã¯ãããŸããããããžã§ã¯ãã¯è«æ±ã¢ã«ãŠã³ãã«ãªã³ã¯ãïŒåãããžã§ã¯ãã¯æ£ç¢ºã«1ã€ã«ïŒã1ã€ã®è«æ±ã¢ã«ãŠã³ãã§å€ãã®ãããžã§ã¯ãã«è³éãæäŸã§ããŸãã
- ç¬èªã®IAMãæã£ãŠããŸãã
roles/billing.adminãroles/billing.userãroles/billing.creatorã¯ããªãœãŒã¹ããŒã«ãšã¯å¥ã«ãè«æ±ã¢ã«ãŠã³ãäžã«ååšããŸããç¹ã«ãæ°ãããããžã§ã¯ããè«æ±ã¢ã«ãŠã³ãã«ã¢ã¿ããããã«ã¯ããã®è«æ±ã¢ã«ãŠã³ãã«roles/billing.userãå¿ èŠã§ã - åºç¯ãªãããžã§ã¯ãæš©éã ãã§ã¯äžååã§ãã - ããããã€ã§ãããããšã¯ã課éå¯èœãªãããžã§ã¯ããäœæã§ãããããšãšã¯é¢ä¿ãããŸããã 課éãçºçããå¯èœæ§ã®ãããããžã§ã¯ããç«ã¡äžããã«ã¯ã
resourcemanager.projectCreatorïŒorg/folderã¬ãã«ïŒãšbilling.userïŒè«æ±ã¢ã«ãŠã³ãäžïŒã®äž¡æ¹ãå¿ èŠã§ããåŸè ãæ¬ ããŠãããšããããžã§ã¯ãäœæã¯åæåããå®éã«ã¯äœãå®è¡ã§ããªããããžã§ã¯ãã«ãªã£ãŠããŸããŸãã
ããã¯Azureã®å³æ Œãªåçšãã¬ãŒã³ã®å£ãããæè»ã§ã - GCPã®è«æ±ã¯Cloud IAMã«çµã¿èŸŒãŸããŠãããããå®å
šã«å¥ã®äžçã§ã¯ãªããåã gcloud ãTerraformã®ã€ã³ã¿ãŒãã§ãŒã¹ã«è¡šç€ºãããŸããããããããã§ãç°ãªã圹å²ãæã€åå¥ã®ãªããžã§ã¯ãã§ãããæå¹åãããŠããªãAPIã®æ¬¡ã«å€ããã§ãç§ã¯ç®¡çè
ãªã®ã«ããšããé©ãã§ãã
ååãIDããããŠ1ã€ã®ãããã¯ãŒã¯ã®é©ã
ãã¹ãŠã®GCPãªãœãŒã¹ã«ã¯ãprojects/acme-app-prod/zones/us-central1-a/instances/web-1 ã®ãããªçžå¯ŸãªãœãŒã¹åïŒããã³å®å
šä¿®é£Ÿããã //compute.googleapis.com/... 圢åŒïŒããããŸãããããžã§ã¯ãIDã¯ãã¹ãŠã®ãã°è¡ãšAPIåŒã³åºããšãšãã«äŒéãããŸã - ããã¯AWSã®ARNã¢ã«ãŠã³ããšåã圹å²ã§ã - ãã®ãããAzureãšåæ§ã«ããªãœãŒã¹ã®ååã¯ãããžã§ã¯ãããã§ã«ãšã³ã³ãŒãããŠãããã®ãçç¥ã§ããŸããåãçãååã¯ã-devã-qaã-prod ãããžã§ã¯ãéã§å®å
šã«ç¹°ãè¿ãããšãã§ããŸãã
AWSã®çŽæã«éãã«åãããããäºåã«ææããŠããã¹ããããã¯ãŒã¯ã®èœãšã穎ïŒGCPã®VPCãããã¯ãŒã¯ã¯ã°ããŒãã«ãªãœãŒã¹ã§ããããã®ãµããããã¯ãªãŒãžã§ã³ã§ãã AWSã§ã¯VPCã¯1ã€ã®ãªãŒãžã§ã³ã«ã¹ã³ãŒããããŸãããGCPã§ã¯1ã€ã®VPCããã¹ãŠã®ãªãŒãžã§ã³ã«ãŸãããããã®äžã«ãªãŒãžã§ã³ãµãããããåãåããŸãããªãŒãžã§ã³ãµãããããæã€åäžã®ã°ããŒãã«VPCãããã©ã«ãã§ããããšããŸããã¯ãªãã«ããªãŒãžã§ã³èšå®ã§ã¯ãããŸãã - ãµããããããã§ã«æäŸããŠããããšãVPCãã¢ãªã³ã°ã§å®çŸããããšããªãã§ãã ããã
AWS -> GCP ã¯ã€ãã¯ããã
æåã®1ã¶æéã¯ãããæå ã«çœ®ããŠãã ãã:
- Organization -> organizationãåãèãæ¹ã§ãããGCPã®çµç¹ã¯Cloud Identity/Workspaceãã¡ã€ã³ã«ãã€ã³ããããŠããŸãã
- Organizational Unit (OU) -> folderããã¹ãå¯èœãªã°ã«ãŒãåããŒãããã©ã«ãã¯ãã©ã«ããå«ãããšãã§ããŸãã
- Account -> projectãåé¢ãIAMãããã³èª²éåäœ - ããã軜éã§äœ¿ãæšãŠå¯èœã倿°äœæãããŸãã
- SCPïŒã¬ãŒãã¬ãŒã«ïŒ -> org/folder/projectã¹ã³ãŒãã§ã®Organization Policy constraint - äœãååšã§ãããããŸãã¯èšå®ã§ããããå¶éããäžäœã«ç¶æ¿ãããŸãã
- IAM identity-attached policy -> ããªãŒããŒãäžã®IAM binding
(member, role)ããŠãŒã¶ãŒã«ããªã·ãŒã¯ãããŸãããä»äžã¯ãªãœãŒã¹äžã«ååšããäžäœã«ç¶æ¿ãããŸãã - IAM role you assume (via STS + trust policy) -> service account you impersonateïŒSAäžã®ããŒã¯ã³äœæè ãã€ã³ãã£ã³ã°ãä»ããŠïŒãäž¡é¢ä»äžãèŠããŠãããŠãã ããã
- Explicit
Denystatement -> IAM deny policy - å¥ã®ãªããžã§ã¯ãã§ãèš±å¯ã®åã«è©äŸ¡ãããŸãã - IRSA (IAM Roles for Service Accounts) -> Workload Identity (GKE) / Workload Identity Federation (å€éšCI) - åãOIDCã®èãæ¹ã§ãããŒã¬ã¹ã§ãã
- ããµãŒãã¹ã¯ãã å©çšå¯èœã -> ãŸããããžã§ã¯ãããšã«ãã®APIãæå¹ã«ããïŒ
google_project_serviceïŒãAWSã«çžåœãããã®ã¯ãããŸããã - ãã°å
ã®ARN -> ãªãœãŒã¹åïŒ
projects/<id>/...ïŒããããžã§ã¯ãã³ã³ããã¹ãã¯æ§é åãããŠãããååã§ãšã³ã³ãŒããããŠããŸããã
Terraformã¹ããŒãã®ããŒãã¹ãã©ããã翻蚳æžã¿
ããã§ã¯ãAWSã®ã©ã³ããã¯ãã»ãšãã©æ©èœãããã®ã®ãã¹ããããŒãã§ç Žç¶»ããå ŽæããããŸãã
ãåç¥ã®AWSããŒãã¹ãã©ããïŒç®¡çã¢ã«ãŠã³ãã§ã¹ããŒãããã¯ãšã³ããã³ãŒã«ãã¹ã¿ãŒããïŒããŒã«ã«ã¹ããŒãããã®åŸããã¯ãšã³ãèªäœã«ç§»è¡ïŒãOUããšã®ããã¯ãšã³ãã®ã¹ããŒãããã®ã«ãŒãããã¯ãšã³ãã«ä¿æããç¬èªã®ããã¯ãšã³ãã䜿çšããŠã¡ã³ããŒã¢ã«ãŠã³ããäœæããŸãããããã¯ãªãŒã³ã«ããäžå€ã®ååã¯ã管çã¢ã«ãŠã³ãã¯åžžã«ååšããS3ãã±ãããä¿æã§ãããããåžžã«ç®¡çã¢ã«ãŠã³ãããããŒãã¹ãã©ããã§ããããšã§ãã
GCPã¯ãAzureãšåãããã«ãçææã«ãã®äžå€ã®ååãç ŽããŸããåžžã«ååšãããªããžã§ã¯ãã¯çµç¹ã§ãããçµç¹ããŒãã¯ãªãœãŒã¹ãä¿æã§ããŸãããGCSãã±ããã¯ãããžã§ã¯ãå
ã«ååšãããããžã§ã¯ãã«ã¯èŠªãšïŒå®éã«äœããè¡ãã«ã¯ïŒè«æ±ãªã³ã¯ãšæå¹åãããAPIãå¿
èŠã§ãããããã£ãŠãGCPã®ãã«ãŒãã¢ã«ãŠã³ããã¯æèçã«éžå®ããã·ãŒããããžã§ã¯ãã§ã - æ
£çšçãªåå㯠prj-bootstrap ãCloud Foundation Toolkitã®ã·ãŒããããžã§ã¯ãã®ãããªãã®ã§ãã
çµç¹ãšè«æ±ã¢ã«ãŠã³ãããã§ã«ååšããå ŽåïŒäžè¬çãªã±ãŒã¹ïŒã®ç¿»èš³ããããããŒ:
- äžåºŠéãã®ã³ãŒã«ãã¹ã¿ãŒã: ã·ãŒããããžã§ã¯ããåœä»€çã«äœæãïŒ
gcloud projects createïŒããã®äžã§ããŒãã¹ãã©ããAPIãæå¹ã«ãïŒcloudresourcemanagerãcloudbillingãserviceusageãiamãstorageïŒãè«æ±ããªã³ã¯ããããŒã«ã«Terraformã¹ããŒãã§GCSã¹ããŒããã±ãããäœæããŸã - ãã®åŸãinit -migrate-stateã§ãã®ãã±ããã«ç§»è¡ããŸãã - çµç¹ã¬ãã«ã®ããŒã«ãæã€ããŒãã¹ãã©ãããµãŒãã¹ã¢ã«ãŠã³ã:
resourcemanager.projectCreatorãbilling.userãããã³çµç¹ããªã·ãŒ/IAM管çè ããŒã«ãçµç¹ããŒãã§ä»äžãããã¹ãŠã®ããŠã³ã¹ããªãŒã ãããžã§ã¯ããäœæããã³ç®¡çã§ããããã«ããŸãã - ãã®ä»ãã¹ãŠã¯éåžžã®é©çš: 远å ã®ãããžã§ã¯ãããã©ã«ããããã³ãããã®ãªãœãŒã¹ã¯ãTerraformããã®ããŒãã¹ãã©ããSAãåœè£
ããŠäœæãããåãããžã§ã¯ãã®ã¹ããŒãã¯1ã€ã®GCSããã¯ãšã³ãã®
prefixã®äžã«ååšããŸãã
å®å
šã«ãŒãããå§ããå Žåãé åºã¯åŒ·å¶ãããŸã - ã·ãŒããããžã§ã¯ããæåãã¹ããŒããã±ããã2çªç® - ãªããªãããã¯ãšã³ãã¯GCSãã±ããã§ããããã±ããã¯ååšãããããžã§ã¯ããå¿
èŠãšããããã§ãããããŠãAzureãšåæ§ã«å°ããªé¶ãšåµã®åé¡ããããŸããgoogle ãããã€ãã¯äœããããããã«ãããžã§ã¯ããšæå¹åãããAPIãå¿
èŠãšãããããæåã®ãããžã§ã¯ããäœæããåœä»€ç㪠gcloud ã³ãŒã«ã§ãã®APIãæå¹ã«ãããã®åŸTerraformã«æ¡çšããŸããïŒterraform-google-modules/bootstrap ã¢ãžã¥ãŒã«ã¯ããŸãã«ãã®ã·ãŒããããžã§ã¯ããšSAã®é£æºãããã±ãŒãžåããŠããŸããïŒ
ãããŠãGCPãAWSã®çèã®èšæ¶ãããçã«ã·ã³ãã«ãªã®ã¯ããã§ããã·ãŒããããžã§ã¯ãå
ã®ããã¯ãšã³ããšã¡ã³ããŒå
ã®ãªãœãŒã¹ã¯ãAWSã®ããã¢ã³ãã¹ããŒã¯ã®ä¿¡é Œã¡ã«ããºã ãå¿
èŠãšããŸãã - ããã¯ãšã³ãã® role_arn ãããããã€ãã® assume_role ããäž¡é¢ä¿¡é Œããªã·ãŒããããŸãããé©åãªããŒã«ãæã€çµç¹ã¬ãã«ã®ãµãŒãã¹ã¢ã«ãŠã³ãã¯ãIAMãäžäœã«ç¶æ¿ãããããçµç¹å
šäœã§æ©èœããŸãããããã€ã㯠project ãèšå®ããã ãã§ãããžã§ã¯ãéããããããããimpersonate_service_account ãèšå®ããããšã§ãããã€ã€ãŒã®ã¢ã€ãã³ãã£ãã£ã«ãªããŸããã¯ãã¹ãããžã§ã¯ãã¯ãã©ã¡ãŒã¿ã§ãããä¿¡é Œäº€æžã§ã¯ãããŸãããïŒåŸã§ã«ã¹ã¿ã ããŒã«ããããžã§ã¯ãããšã®SAãå°çšã®CIã¢ã€ãã³ãã£ãã£ã§ããã匷åããŸãããããã§ãã¹ã³ãŒãã§ã®ããŒã«ãã€ã³ãã£ã³ã°ã§ãããä¿¡é Œããªã·ãŒã®ãã³ãã·ã§ã€ã¯ã§ã¯ãããŸãããïŒã©ã¡ããã®åŽãæ·±ãã³ãŒãåãããå ŽåãHashiCorp Terraform Authoring & Operations Pro詊éšã¯ããŸãã«ãããã®ã¹ããŒããšãããã€ãã®ãã¿ãŒã³ãäžå¿ã«æ§ç¯ãããŠããŸãã
AWSã®çŽæãç©æ¥µçã«èª€è§£ãæã4ã€ã®ãã€ã³ã
ä»ã®ãã¹ãŠãå¿ããŠããããã ãã¯èŠããŠãããŠãã ãã:
- ãŠãŒã¶ãŒã«ããªã·ãŒã¯ãããŸããã ã¢ã€ãã³ãã£ãã£ã«ãããã¹æ¢ããããJSONãæ¢ãã®ã¯ãããŠãã ãããæš©éã¯orgãfolderãprojectããŸãã¯resourceäžã®
(member, role)ãã€ã³ãã£ã³ã°ã§ãããäžäœã«ç¶æ¿ãããŸããå¿ èŠãªä»äžã¯3ã¬ãã«äžã«ãããããããŸããã - APIãæå¹ã«ãããŸã§äœãæ©èœããŸããã æ°ãããããžã§ã¯ãã§ã®æåã®403ãšã©ãŒã¯ãéåžžãããŒã«ã®äžè¶³ã§ã¯ãªã
API not enabledã§ãããã¹ãŠã®ãµãŒãã¹ã¯ããããžã§ã¯ãããšã«ãªã³ã«ãããŸã§ãªãã«ãªã£ãŠããŸãã - ãµãŒãã¹ã¢ã«ãŠã³ããåœè£ ããã®ã§ãã£ãŠãããŒã«ãã¢ã·ã¥ãŒã ããã®ã§ã¯ãããŸããã ãããŠSAã¯ç¬èªã®ã¢ã¯ã»ã¹ããªã·ãŒãæã€ãªãœãŒã¹ã§ã - ããªã³ã·ãã«ã«åºç¯ãªãããžã§ã¯ãæš©éãäžããŠããSAäžã®ããŒã¯ã³äœæè ãã€ã³ãã£ã³ã°ããªããã°ç¡æå³ã§ãã
- è«æ±ã¯å¥ã®ãªããžã§ã¯ãã§ãã ãäœã§ããããã€ã§ãããããšã¯ãã課éå¯èœãªãããžã§ã¯ããäœæããããè«æ±ã¢ã«ãŠã³ãããªã³ã¯ãããã§ãããããšãšã¯é¢ä¿ãããŸãããç°ãªããªãœãŒã¹ãç°ãªãããŒã« - ãããžã§ã¯ã管çè
ã§ã¯ãªããè«æ±ã¢ã«ãŠã³ãäžã®
billing.userã§ãã
ååŽé¢ãæ·±ãæãäžããèªå®è³æ Œ
ã¯ã©ãŠãã¬ããã³ã¹ - éå±€ãã¢ã€ãã³ãã£ãã£ãã¬ãŒãã¬ãŒã«ãããã³ã¹ããŒã - ã¯ãäž¡æ¹ã®ã¯ã©ãŠãã®ã¢ãŒããã¯ãã£ããã³ç®¡ç詊éšã®ããã¯ããŒã³ã§ããããããããã®åŠç¿ã¯äžèšã®æŠå¿µãå®çãããæéã®æ¹æ³ã§ããããŸãããã§ã«AWSã®è³æ Œããæã¡ã®å Žåãåãè¡ã«ããGoogle Cloudã®è³æ Œã次ã®èªç¶ãªã¹ãããã§ãã
AWSåŽïŒãã翻蚳ããç¥èïŒ:
- AWS Certified Cloud Practitioner (CLF-C02) - ã¢ã«ãŠã³ããIAMãããã³Organizationsã®åºç€ã
- AWS Certified Solutions Architect - Associate (SAA-C03) - IAMããã«ãã¢ã«ãŠã³ãæ§é ãããã³ã³ã¢ã¢ãŒããã¯ãã£ã
- AWS Certified Solutions Architect - Professional (SAP-C02) - ãã«ãã¢ã«ãŠã³ãOrganizationsãSCPsãããã³å€§èŠæš¡ãªã¯ãã¹ã¢ã«ãŠã³ãã¢ã¯ã»ã¹ã
- AWS Certified Security - Specialty (SCS-C03) - IAMã®è©³çްãSCPsãããã³ããŒç®¡çã
Google CloudåŽïŒãžç¿»èš³ããç¥èïŒ:
- Google Cloud Digital Leader - çµç¹ããããžã§ã¯ããIAMãããã³è«æ±ã®åºç€ã¬ãã«ã
- Google Cloud Associate Cloud Engineer - æ¥åžžçãªéçšïŒãããžã§ã¯ããIAMãã€ã³ãã£ã³ã°ããµãŒãã¹ã¢ã«ãŠã³ããããã³
gcloudã - Google Cloud Professional Cloud Architect - org/folder/projectéå±€ãã©ã³ãã£ã³ã°ãŸãŒã³èšèšãããã³å€§èŠæš¡ãªã¬ããã³ã¹ã
- Google Cloud Professional Cloud Security Engineer - IAMã®è©³çްãçµç¹ããªã·ãŒããµãŒãã¹ã¢ã«ãŠã³ãã»ãã¥ãªãã£ãããã³ããŒç®¡çã
çŸåšAWSèªå®ããæã¡ã®å Žåã®å®çšçãªãã¹ïŒCloud Digital Leaderããå§ããŠèªåœããããã³ã°ããæ¬¡ã«Associate Cloud EngineerïŒæã䜿çšãããããžã§ã¯ããšIAMã®é åïŒã«é²ã¿ãä»äºãã¢ãŒããã¯ãã£å¯ããã»ãã¥ãªãã£å¯ããã«å¿ããŠProfessional Cloud ArchitectãŸãã¯Professional Cloud Security Engineerã远å ããŸãã
ãŸãšã
GCPã¯AWSãããé£ããããã§ã¯ãããŸãã - ç°ãªãèŠçŽ ã«åè§£ãããŠããã ãã§ããAWSã¯æš©éãã¢ã€ãã³ãã£ãã£ã«ãããã¹æ¢ããããã¹ãŠããªã³ã«ãªã£ãéåãªã¢ã«ãŠã³ããæäŸããã»ãšãã©ã®æš©éãIAMã«éçŽããŸããGCPã¯ãäžäœã«ç¶æ¿ããããªãœãŒã¹ããªãŒã«æš©éãã¶ãäžããçœçŽã®ç¶æ ããå§ãŸãå®äŸ¡ã§äœ¿ãæšãŠå¯èœãªãããžã§ã¯ããæäŸããããŒã«ãã¢ã·ã¥ãŒã ãã代ããã«ãµãŒãã¹ã¢ã«ãŠã³ããåœè£ ãããŸããäžåºŠæŠå¿µã翻蚳ããŠãã ãã - ããªã·ãŒã¯ã¢ã€ãã³ãã£ãã£ããããªãŒãžç§»åããã¢ã«ãŠã³ãã¯APIããªãã®ãããžã§ã¯ãã«ãªããããŒã«ã¯åœè£ ãããµãŒãã¹ã¢ã«ãŠã³ãã«ãªããè«æ±ã¯ãªã³ã¯ããå¥ã®ãªããžã§ã¯ãã«ãªããŸã - ããããã°æ®ãã¯èªåœã§ããäžèšã®èªå®ã§ãããç¿åŸããã°ãæ£æçãªæåŠã®ããã«æããããéšåããäžè²«æ§ã®ããæå³çãªèšèšãšããŠçè§£ã§ããããã«ãªããŸãã