2017年04月10日

[AWS] Lambda 関数にトリガーを設定しようとすると「The requested resource exceeds the maximum number allowed」が出る

Lambda関数を指定した時間で起動したいとき、トリガーを設定することで
実現できます。

トリガーには、クーロンと同じように「0 * * * MON-WED *(毎週月曜から水曜の0時」
といった「ルール」を設定できます。

同じルールを他のLambda関数にも適用できるので、どんどん適用していったのですが、
6つ目から、

--------------------------------------------------
トリガー [ルール名] を有効にできませんでした:
The requested resource exceeds the maximum number allowed.
--------------------------------------------------

スクショ20170410_1.png

というメッセージが出るようになりました。
これは「1つのルールにつき対象(ターゲット)は5つまで」という制限があるからでした。

このメッセージを無視してLambda関数に適用していったので、6つ目以降のLambda関数は
時間になっても発動しなかったのでした。

各ルールにどんな対象(ターゲット)が設定されているのかは、
Cloud Watch > ルール
の画面で確認することができます。

スクショ20170410_2.png

また、ルールを編集したり追加したりしたいときは、

CloudWatch > ルール > 該当ルールを追加(編集) > ターゲットを追加(編集)

で行えます。
posted by be-style at 09:35| Comment(0) | Web

2016年08月30日

[Web] AWS Lambda から DynamoDB にアクセスしてアイテムを更新してみた

前回の[Unity] AWS Lambda をUnityから実行してみた(iPhoneから実行も)で、iPhoneからAWS Lambdaにアクセスすることができました。

今回は、この3点をやってみます。
・管理画面からDynamoDBにアイテムを追加する
・LambdaからDynamoDBにアクセスする(node.js)
・DynamoDBのアイテムを更新する


Lambdaでnode.jsを使って色々できるとなったら、Lambdaが動いているサーバー上に
記録を残したいときがあります。
memocached や ファイル書き出し等はできないようです。

そこで、永続的にデータを保存できるAWSサービスのRDBとDynamoDBを考えました。
今回は、後々データが増えたときに扱いやすそうなDynamoDBを触ってみます。

DynamoDB の基礎知識とまとめ:
http://qiita.com/hshimo/items/e5ad98b21786d796f1da


AWSの管理画面から、サービス > データベース > DynamoDB を選択します。

dynamo_1.png


はじめてDynamoDBを触ったときの画面になります。
Create table
を選びます。

dynamo_2.png


テーブルの設定画面になります。

・テーブル名 : Test
・プライマリキー : key1(文字列)
・デフォルト設定の使用 : オフ
・セカンダリインデックス : なし
・プロビジョニングされたキャパシティ 読み込み/書き込み容量ユニット : 1

にして"作成"を押します。

dynamo_3.png


テーブルができました!

dynamo_4.png


それでは項目(アイテム)を追加してみましょう。
画面右の"項目"メニュー > 項目の作成 を選びます。

dynamo_5.png


項目の作成画面に移るので、プライマリキーに"aaa"を入力します。

dynamo_6.png


要素を追加するので、"+"ボタン > Append > String を選びます。

dynamo_7.png


key2 として、値に vvv を入力します。
その後、画面右下の"保存"を押します。

dynamo_8.png


テーブルに項目が追加されました。

dynamo_9.png


AWS LambdaからDynamoDBにアクセスするために、ロールの設定の変更が必要になります。
ここで、作成したテーブルの"Amazonリソースネーム(ARN)"をコピーして覚えておきます。

dynamo_10.png


サービス > IAM の画面に移り、ロールの画面を開きます。
前回のhelloWorldで使ったロール(Cognito_AllZeroPuzzleUnauth_Role)を開きます。

dynamo_10_1.png


インラインポリシー > ロールポリシーの作成 を選びます。

dynamo_11.png


"選択"を押します。

dynamo_12.png


アクセス許可の編集画面になりますので、
・AWSサービス : Amazon DynamoDB
・アクション : Scan, UpdateItem
・ARN : 先ほどコピーしたARN

を設定して、"ステートメントを追加"を押します。

dynamo_13.png

dynamo_14.png


ステートメントの内容を確認(Scan, UpdateItemがある)して、"次のステップ"を押します。

dynamo_15.png


ポリシーの確認画面では特になにもせず"ポリシーの適用"を選びます。

dynamo_16.png


ポリシー一覧の画面に戻ると、先ほど作ったポリシーが追加されています。

dynamo_17.png


サービス > AWS Lambda の画面に移り、以前作成した helloWorld を選びます。

dynamo_18.png


以前のプログラムを、DynamoDB用に書き換えます。

node.jsによるLambda操作のサンプル
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/gettingstartedguide/GettingStarted.NodeJs.03.html

var AWS = require("aws-sdk");
var dynamo = new AWS.DynamoDB.DocumentClient();

exports.handler = function(event, context) {
var param = {
TableName : "Test",
FilterExpression : "key1 = :val",
ExpressionAttributeValues : {":val" : "aaa"}
};
dynamo.scan(param, function(err, data) {
if (err) {
console.log("エラー = " + err);
context.fail(err); // エラー時
} else {
console.log("成功 = " + data);
context.succeed(data); // 正常時
}
});
};

dynamo_19.png


管理画面で実行してみると、DynamoDBの項目の中身を取得できました。

dynamo_20.png


では、key2 の "vvv" を "moji" に置き換えてみましょう。
Lambdaのプログラムを変更します。

var AWS = require("aws-sdk");
var dynamo = new AWS.DynamoDB.DocumentClient();

exports.handler = function(event, context) {
var params = {
TableName: 'Test',
Key: {
"key1": "aaa" // Hashキー
},
AttributeUpdates: {
"key2": {
'Action': 'PUT', // 置き換え
'Value': "moji" // 文字列
}
}
};
dynamo.update(params, function (err, data) {
if (err) {
console.log("失敗" + err);
} else {
console.log("成功");
}
});
};


dynamo_21.png


実行すると、"成功"と出たので、置き換えがうまくいったようです。

dynamo_22.png


サービス > DynamoDB の画面に移り、先ほど作成した Testテーブルの中身を確認すると、
ちゃんと更新されていました。

dynamo_23.png


これで、これからアプリに追加する機能に必要なことは揃いました。
よかったよかった。
posted by be-style at 21:37| Comment(0) | Web

2016年08月28日

[Web] AWS Lambda のHello Worldをやってみた

個人開発のアプリでAWSのEC2を利用しているのですが、
非常にアクセス数が少ないのに、利用時間による従量課金になっています。

AWS EC2の料金表:
https://aws.amazon.com/jp/ec2/pricing/

t2.micro だと、$0.02/時間 なので、1年だと
1日の料金(0.02 x 24) x 365 = 175.2$
かかります。

ほとんど使われないのに、EC2を起動し続けているために毎年これくらいの
費用がかかってしまいます。

そうなると「使うときだけ料金が発生してくれたらなー」と考えてしまいます。
そこで登場するのが「AWS Lambda」というサービスです。

簡単にいうと、
・利用したときだけ料金が発生する
・サーバーを持つ必要がなくメンテナンスの必要がない
・アクセス数が急増してもAWS側で自動で対応してくれる
というサービスです。

AWS Lambdaについてのamazonの説明:
https://aws.amazon.com/jp/lambda/

初めてのAWS Lambda:
https://codezine.jp/article/detail/8446

AWS Lambdaの料金については、
メモリ128MB で、1ヶ月の無料利用枠の秒数が 3,200,000秒(約37日)
それを超えると100 ミリ秒単位の価格が0.000000208$ です。

現状の少ないアクセス数ならば、Lambdaの実行時間が1秒だとしても
無料枠で十分まかなえます。

AWS Lambdaの料金表
https://aws.amazon.com/jp/lambda/pricing/

これは利用しなければ!
ということで、Hello World をやってみましたので、記録として残しておきます。

----------------------------------
ここからは「AWSのアカウントを開設している」ことが前提になっています。
AWSのアカウントを開設していない方は、開設してからお進みください。
----------------------------------

管理画面のサービスの中から Lambda を選びます。
lambda1_1.png


Get Started Now を選びます。
lambda1_2.png


blue print(青写真)を選ぶ画面になったら、画面中央の">"を押して青写真一覧の次のページを
表示します。
lambda1_3.png


hello-world の青写真があるので、選択します。
lambda1_4.png


ここは何もせず"Next"を選択。
lambda1_5.png


ファンクション名が必須なので、"helloWorld"とします。
他はデフォルトのままです。
lambda1_6.png


画面を下に進めると"Lambda function handler and role"の欄で"Role"を設定する必要があります。
lambda1_7.png


Roleを作っていないので、ここでRoleを作ります。
Roleのプルダウンメニューの中から、"Create a custom role"を選択します。
lambda1_8.png


Roleを作成する画面に移ったら、デフォルト設定のまま"許可"を押します。
lambda1_9.png


Lambdaの画面に戻ると、RoleとExisting roleの欄が先ほど作ったRoleで埋まっています。
他の設定はデフォルトのまま"Next"を押します。
lambda1_10.png


確認画面になりますので、"Create function"を押します。
lambda1_11.png


Lambdaのダッシュボード画面に切り替わると、Hello Worldのコードの内容が表示されます。
今回はそのまま、画面上の"Test"を押して実行してみす。
lambda1_12.png


ダッシュボード画面の下の方に、実行結果が表示されます。
さらに詳しいログを見るときは、"Click here"を押します。
lambda1_13.png


CloudWatchの画面に移ります。先ほどのログが表示されています。
ログを選択します。
lambda1_14.png


詳しいログを確認することができます。
lambda1_15.png


Hello World の流れは以上です。
次は、Unityとの連携をしてみます。

続きの記事:
[Unity] AWS Lambda をUnityから実行してみた(iPhoneから実行も)
posted by be-style at 14:46| Comment(0) | Web