Как использовать Terraform для определения правил событий cloundwatch для запуска StepFunction statemachine

#amazon-web-services #terraform #state-machine #aws-step-functions #amazon-cloudwatch-events

#amazon-веб-сервисы #terraform #конечный автомат #aws-step-функции #amazon-cloudwatch-события

Вопрос:

Я определил создание конечного автомата StepFunction в Terraform, теперь я хочу установить таймер для запуска конечного автомата каждый день, я думаю, что, вероятно, использование правил событий cloudwatch — хороший выбор, я знаю, как установить правило событий для запуска лямбда-функции:

 resource "aws_cloudwatch_event_rule" "lambda_event_rule" {
  name                = xxx
  schedule_expression = xxx
  description         = xxx
}

resource "aws_cloudwatch_event_target" "lambda_event_target" {
  target_id = xxx
  rule      = aws_cloudwatch_event_rule.lambda_event_rule.name
  arn       = xxx
}

#I must setup the right permissions using 'aws_lambda_permission' 
#see: https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_event_target

resource "aws_lambda_permission" "lambda_event_permission" {
  statement_id  = xxx
  action        = "lambda:InvokeFunction"
  function_name = xxx
  principal     = "events.amazonaws.com"
  source_arn    = aws_cloudwatch_event_rule.lambda_event_rule.name
}
 

но как я могу настроить часть разрешений для запуска конечного автомата? Я не смог найти никаких примеров по этому поводу, я что-то пропустил? Это потому, что нам не нужна конфигурация разрешений для конечного автомата? Может кто-нибудь помочь, пожалуйста?

Ниже приведено то, что я должен использовать правила событий cloudwatch для запуска конечного автомата до сих пор:

 resource "aws_cloudwatch_event_rule" "step_function_event_rule" {
  name                = xxx
  schedule_expression = xxx
  description         = xxx
}

resource "aws_cloudwatch_event_target" "step_function_event_target" {
  target_id = xxx
  rule      = aws_cloudwatch_event_rule.step_function_event_rule.name
  arn       = xxx
}


?????What else should I add here?

 

PS: Я обнаружил, что кто-то еще задавал здесь аналогичный вопрос, но ответов пока нет.

Ответ №1:

В

     resource "aws_lambda_permission" "lambda_event_permission" {
     statement_id  = xxx
     action        = "lambda:InvokeFunction"
     function_name = xxx
     principal     = "events.amazonaws.com"
     source_arn    = aws_cloudwatch_event_rule.lambda_event_rule.name
    }
 

в вашем случае часть вообще не нужна, она нужна только, как указано «Для того, чтобы ваша лямбда-функция AWS или тема SNS вызывались правилом EventBridge».

Как указано в ответе blr, вам необходимо добавить role_arn в aws_cloudwatch_event_target, настроить роль с помощью assume_role_policy, которая предоставляет доступ к states.amazonaws.com и events.amazonaws.com , и прикрепите к этой роли дополнительную политику следующим образом:

     data "aws_iam_policy_document" "CW2SF_allowexec" {
      statement {
        actions = [
          "sts:AssumeRole"
        ]

        principals {
          type = "Service"
          identifiers = [
            "states.amazonaws.com",
            "events.amazonaws.com"
          ]
        }
      }
    }

    resource "aws_iam_role" "CW2SF_allowexec" {
      name               = "AWS_Events_Invoke-StepFunc"
      assume_role_policy = data.aws_iam_policy_document.CW2SF_allowexec.json
    }

    resource "aws_iam_role_policy" "state-execution" {
      name        = "CW2SF_allowexec"
      role   = aws_iam_role.CW2SF_allowexec.id

      policy = <<EOF
    {
      "Version": "2012-10-17",
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "states:StartExecution"
              ],
              "Resource": [          
"arn:aws:states:${var.region}:${data.aws_caller_identity.current.account_id}:stateMachine:data-pipeline-incremental"
          ]
      }
  ]
}
EOF
} 
 

Вам необходимо установить доверие между CloudWatch и StepFunctions с помощью AssumeRole, а затем прикрепить встроенную или управляемую политику к роли, которая специально позволяет этой роли запускать выполнение конечного автомата.

Ответ №2:

Я не очень хорошо разбираюсь в terraform, но, похоже, он соответствует шаблону, аналогичному официальной документации. Для целей; https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_PutTargets.html >> См. Раздел «Добавление конечного автомата пошаговых функций в качестве целевого объекта».

 {
    "Rule": "testrule", 
    "Targets": [
           {
        "RoleArn": "arn:aws:iam::123456789012:role/MyRoleToAccessStepFunctions"
        "Arn":"arn:aws:states:us-east-1:123456789012:stateMachine:HelloWorld"
      }
    ]
}
 

Это говорит мне о том, что вам нужно передать роль и арну. Итак, взяв ваш пример, вот что вам, вероятно, нужно заполнить

 resource "aws_cloudwatch_event_rule" "step_function_event_rule" {
  name                = <something unique>
  schedule_expression = <syntax described in https://docs.aws.amazon.com/eventbridge/latest/userguide/scheduled-events.html>
  description         = <something descriptive>
}

resource "aws_cloudwatch_event_target" "step_function_event_target" {
  target_id = <something unique>
  rule      = aws_cloudwatch_event_rule.step_function_event_rule.name
  arn       = <step function arn>
  role_arn  = <role that allows eventbridge to start execution on your behalf>
}
 

Комментарии:

1. это target_id = <something unique> обязательное поле?

2. Я только что проверил документ, он необязательный, я все равно включил его, спасибо

3. На основе docs.aws.amazon.com/eventbridge/latest/APIReference /… , кажется, требуется. Возможно, terraform создаст его для вас, если вы его не задали.

4. когда я пытаюсь «terraform plan», он показывает дополнительное поле для правила события ` event_bus_name = «default»`, я предполагаю, что это лучше включить в сценарий, иначе для него будет установлено значение по умолчанию.

5. ДА. Для него будет установлено значение по умолчанию.