前端开发者本地运行AWS Amplify的最小IAM权限配置咨询
前提假设
- 拥有单个AWS组织“MyOrg”和单个AWS账户“MyAccountId”
- 采用AWS Identity Center管理人工用户的身份验证(Authn)与授权(Authz)
- 已存在一个AWS Amplify App(v5),配置如下:
- 托管环境:dev、prod
- 托管应用为NextJS Web应用
- 后端环境:dev、prod
- 已启用“auth”类别
- 禁用自助注册
- 已启用“auth”类别
- 托管环境:dev、prod
- 托管环境中的前端应用使用AWS Amplify客户端SDK amplify-js与后端环境进行身份验证
- 拥有管理员账户,可修改上述任意配置
目标
需为新前端开发者完成入职配置,使其能够:
- 通过命令行在本地运行前端应用
- 通过本地前端应用以用户“user1”身份在“dev”后端环境中完成身份验证
- 使用前端应用的体验与托管在同一“dev”后端环境下的前端应用一致
开发者不得:
- 通过AWS Amplify CLI对后端环境执行修改或删除操作(如移除类别、修改类别配置等),假设前端应用本身无需此类操作
挑战
按照官方文档配置AWS Amplify CLI以本地运行前端应用时,采用的AdministratorAccess-Amplify AWS托管策略不符合最小权限原则,该策略允许开发者执行所有操作,包括删除应用、重新配置类别等
已完成配置
- 在AWS Identity Center中为开发者创建用户,开发者可登录组织的SSO门户
- 将用户加入“Frontend Developers Group”组,该组关联“Frontend Developer”权限集,开发者可以“Frontend Developer”身份登录AWS账户“MyAccountId”
- 在“dev”后端环境的身份验证用户池(AWS Cognito)中为“dev”应用添加用户,开发者可登录基于“dev”后端环境的前端应用
- 开发者已按照官方文档正确配置AWS profile以使用“Frontend Developer”权限,可成功使用带有“Frontend Developer”权限集的profile完成AWS CLI与Amplify CLI的身份验证
核心问题
需为“Frontend Developer”权限集关联何种IAM策略(AWS托管或内联策略),以成功配置AWS Amplify CLI,使得开发者无法对Amplify后端环境执行破坏性(删除、编辑)操作,但仍可通过Amplify客户端SDK读取/使用后端环境?
已尝试方案
已查看AWS托管策略,仅找到以下两个:
AdministratorAccess-AmplifyAmplifyBackendDeployFullAccess
二者权限范围过大,不符合需求。期望找到类似“AmplifyReadOnly”的策略。查看这些策略中的权限定义后,无法明确AWS Amplify CLI正常工作所需的具体权限,因为这需要了解Amplify CLI的底层操作逻辑。
目前只能逐个添加权限来调整IAM策略,但这种方法依赖CLI给出有效的错误提示,且耗时较长。此外,执行破坏性命令存在风险(即使使用测试应用,也可能误删重要内容)。最后,根据经验,AWS Amplify CLI工具链较为脆弱,必须严格按照其支持的方式使用(例如即使不需要未授权用户访问,也必须定义未授权用户角色)
解决方案
要实现最小权限需求,需创建自定义内联IAM策略,仅授予Amplify CLI读取后端配置所需的权限,同时拒绝所有破坏性操作。以下是具体策略内容:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "amplify:GetApp", "amplify:GetBackendEnvironment", "amplify:GetBranch", "amplify:GetDomainAssociation", "amplify:ListApps", "amplify:ListBackendEnvironments", "amplify:ListBranches", "amplify:ListDomainAssociations", "amplify:ListTagsForResource", "cognito-idp:DescribeUserPool", "cognito-idp:DescribeUserPoolClient", "cognito-idp:ListUserPoolClients", "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:amplify:${Region}:${MyAccountId}:apps/${AmplifyAppId}", "arn:aws:amplify:${Region}:${MyAccountId}:apps/${AmplifyAppId}/backendenvironments/dev", "arn:aws:cognito-idp:${Region}:${MyAccountId}:userpool/${UserPoolId}", "arn:aws:s3:::${AmplifyDeploymentBucket}/*", "arn:aws:s3:::${AmplifyDeploymentBucket}" ] }, { "Effect": "Deny", "Action": [ "amplify:CreateApp", "amplify:DeleteApp", "amplify:UpdateApp", "amplify:CreateBackendEnvironment", "amplify:DeleteBackendEnvironment", "amplify:UpdateBackendEnvironment", "amplify:CreateBranch", "amplify:DeleteBranch", "amplify:UpdateBranch", "amplify:CreateDomainAssociation", "amplify:DeleteDomainAssociation", "amplify:UpdateDomainAssociation", "amplify:StartDeployment", "amplify:StopDeployment", "cognito-idp:CreateUserPool", "cognito-idp:DeleteUserPool", "cognito-idp:UpdateUserPool", "cognito-idp:CreateUserPoolClient", "cognito-idp:DeleteUserPoolClient", "cognito-idp:UpdateUserPoolClient" ], "Resource": [ "arn:aws:amplify:${Region}:${MyAccountId}:apps/${AmplifyAppId}", "arn:aws:amplify:${Region}:${MyAccountId}:apps/${AmplifyAppId}/backendenvironments/dev", "arn:aws:cognito-idp:${Region}:${MyAccountId}:userpool/${UserPoolId}" ] } ] }
策略说明
允许的权限:
- Amplify相关:仅允许读取应用、后端环境、分支等元数据的权限,确保CLI能拉取后端配置文件
- Cognito相关:允许读取用户池和客户端配置,确保前端SDK能正常对接身份验证服务
- S3相关:允许读取Amplify部署桶中的配置文件,CLI需要这些文件来生成本地配置
拒绝的权限:
- 明确拒绝所有Amplify应用、后端环境、分支的创建/删除/修改操作
- 拒绝Cognito用户池及客户端的创建/删除/修改操作
- 拒绝部署相关操作,防止开发者触发应用部署
变量替换说明
将策略中的${Region}、${MyAccountId}、${AmplifyAppId}、${UserPoolId}、${AmplifyDeploymentBucket}替换为实际的AWS区域、账户ID、Amplify应用ID、Cognito用户池ID和Amplify部署桶名称。
验证步骤
- 将该策略关联到“Frontend Developer”权限集
- 开发者使用该权限集的AWS profile执行
amplify pull --appId ${AmplifyAppId} --envName dev - 确认CLI能成功拉取配置,且执行破坏性命令(如
amplify delete、amplify update auth)时返回权限拒绝错误
内容的提问来源于stack exchange,提问作者Bhav Bhela

