AWS LambdaをAWS CLIで呼び出し、S3にファイルを格納する

## :libra: AWS Lambdaとは

**AWS Lambda**(エーダブルエス・ラムダ)は、**サーバレス・システム**の一つで、何らかのプログラムなどによる処理を行う際に、実行環境となるサーバを用意することなくそのプログラムを実行する環境を提供する新しい技術です。
特に、バッチ処理やオフライン処理を実行するのに適しています。

また、AWS Lambdaの実行基盤となるインフラ面(サーバリソースなど)はAWSが管理しているために、この部分についてのメンテナンス作業は不要で、利用側としては実行対象となるソースのみに集中すれば良く、コスト面・運用面でもメリットがあります。

本記事執筆時点で実行できるプログラムとして、Java、Go、PowerShell、Node.js、C#、Python、Rubyがあります。
ただし、処理の実行可能時間には上限があり、最大15分となっています(2020年8月現在)。


## :libra: この記事の目的

本記事では、AWS Lambdaを実行するためのAWSの環境設定と実行方法を確認したいと思います。
実行するプログラムとして、Python言語で文字列"Hello world."を出力するプログラムを用意し、Lambda関数として登録します。
そしてこのLambda関数を、AWSサービスをコマンドプロンプトから使用できる**AWS CLI**で実行し、その結果を**S3**(エススリー)にテキストファイルで格納する手順とします。
※AWS CLIはコマンド・ライン・インターフェースの略です。
※S3はSimple Storage Serviceの略で、AWSが提供するストレージサービスのことです。

:point_up:本記事の情報は、執筆2020年8月現在のものです。AWSのサービス内容は常に更新されますので、AWSのWEBサイトで最新情報を確認して下さい。
:point_up:Lambdaを実行すると料金が発生します。

## :libra: Lambda関数を作成する

**AWS Lambdaを実行する**とは、Lambda関数を実行することを意味します。よって、Lambda関数の作成から始めます。
前提条件として、AWSアカウントをすでに作成していることとします。

####①Lambda関数を新規作成する

(1) AWSマネジメントコンソール画面の上部のメニューから「サービス」→「コンピューティング」→「Lambda」を選択します(下図赤下線)。
![Screenshot from 2020-08-24 02-12-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/f8fa1dbd-ef0e-c2bc-3c04-92f5a6cd7f55.png)

(2)「関数の作成」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/916d0fe5-ba2a-4c4d-5704-8bc661380a08.png)

(3) 関数の作成オプションとして、「一から作成」を選択して下さい(デフォルトで選択されています)。
![Screenshot from 2020-08-24 02-25-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/08ace653-71e3-fde6-e084-5002494c73e3.png)

(4) 基本的な情報を設定します。
ここでは、以下の通り設定しました。

|設定項目|設定内容          |
|:-----:|:--------------:|
|関数名  |my_lambda_function |
|ランタイム|Python 3.8     |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/0c632f03-79a6-71d7-65ca-2c30d2dc4a7c.png)
アクセス権限の設定はデフォルトのままで構いません。
右下の「関数の作成」ボタンをクリックします。

Lambda関数が作成され、画面が切り替わります。

(5) Lambda関数を実装します。
画面が切り替わると以下の画面となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/12e9c37f-0fdc-3afa-076a-3225702f7293.png)
さらに下に進むと、下図のようなソースの編集枠が現れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/f2e61b22-7bfb-75d6-9613-43d59ed22ed1.png)
ここがLambda関数の実態になります。ここに実行したい処理を記述します。
今回はS3へファイルを格納するため、ソースを以下のように実装しました。

**※バケット名やオブジェクト・キー名は実際に使用する値に設定して下さい。**

```ruby:lambda_function
import boto3

# S3オブジェクトを取得
s3 = boto3.resource('s3')

# Lambdaが実行するプログラム本体の関数
def lambda_handler(event, context):
    
    # バケット名を指定
    bucket = 'tabata.myfirstbucket'
    # オブジェクトキーの定義(Lambdaがバケット内に書き出すファイル名に相当)
    key = 'lambda_outpu.dat'
    # ファイルに書き出す文字列
    puttext = 'Hello world.'
    # バケット名とオブジェクトキーを設定
    obj = s3.Object(bucket,key)
    # ファイルに書き出す文字列を設定
    obj.put(Body=puttext)
    # 関数終了
    return
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/ab9a3a75-04e8-0662-32fd-d72d0e772169.png)
(6) 右上の「保存」ボタンをクリックして保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/49a0d01a-83cd-59e2-379b-e64d568c6d63.png)

####②S3バケットへアクセスするIAMロールを作成する

Lambda関数からS3バケットへのアクセスを許可するためのIAMロールを作成し、Lambda関数に付与します。

(1) AWSマネジメントコンソール画面の上部のメニューから「サービス」→「セキュリティ、ID、およびコンプライアンス」→「IAM」を選択します(下図赤枠)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/e8fb14a7-b74c-f14e-2647-b3448c193327.png)
(2) 左枠のメニューから「ロール」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/cf3e2c21-15f7-3f97-218d-0cf666e6c41b.png)
(3) 「ロールの作成」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/c32a3aef-433c-26e4-c6be-6b3be30a0ff0.png)
(4) 下図を参考に、ユースケースとして「Lambda」を選択し、「次のステップへ」ボタンをクリックして下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/f645b660-ddab-7270-28e7-2f3aa5219454.png)
(5) 下図を参考に、アタッチするアクセス権限ポリシーを選択します。
緑色枠のように、検索欄に"lambda"と入力します。
赤色枠の通り「AWSLambdaBasicExecutionRole」にチェックを入れて下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/bba0be20-f6dd-aede-6382-4a1f55af7a0d.png)
「次のステップ」ボタンをクリックします。

(6) タグ名を設定します。
必要であれば、タグ名を入力して下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/2fdffda5-ad6b-83f9-4703-a0d5cd8fb42a.png)
「次のステップ」ボタンをクリックします。

(7) ロール名を設定します。
ロール名を「lambda-role」としました。
「ロールの作成」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/d03a1aa6-f864-9071-0311-853e124ccdae.png)

####③作成したIAMロールにS3バケットへのアクセス権ポリシーを付与する

(1) 下図の通り、作成したIAMロールを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/bce8d651-c82e-0d72-35ba-7c08245dd3a0.png)
(2)「アクセス権限」タブ内の「インラインポリシーの追加」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/e98142bf-e69d-1676-c583-9549c4aec145.png)
(3) 下図の通り、サービス項目「サービスの選択」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/5523893d-79de-1eb4-8538-703637d23697.png)
(4) サービス名から「S3」を選択して下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/0229e03b-adc6-1db5-1a7e-1d3ae5a69783.png)
(5) 下図の通り、アクション項目で「アクセスレベル」として「書き込み」にチェックを入れて下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/27e6edd9-0d75-9136-0661-eebf29819330.png)
(6) リソースとして「すべてのリソース」を選択するか、またはbucketのみ許可して下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/d15615a9-b9ef-28f5-ff53-ab9127ece145.png)
(7)「ポリシーの確認」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/e1256081-6187-09d3-ccd4-bc1da2039e80.png)
(8) ポリシーの確認画面で任意の名前を入力して下さい。
ここでは「lambda_function_policy」としました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/4e23a25d-317f-ef2f-364e-2317bbfc680c.png)
最後に「ポリシーの作成」をクリックします。
(9) 付与したポリシーが表示されていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/cf149c0f-1080-3dab-0b8a-49a943776b7a.png)

####④IAMロールをLambda関数の実行ロールとして設定する

(1) AWSマネジメントコンソール画面の上部のメニューから「サービス」→「コンピューティング」→「Lambda」を選択します(下図赤枠)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/fec359a6-42c0-cdb3-73c5-6b7221a27b9b.png)
(2) 作成したLambda関数を選択して下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/172a3851-6f16-b534-aa58-ee8321c06a18.png)
(3) 下図の通り、「アクセス権限」タブを選択し、「編集」ボタンをクリックして下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/d2933b8f-ea04-3215-5d16-0ddfd46fe47c.png)
(4) 下図を参考に、「説明 - オプション」欄が空欄の場合は入力して下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/776ca257-05c6-adf8-9ce3-4a4b74e81bf9.png)
(5) 下図を参考に入力して下さい。
　・メモリ容量の調整が必要な場合は、修正して下さい。
　・タイムアウトの調整が必要な場合は、修正して下さい。
　・既存のロールで、作成したロールを選択して下さい(赤枠)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/35cc9c68-23f7-d128-581d-82aba0241cb3.png)
最後に「保存」ボタンをクリックして下さい。

####⑤Lambda関数の実行テスト

作成したLambda関数が実際に実行されるか、テストします。

(1) 下図の通り、「テスト」ボタンを選択して下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/3002d915-91e9-40de-5e4a-03891cc2ab9d.png)
(2) 「イベント名」を入力して下さい(任意の名前)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/357b2dbe-712a-5cdf-2a4f-4ede75eb6cf9.png)
(3) 「作成」ボタンをクリックして下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/8d67e03e-b02a-f774-87c9-5f78f3b317b1.png)
(4) 「テスト」ボタンを選択して下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/aa7074cf-e100-1851-fea6-3e3cb98cfc27.png)
(5) テスト結果を確認します。
特にエラーが発生していなければテストはOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/9ab5d805-b463-12c7-ba9d-1a0460c427a3.png)
※念のため、S3バケットにファイルが格納されたことを確認して下さい。
※ファイルの内容に「Hello world.」と記載されていればLambda関数の作成は完了です。

## :libra: AWS CLIからLambdaを実行する

Lambda関数の作成は完了しましたので、実際にコマンドプロンプトからLambda関数を実行します。
コマンドプロンプトでAWS CLIが使用できることを予め確認します。
`aws --version`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/76ee0744-2eb7-5d80-13a8-deaaa2fe7649.png)


####①awsコマンドの事前設定を行う

以下のコマンドを実行して事前設定を行います。
`aws configure`

入力項目は以下となります。

(1)アクセスキーID(Access Key ID)
(2)シークレットアクセスキー(Secret Access Key)
　上記(1)(2)の確認方法は、以下を参考にして下さい。

　■AWS S3の始め方 ～ バケットにファイルを格納する
　　→「②アクセスキーIDとシークレットアクセスキーの作成」の章
　https://qiita.com/ttlabo/items/ea802f98418d229681fb


(3)Default region name
　実行するリージョンを設定します。ここでは ap-northeast-1 としました。
(4)Default output format
　関数の実行後のレスポンスのデータ形式を指定します。ここでは json としました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/951c1e07-0c0f-e2da-49e5-834ea664814d.png)


####②Lambda関数を実行するコマンド

Lambda関数を実行するためのコマンドは以下です。

`aws lambda invoke --function-name my_lambda_function --payload '{ "key": "" }' response.json`

コマンドの意味は以下です。

**--function-name**
　実行するLambda関数名を指定します。
**--payload**
　入力パラメータです。今回はパラメータ無しのため、key=""としています。
**response.json**
　AWS CLIが関数からのレスポンスを書き込むファイルの名前です。

####③awsコマンドでLambda関数を実行する

上記のaws lambda...コマンドを実行します。
実行後、Lambda関数の処理によりS3にファイルが格納されればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/a884bc87-147b-0d8c-9817-f40a3784335f.png)


## :libra: 関連情報

■Lambda 実行ロールに Amazon S3 バケットへのアクセスを許可するにはどうすればよいですか?(AWS公式ドキュメント)
https://aws.amazon.com/jp/premiumsupport/knowledge-center/lambda-execution-role-s3-bucket/

■AWS S3の始め方 ～ バケットにファイルを格納する
https://qiita.com/ttlabo/items/ea802f98418d229681fb


## :libra: ご意見など

ご意見、間違い訂正などございましたらお寄せ下さい。