2016-08-16 12 views

ответ

4

Объекты, имеющие встроенные объекты Cloudwatch, как представляется, требуют входного параметра, а также ARN, который показан для добавления сообщения в очередь SNS в примере для aws_cloudwatch_event_rule или отправки в поток Kinesis в aws_cloudwatch_event_target.

Таким образом, мы просто должны быть в состоянии сделать что-то вроде этого:

resource "aws_cloudwatch_event_target" "ebs_vol_a" { 
    target_id = "ebs_vol_a" 
    rule = "${aws_cloudwatch_event_rule.snap_ebs.name}" 
    arn = "arn:aws:automation:${var.region}:${var.account_id}:action/EBSCreateSnapshot/EBSCreateSnapshot_ebs_vol_a" 
    input = "\"arn:aws:ec2:${var.region}:${var.account_id}:volume/vol-${var.ebs_vol_a_id}\"" 
} 

resource "aws_cloudwatch_event_rule" "snap_ebs" { 
    name = "snap-ebs-volumes" 
    description = "Snapshot EBS volumes" 
    schedule_expression = "rate(6 hours)" 
} 

Я еще не проверял это, но он должен работы. Очевидно, вы, вероятно, хотите получить идентификаторы тома EBS из ресурса, который вы создали, но это выходит за рамки вопроса. Я также догадался в ARN после создания правила в консоли AWS, а затем посмотрел вывод aws events list-targets-by-rule, где он, кажется, добавляет имя правила в ARN цели, но это может быть не всегда верно/необходимо.

+0

Так близко! Мне пришлось вручную выбрать роль для встроенных целей. – ds011591

+0

@ ds011591 Можете ли вы уточнить? Могли ли вы создать все это в Terraform? – mkobit

3

Предыдущий ответ был достаточно, чтобы получить все, кроме разрешений IAM на целевые объекты (например, войти в консоль, отредактировать правило и в «Шаге 2» в разделе «Разрешения AWS» создать новый роль и т. д.). Чтобы получить эту работу в terraform, я просто добавил несколько ресурсов:

resource "aws_cloudwatch_event_rule" "snapshot_example" { 
    name = "example-snapshot-volumes" 
    description = "Snapshot EBS volumes" 
    schedule_expression = "rate(24 hours)" 
} 

resource "aws_cloudwatch_event_target" "example_event_target" { 
    target_id = "example" 
    rule = "${aws_cloudwatch_event_rule.snapshot_example.name}" 
    arn = "arn:aws:automation:${var.aws_region}:${var.account_id}:action/EBSCreateSnapshot/EBSCreateSnapshot_example-snapshot-volumes" 
    input = "${jsonencode("arn:aws:ec2:${var.aws_region}:${var.account_id}:volume/${aws_ebs_volume.example.id}")}" 
} 

resource "aws_iam_role" "snapshot_permissions" { 
    name = "example" 
    assume_role_policy = <<EOF 
{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Action": "sts:AssumeRole", 
     "Principal": { 
     "Service": "automation.amazonaws.com" 
     }, 
     "Effect": "Allow", 
     "Sid": "" 
    } 
    ] 
} 
EOF 
} 

resource "aws_iam_policy" "snapshot_policy" { 
    name  = "example-snapshot-policy" 
    description = "grant ebs snapshot permissions to cloudwatch event rule" 
    policy = <<EOF 
{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Effect": "Allow", 
     "Action": [ 
     "ec2:Describe*", 
     "ec2:RebootInstances", 
     "ec2:StopInstances", 
     "ec2:TerminateInstances", 
     "ec2:CreateSnapshot" 
     ], 
     "Resource": "*" 
    } 
    ] 
} 
EOF 
} 

resource "aws_iam_role_policy_attachment" "snapshot_policy_attach" { 
    role  = "${aws_iam_role.snapshot_permissions.name}" 
    policy_arn = "${aws_iam_policy.snapshot_policy.arn}" 
}