【问题标题】:Creating CloudWatch rule with AWS CloudFormation not linking to role使用未链接到角色的 AWS CloudFormation 创建 CloudWatch 规则
【发布时间】:2019-04-07 04:30:55
【问题描述】:

我正在尝试创建一个按计划触发并执行状态机(Step Functions)的 CloudWatch 规则。我正在使用 CloudFormation 来创建它,除了规则使用的 IAM 角色与规则本身的关联之外,一切都很好。这就是我的意思:

“使用现有角色”下的通知是空白的。

这是处理规则及其角色的 CF 模板部分。

"SFInvoke":{
    "Type": "AWS::IAM::Role",
    "Properties": {
      "AssumeRolePolicyDocument": {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
              "Service": {
                "Fn::Sub": "states.${AWS::Region}.amazonaws.com"
              }
            },
            "Action": "sts:AssumeRole"
          }
        ]
      },
      "Policies": [
        {
          "PolicyName": "StepFunctionsInvoke",
          "PolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
              {
                "Effect": "Allow",
                "Action": [
                  "states:StartExecution"
                ],
                "Resource": { "Ref" : "StateMachine"}
              }
            ]
          }
        }
      ]
    }
  },
  "CloudWatchStateMachineSDCEventRule": {
    "Type":"AWS::Events::Rule",
    "Properties": {
      "Description":"CloudWatch trigger for the InSite Static Data Consumer",
      "ScheduleExpression": "rate(5 minutes)",
      "State":"ENABLED",
      "Targets":[{
        "Arn":{ "Ref" : "StateMachine"},
        "Id":"StateMachineTargetId",
        "RoleArn":{
          "Fn::GetAtt": [
            "SFInvoke",
            "Arn"
          ]
        }
      }]
    }
},

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation amazon-cloudwatch


    【解决方案1】:

    您希望SFInvoke 角色显示在Use existing role selector 上吗?

    如果是这种情况,您需要将 Principal 设置为 events 而不是 states

    您正在编辑上面屏幕截图中的事件目标,而不是步进函数。 Principal 定义可以承担该角色的服务,在您的情况下是事件服务。

    试试这个来创建角色:

    "SFInvoke":{
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Principal": {
                "Service": "events.amazonaws.com"
              },
              "Action": "sts:AssumeRole"
            }
          ]
        },
        "Policies": [
          {
            "PolicyName": "StepFunctionsInvoke",
            "PolicyDocument": {
              "Version": "2012-10-17",
              "Statement": [
                {
                  "Effect": "Allow",
                  "Action": [
                    "states:StartExecution"
                  ],
                  "Resource": { "Ref" : "StateMachine"}
                }
              ]
            }
          }
        ]
      }
    }
    

    【讨论】:

    • 谢谢 Tartaglia - 这是否意味着该角色已按照我的要求与规则相关联?那么它将能够使用该角色执行吗?这就是我所追求的,我在让 CF 模板生成角色和 CloudWatch 事件之间的链接,以便它可以根据需要执行并触发状态机。
    • 是的,这将触发状态机。您还需要在状态机上正确设置角色(此角色将具有 states 主体)和 lambda 角色(此角色将具有 lambda 主体)。
    • 感谢您将states 更改为events 解决了我的问题!
    【解决方案2】:

    Yaml 可能是:
    基于主体:作为基于事件的服务和操作:开始执行 StepFunctions 状态机。

    AWSEventsInvokeStepFunctions:
        Type: AWS::IAM::Role
        Properties:
          AssumeRolePolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Principal:  
                  Service: 
                    - events.amazonaws.com                   
                Action: sts:AssumeRole     
          Policies:
            - PolicyName: AWSEventsInvokeStepFunctions
              PolicyDocument:
                Version: "2012-10-17"
                Statement:
                  - Effect: Allow
                    Action:
                      - states:StartExecution
                    Resource: !Sub "arn:aws:states:${AWS::Region}:${AWS::AccountId}:stateMachine:*" 
    
    

    现在本质上通用的角色可以应用于 CloudWatch 事件规则,赋予规则能够基于 Amazon S3 事件启动 StepFunctions 状态机执行的权限。

    AmazonCloudWatchEventRule:
        Type: AWS::Events::Rule
        Properties:
          EventPattern:
            source:
              - aws.s3
            detail-type:
              - 'AWS API Call via CloudTrail'
            detail:
              eventSource:
                - s3.amazonaws.com
              eventName:           
                - PutObject            
              requestParameters:
                bucketName:
                  - !Ref EventBucket
          Targets:
            - 
              RoleArn: !GetAtt AWSEventsInvokeStepFunctions.Arn
              Arn: !Sub "arn:aws:states:${AWS::Region}:${AWS::AccountId}:stateMachine:MyStateMachine"        
              Id: !Sub "StepExecution"
    
    

    您可以在Start the Execution of State Machine based on Amazon S3 Event 上查看更多信息

    【讨论】:

      猜你喜欢
      • 2019-03-19
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      • 2023-04-01
      • 2018-08-24
      相关资源
      最近更新 更多