
AWS Lambda Python S3へファイルアップロードで別のS3にその暗号化ファイルをアップロード(1/3)
こんにちは。現在、AWSにつきまして、勉強させて頂いております者です。
今回は、AWSのLambda(Python)で、S3バケットにファイルがアップロードされたイベントで、別のS3バケットに、その暗号化ファイルをアップロードする方法につきまして、書かせて頂きたいと存じ上げます。
私はWSL(Windows10)を使用中で、WSL環境での説明になりますが、他の環境をお使いの方は、ご自身で環境に合わせてご対応頂きたく存じ上げます。
◆使うAWSサービス ・EC2仮想サーバー(Amazon Linux 2) ・S3バケット ・Lambda
◆対象者 ・AWSのアカウントを取得されておられます方 ・AWSコンソールのセキュリティステータス設定を全て完了されておられます方

◆事前にご準備頂くもの
・FileZillaのインストール ・TeraTermのインストール ・IAMロールの作成

※話が前後致しまして、大変、申し訳ありませんが、「ロール」につきまして、説明が巻末にございます。解り易く説明致しておりますので、そちらを先に、ご購読頂きたい次第です。
Appendix A →(3/3)の最後です。
※あともう一つ。AWSのセキュリティ対策としまして、S3に、「アクセスコントロール」というものが必要になります。テストをしてから、「どうしてS3にアクセス出来ないんだ」と、慌てないように、巻末のAppendix Bにて、ご説明致しております。話が前後して、大変、申し訳ありませんが、「始められます前に」、巻末の(3/3)のAppendix A、Appendix Bをご参照頂きますよう、宜しくお願い申し上げます。
◆概要
1. EC2インスタンスの作成 2. VenvでEC2内仮想環境構築 3. S3バケット作成 4. ライブラリデプロイ前のLambdaのテスト 5. pyminizipというファイル暗号圧縮ライブラリのLambda関数へのデプロイ 6. デプロイ済のLambda_function.zipをLambdaにアップロード 7. AWS料金節約の為、使用済みのS3バケットとEC2インスタンスの削除

1. EC2インスタンス作成
(1)AWSコンソールから、EC2を選択し、EC2インスタンスを起動します。

(2) 「Amazon Linux 2」を選択します。

(3)無料枠の「t2.micro」サービスを選択します。

(4) 詳細を設定します。

(5)ストレージの追加をします。

(6)タグの追加もそのままで、次の「セキュリティグループの設定」へ進みます。

(7) 内容を確認し、「確認と作成」へ進みます。

(8)インスタンス作成の確認をしインスタンスを起動します。

(9)キーペアを作成します。 適当な名前を決めて下さい。そして必ず、「キーペアのダウンロードをした後で」 インスタンスを作成します。キーペアは、WindowsのDownloadsフォルダに格納されます。

※EC2インスタンスは、起動までに約10分以上時間がかかります。
(10) EC2インスタンスが起動したら、パブリックIPアドレスとパブリックDNSをメモするか、こちらの画面のスクリーンショットを撮っておきます。

2. VenvでEC2内仮想環境構築
(1)TeraTermを起動し、このまま「OK」を押します。

(2)ユーザー名に「ec2-user」と入力し、認証方式は「RSA/DSA/ECDSA/ED25519鍵を使う」を選択し、右側の「…」ボタンを押すと、Windowsのエクスプローラが開くので、Downloadsフォルダから、先程ダウンロードしたキーペアをクリックします。

(3)「OK」を押したら、EC2環境に入ることが出来ました。プロンプトには、[ec2-user@ip-*******]$と表示されればOKです。

(4)Venvを使い、EC2内に仮想環境を作ります。
a. Python3をインストールします。
【注意】インストールする為に、Ubuntuなどでは、「apt 」を使いますが、現在は、Amazon Linux 2 環境内におりますので、「yum」を使います。
$ sudo yum install python3 -y
b. Venv(旧Virtualenv)を使い、仮想環境を作ります。
$ python3 -m venv ***/env
「***」の部分は、好きな環境名を決めて下さい。
c. 仮想環境に入ります。
[ec2-user ~]$ source ~/***/env/bin/activate
上手く入れたら、プロンプトの先頭に(env)が追加されます。
(env)[ec2-user@~]$
d. pipの最新版をインストールします。
(env)[ec2-user@~]$ pip install pip --upgrade
e.開発に必要なBoto3ライブラリをインストールします。
(env)[ec2-user@~]$pip install boto3
f.「pyminizip」というファイル暗号圧縮ライブラリもインストールしておきます。
(env)[ec2-user@~]$ sudo yum install -y gcc zlib-devel
(env)[ec2-user@~]$ pip install pyminizip
g.最後に、Venv環境から抜けます。
(env)[ec2-user@~]$ deactivate
h. プロンプトが元に戻ります。
[ec2-user@~]$
i. 接続を終わります。右上の×を押し、切断しますか?で「OK」を押します。

3. S3バケットを2つ作ります。
コンソールで、「read用」と「write用」のS3バケットを2つ作ります。
(1) コンソールから、S3を選択し、「バケットを作成する」を押します。

(2) 世界でユニークな(唯一ひとつだけの)名前をつけ、日本在住の方は、東京リージョンのままで、次へ進みます。(バケットを2つ作るので、名前の末尾に、それぞれreadとwriteをつけると解り易い)

(3)そのまま「次へ」を押します。

(4)S3にアクセス出来ない問題が発生したら困るので、テストとして「完了後、直ぐに削除する前提で」パブリックアクセスをONにします。

(5)確認し、S3バケットを作成します。

(6)同様のことを繰り返し、read用とwrite用にS3バケットを2つ、作成します。

4.ライブラリデプロイ前のLambdaのテスト
まずは簡単な動作から、確認します。簡単なLambda関数を作成します。
(1)コンソールから、Lambdaを選択し、「関数の作成」ボタンを押します。

(2)「設計図の使用」と「s3-get-object-python」を選択し、画面を下にスクロールさせて「設定」を押します。

(3)詳細を設定します。実行ロールというのは、Lambdaに与えられる権限のことです。作成済なら、「既存のロールを使用する」を選択し、トリガーは、作成した「read用の」S3バケットを指定します。トリガーとは、これから作戦するLambda関数を呼び出す「引き金となる」イベントのことです。ここで、read用のS3バケットに、動作が起こった場合に、Lambdaの関数が実行されます。

(4) テストの際は、「トリガーの有効化」のチェックを外しておいても良いですが、忘れない為に、チェックしておきます。

(5)「関数の作成」を押します。

(6)関数が作成されたら、中央の「Lambda_function」のボタンをクリックして、Lambda関数を編集します。

(7)まずは一旦、表示されているコードを全て削除して、「こちらの画面の通りに」コードを書き、右上の「保存」ボタンを押して下さい。

AWS Lambda(2/3)へ続く