【ESP32でAmazon自動注文ボタン】Lambda関数で自動注文スクリプトの準備する

DIY
スポンサーリンク

Amazon自動注文ボタンをESP32で作ろうとしています。
前回の記事ではローカル環境でAmazon自動注文スクリプトを作成できたので、今回と次回のブログでその自動注文スクリプトをAWS Lambda関数で実行できるようにします。
本ブログではAWS Lambda関数の事前準備を実施します。

●自動購入スクリプト
・Python 3.7
・Selenium 3.141.0
・headless-chromiumのバージョンはv1.0.0-37(chromium 64.0.3282.167)
・chromedriverのバージョンはv2.37(Supports Chrome v64-66)
●AWS Lambda
・Python 3.7

 

はじめに

本記事は「ESP32でAmazon自動注文ボタン」の作成手順をまとめた連載記事の1つです。

前の手順

【ESP32でAmazon自動注文ボタン】自動購入スクリプトを作成する(ローカル環境で)
Amazon自動注文ボタンをESP32で作ろうとしています。 本記事はローカル環境で自動購入スクリプトを作成する手順をまとめました。

 

次の手順

【ESP32でAmazon自動注文ボタン】Pythonの自動注文スクリプトをAmazon Lambda上で動作させる
Amazon自動注文ボタンをESP32で作ろうとしています。 本記事はLambda関数で自動購入スクリプトを実行する手順をまとめました。

 

手順全体や関連情報まとめ

 

 

自動注文スクリプトをLambda関数で実行するための方針

前ブログで作成した自動注文スクリプトをLambda関数に書き込んだだけではうまく動作しません。
Lambda関数はランタイムとして標準的な実行環境しか準備されていないため、外部のPythonスクリプトやChromeドライバなどは事前準備する必要があります。
また、Lambda関数上で秘密情報を直接扱うのはAWSベストエフォートとして問題ありそうなので、秘密情報は「AWS Systems Managerのパラメータストア」を利用することにします。

 

そのため、本ブログでは自動注文スクリプトをLambda関数で実行できるようにするため、以下の事前準備をします。

【本ブログのターゲット(AWS Lambda関数の事前準備)】

  • Lambdaレイヤーを作成する
  • AWS Systems Managerのパラメータストアに秘密情報を登録する
  • Lambda関数用のIAMポリシーを作成する

 

その後、次回ブログで以下の設定をします。

【次回ブログのターゲット(Lambda関数の作成~動作テスト)】

  • Lambda関数を作成する
  • Lambda関数に自動注文スクリプトを登録する
  • Lambda関数にLambdaレイヤをアタッチする
  • Lambda関数にIAMポリシーをアタッチする
  • Lambda関数の基本設定を変更する
  • 自動購入スクリプトの動作確認

 

以下では、AWS Lambda関数の事前準備する手順をまとめます。

Lambdaレイヤーを作成する

PythonでSeleniumを実行するためには、Seleniumライブラリやheadless-chromium、chromedriverといったソフトウェアが必要となり、pipやaptでPythonの実行環境にインストールする必要があります。
一方、AWS Lambdaのデフォルト設定ではPythonの実行環境のみの提供であり、pipやaptなどでインストールした外部ライブラリについては事前にその実行環境にインストールされるように設定しないといけません。
その設定方法として、AWS Lambdaでは「Lambdaレイヤ」と呼ばれるものがあります。

ここではまず、Selenium、chromedriver、headless-chromiumはAWS Cloud9で構築し、それをZIPファイル化します。

用途ZIPファイルの名前Lambdaレイヤの名前
PythonのSeleniumライブラリpython.zipselenium
(レイヤにZIPファイルを紐づけ)
headless-chromiumと
chromedriver
headless
_[headless-chromiumのバージョン]
_[chromedriverのバージョン].zip
headless
(ZIPファイルはS3に格納し、
レイヤにはS3のURLを紐づけ)

以下に簡単な構築手順をまとめました。

AWS LambdaレイヤにアタッチするZIPファイルを作成する

AWS LambdaレイヤにアタッチするZIPファイルを2つ作成します。

  • python.zip
    • Seleniumを格納したZIPファイル
    • [python/lib/python3.7/site-packages/*]にSeleniumをインストールします。
  • headless_[headless-chromiumのバージョン]_[chromedriverのバージョン].zip
    • headless-chromiumとchromedriverを格納したZIPファイル
    • [headless/*]に各ファイルをダウンロードします。

 

以下に、AWS Lambdaレイヤ用の環境を準備する方法をまとめました。

  1. AWSマネージメントコンソールにログインする。
  2. AWS Cloud9」にアクセスして、[Create environment]をクリックする。
  3. [Name environment]画面が開いたら、Name、Descriptionを入力して[Next step]をクリックする。
設定項目設定例
Name任意のCloud9の環境名
(例: python_for_lambda)
DescriptionCloud9の環境の説明
(オプションのため空欄でも可)

 

  1. [Configure settings]画面が開いたら、EC2の最小構成を選択して[Next step]をクリックする。
設定項目設定例
Environment type Create a new EC2 instance for environment(direct access)
Instance typet2.micro (1 GiB RAM + 1 vCPU)
PlatformAmazon Linux 2 (recommended)
Cost-saving settingAfter 30 minutes (default)
LAM roleAWSServiceRoleForAWSCloud9(固定)

 

  1. [Review]画面が開いたら、内容を確認して問題なければ、[Create environment]をクリックする。
  2. EC2の生成が完了したら、以下のようにEC2の編集画面が出てくる。

 

  1. 下部にあるコマンドコンソール部分で以下のコマンドを実行し、Seleniumをインストールする。
$ pip install selenium==3.141.0 -t python/lib/python3.7/site-packages

 

  1. 同じく下部にあるコマンドコンソール部分で以下のコマンドを実行し、headless-chromiumとchromedriverをダウンロードする。
【headless-chromiumのダウンロード】
$ mkdir -p headless
$ curl -SL https://github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-37/stable-headless-chromium-amazonlinux-2017-03.zip > headless-chromium.zip
$ unzip -o headless/headless-chromium.zip -d ./headless 
$ rm headless/headless-chromium.zip

【chromedriverのダウンロード】
$ curl -SL https://chromedriver.storage.googleapis.com/2.37/chromedriver_linux64.zip > chromedriver.zip
$ unzip -o chromedriver.zip -d ./headless 
$ rm headless/chromedriver.zip

 

  1. pythonフォルダをpython.zipという名前でダウンロードする。
  2. headlessフォルダをheadless_[headless-chromiumのバージョン]_[chromedriverのバージョン].zipという名前でダウンロードする。

Selenium、headless-chromiumとchromedriverをダウンロード完了すると、Cloud9のフォルダ構成は以下のようになっていると思います。
各フォルダを[右クリック > ダウンロード]を選択することでZIPファイルとしてダウンロードできます。

 

 

 

Selenium用のLambdaレイヤを作成する

前手順で作成したSeleniumライブラリが格納された「python.zip」を起動させるLambdaレイヤを作成します。

以下に、AWS Lambdaレイヤ用の環境を準備する方法をまとめました。

  1. AWSマネージメントコンソールにログインする。
  2. AWS Lambda」にアクセスする。
  3. 左側のメニューから「その他のリソース > レイヤー」を選択し、「レイヤーの作成」をクリックする。
  4. 「レイヤー設定」画面が表示されるので、以下の設定例を参考に入力し、下部の「作成」ボタンをクリックする。
設定項目設定例
名前selenium
説明任意のものを記入
アップロード方法「.zipファイルをアップロード」にチェック
アップロード対象「python.zip」をアップロード
互換性のあるアーキテクチャ「x86_64」にチェック
互換性のあるランタイム「Python 3.7」を選択

 

  

「レイヤー seleniumのバージョン*が正常に作成されました。」と表示されれば、作成完了です。

 

chrome関連ファイル用のLambdaレイヤを作成する

headless-chromiumとchromedriverをまとめたZIPファイルはサイズが大きいため、AWS Lambdaレイヤの「.zipファイルをアップロード」で設定するとエラーとなってしまいます。

 

そのため、headless-chromiumとchromedriverをまとめたZIPファイルはS3に格納したうえで、「Amazon S3からファイルをアップロードする」でLambdaレイヤの設定を行います。

 

chrome関連のZIPファイルをS3に格納する

  1. AWSマネージメントコンソールにログインする。
  2. AWS S3」にアクセスする。
  3. メニューから「バケット」を選択して、「バケットを作成」ボタンをクリックする。
  4. 「一般的な設定」画面が開くので、以下の設定値を入力し、下部にある「バケットを作成」ボタンをクリックする。
設定項目設定例
バケット名headless-chromium-yyyymmddhhmm
※「yyyymmddhhmm」に日付を入れて一意な名称にしてます
AWSリージョンアジアパシフィック(東京) ap-northeast-1

※自分は、上記設定以外はデフォルトのままに設定しましたが、ご自分の環境に合わせて設定してください。

 

パケット「headless-chromium-yyyymmddhhmm」が正常に作成されました。」と表示され、バケット一覧に作成したバケット名が表示されれば、バケット作成は完了です。
次に、そのバケットにchrome関連のZIPファイルを格納します。

 

  1. バケット一覧の中から、上で作成したバケット名をクリックする。
  2. オブジェクトタブを選択し、「アップロード」ボタンをクリックする。

 

  1. 「アップロード」画面が開いたら、ファイルとフォルダの「ファイルを追加」をクリックして、前章で作成した「headless.zip」をアップロードする。
  2. 「アップロード」画面右下の「アップロード」ボタンをクリックする。

「アップロードが成功しました。」と表示されれば、S3の設定完了です。

 

  1. S3にアップロードした「headless.zip」のオブジェクトURLをメモする。

 

chrome関連ファイル用のLambdaレイヤを作成する

前章で作成したChrome関連ファイルが格納された「headless.zip」を起動させるLambdaレイヤを作成します。

以下に、AWS Lambdaレイヤ用の環境を準備する方法をまとめました。

  1. AWSマネージメントコンソールにログインする。
  2. AWS Lambda」にアクセスする。
  3. 左側のメニューから「その他のリソース > レイヤー」を選択し、「レイヤーの作成」をクリックする。
  4. 「レイヤー設定」画面が表示されるので、以下の設定例を参考に入力し、下部の「作成」ボタンをクリックする。
設定項目設定例
名前headless
説明任意のものを記入
アップロード方法「Amazon S3からファイルをアップロードする」にチェック
Amazon S3のリンクURLS3にアップロードした「headless.zip」のオブジェクトURL
互換性のあるアーキテクチャ「x86_64」にチェック
互換性のあるランタイム「Python 3.7」を選択

 

  

「レイヤー headlessのバージョン*が正常に作成されました。」と表示されれば、作成完了です。

 

 

 

AWS Systems Managerのパラメータストアに秘密情報を登録する

「AWS Systems Manager」に以下のようなパラメータを登録する方法をまとめました。

パラメータ名
AmazonLoginIDご自分のAmazonアカウントのログインID
AmazonLoginPassWordご自分のAmazonアカウントのログインパスワード

 

  1. AWSマネージメントコンソールにログインする。
  2. AWS Systems Manager」にアクセスして、左側のメニューにある「パラメータストア」をクリックする。
  3. 「AWS Systems Manager パラメータ」画面が開くので、「パラメータの作成」をクリックする。
  4. 「パラメータを作成」画面が開くので、以下の設定項目を入力し、右下の「パラメータを作成」をクリックする。
設定項目設定例
(AmazonLoginID)
設定例
(AmazonLoginPassWord)
名前AmazonLoginIDAmazonLoginPassWord
説明任意同左
利用枠「標準」を選択同左
タイプ「安全な文字列」を選択同左
KMS キーソース「現在のアカウント」を選択同左
KMSキー ID「alias/aws/ssm」を選択同左
ご自分のAmazonアカウントの
ログインID
ご自分のAmazonアカウントの
ログインパスワード

 

「アクティベーション~」と表示されればOKです。

 

 

 

Lambda関数用のIAMポリシーを作成する

Lambda関数では以下の処理をするため、IAMポリシーで権限を付与します。

  • LambdaレイヤでS3からZIPファイルをダウンロードする
  • Lambda関数からSystems Manager(SSM)にアクセスする

 

 

  1. AWSマネージメントコンソールにログインする。
  2. IAM」にアクセスする。
  3. 左側のメニューにある「ポリシー」をクリックする。
  4. 「ポリシーの作成」画面が開いたら、「JSON」タブを選択し、以下のJSONコードを入力して、右下にある「次のステップ:タグ」をクリック
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:GetParameters"
            ],
            "Resource": [
                "arn:aws:ssm:*:*:parameter/AmazonLoginID",
                "arn:aws:ssm:*:*:parameter/AmazonLoginPassWord"
            ]
        }
    ]
}

 

  1. 「タグを追加(オプション)」画面が開いたら、右下の「次のステップ:確認」をクリックする。
  2. 「ポリシーの確認」画面が開いたら、以下の設定項目を入力し、右下の「ポリシーの作成」をクリックする。
設定項目設定例
名前任意のポリシー名
(例: autoPurcaserPolicy)
説明任意

 

 

「The policy xxxxx has been created」と表示されればOKです。

 

 

 

 

さいごに

「ESP32でAmazon自動注文ボタン」に向けて、Lambda関数の事前準備をしました。
引き続き、「ESP32でAmazon自動注文ボタン」の作成手順をまとめています。

前の手順

【ESP32でAmazon自動注文ボタン】自動購入スクリプトを作成する(ローカル環境で)
Amazon自動注文ボタンをESP32で作ろうとしています。 本記事はローカル環境で自動購入スクリプトを作成する手順をまとめました。

 

次の手順

【ESP32でAmazon自動注文ボタン】Pythonの自動注文スクリプトをAmazon Lambda上で動作させる
Amazon自動注文ボタンをESP32で作ろうとしています。 本記事はLambda関数で自動購入スクリプトを実行する手順をまとめました。

 

手順全体や関連情報まとめ

 

 

 

参考情報

 

以上!

コメント

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