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
にチェックを入れます。
次の画面で「ユーザーの作成」をクリックします。
すると、次の画面で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」をクリックしましょう。
次に関数を作っていきます。
上記のイメージ通り作成しようとしていたら、「You are not authorized to perform:iam:CreateRole」というエラーが出ました。
以下の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サービス」を選択します。
「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"」と返ってきたことがわかります。