概要

  • AWS Elastic Beanstalk は、アプリケーションコードをアップロードするだけで、インフラの構築や管理を自動で行えるマネージドサービスです。ウェブアプリケーションやサービスのデプロイとスケーリングを容易にします。
  • 今回、担当案件において、Elastic Beanstalk にcron によるコマンドの定期実行を導入する機会がありました。Elastic Beanstalk のプラットフォームには、Amazon Linux 2023 を利用します。今回、.ebextensions ディレクトリに設定ファイルを追加してElastic Beanstalk 環境のインスタンスOS をカスタマイズしました。.ebextensionsの使用方法とcron 設定方法を紹介します。

 

Elastic Beanstalk のインスタンスOS をカスタマイズする方法

  • 先ずElastic Beanstalk 環境のインスタンスOS において、定期的なバッチ処理やメンテナンススクリプトなどを実行したい場合、Unix/Linux OS で広く利用されているcron を設定することが一般的です。次にインスタンスOS をカスタマイズする方法はいくつかあります。
  • 1つ目の方法は、Elastic Beanstalk 環境にカスタムAMI を使用する方法です。
    • カスタムAMI を使用するメリットは、起動するイメージに対して、事前にパッケージ導入や設定変更などカスタマイズを行うことができ、環境の作成やインスタンス更新時の処理時間を短縮させたり、OSや導入するパッケージのバージョンを固定することが可能です。また、アプリケーションのデプロイとインフラ環境の設定を担当するエンジニアを異なる際に、責任分界点が明確になります。
    • デメリットは、カスタムAMI を作成するため、EC2 インスタンスを起動、OSにログインしてコマンドを実行する必要があり、Linuxオペレーションの知識や作業の工数が必要になります。また、セキュリティパッチの適用などカスタムAMI の継続的なメンテナンスを必要とします。
    • カスタムAMI を使用する方法は、こちらのブログを参考にしてください。
  • 2つ目の方法は、.ebextensions を使用する方法です。
    • .ebextensions ディレクトリにYAML または JSON 形式の設定ファイル(.config)を配置し、アプリケーションのソースに含める形でソースバンドルを作成します。Elastic Beanstalk 環境下でインスタンス起動時に、パッケージ導入や設定変更が行われます。
    • .ebextensions を使用するメリットは、インフラの設定がコードとして管理されるため、変更履歴の追跡や環境の再現性が容易になります。
    • デメリットは、カスタム AMI ほど柔軟なパッケージ管理やカスタマイズは難しい場合があります。また、設定ファイルをアプリケーションのソースバンドルに含める必要があり、インフラの構築やテストのタイミングがアプリケーションのデプロイタイミングに影響を受けます。設定ファイルの記述ミスによるデプロイ失敗のリスクも考えておきましょう。

 

.ebextensions を使用してインスタンスOS にcronを設定する

前提

  • 以下のドキュメントを参考に、インスタンスOS にcronを設定します。
  • Amazon Linux 2023 にはデフォルトでcron はインストールされないため、cronie パッケージをインストールします。
  • cronの設定は、crontabコマンドの使用や/etc/crontabファイルを直接編集するなどいくつかの方法がありますが、今回は/etc/cron.d/ に設定ファイルを配置する方法を使用します。/etc/cron.d/ に配置する設定ファイルを記述する際は、crontabコマンドと異なり、ユーザーの指定が必須となります。

 

.ebextensions の設定手順

  • 今回設定するcronは、/etc/cron.d/cleanup_tmpfile という設定ファイルを配置し、定期的に/var/tmp ディレクトリ配下の特定日時が経過したファイルを削除します。
  • .ebextensions/01setup_cronie.config の設定ファイルを作成します。以下の記述を行います。cronの設定値は実環境に合わせてください。特にタイムゾーンに注意します。

 

commands:
    01_install_cronie:
        command: "sudo dnf install -y cronie"
    02_systemctl_enable_cronie:
        command: "sudo systemctl enable crond"
    03_systemctl_start_cronie:
        command: "sudo systemctl start crond"
    
files:
    "/etc/cron.d/cleanup_tmpfile":
        mode: "000644"
        owner: root
        group: root
        content: |
            0 * * * * root /usr/bin/find /var/tmp -mtime +7 -name "tmp*.zip" -delete

 

 

commands:
    01_install_cronie:
        command: "sudo dnf install -y cronie"
    02_systemctl_enable_cronie:
        command: "sudo systemctl enable crond"
    03_systemctl_start_cronie:
        command: "sudo systemctl start crond"

files:
    "/etc/cron.d/cleanup_tmpfile":
        mode: "000644"
        owner: root
        group: root
        content: |
            0 * * * * root /usr/local/bin/cleanup_tmpfile.sh

    "/usr/local/bin/cleanup_tmpfile.sh":
        mode: "000755"
        owner: root
        group: root
        content: |
            #!/bin/bash

            date >> /var/tmp/cleanup_tmpfile.txt
            /usr/bin/find /var/tmp -mtime +7 -name "tmp*.zip" -delete

            exit 0

 

  • アプリケーションのソースバンドルを作成します。zipファイルが作成されます。(ソースバンドル作成のドキュメントは、こちらを参照)
  • ベースとなるアプリケーションのコードは、こちらのチュートリアルにあるサンプルを利用しています。

 

$ zip ../python_with_cron_script.zip -r * .[^.]*
  adding: application.py (deflated 60%)
  adding: cron.yaml (deflated 24%)
  adding: .ebextensions/ (stored 0%)
  adding: .ebextensions/00sample_log.config (deflated 53%)
  adding: .ebextensions/01setup_cronie.config (deflated 62%)

 

  • Elastic Beanstalk 環境の作成時に、作成したアプリケーションのソースバンドルを指定します。

 

  • Elastic Beanstalk 環境の作成後、セッションマネージャーなどを使用してインスタンスOS にログインします。
  • cronie パッケージがインストールされていること、crondサービスが起動していることを確認します。

 

sh-5.2$ dnf list --installed cronie
Installed Packages
cronie.x86_64                                                                           1.5.7-1.amzn2023.0.2                                                                           @amazonlinux
sh-5.2$ systemctl status crond
● crond.service - Command Scheduler
     Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; preset: enabled)
     Active: active (running) since Tue 2025-04-22 09:51:59 UTC; 6min ago
   Main PID: 1622 (crond)
      Tasks: 1 (limit: 1058)
     Memory: 1.0M
        CPU: 11ms
     CGroup: /system.slice/crond.service
             └─1622 /usr/sbin/crond -n
sh-5.2$ ls -l /etc/cron.d
total 12
-rw-r--r--. 1 root root 128 Jan 30  2023 0hourly
-rw-r--r--. 1 root root  73 Apr 22 09:55 cleanup_tmpfile
-rw-r--r--. 1 root root 143 Apr 22 09:52 publishlogs

 

  • cron の動作確認を行います。テスト用のファイルを作成します。その後、無事にファイルの定期削除が行われました。

 

sh-5.2$ touch -d "2025/01/01 13:00:00" /var/tmp/tmp_01.zip
sh-5.2$ touch -d "2025/01/02 13:00:00" /var/tmp/tmp_02.zip
sh-5.2$ touch -d "2025/01/03 13:00:00" /var/tmp/tmp_03.zip
sh-5.2$
sh-5.2$ date
Tue Apr 22 09:59:15 AM UTC 2025
sh-5.2$
sh-5.2$ ls -l /var/tmp
total 0
drwxrwxrwt. 2 root     root       6 Apr 22 09:51 cloud-init
drwx------. 3 ssm-user ssm-user 120 Apr 22 09:58 dnf-ssm-user-nbqawm4_
drwx------. 3 root     root      17 Apr 22 09:51 systemd-private-c66911cd4362460ba82c00f801d43c70-chronyd.service-nZAZy7
drwx------. 3 root     root      17 Apr 22 09:51 systemd-private-c66911cd4362460ba82c00f801d43c70-dbus-broker.service-aIwtYp
drwx------. 3 root     root      17 Apr 22 09:55 systemd-private-c66911cd4362460ba82c00f801d43c70-nginx.service-KNt5ak
drwx------. 3 root     root      17 Apr 22 09:51 systemd-private-c66911cd4362460ba82c00f801d43c70-policy-routes@ens5.service-t4T1Rf
drwx------. 3 root     root      17 Apr 22 09:51 systemd-private-c66911cd4362460ba82c00f801d43c70-systemd-logind.service-J1fVH7
drwx------. 3 root     root      17 Apr 22 09:51 systemd-private-c66911cd4362460ba82c00f801d43c70-systemd-resolved.service-XKdtMT
-rw-r--r--. 1 ssm-user ssm-user   0 Jan  1 13:00 tmp_01.zip
-rw-r--r--. 1 ssm-user ssm-user   0 Jan  2 13:00 tmp_02.zip
-rw-r--r--. 1 ssm-user ssm-user   0 Jan  3 13:00 tmp_03.zip
sh-5.2$
sh-5.2$ date
Tue Apr 22 10:00:36 AM UTC 2025
sh-5.2$
sh-5.2$ ls -l /var/tmp
total 0
drwxrwxrwt. 2 root     root       6 Apr 22 09:51 cloud-init
drwx------. 3 ssm-user ssm-user 120 Apr 22 09:58 dnf-ssm-user-nbqawm4_
drwx------. 3 root     root      17 Apr 22 09:51 systemd-private-c66911cd4362460ba82c00f801d43c70-chronyd.service-nZAZy7
drwx------. 3 root     root      17 Apr 22 09:51 systemd-private-c66911cd4362460ba82c00f801d43c70-dbus-broker.service-aIwtYp
drwx------. 3 root     root      17 Apr 22 09:55 systemd-private-c66911cd4362460ba82c00f801d43c70-nginx.service-KNt5ak
drwx------. 3 root     root      17 Apr 22 09:51 systemd-private-c66911cd4362460ba82c00f801d43c70-policy-routes@ens5.service-t4T1Rf
drwx------. 3 root     root      17 Apr 22 09:51 systemd-private-c66911cd4362460ba82c00f801d43c70-systemd-logind.service-J1fVH7
drwx------. 3 root     root      17 Apr 22 09:51 systemd-private-c66911cd4362460ba82c00f801d43c70-systemd-resolved.service-XKdtMT
sh-5.2$

 

  • これで、.ebextensions を使用してElastic Beanstalk のインスタンスOSにcron を設定することができました。あなたの Elastic Beanstalk 環境では、どのようなカスタマイズが必要でしょうか。参考にしてください。

 

関連資料

elastic-beanstalk-samples