cron起動するEventBridgeから、SystemsManagerRunCommandのRunShellドキュメントを利用して、EC2インスタンス上のShellScriptを実行してみた!

AWS

はじめに

今回は、EventBridgeからEC2インスタンス上のShellScriptを実行する構成をCloudFormationで作成していきます。

EventBridgeの設定は以下を使用します。

  • 起動条件:スケジュールのcron式
  • 実行ターゲット:SystemsManagerのRunCommandドキュメントRun-ShellScript

構成図

CloudFormationで構築

EventBridgeを作成するCloudFormationテンプレートは以下にございます。
ダウンロードしてデスクトップなど任意のフォルダに保存します。
s3bucket-for-lambda-code.yml
※その他のファイルも後述の手順で使用するためダウンロードしておきます

GitHub - kosments/eventbridge-ssm-runsh-on-ec2
Contribute to kosments/eventbridge-ssm-runsh-on-ec2 development by creating an account on GitHub.

CloudFormation:YAMLテンプレートのポイント

EventBridgeのルール作成と必要なロールがポイントになります。

以下は、EventBridgeRuleの作成箇所です。Target項目で、AWS Run-ShellScriptというSSMドキュメント(SystemsManagerにおけるオートメーションテンプレート)を指定しています。
また、Input項目では、EC2錠で実行したいコマンドを指定しています。最後にコマンドを実行するEC2のIDを指定します。
※実際には、コード全体の前半におけるParameters項目から受け取ることになります

Resources:
  EventRule:
    Type: AWS::Events::Rule
    Properties: 
      Name: !Sub "${Env}-eventbridge-${ResourceName}"
      EventBusName: default
      ScheduleExpression: !Ref cron
      State: ENABLED
      Targets:
        - Id: Id3e53de3b-8aaf-4622-a351-cd3eef85ff4b
          Arn: arn:aws:ssm:ap-northeast-1::document/AWS-RunShellScript
          RoleArn: !GetAtt EventBridgeRole.Arn
          Input: !Sub >-
            {"commands":["sudo -u ec2-user bash ${ShPath}${ShName}" ],"workingDirectory":["${ShPath}"]}
          RunCommandParameters:
            RunCommandTargets:
              - Key: InstanceIds
                Values:
                  - !Ref TargetEC2InstanceId

以下は、 EventBridgeRuleに付与するロールです。今回は、SSMの
RunCommand機能を使用するため、ssm:SendCommandを許可するようにします。

  EventBridgeRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub "${Env}-role-eventbridge-${ResourceName}"
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - events.amazonaws.com
            Action:
                - sts:AssumeRole
      Policies:
        - PolicyName: !Sub "${Env}-policy-eventbridge-${ResourceName}"
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Sid: sendcommand
                Effect: Allow
                Action: ssm:SendCommand
                Resource:
                  - !Sub "arn:aws:ec2:ap-northeast-1:${AccountId}:instance/${TargetEC2InstanceId}"
                  - arn:aws:ssm:ap-northeast-1:*:document/AWS-RunShellScript

スタックの作成

早速、CloudFormationを使用してリソースを作成していきます。
手順は、以下の通りで、リンクにも詳細がございます。

  1. CloudFormation画面を開きスタックの作成>新しいソースを使用(標準)を選択
  2. テンプレートの準備完了>テンプレートファイルのアップロードを選択して、保存したymlを選択
  3. スタックに任意の名称を入力して、パラメータは環境に合わせて変更>次へを選択。※後述の手順に従う場合、デフォルト値でOK
  4. スタックオプションは特に変更せず、次へを選択
  5. レビュー画面を確認して送信を選択
RDSリストアで起動するLambda実行EventBridgeをCloudFormationで構築してみた!
RDSリストアで起動するLambda実行EventBridgeをCloudFormationで構築してみた!

事前準備

必要なリソースを準備しておきます。

EC2を構築

EC2画面>[インスタンスを起動]から任意のEC2インスタンスを起動しておきます。

AMIはAmazonLinux2023を選択します。

任意のVPC,サブネット,セキュリティグループを選んだらインスタンスを起動を選択します。

インスタンスが作成されました。

SSMAgentをインストール

以下を参考にSSMAgentをインストールします。

Amazon Linux 2 および Amazon Linux 2023 インスタンスに SSM Agent を手動でインストールする - AWS Systems Manager
Amazon Linux 2 または Amazon Linux 2023 インスタンスに接続し、Systems Manager を使用してコマンドを実行する各インスタンスに SSM Agent をインストールします。
  • 作成したEC2インスタンスに接続して以下のコマンドでインストール
sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
  • インストールされたことを確認
sudo systemctl status amazon-ssm-agent

SSMへのアクセス権限の追加

以下のポリシーをEC2に付与されているロールにアタッチします。

  • AmazonSSMManagedInstanceCore
AmazonSSMManagedInstanceCore - AWS 管理ポリシー
AWS 管理ポリシーについて: AmazonSSMManagedInstanceCore

ShellScriptを配置

GitHubに保存されているtest.shを、作成したEC2の/home/ec2-user/test/配下に配置します。
test.shはHelloWorld!を日時付きで出力するだけのShellScriptです。

動作検証

CloudFormationで問題なくスタックが作成されていたら、EventBridgeを開き、該当のルールを選択します。
以下の編集ボタンから、cronを変更できるので、数分後など任意の時間を設定します。

時間になったら、Shが実行されているか確認してみます。

5分ごとに実行されています。
ファイルの中身も見てみます。

cat test_20230825033541.log

問題なく出力されています。

まとめ

今回は、EventBridgeを用いて、EC2インスタンス上のShellScriptを実行しました。
EventBridgeは様々な自動化ケースに対応できそうなので、これからも試していきたいと思います。
最後までご覧いただきありがとうございました。

コメント

タイトルとURLをコピーしました