Amazon web services CloudFormation无权对资源执行:iam:PassRole

Amazon web services CloudFormation无权对资源执行:iam:PassRole,amazon-web-services,aws-lambda,amazon-cloudformation,amazon-iam,Amazon Web Services,Aws Lambda,Amazon Cloudformation,Amazon Iam,这是Cloud9中mytemplate.yml代码的一部分: Type: 'AWS::Serverless::Function' Properties: Handler: index.handler Runtime: nodejs6.10 CodeUri: . Description: Updates records in the AppConfig table. MemorySize: 128 Timeout: 3 Role: 'arn:aws:iam::57991

这是Cloud9中my
template.yml
代码的一部分:

Type: 'AWS::Serverless::Function'
Properties:
  Handler: index.handler
  Runtime: nodejs6.10
  CodeUri: .
  Description: Updates records in the AppConfig table.
  MemorySize: 128
  Timeout: 3
  Role: 'arn:aws:iam::579913947261:role/FnRole'
  Events:
    Api1:
      Type: Api
      Properties:
当我在Cloud9中提交更改时,在尝试
ExecuteChangeSet
时,在CodePipeline部署阶段部署失败。我得到这个错误:

CloudFormation无权对资源执行:iam:PassRole


有人能帮忙吗?

虽然我不能具体说明在您的情况下发生了什么,但错误消息表示CloudFormation用于部署资源的角色/用户没有适当的
iam:PassRole
权限

将角色分配给资源时使用
iam:PassRole
权限。例如,当使用IAM角色启动Amazon EC2实例时,启动该实例的实体需要指定要使用的IAM角色的权限。这样做是为了防止用户获得过多的权限。例如,不应允许非管理用户启动具有管理角色的实例,因为这样他们就可以访问他们无权访问的其他权限

在模板的情况下,CloudFormation似乎正在创建一个函数,并且正在为该函数分配
FnRole
权限。但是,尚未授予CloudFormation模板将此角色分配给函数的权限

启动CloudFormation模板时,它要么将资源提供给创建堆栈的用户,要么使用启动堆栈时指定的IAM角色。正是该用户/角色需要
iam:PassRole
权限才能使用
FnRole

用户:arn:aws:sts::156478935478:假定角色/CodeStarWorker AppConfig CloudFormation/AWSCloudFormation未被授权执行:iam:PassRole on resource:arn:aws:iam::156478935478:角色/服务角色/FnRole(服务:AWSLambda;状态代码:403;错误代码:AccessDeniedException;请求ID:129f601b-a425-11e8-9659-410b0cc8f4f9)

从该日志中,您可以知道需要为堆栈的CloudFormation角色分配什么策略(
iam:PassRole
)(
CodeStarWorker AppConfig CloudFormation

你应该:

  • 转到
    IAM>角色
  • 键入搜索
    CodeStarWorker AppConfig CloudFormation
  • 打开该角色并转到
    权限
  • 查找
    CodeStarWorkerCloudFormation角色策略
    ,展开它,转到
    编辑策略
  • 在下面的参考资料部分中,添加您角色的ARN(
    ARN:aws:iam::579913947261:role/FnRole
    ),如果您没有该部分,请复制并粘贴该部分,但在
    resources
    下使用您的ARN
政策:

{
    "Action": [
        "iam:PassRole"
    ],
    "Resource": [
        "arn:aws:iam::156478935478:role/CodeStarWorker-AppConfig-Lambda",
        "arn:aws:iam::579913947261:role/FnRole"
    ],
    "Effect": "Allow"
}
如果要将该权限分配给所有资源(
“资源”:“*”
),请在“操作”“添加要分配的权限”下找到以下部分和以上部分:

"Resource": "*",
"Effect": "Allow"

您可以将此应用于要为您的资源分配给CloudFormation的所有其他权限。

如果您将角色名称从:
RoleName:'arn:aws:iam::579913947261:role/FnRole'

要包含CodeStar-${ProjectId}前缀,则可以创建/更新/etc角色,而无需修改
CodeStarWorker AppConfig CloudFormation
角色的IAM策略。例如
RoleName:!Sub'CodeStar-${ProjectId}-[FunctionName]”


我在这里发布了一个完整的解释:

使我们能够减少人们如何与AWS相处的复杂性

必须更新策略Json中的操作部分

"iam:PassRole"

应添加到策略文件中的操作块括号中。

谢谢您提供的信息。对不起,我应该发布更多的日志信息。用户:arn:aws:sts::156478935478:假定角色/CodeStarWorker AppConfig CloudFormation/AWSCloudFormation未被授权执行:iam:PassRole on resource:arn:aws:iam::156478935478:角色/服务角色/FnRole(服务:AWSLambda;状态代码:403;错误代码:AccessDeniedException;请求ID:129f601b-a425-11e8-9659-410b0cc8f4f9)我知道我需要向CloudFormation授予许可,但我不知道怎么做,也不知道在哪里做。@John Rotenstein答案准确且解释得很好。感谢您帮助格式化答案@John Rotenstein,并希望我能将您的答案标记为有用,但我需要有15个声誉。您回答自己的问题不会获得声誉。这就是堆栈溢出的工作原理。对于@SecondOfTwo的答案,这里有一个小问题,如果它是AWS管理的策略,您不能编辑它,这通常是使用codepipeline的情况。只需创建一个附加到角色的新策略。