はじめに
今回は、EventBridgeからEC2インスタンス上のShellScriptを実行する構成をCloudFormationで作成していきます。
EventBridgeの設定は以下を使用します。
- 起動条件:スケジュールのcron式
- 実行ターゲット:SystemsManagerのRunCommandドキュメント
Run-ShellScript
構成図
CloudFormationで構築
EventBridgeを作成するCloudFormationテンプレートは以下にございます。
ダウンロードしてデスクトップなど任意のフォルダに保存します。
s3bucket-for-lambda-code.yml
※その他のファイルも後述の手順で使用するためダウンロードしておきます
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を使用してリソースを作成していきます。
手順は、以下の通りで、リンクにも詳細がございます。
- CloudFormation画面を開きスタックの作成>新しいソースを使用(標準)を選択
- テンプレートの準備完了>テンプレートファイルのアップロードを選択して、保存したymlを選択
- スタックに任意の名称を入力して、パラメータは環境に合わせて変更>次へを選択。※後述の手順に従う場合、デフォルト値でOK
- スタックオプションは特に変更せず、次へを選択
- レビュー画面を確認して送信を選択
事前準備
必要なリソースを準備しておきます。
EC2を構築
EC2画面>[インスタンスを起動]から任意のEC2インスタンスを起動しておきます。
AMIはAmazonLinux2023を選択します。
任意のVPC,サブネット,セキュリティグループを選んだらインスタンスを起動を選択します。
インスタンスが作成されました。
SSMAgentをインストール
以下を参考にSSMAgentをインストールします。
- 作成した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
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は様々な自動化ケースに対応できそうなので、これからも試していきたいと思います。
最後までご覧いただきありがとうございました。
コメント