#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. ДА. Для него будет установлено значение по умолчанию.