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
ユーザー名などを記載したら、Next:Permissionsをクリックします。
次のアクセス権限を設定する画面では、既存のポリシーを直接アタッチ(Attach existing policies directory)をクリックします。
そして、AWSLambdaFullAccess
にチェックを入れます。
![IAM Management Console 2017-12-29 15-49-06.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F226431%2F88401e60-e372-6144-7ac7-af58c543adaa.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=19d3f349413ab2da00c229bcd35c846c)
次の画面で「ユーザーの作成」をクリックします。
すると、次の画面でAccess key IDやSecret access key, Passwordが表示されるので、情報を保存してください。
IAM作成が完了した際に表示される画面にはhttps://XXXXXXXXXXX.signin.aws.amazon.com/console
のようなURLが表示されていると思います。
そのURLをクリックすると、作成したIAMユーザーでログインすることができます。
場合に応じて、AmazonAPIGatewayAdministrator
やAmazonSESFullAccess
、AmazonSQSFullAccess
など、Lambdaから操作したいサービスへのアクセス権限を追加してください。
Lambda関数を作成してみる
なんかカッコいい画面が出てくるので、「Create a function」をクリックしましょう。
![Lambda Management Console 2017-12-29 16-06-29.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F226431%2F92a8bd85-8b9c-bad9-413f-1a0473c7a8e5.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=bdc47843d27a91baee068d0a17bf297a)
次に関数を作っていきます。
![Lambda Management Console 2017-12-29 16-09-00.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F226431%2F0499fdaf-6b75-0498-e15c-667648e6f1a2.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=87903627291d2f8abd011d1c3e231474)
![Lambda Management Console 2017-12-29 16-09-48.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F226431%2F11253185-9a5f-ec28-058b-dc9358f713d3.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=461878858dd66b7c8e91b57409dd1de8)
上記のイメージ通り作成しようとしていたら、「You are not authorized to perform:iam:CreateRole」というエラーが出ました。
![Lambda Management Console 2017-12-29 16-11-50.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F226431%2F9c688bd2-dcb1-4f05-0388-0ed70a71a6b8.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=182227e99a5dc6357a5592745cad1c6f)
以下の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 ユーザーにアクセス権限を委任するロールの作成
ロール > ロールの作成
をクリックします(日本語にしました)
「信頼されたエンティティの種類を選択」で「AWSサービス」を選択します。
![IAM Management Console 2017-12-29 16-42-38.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F226431%2Fff5c0ed1-2ca6-4b36-137f-995413ae5fdb.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=177139c55086f75364837c8dbbc81c9b)
「AWSLambdaBasicExecutionRole」のポリシーをあたっちします。
次の画面でロールに名前をつけます。
ここで画像を貼りたいのですが、Qiitaのサーバから「画像を載せすぎだ!」と怒られため、アップロードできませんでした。
しかし、このようにロールを作成すると、Lambdaの関数作成画面でロール「既存のロールを選択」で、先ほど作ったロールを選択できるようになります。
IAMで作ったユーザーにはロールを作成する管理者権限がないため、新規に作成しようとすると怒られていたのでした。
いよいよ関数を実行する
「Lambda > 関数 > 関数名」
の画面の下の方にコードを書く場所があります。
ここに実行したい関数を書きましょう。
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」
{
"key3": "value3",
"key2": "value2",
"key1": "value1"
}
で、右上の「テスト」をクリックすると、「実行結果:成功」と表示されます。
ログはCloudWatch内に保存されます。
実行結果の詳細を見ると、「"key1=value1 key2=value2key3=value3"」と返ってきたことがわかります。