Целью здесь является создание запланированных снимков томов EBS. Глядя на документацию Terraform для aws_cloudwatch_event_target
, это кажется невозможным, но я мог что-то упустить.Могу ли я присоединить правило событий CloudWatch к «встроенной цели» через Terraform?
ответ
Объекты, имеющие встроенные объекты 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 цели, но это может быть не всегда верно/необходимо.
Предыдущий ответ был достаточно, чтобы получить все, кроме разрешений 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}"
}
Так близко! Мне пришлось вручную выбрать роль для встроенных целей. – ds011591
@ ds011591 Можете ли вы уточнить? Могли ли вы создать все это в Terraform? – mkobit