Python3.11×Lambda×Seleniumを動かす方法（docker-selenium-lambda）

## はじめに
Python3.7がLambdaで利用できなくなるということで、新しくPython3.xのバージョンアップを行ってSeleniumを動かうための環境を作ったので、メモを残しておきます。

## 変更前のLambdaの環境
環境はこんな感じ
* Python3.7
* SeleniumとWebDriverはLayerで追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736577/e0856f3b-43fa-50ba-a845-d46f97d13077.png)


## 実現したい環境
* Python3.11
* Seleniumを動かす環境
※本当はRequestとBeautifulSoupで処理したほうが早いと思ったけど、
　今の機能を踏襲する意味で変更しないこととしました。

### Python3.8以降へそのまま移行できない理由
調べてみるとヒットしますが、Python3.7以前と3.8以降では動くOSが違うようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736577/a04a31fb-46c3-54c9-6816-3e5562aae79f.png)
引用元：[Lambda ランタイム](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html "Lambda ランタイム")

そのままLayerの考え方で作り込んでも動かないという背景があるので、大きく作り変える必要があります。

### 実現するために使おうとしているもの
以下のGitHubで登録されているリポジトリを利用して、Lambdaの関数登録を行います。
[GitHub:docker-selenium-lambda](https://github.com/umihico/docker-selenium-lambda?search=1 "docker-selenium-lambda")


## 設定の大まかな手順
1. ローカルマシンにDockerをインストールする
1. Node.jsをインストールする(インストールされていなかったら実施する)
1. AWS上でIam設定を行う
1. コマンドプロンプトでLambdaをデプロイできる設定を行う
1. サーバーレスフレームワーク(Serverless FW)をインストールする
1. プログラムをローカルに取得し、デプロイする
1. デプロイしたプログラムを動かしてみる


### ローカルマシンにDockerをインストールする
Dockerとはなにかと言うことは今回省略して、設定内容だけ残しておきます。
一応説明しているサイトはこちら。
https://knowledge.sakura.ad.jp/13265/


以下Docker本家サイトへアクセスし、該当OSのセットアップファイルをダウンロードする
https://www.docker.com/get-started/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736577/4a9ad105-047b-5aa6-0f9e-59e33b25da93.png)

インストール環境し開いてみるとこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736577/d94b8757-fd32-b79a-6364-028d2cdf6258.png)

左下のResource Server runningとなっていたらOKです。
なっていなかったら再度実行してみてください。

### Node.jsをインストールする(インストールされていなかったら実施する)
今回実現するためには、ローカルマシンへServerlessをインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736577/4f4f926d-2234-4ce9-bc49-efd9785ee6a6.png)

インストールは数分で終わります「


### AWS上でIAM設定を行う

プログラムをLambdaへ反映するのに必要な強さの権限を保持しておきます。

とりあえず反映が目的だったのですべての権限をFullAccessにしていますが、これは最低限必要な権限へ変更することをおすすめします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736577/63b0002c-6571-351f-b59f-225df72c0192.png)

設定した権限一覧
* AmazonEC2ContainerRegistryFullAccess
* AmazonElasticContainerRegistryPublicFullAccess
* AmazonS3FullAccess
* AWSCloudFormationFullAccess
* AWSCloudFormationReadOnlyAccess
* AWSCodeDeployRoleForCloudFormation
* AWSDeepRacerCloudFormationAccessPolicy
* AWSLambda_FullAccess
* CloudWatchLogsFullAccess
* IAMFullAccess


また、このあとのLambdaへのプログラム反映については、上の方にあるアクセスキーは必要なってくるので、未作成の場合は作成しておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736577/cefef4e7-1eda-69cb-8cc7-fd7b97f3ead5.png)


### コマンドプロンプトでLambdaをデプロイできる設定を行う
コマンドプロンプトを使ってプログラムをLambdaへ配置する準備をしていきます。

[事前準備]
コマンドプロンプトからAWSを操作するためのツールをインストールします。
[AWS CLI：AWSコマンドラインインターフェース](https://aws.amazon.com/jp/cli/ "AWS CLI")

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736577/98ec1d3c-22c6-8439-575c-4728624845dd.png)

コマンドプロンプトを立ち上げた上で、下記コマンドを入力しAWSの設定を行います。
```console
aws configure
```

入力するのは、以下3点です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736577/2e1cd913-e4c6-7221-1386-2729dbffe8d6.png)
* Access Key ID（アクセスキーID）
　→上で作成したアクセスキー
* Secret Access Key（秘密鍵）
　→アクセスキーを作成した時に一緒に登録されるキー
* Default region name（デフォルトのリージョン名）
　→基本は東京リージョンで良いと思うので「ap-northeast-1」でOK
※Default output formatは入力しなくてOKです


### サーバーレスフレームワーク(Serverless FW)をインストールする

Lambdaをサーバーレスフレームワークで構築するために、serverlessを利用してセットアップします。
(すでにインストール済みだった場合は、この手順をスキップしてください)

```console
npm install -g serverless
```


### プログラムをローカルに取得し、デプロイする
ローカルにGitHubで公開されているプログラムを取得＆展開します。

```console
$ sls create --template-url "https://github.com/umihico/docker-selenium-lambda/tree/main" --path docker-selenium-lambda && cd $_
```

上記コマンドにてプログラムが取得できたら、今度は実際にデプロイします。

```console
$ sls deploy
```

エラー原因は多岐にわたりますが、つまづくポイントとしてはIAM設定がミスしがちです。
まずは、上記で記載した権限を付与してみてください。

### デプロイしたプログラムを動かしてみる

下記コマンドで実際のでもプログラムを動かすことができます。

```console
$ sls invoke --function demo
```

デモプログラムは以下サイトの情報をスクレイピングして表示するというシンプルなものです。
https://example.com/

内容がうまく表示されるか確認してみてください。

エラーの場合は、再度手順を踏んでもらうか、こちらへコメントいただければわかる範囲で追記していきます！


### しておいたほうが良い設定
初期設定だとLambdaのメモリ利用サイズが非常に大きくなっています。
1回動かしてみて、実際に利用するメモリサイズに合わせて修正することをおすすめします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736577/82ef6c40-64ea-fb54-e884-6f14fa12de07.png)

このサイズが大きいと1回あたりの実行費用が高くなるため、費用がかかってしまいます。

変更するには、右の編集ボタンから入って、下図赤枠部分を更新＆保存することで設定されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736577/db8c237d-4e16-e790-999b-669cb202de22.png)



## 最後に
Layer利用からDockerからのデプロイに変わると、手順が大きく変わるので分かりづらいですよね。

ですが、一回やってみるとなんとなくコツが掴めると思いますので、ぜひチャレンジしてみてください！