Amazon web services 使用未链接到角色的AWS CloudFormation创建CloudWatch规则
我正在尝试创建一个CloudWatch规则,该规则根据计划触发并执行状态机(步骤函数)。我正在使用CloudFormation来创建这个,除了规则使用的IAM角色与规则本身的关联之外,其他一切都创建得很好。我的意思是: 注意“使用现有角色”下为空 下面是处理规则及其角色的CF模板部分Amazon web services 使用未链接到角色的AWS CloudFormation创建CloudWatch规则,amazon-web-services,amazon-cloudformation,amazon-cloudwatch,Amazon Web Services,Amazon Cloudformation,Amazon Cloudwatch,我正在尝试创建一个CloudWatch规则,该规则根据计划触发并执行状态机(步骤函数)。我正在使用CloudFormation来创建这个,除了规则使用的IAM角色与规则本身的关联之外,其他一切都创建得很好。我的意思是: 注意“使用现有角色”下为空 下面是处理规则及其角色的CF模板部分 "SFInvoke":{ "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": {
"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"
]
}
}]
}
},
是否希望
SFInvoke
角色显示在使用现有角色选择器上
如果是这种情况,则需要将主体设置为事件
,而不是状态
您正在编辑上面屏幕截图中的事件目标,而不是步骤函数。主体定义了可以承担该角色的服务,在您的情况下是事件服务
尝试以下方法创建角色:
"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"}
}
]
}
}
]
}
}
是否希望SFInvoke
角色显示在使用现有角色选择器上
如果是这种情况,则需要将主体设置为事件
,而不是状态
您正在编辑上面屏幕截图中的事件目标,而不是步骤函数。主体定义了可以承担该角色的服务,在您的情况下是事件服务
尝试以下方法创建角色:
"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"}
}
]
}
}
]
}
}
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事件规则,为该规则提供了基于AmazonS3事件启动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"
您可能可以在上查看更多信息。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事件规则,为该规则提供了基于AmazonS3事件启动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"
您可能可以在感谢Tartaglia上查看更多信息-这是否意味着该角色将按照我的要求链接到规则?那么它将能够使用该角色执行吗?这就是我要做的,我要让CF模板生成角色和CloudWatch事件之间的链接,以便它可以根据需要执行并触发状态机。是的,这将触发状态机。您还需要正确设置状态机上的角色(此角色将具有状态
主体),以及lambda上的角色(此角色将具有lambda
主体)。感谢您将状态
更改为事件
解决了我的问题!感谢Tartaglia-这是否意味着该角色按照我的要求与规则相关联?那么它将能够使用该角色执行吗?这就是我要做的,我要让CF模板生成角色和CloudWatch事件之间的链接,以便它可以根据需要执行并触发状态机。是的,这将触发状态机。您还需要正确设置状态机上的角色(此角色将具有状态
主体),以及lambda上的角色(此角色将具有lambda
主体)。感谢您将状态
更改为事件
解决了我的问题!