AWS Lambdaビギナーがテストイベントを作成して関数を実行するまで。


### Lambdaとは

- アップロードした関数を実行してくれる
- 実行環境はJavaScript, Java, C#, Python
- アップロードされた関数は都度実行され、終わると破棄されるステートレスな構成
- 最大稼働時間は5分
- 課金単位が「実行時間」なので、実行されていない時は費用がかからない
- API Gatewayと組み合わせると、Lambda関数をREST形式のWeb APIとして呼び出すことができる
 
### Lambda関数

- Lambda関数はS3(Simple Storage Service)やSES(Simple Email Services)などで発生するイベントをトリガーとして呼び出される

### Lambdaを使うまで

以下、Lambdaを使うまでの手順を紹介します。

#### IAMを設定する

まずはIAMを設定します。
IAMはIdentity and Access Managementの略で、IAMで作成したユーザーに対して、AWSリソースに対するユーザー認証やアクセス制限を行うことができます。
http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id.html

マネジメントコンソールで「IAM」と検索します。
<img width="831" alt="IAM Management Console 2017-12-29 14-29-36.png" src="https://qiita-image-store.s3.amazonaws.com/0/226431/552cc0fc-e2d6-fb87-bfe5-d20c9813a691.png">

ユーザーを追加します。
<img width="733" alt="IAM Management Console 2017-12-29 15-44-06.png" src="https://qiita-image-store.s3.amazonaws.com/0/226431/b9cdfa3c-7403-4585-bfa2-47e61e2e06be.png">

ユーザー名などを記載したら、Next:Permissionsをクリックします。
<img width="909" alt="IAM Management Console 2017-12-29 15-45-54.png" src="https://qiita-image-store.s3.amazonaws.com/0/226431/7823af5a-3a9d-30a5-8a23-ca759aa46829.png">

次のアクセス権限を設定する画面では、既存のポリシーを直接アタッチ(Attach existing policies directory)をクリックします。

そして、`AWSLambdaFullAccess`にチェックを入れます。

<img width="1152" alt="IAM Management Console 2017-12-29 15-49-06.png" src="https://qiita-image-store.s3.amazonaws.com/0/226431/88401e60-e372-6144-7ac7-af58c543adaa.png">

次の画面で「ユーザーの作成」をクリックします。

すると、次の画面でAccess key IDやSecret access key, Passwordが表示されるので、情報を保存してください。

IAM作成が完了した際に表示される画面には`https://XXXXXXXXXXX.signin.aws.amazon.com/console`のようなURLが表示されていると思います。

そのURLをクリックすると、作成したIAMユーザーでログインすることができます。
場合に応じて、`AmazonAPIGatewayAdministrator`や`AmazonSESFullAccess`、`AmazonSQSFullAccess`など、Lambdaから操作したいサービスへのアクセス権限を追加してください。


#### Lambda関数を作成してみる

AWSのServiceからLambdaを選択します。
<img width="806" alt="Lambda Management Console 2017-12-29 16-00-03.png" src="https://qiita-image-store.s3.amazonaws.com/0/226431/8dfc09f5-d1e9-5fad-1618-163bd2b079c2.png">

なんかカッコいい画面が出てくるので、「Create a function」をクリックしましょう。

<img width="1131" alt="Lambda Management Console 2017-12-29 16-06-29.png" src="https://qiita-image-store.s3.amazonaws.com/0/226431/92a8bd85-8b9c-bad9-413f-1a0473c7a8e5.png">

次に関数を作っていきます。

<img width="1154" alt="Lambda Management Console 2017-12-29 16-09-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/226431/0499fdaf-6b75-0498-e15c-667648e6f1a2.png">
<img width="1138" alt="Lambda Management Console 2017-12-29 16-09-48.png" src="https://qiita-image-store.s3.amazonaws.com/0/226431/11253185-9a5f-ec28-058b-dc9358f713d3.png">

上記のイメージ通り作成しようとしていたら、「You are　not authorized to perform:iam:CreateRole」というエラーが出ました。

<img width="1163" alt="Lambda Management Console 2017-12-29 16-11-50.png" src="https://qiita-image-store.s3.amazonaws.com/0/226431/9c688bd2-dcb1-4f05-0388-0ed70a71a6b8.png">

以下のStackoverflowの記事によると、`iam:attachRolePolicy`や`iam:createPolicy`が足りないようですが...。
https://stackoverflow.com/questions/34946609/giving-access-to-aws-lambda-service-with-limited-policy

以下に手順が書いてあったので、試してみます。

「IAM ユーザーにアクセス権限を委任するロールの作成」
http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_create_for-user.html

一度サインアウトして、ルートアカウントでログインし直します。
その後、IAMのサービスを開きます。


#### IAM ユーザーにアクセス権限を委任するロールの作成

ロール > ロールの作成
をクリックします(日本語にしました)
<img width="975" alt="IAM Management Console 2017-12-29 16-39-22.png" src="https://qiita-image-store.s3.amazonaws.com/0/226431/78d11f86-a265-9fb5-3e7f-0b45185fa400.png">

「信頼されたエンティティの種類を選択」で「AWSサービス」を選択します。

<img width="725" alt="IAM Management Console 2017-12-29 16-42-38.png" src="https://qiita-image-store.s3.amazonaws.com/0/226431/ff5c0ed1-2ca6-4b36-137f-995413ae5fdb.png">

「AWSLambdaBasicExecutionRole」のポリシーをあたっちします。
次の画面でロールに名前をつけます。
ここで画像を貼りたいのですが、Qiitaのサーバから「画像を載せすぎだ！」と怒られため、アップロードできませんでした。

しかし、このようにロールを作成すると、Lambdaの関数作成画面でロール「既存のロールを選択」で、先ほど作ったロールを選択できるようになります。

IAMで作ったユーザーにはロールを作成する管理者権限がないため、新規に作成しようとすると怒られていたのでした。


#### いよいよ関数を実行する

「Lambda > 関数 > 関数名」

の画面の下の方にコードを書く場所があります。
ここに実行したい関数を書きましょう。

```python3
def lambda_handler(event, context):
    key1 = event['key1']
    key2 = event['key2']
    key3 = event['key3']
    result = "key1=" + key1 + " key2=" + key2 + " key3="+key3
    return result
```
ソースコードを書いたら右上の「保存」をクリックします。

次に、画面の右上に「テストイベントの選択」とあるので、そこのプルダウンから「テストイベントの設定」を選びます。

次の画面で以下のイベントを作成して、テストを実行してみます。

イベントテンプレート「Hello World」
イベント名「testEvent」

```json
{
  "key3": "value3",
  "key2": "value2",
  "key1": "value1"
}
```

で、右上の「テスト」をクリックすると、「実行結果：成功」と表示されます。
ログはCloudWatch内に保存されます。

実行結果の詳細を見ると、「"key1=value1 key2=value2key3=value3"」と返ってきたことがわかります。