AWS CDK を用いて Systems Manager Automation をターゲットとした EventBridge ルールを作成する方法を教えてください

AWS CDK を用いて Systems Manager Automation をターゲットとした EventBridge ルールを作成する方法を教えてください

AwsApi クラスをご利用ください。
Clock Icon2024.09.02

困っていること

AWS 提供の AWS-StopEC2Instance ランブックと EventBridge ルールを用いてスケジュールに基づいて EC2 を停止する処理を AWS CDK を用いて作成したいです。
どのように実装すればいいですか?

どう対応すればいいの?

AwsApi クラスをご利用ください。

EventBridge ルールのターゲットを設定するために利用する aws_events_targets モジュールには、ターゲットとして AWS API を呼び出す Lambda 関数を定義するために利用できる AwsApi クラスが用意されております。

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_events_targets.AwsApi.html

こちらをご利用いただくことで、AWS API にて実行可能なアクションを実行する Lambda 関数を EventBridge のターゲットとすることが可能になります。

Systems Manager Automation にてランブックを実行するアクションは StartAutomationExecution となるため、上記クラス内にて StartAutomationExecution を指定して実行するよう構築いただくことでお客様のご要件が達成可能です。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/APIReference/API_StartAutomationExecution.html

やってみた

それでは実際にやってみます。

まず、以下のドキュメントに沿って CDK プロジェクトを作成していきます。

https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/hello_world.html

CDK プロジェクトの作成が完了したら早速コードを書いていきましょう!
今回は Python で作成してみました。実際のコードは以下です。

hello_cdk_stack.py
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 ルールが作成されました。

スクリーンショット 2024-09-02 15.55.11

ルール作成後、一分経過したタイミングで指定した EC2 インスタンスが停止されました。

スクリーンショット 2024-09-02 15.56.09

コンソール画面から作成する構成とは異なりますが、同様の挙動となることを確認できました。

参考資料

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.