Upgrade to Pro — share decks privately, control downloads, hide ads and more …

業務自動化をJavaとSeleniumとAWS Lambdaで実現した方法

業務自動化をJavaとSeleniumとAWS Lambdaで実現した方法

WebアプリのUIを自動化する目的で開発され、みなさんもよく知っているSeleniumをテストツールとしてではなく、業務自動化エンジンとしてJavaからコントロールするする方法とAWS Lambda上で実行する方法についての説明です。

Avatar for GreenFlagProject

GreenFlagProject

June 06, 2025
Tweet

Other Decks in Programming

Transcript

  1. SeleniumとAWS Lambdaについて Selenium͸WebBrowserૢ࡞ͷࣗಈԽΛՄೳʹ͢Δ͞· ͟·ͳπʔϧͱϥΠϒϥϦʔͷแׅతͳϓϩδΣΫτɻ Selenium ʹ͸͞·͟·ͳػೳ͕͋Γ·͕͢ɺͦͷ֩ͱͳΔͷ͸ɺ Web BrowserͷΠϯελϯεΛϦϞʔτͰ੍ޚ͠ɺ Ϣʔβʔͱͷ ΍ΓͱΓΛΤϛϡϨʔτ͢ΔࣗಈԽͷͨΊͷπʔϧηοτɻ

    Selenium公式Web siteより<https://www.selenium.dev/> AWS公式Web siteより<https://aws.amazon.com/jp/lambda/> 退屈なWeb作業も自動化すべきだよね AWS Lambda ͸Πϕϯτൃੜ࣌ʹίʔυΛ࣮ߦ͠ɺج൫ ͱͳΔίϯϐϡʔςΟϯάϦιʔεΛAWS͕؅ཧ͢Δɺ αʔόʔϨείϯϐϡʔςΟϯάαʔϏεɻ Lambda ͸Մ༻ੑͷߴ͍ίϯϐϡʔςΟϯάΠϯϑϥετϥΫνϟ ͰίʔυΛ࣮ߦ͠ɺίϯϐϡʔςΟϯάϦιʔεʹؔ͢Δ͢΂ͯͷ ؅ཧΛߦ͍·͢ɻ AWS公式Web siteより<https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html>
  2. SeleniumとAWS Lambdaについて Selenium͸WebBrowserૢ࡞ͷࣗಈԽΛՄೳʹ͢Δ͞· ͟·ͳπʔϧͱϥΠϒϥϦʔͷแׅతͳϓϩδΣΫτɻ Selenium ʹ͸͞·͟·ͳػೳ͕͋Γ·͕͢ɺͦͷ֩ͱͳΔͷ͸ɺ Web BrowserͷΠϯελϯεΛϦϞʔτͰ੍ޚ͠ɺ Ϣʔβʔͱͷ ΍ΓͱΓΛΤϛϡϨʔτ͢ΔࣗಈԽͷͨΊͷπʔϧηοτɻ

    Selenium公式Web siteより<https://www.selenium.dev/> AWS公式Web siteより<https://aws.amazon.com/jp/lambda/> 退屈なWeb作業も自動化すべきだよね AWS Lambda ͸Πϕϯτൃੜ࣌ʹίʔυΛ࣮ߦ͠ɺج൫ ͱͳΔίϯϐϡʔςΟϯάϦιʔεΛAWS͕؅ཧ͢Δɺ αʔόʔϨείϯϐϡʔςΟϯάαʔϏεɻ Lambda ͸Մ༻ੑͷߴ͍ίϯϐϡʔςΟϯάΠϯϑϥετϥΫνϟ ͰίʔυΛ࣮ߦ͠ɺίϯϐϡʔςΟϯάϦιʔεʹؔ͢Δ͢΂ͯͷ ؅ཧΛߦ͍·͢ɻ AWS公式Web siteより<https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html> AWS Lambda 業務自動処理に最適な 実行環境 Selenium Browser処理自動化の 開発フレームワーク
  3. Seleniumの概要 LocalDriver ୺຤୯ମͰ࣮ߦ RemoteDriver ϒϥ΢βͷಈ࡞ΛϦϞʔτ୺຤Ͱ࣮ߦ Grid ϒϥ΢βͷಈ࡞Λෳ਺୺຤Ͱ࣮ߦ WebDriver Seleniumͷத֩ɻ MavenɺGladleͰJavaProjectʹΠϯετʔϧɻ

    Driver WebDriver͔Βͷ໋ྩΛݩʹBrowserΛૢ࡞ ͢Δ࣮ߦϓϩάϥϜɻ ૢ࡞͢ΔBrowserʹରԠͨ͠΋ͷΛ࢖͏ɻ ࣮ߦ؀ڥʹΠϯετʔϧɻ (ϓϩάϥϜ։ൃʹ௚઀ؔ༩͠ͳ͍) Browser ͍ΘΏΔWebϒϥ΢βɻ ࣮ߦ؀ڥʹΠϯετʔϧɻ (ϓϩάϥϜ։ൃʹ௚઀ؔ༩͠ͳ͍) 実行環境構成パターン Seleniumの構成要素 実行環境(LocalDriverのパターン) JavaProject Driver eg ChromeDriver Browser eg Chromium WebDriver eg selenium-java プロセス プロセス プロセス
  4. AWS Lambdaの概要 要は、プログラム実行環境 プログラムが動く時だけサーバが稼働し、プログラムが実行し終わるとサーバが 終了する。 プログラムは配置すれば良い。 サーバ管理考慮レス 中身はコンテナ技術 プログラムを配置するとさま ざまな方法で実行できる

    DriverとBrowserのバイナリ配置 配置可能アーカイブ容量 AWS LambdaでSeleniumを動かすための課題等対策 課題 コンテナイメージで対応する ZIP アーカイブを使用して作成 された関数の最大コードパッ ケージサイズは解凍状態で 250 MB以下であること。 対策 コンテナイメージを使用して作 成された関数の最大イメージサ イズは 10 GBまでOK。
  5. AWS Lambda実行のためのBrowser [Browser] Chromeのデフォルトパッケージマネージャリポジトリはない ChromeのLinux公式バイナリはlinux64(AMD64)がある public.ecr.aws lambda/java:21 fedora:42 debian:bookworm AMD64

    (x86_64) ❌ 👍 👍 AArch64 (arm64) ❌ 👍 👍 DistributionのパッケージマネージャChromium提供状況 Chromeが使えなければ Chromiumを使おう AArch64(ARM64)のChromeは公式提供なし...
  6. 開発環境構築 [開発環境] ① Selenium開発のJavaProjectを作成 ② DriverとBrowserをインストール ③ DriverとBrowserを指定するコード https://googlechromelabs.github.io/chrome-for-testing/ 実行環境

    JavaProject Driver Browser WebDriver プロセス プロセス プロセス • ①のWebDriverのバージョンに対応した バージョンを選択 • 開発環境に合わせたPlatformを選択 Browser Driver
  7. 開発環境構築 [開発環境] ① Selenium開発のJavaProjectを作成 ② DriverとBrowserをインストール ③ DriverとBrowserを指定するコード 最小限のプログラム(まだ、AWS Lambdaでは動かせないです)

    import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; public class SimpleSeleniumTest { static public void main(String[] args){ // Driverにchromedriverのpathをセットする ・・・①-1 System.setProperty("webdriver.chrome.driver" , "/usr/bin/chromedriver"); // Browserにchromeのpathをセットする・・・・・・①-2 ChromeOptions options = new ChromeOptions(); options.setBinary("/usr/bin/chrome"); // chromeを起動する ・・・・・・・・・・・・・・②-1 WebDriver driver = new ChromeDriver(options); // seleniumでchromeを操作する ・・・・・・・・・②-1 driver.get("https://www.kanpo.go.jp/"); System.out.print(driver.getTitle()); // chromeを終了する ・・・・・・・・・・・・・・③ driver.quit(); } } ①DriverパスとBrowserパスを設定。 ②Chromeを起動し、官報のwebpageを開い てタイトルをコンソールに出力。 ③Chromeを終了。
  8. AWS Lambdaで動かすContainer構築 Dockerfile作成 AWS側の準備 プログラムデプロイ docker build docker tag docker

    push Dockerfile(debian:bookworm) FROM debian:bookworm ENV LAMBDA_TASK_ROOT=/var/task # ᶃInstall Java21(Amazon corretto) RUN apt update RUN apt install -y curl gnupg RUN curl -s https://apt.corretto.aws/corretto.key | gpg --dearmor -o /usr/share/keyrings/corretto-keyring.gpg && \ echo "deb [signed-by=/usr/share/keyrings/corretto-keyring.gpg] https://apt.corretto.aws stable main" | \ tee /etc/apt/sources.list.d/corretto.list && \ apt update; apt install -y java-21-amazon-corretto-jdk # ᶃInstall Chromium & Chromedriver ARG CHROMIUM_VERSION=137.0.7151.55-3~deb12u1 RUN apt install -y chromium-driver=${CHROMIUM_VERSION} chromium-common=${CHROMIUM_VERSION} chromium=${CHROMIUM_VERSION} # ᶄJava ProgramσϓϩΠ COPY target/classes ${LAMBDA_TASK_ROOT} COPY target/dependency/* ${LAMBDA_TASK_ROOT}/lib/ # ᶅ೔ຊޠදࣔରԠ RUN apt install -y locales &&\ echo "ja_JP.UTF-8 UTF-8" > /etc/locale.gen &&\ locale-gen ja_JP.UTF-8 ENV HOSTNAME=weboperator # ᶆSelenium؀ڥม਺ͷઃఆ ENV SE_CACHE_PATH=/tmp ENV WDM_CACHEPATH=/tmp ENV WEBDRIVER_CHROME_DRIVER=/usr/bin/chromedriver ENV WEBDRIVER_CHROME_BINARY=/usr/bin/chromium ENV DBUS_SESSION_BUS_ADDRESS=/dev/null # ᶆAWS Lambdaؔ࿈ͷઃఆ ENV LANG=ja_JP.UTF-8 ENV LAMBDA_RUNTIME_DIR=/var/runtime WORKDIR ${LAMBDA_TASK_ROOT} # Set runtime interface client as default command for the container runtime ENTRYPOINT [ "/usr/bin/java", "-cp", "./*", "com.amazonaws.services.lambda.runtime.api.client.AWSLambda" ] # Pass the name of the function handler as an argument to the runtime CMD [ "example.App::sayHello" ] ①JDK、Driver、Browserのインストール ②開発したJavaプログラムのデプロイ ③日本語ロケール設定 ④AWSとSeleniumなどの各種環境変数設定
  9. AWS Lambdaで動かすContainer構築 Dockerfile作成 AWS側の準備 プログラムデプロイ docker build docker tag docker

    push # docker build実行 docker build --provenance=false --platform oplatform -t $image_name:$tag . # docker tag実行します docker tag $image_name:$tag $aws_repository/$image_name:$tag # AWSログイン aws ecr get-login-password --region $aws_reagion | \ docker login --username AWS --password-stdin $aws_repository # docker push実行します docker push $aws_repository/$image_name:$tag # AWS lambdaを変更します aws lambda update-function-code --region $aws_reagion \ --output $aws_output --function-name $aws_lambda_function_name \ --image-uri $aws_repository/$image_name:$tag AWS公式Web site参照<https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/java-image.html> AWS公式のWebサイトを参照して🙏
  10. 開発のポイント headless モード切替 開発時はブラウザの動きを見たいけど、本番実行の 時は画面は出せないので、headless実行を切り替え られる仕組みを作っておくと良いです。 Driverと Browserの指定 実行モード同様、開発時と本番実行時で使うDriver とBrowserのpathを切り替えられる仕組みを作って

    おくと良いです。SeleniumManagerは動かさない。 Download処理 残念ながらWebDviverの機能でダウンロード完了を 検知する仕組みはないです。 Chromeはダウンロード中のファイル名 に".crdownload"を付けます。ダウンロード前のダ ウンロードフォルダの".crdownload"を除いたファ イル数を取得しておき、ダウンロード実行後にファ イル数が増えたらダウンロード完了したと判断する 処理を作って対応しました。
  11. 開発のポイント 実行環境別のDriver設定要否 オプション 概要 開発環境 AWS Lambda 画面あり 画面なし Docker

    --headless=new --no-sandbox --disable-dev-shm-usage headless関連必須 不要 必須 必須 必須 --single-process ヘッドレス関連 不要 不要 不要 必須 --user-data-dir=/tmp 環境別設定 NG NG 不要 必須 --lang=ja-JP 言語設定 対象次第 対象次第 対象次第 対象次第 --allow-running-insecure-content --ignore-certificate-errors --disable-features=InsecureDownloadWarnings --unsafely-treat-insecure-origin-as-secure =http://xxx.com 非SSL対応 対象次第 対象次第 対象次第 対象次第 --password-store=basic --use-mock-keychain パスワード関連 ? ? ? ?
  12. Macで開発する際の注意事項 Google Chrome for Testingの binary指定方法 がわからない ChromeOptions#setBinary() に渡すべき値は .app

    フォルダの中の実行ファイルのフルパスです。 「Google Chrome for Testing.app/Contents/ MacOS/Google Chrome for Testing」 ダウンロードし たアプリケーシ ョンが壊れてい る Mac OS Xのファイルシステム拡張属性(Extended Attributes)が付いているので削除してください。 「xattr -rc ~/Documents/chrome-mac-arm64/ Google\ Chrome\ for\ Testing.app」
  13. AWS Lambda実行時に 無視しても動作するメッセージ selenium-javaの CHANGELOGを確認し、 WebDriver、Driver、 Browserのバージョン を合わせましょう。 警告: Unable

    to find version of CDP to use for 136.0.7103.93. You may need to include a dependency on a specific version of the CDP using something similar to `org.seleniumhq.selenium:selenium-devtools- v86:4.27.0` where the version ("v86") matches the version of the chromium-based browser you're using and the version number of the artifact is the same as Selenium's. Browserのバージョンに合うWebDriverが見つからない時に出る警告 警告メッセージ 対応方法 • WebDriver 4.27.0のサポートバージョンは 128〜131なので、136は対象外ということ がわかる。 • CDP: Chrome DevTools Protocolの略. • WebDriver v4.33.0はChrome136はサ ポート対象であることが確認できる。
  14. AWS Lambda実行時に 無視しても動作するメッセージ CreatePlatformSocket() failed: アドレスファ ミリはプロトコルによってサポートされていませ ん (97) 警告メッセージ

    コメント すいません、深掘りで きていないです。AWS Lambdaの設定でIPv6が 無効化されていると発 生するらしいのです が、結果として対応し なくてもプログラムは 意図した通り動作して います。