【AWS Lambda関数作成】selenium + AWS lambda開発環境の構築



## はじめに
AWSの開発環境の構築の備忘録です💁
初心者です😅
間違えてる部分多々あると思います。
もし見つけた場合、ツッコミいただけると助かります🙇
<br>
環境構築はかなり苦労しました。
なので図にしてみました。
わかりづらい部分もあるかと思います。
ただ、図にするのは時間がかかってしまうのがデメリットですが、理解の落とし込みはかなりしやすいなと感じました。


## 🦁<INS>**結論**</INS>🦁
## 手順
1. Cloud Shellを開く
2. Pythonのバージョン確認
3. Seleniumのインストール（バージョン3.141.0）
4. CloudShell上で保存用ディレクトリを作成
5. chromedriverをダウンロードして展開
6. headless-chromiumをダウンロードして展開
7. いらなくなったzipファイルの削除
8. headlessディレクトリをzip化
9. S3のバケット作成
10. zipファイルをS3にコピーする
11. Seleniumレイヤーの作成
12. headlessレイヤーの作成
13. 関数の作成
14. 関数にレイヤーを追加


:::note info
押さえておくべき点
* AWS Lambda関数にseleniumなどを使う場合に手順を踏んでimportする必要がある。
* AWSサーバーを活用するスクレイピングはheadlessモードで行う。
* pipは「pip3」を使う。
* Pythonパッケージ（selenium）の保存先は<INS>**./python/lib/python3.7/site-packages**</INS>
:::  
***
:::note alert
注意点
* Pythonパッケージ（pypl）にあるものはディレクトリが指定されてる<INS>**（./python/lib/python3.7/site-packages）**</INS>
* Pythonパッケージ以外のものは<INS>**ホームディレクトリに新しくディレクトリを作成する**</INS>（Chrome driver,dockerなど）
* ファイルサイズは直接アップロードする場合には50MB（ZIP形式）、解凍後のサイズで250MBまで
* Pythonパッケージ（selenium）の保存先は./python/lib/python3.7/site-packages
:::  

***
## <INS>**前提**</INS>🙊
* アカウントの作成が完了してる
やり方がわからない方は[  コチラ🐒](https://qiita.com/nyanyacyan/items/f533938e4f5d7960a32e)
***

## 今回、importが必要なもの
### Pythonパッケージ
* 「selenium 3.141」

### Pythonパッケージ外のもの
* 「chromedriver 2.43」
* 「headless-chromium v1.0.0-55」

バージョンはこの組み合わせが良さそうです。
もし他にもある場合、教えていただけると助かります！

:::note info
Pythonパッケージとは
* PyPI（Python Package Index）に存在しているものはPythonパッケージと呼ばれます。
* PythonのライブラリはPythonパッケージの一部であり、例としてrequestsやseleniumなどがあります。
* “Chrome driver” や “headless-chromium” など、Googleが提供しているものやDockerなどは、Pythonパッケージではなく、Python以外の外部ツールやプログラムです。
:::  

## 全体図
![スクリーンショット 2023-12-13 7.08.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522630/bc4cddcc-4629-6fe1-f01c-f55684715851.png)
<br><br>



## Cloud Shellを開く
AWSの検索バーで「AWS CloudShell」と検索して起動する。  
<br><br>


## Pythonのバージョン確認
```
python3 --version
```
Python 3の場合、バージョンはPython 3.7となってるはずです。
今回はこのまま利用します。  
<br><br>

## Seleniumのインストール（バージョン3.141.0）
CloudShell上でpipを利用して、 ./python/lib/python3.7/site-packages 配下にSeleniumをダウンロードします。
```
pip3 install selenium==3.141.0 -t ./python/lib/python3.7/site-packages --use-feature=2020-resolver
```

Pythonディレクトリをローカル環境にDLできるようにzip化します。
```
zip -r python python
```
※zip化ができてるかは「ls」にて確認ができます。<br><br>
  
![スクリーンショット 2023-12-13 7.10.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522630/a8494ac9-f4da-bb73-6532-724372648728.png)


## CloudShell上で保存用ディレクトリを作成
CloudShell上で保存用ディレクトリを作成
```
mkdir headless
```  
<br>

![スクリーンショット 2023-12-13 7.11.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522630/5412ec2d-3488-bcca-ab8a-f5da63fbd136.png)

<br><br>

## chromedriverをダウンロードして展開
chromedriverのバージョンは2.43を利用(headless-chromiumのchromeバージョンとの互換性のため）
```
curl -SL https://chromedriver.storage.googleapis.com/2.43/chromedriver_linux64.zip > chromedriver.zip
```  

chromedriverを展開
```
unzip -o chromedriver.zip -d .
```  
<br>

![スクリーンショット 2023-12-13 7.25.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522630/9a4d33eb-f013-98bd-af04-9d852b78833f.png)


<br><br>

## headless-chromiumをダウンロードして展開
```
curl -SL https://github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-55/stable-headless-chromium-amazonlinux-2017-03.zip > headless-chromium.zip
```  

headless-chromiumを展開
```
unzip -o headless-chromium.zip -d .
```  
<br>

![スクリーンショット 2023-12-13 7.13.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522630/9d740e20-ad7e-5ffd-f214-7088770b815e.png)

<br><br>


## いらなくなったzipファイルの削除
chromedriverとheadless-chromiumのいらなくなったzipファイルを削除
```
rm chromedriver.zip
```  
```
rm headless-chromium.zip
```  
<br>

![スクリーンショット 2023-12-13 7.15.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522630/f117edae-1943-1f32-c698-0aeca36f6d72.png)



※zip化ができてるかは「ls」にて確認ができます。  
<br><br>



## headlessディレクトリをzip化
homeディレクトリに戻り、headlessディレクトリをzip化
```
cd
zip -r headless headless
```  
<br>

![スクリーンショット 2023-12-13 7.15.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522630/8f996ae0-6118-b0e4-49ad-ae0aa60740f0.png)

<br><br>



## S3のバケット作成
バケットの作成を選択。
AWS リージョンを「アジアパシフィック（東京）ap-northeast-1」を選択。
パケット名を入力（今回は「selenium-work」と入力）

その他はデフォルトのままでOK。
バケットを作成を選択。
<br><br>

![スクリーンショット 2023-12-13 7.18.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522630/4a890363-2d3c-3fc0-80ea-5298cbc74c48.png)
<br><br>



## zipファイルをS3にコピーする
zip化したファイル（python.zip, headless.zip）を、CloudShellからS3へコピーを行う。
```
aws s3 cp python.zip s3://selenium-work
```  


```
aws s3 cp headless.zip s3://selenium-work
```  
<br>

![スクリーンショット 2023-12-13 7.19.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522630/1c2cdfd0-da2a-822d-fe1b-b73c3623ce8e.png)


<br><br>



## Seleniumレイヤーの作成
AWSの検索メニューで「 lambda」と入力して「AWS Lambda」の画面を開く。
ハンバーガーメニューから「レイヤー」を選択。
レイヤーの作成を選択。
「名前」を作成（今回は「selenium-layer」と入力）
「Amazon S3 からファイルをアップロードする」を選択。
Amazon S3 のリンク URLを貼り付ける（今回は「s3://selenium-work/python.zip」を貼り付ける）
x86_64を選択。
互換性のあるランタイム - オプションは「Python3.7」を選択。
作成を選択。
<br><br>

![スクリーンショット 2023-12-13 7.20.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522630/5911d513-ea45-8ee7-798b-5e265f83f502.png)

<br><br>



## headlessレイヤーの作成
レイヤーの作成を選択。
「名前」を作成（今回は「headless-layer」と入力）
「Amazon S3 からファイルをアップロードする」を選択。
Amazon S3 のリンク URLを貼り付ける（今回は「s3://selenium-work/headless.zip」を貼り付ける）
x86_64を選択。
互換性のあるランタイム - オプションは「Python3.7」を選択。
作成を選択。
<br><br>

![スクリーンショット 2023-12-13 7.21.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522630/b43a3ad8-5cdd-9e39-3a85-917e192dec44.png)

<br><br>



## 関数の作成
ハンバーガーメニューから「関数」を選択。
「関数を作成」を選択。
「一から作成」を選択。
関数名を入力(今回は「scraper」とします)
ランタイムは「Python3.7」を選択。
アーキテクチャは「x86_64」を選択。
「関数の作成」を選択。
<br><br>



## 関数にレイヤーを追加
※「selenium-layer」と「headless-layer」の２回分を実装が必要。
関数の作成が完了したら、下の方にある「レイヤー」から「レイヤーの追加」を選択。
レイヤーソースは「カスタムレイヤー」を選択。
バージョンは最新のものを選択。
追加を選択。
<br><br>

![スクリーンショット 2023-12-13 7.22.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522630/f95b8039-1c1b-dc24-acec-6a3f180a5c5f.png)

<br><br>

## 設定をする
設定の中の「一般設定」をクリック。
「編集」をクリック。
メモリを「256」MBに変更する。
タイムアウトを5分にする（コードの内容によって変更）

## 参考にしたサイト📗
[AWS Lambda PythonでSeleniumを使える環境を構築する](https://dev.classmethod.jp/articles/aws-lambda-python-selenium-make-env/)

***

AWS Lambda関数作成 セクション　リンク
1. [<INS>AWSアカウントの作成](https://qiita.com/nyanyacyan/items/f533938e4f5d7960a32e)
2. [<INS>AWSの開発環境の構築](https://qiita.com/nyanyacyan/items/d1dd2fb874725226f9da)
3. [<INS>Lambda関数の開発とデバッグ](https://qiita.com/nyanyacyan/items/9644db9eb01bdc91d85b)
5. [<INS>IAMロールの作成と設定（途中まで作成したら、Step Functionsを設定する必要あり）](https://qiita.com/nyanyacyan/items/8b0bba4fe59b0c06a946)
6. [<INS>AWS Step Functionsの設定とデバッグ（完了後、IAMの権限にStep Functionsを追加）](https://qiita.com/nyanyacyan/items/004e0dc6145a0fc90b1d)
7. [<INS>API Gateway（発火API）の設定とデバッグ](https://qiita.com/nyanyacyan/items/3cd13fc016103d1de5c1)
8. [<INS>API Gateway（状態維持API）の設定とデバッグ](https://qiita.com/nyanyacyan/items/e96686b5b54b4059d2aa)
9. [<INS>Python（local環境）の開発とデバック](https://qiita.com/nyanyacyan/items/d76e98b0e6e9d9665a54)