为什么需要服务角色?
CodeDeploy 服务使用服务角色来执行 CodeDeploy 外部的操作(即在另一个服务上,例如 S3)。
AWS 有一种特殊的集成服务方法。基本上,您必须明确允许您使用的每个服务使用另一个服务(即使访问权限保持在同一帐户的范围内)。CodeDeploy 服务没有固有的权限来更改 S3 中的内容。事实上,CodeDeploy 甚至不允许在没有明确允许的情况下从 S3 读取文件。
这是来自文档 [1] 的官方解释:
在 AWS 中,服务角色用于向 AWS 服务授予权限,以便它可以访问 AWS 资源。您附加到服务角色的策略决定了该服务可以访问哪些 AWS 资源以及可以对这些资源执行哪些操作。
根据hackernoon文章,您实际上在做什么
- 您需要一个能够以编程方式访问您的 aws 帐户的用户帐户
- 用户帐户需要附加一个策略,该策略授予将文件上传到 S3 并触发 CodeDeploy 部署的权限 --> 您将此用户的访问密钥和秘密访问密钥提供给 Bitbucket,以便它可以将内容上传到 S3 并触发代替您的用户身份进行部署
- 与第 1 步和第 2 步无关:在 AWS IAM [2] 中创建一个角色,这将由两种服务(不是 Bitbucket)使用:CodeDeploy 和 EC2。严格来说,hackernoon 文章的作者在这里将两个步骤合并为一个:您正在创建一个由两个服务使用的角色(由信任关系中的两个不同主体指定:ec2.amazonaws.com和codedeploy.us -west-2.amazonaws.com)。通常这不是IAM 策略的配置方式,因为它违反了授予最小权限 [4] 的原则,因为 EC2 实例从AWSCodeDeployRole接收权限据我所知,它可能不需要的政策。但这只是这里的哲学注释。hackernoon 文章中提到的所有步骤在技术上都应该有效。
所以,你实际上做的是:
- 授予 CodeDeploy 权限以在您的账户内执行各种操作,例如查看您已启动的 EC2 实例等(这在策略 AWSCodeDeployRole [3] 中指定)
- 授予 EC2 读取上传到 S3 的修订的权限(这在 AmazonS3FullAccess 策略中指定)
回到你的问题...
但是,当我尝试设置代码部署组时,它要求提供服务角色,但我不确定从哪里获得这个?
您需要在 IAM 服务中自己创建服务角色(参见 [2])。我不知道 AWS Educate 是否支持,但我想应该支持。创建服务角色后,您必须将其分配给 CodeDeploy 组(这是您现在卡住的地方)。此外,您必须将相同的服务角色分配给您的 EC2 实例配置文件。
参考
[1] https://docs.aws.amazon.com/codedeploy/latest/userguide/getting-started-create-service-role.html
[2] https://docs.aws.amazon.com/IAM/latest /UserGuide/id_roles_create_for-service.html#roles-creatingrole-service-console
[3] https://github.com/SummitRoute/aws_managed_policies/blob/master/policies/AWSCodeDeployRole
[4] https://docs.aws.amazon .com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege