AWS CDK を用いて Systems Manager Automation をターゲットとした EventBridge ルールを作成する方法を教えてください
困っていること
AWS 提供の AWS-StopEC2Instance ランブックと EventBridge ルールを用いてスケジュールに基づいて EC2 を停止する処理を AWS CDK を用いて作成したいです。
どのように実装すればいいですか?
どう対応すればいいの?
AwsApi クラスをご利用ください。
EventBridge ルールのターゲットを設定するために利用する aws_events_targets モジュールには、ターゲットとして AWS API を呼び出す Lambda 関数を定義するために利用できる AwsApi クラスが用意されております。
こちらをご利用いただくことで、AWS API にて実行可能なアクションを実行する Lambda 関数を EventBridge のターゲットとすることが可能になります。
Systems Manager Automation にてランブックを実行するアクションは StartAutomationExecution となるため、上記クラス内にて StartAutomationExecution を指定して実行するよう構築いただくことでお客様のご要件が達成可能です。
やってみた
それでは実際にやってみます。
まず、以下のドキュメントに沿って CDK プロジェクトを作成していきます。
CDK プロジェクトの作成が完了したら早速コードを書いていきましょう!
今回は Python で作成してみました。実際のコードは以下です。
from aws_cdk import (
Duration,
Stack,
aws_events as events,
aws_events_targets as events_targets,
aws_iam as iam,
)
from constructs import Construct
class HelloCdkStack(Stack):
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwargs)
# EventBridge ルールで利用する IAM ポリシー
policy_statement = iam.PolicyStatement(
actions=[
'ssm:StartAutomationExecution',
'tag:*',
'ec2:*',
],
effect=iam.Effect.ALLOW,
resources=["*"]
)
# EventBridge ルール
rule = events.Rule(self, "rule",
enabled=True,
schedule=events.Schedule.rate(Duration.minutes(1)),
event_pattern=events.EventPattern(
source=["aws.ec2"]
)
)
# EventBridge ルールのターゲット
targets = events_targets.AwsApi(
action="StartAutomationExecution",
service="ssm",
parameters={
"DocumentName": 'AWS-StopEC2Instance',
"Parameters": {
"InstanceId": ['i-xxxxx'],
},
},
policy_statement=policy_statement
)
rule.add_target(targets)
デプロイ後、以下のように Lambda 関数をターゲットとする EventBridge ルールが作成されました。
ルール作成後、一分経過したタイミングで指定した EC2 インスタンスが停止されました。
コンソール画面から作成する構成とは異なりますが、同様の挙動となることを確認できました。