Tag: Lambda

lambrollデプロイに必要なIAM権限

lambrollとは

fujiwara/lambroll は、AWS Lambda関数のデプロイを簡単に行うための軽量デプロイツールです。

デプロイに必要なIAM権限

lambrollを使ってLambda関数をデプロイする際、GitHub ActionsやCI/CDパイプラインで実行する場合に必要なIAM権限の一覧です。

権限一覧

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "lambda:CreateFunction",
        "lambda:GetFunction",
        "lambda:GetFunctionConfiguration",
        "lambda:InvokeFunction",
        "lambda:ListTags",
        "lambda:TagResource",
        "lambda:UntagResource",
        "lambda:UpdateFunctionCode",
        "lambda:UpdateFunctionConfiguration"
      ],
      "Resource": [
        "arn:aws:lambda:ap-northeast-1:123456789012:function:your-function-name"
      ]
    }
  ]
}

各権限の説明

必須権限

権限用途備考
lambda:CreateFunctionLambda関数の初回作成既存関数の更新のみの場合は不要
lambda:GetFunction既存関数の情報取得lambrollが関数の存在確認に使用
lambda:GetFunctionConfiguration関数設定の取得現在の設定との差分確認に使用
lambda:UpdateFunctionCode関数コードの更新デプロイの主要な処理
lambda:UpdateFunctionConfiguration関数設定の更新(環境変数、タイムアウトなど)function.jsonの設定を反映
lambda:ListTags関数のタグ一覧を取得重要: lambrollがfunction.jsonのTagsと既存タグを比較するために必須
lambda:TagResourceタグの追加function.jsonにTagsフィールドがある場合は必須
lambda:UntagResourceタグの削除既存タグを削除する場合に必要

オプション権限

権限用途備考
lambda:InvokeFunctionLambda関数の実行デプロイ後のテスト実行を行う場合に必要

よくあるエラーと対処法

lambda:ListTagsが不足している場合

Error: failed to deploy function configuration: failed to list tags of
arn:aws:lambda:...: operation error Lambda: ListTags,
api error AccessDeniedException: User is not authorized to perform:
lambda:ListTags on resource

原因: lambrollはfunction.jsonTagsフィールドと既存のタグを比較するため、lambda:ListTags権限が必要です。

Read more...

MediaLiveをCloudWatchで監視する

背景

MediaLive ですが、いろいろなエラーを通知してくれます。

やれ「RTMP 接続が切れたよ」とか「オーディオ入力 or ビデオ入力が無いよ」とかですね。 通常、ライブ配信が始まる前は当然、MediaLive への入力は無いはずなので、通知は構わないのですが、 ライブ配信中に出ると、それはもうトラブルシューティングの情報の一つとして重要なものになります。 ( というか当初、エラーは出てるっぽいし、挙動はおかしいんだけど、どんなエラーが出てるか分からないケースがあって窮地な時がありました )

今は管理画面の[ channels ]->[ 目的のチャンネル ]->[ Alerts ]から確認できます。が、ログとして残しておくのは良い事だと思います。 このエラー出力のフォーマットは決まっている訳ではなく、たまに変わります。ので 『あー、エラー出力が変わったからアラートが上がらなくなったのね』、という事がログを残しておくと分かります。

手順

WebUI

SNS トピック作成

  • SNS のページ( https://ap-northeast-1.console.aws.amazon.com/sns/ )を開く

  • [ トピック ]->[ 新しいトピックの作成 ]->トピック名の入力、私は[ MediaLiveEvent ]、表示名[ MediaLiveEvent ]と入れてみた

  • 作成したトピックの ARN をコピペ arn:aws:sns:ap-northeast-1:123456789012:MediaLiveEvent

  • 同じ SNS 内の左側メニュー->[ サブスクリプションの作成 ]

  • [ トピック ARN ]に先程作成した MediaLive のトピックの ARN を入力

  • プロトコル メール(ほかにも lambda とかから Slack に送信できたりする)

  • エンドポイント : 自分のメールアドレス

はじめてのアラートメール設定の場合、AWS から確認のメールが飛ぶ

  • [ AWS Notification - Subscription Confirmation ]という件名のメールがあったらメール本文内のリンクをクリック

CloudWatch

  • cloudwatch のページに移動*
  • [ イベント ]->[ ルールの作成 ]
  • [ イベントパターン ]になってること
  • [ カスタムイベントパターン ]に変更 カスタムイベントパターンの内容としては下記を入力
{
  "source": [
    "aws.medialive"
  ]
}
  • 右側の[ ターゲットの追加 ]->[ SNS トピック ]に変更->[ トピック ]はプルダウンメニューから先程、作成した SNS のトピックを選択
  • [ 設定の詳細 ]
  • ルールの定義
  • 名前: 任意
  • 説明: 任意
  • [ ルールの作成 ]
  • メールボックスを確認

CLI

参考: SNS をコマンドラインから設定する : 電子の密林を開拓する

Read more...

lambdaのあれこれ

上限値

Lambda 関数の同時実行 - AWS Lambda

初めてのLambda

初めてのJavaScript、初めてのAWS Lambda

invokeする時のオプション

ブラウザから直接invokeする、という方法

AWS Lambdaのコードをローカルで実行する

この方法は導入した方が良さそう。デバックスピードを上げられる。 AWS Lambdaのための関数のローカル開発とテスト

handlerに渡ってくるeventとcontextというオブジェクトについての補足
event: 実際に渡ってくるイベントのデータ(S3のアップデートとかKinesisのレコードとか)。
context: Lambda functionの呼び出しコンテキスト。done()というAPIを呼び出すと関数が終了するのだが、コードをちょっと追いきれてないのでとりあえず単純にreturnするだけな感じにstub化。ちなみにcontextオブジェクトのダンプは以下のとおり。done()の中で呼び出されているpostDone()は後で追ってみる。

AWS Lambdaの関数をnpmでパッケージ管理

CLIで使う

http://qiita.com/toshihirock/items/8d06a524df79e7bb675c

  • Role作成
  • function作成( ファイルのアップロード )

Scheduleイベントで

EC2を自動起動終了

Amazonのサイトの説明、aws-cliで設定している

ユーザがEC2を起動 => CloudTrailがEC2起動を検知してS3バケットにログ記録 => Lambdaファンクション起動 => ログから実行ユーザを特定してEC2にタグ付け

LambdaでEC2作成者をタグ付けする

AWSへの接続に使う

AWSのリファレンスを見て、左側のメニューから使いたいサービスをクリック

トラブル集

node.jsでLambdaを実装した時のトラブル&解決策集

Read more...

AWS SQSを使う際に調べた事

API リファレンス

Class: AWS.SQS — AWS SDK for JavaScript

送信/受信/削除

AWS SDK for Node.js を用いた SQS の操作 – ゴミ箱

FIFO になって情報古くなってる面もあるが有益な情報

【AWS】SQS をただただ触ってみただけの話 - ニクニクドットミー Amazon SQS を利用する前に抑えておくべき 7 つのポイント - Qiita Amazon SQS を使う前に知っておきたい基本的なこと - Qiita Schoo の非同期パイプライン処理について - Qiita

『ロングポーリングして』という話は下記でも触れてる(一番下の方) フレクトのクラウド blog(New): lambda から lambda を起動するリレー方式 SQS コンシューマ

ショートポーリングの場合、キュー内のメッセージ数が少ない(1000以下など)場合、
キュー内のメッセージ数で重み付けされたサンプル数のサーバにしか問い合わせにいかないため、
MaxNumberOfMessagesに指定した数より少ないメッセージしか返ってこず、
キュー内のメッセージ数が極めて少ない場合、メッセージが返却されないことがあるため、
繰り返しreceiveMessageを発行する必要がある。

という理解であってるんですかね?

ロングポーリングの場合はどうなんでしょうか? 次の記述が見つかりました。
どうやらロングポーリングの場合、上記の問題は発生しないようです。

(receiveMessageのWaitTimeSecondsを1以上にすると、ロングポーリングになる)

Lambdaはコンピューティング時間で課金されるため、なるべく「待ち」の時間は減らしたいところですが、ショートポーリングで1,2件づつメッセージを処理するよりは効率が良さそうです。

ログポーリング必須…

ロングポーリングを利用する(これは必須。劇的にリクエスト数が改善されます)
ロングポーリングは管理画面から設定できるので簡単。
送信側はバッチリクエストを利用すると良い(SendMessageBatch)
受信側も複数メッセージを一度に受信すると良い(MaxNumberOfMessages)

FIFO に関する情報

【新機能】Amazon SQS に FIFO が追加されました!(重複削除/単一実行/順序取得に対応) | Developers.IO FIFO/重複排除のイメージがつかみやすい

Read more...

AWS SNSを使う

lambdaネタ

SNS + Lambda + Slack でアラート通知を受け取る - Qiita

障害時でも まずPush通知がされるまでの流れを把握

http://dev.classmethod.jp/cloud/aws/sns-mobile-token/ この中のフローが非常に参考になる。

大規模Push配信環境 メルカリの例

ハイパフォーマンスGaurun〜メルカリの大規模プッシュ配信を支えるミドルウェア〜 - Mercari Engineering Blog

Push通知が届かない場合

http://faq.growthbeat.com/article/60-push

  • 電源が入っていない
  • 証明書の有効期限が切れてる
  • デバイスのプッシュ通知ステータスがアクティブ(Active)になっていない
  • アプリがアンインストールされてる
  • 登録されているデバイストークンと環境(development/production)が一致しない

証明書の扱いは難しいらしい

http://faq.growthbeat.com/article/81-growthpush

具体的にエラーとなるのは、下記のような場合です:

iOSの証明書の有効期限が切れている

iOSの証明書が無効化されている。

AndroidのAPIキーのIP制限が設定されている

Androidの証明書が無効化されている

PHPでPush通知を実装する

http://qiita.com/toshiyuki_wada/items/a072ec557a49c6f8c00a

AWS CLIで取得する

http://qiita.com/tcsh/items/e2184f8c7c283e93b167

各メトリクスの説明

Amazon Simple Notification Service のメトリックスおよびディメンション - Amazon CloudWatch

NumberOfMessagesPublished 発行されたメッセージの数。
NumberOfNotificationsDelivered 正常に配信されたメッセージの数。
NumberOfNotificationsFailed Amazon SNS が配信に失敗したメッセージの数。
このメトリクスは、Amazon SNS が Amazon SQS、電子メール、SMS、またはモバイルプッシュのエンドポイントへのメッセージ配信の試行を停止した後に適用されます。
HTTPまたはHTTPSエンドポイントに対して配信が試行されるたびに、メトリクスが1つ追加されます。
他のすべてのエンドポイントの場合、メッセージが配信されないとカウントが1増加します (試行回数に関係なく)。
HTTP エンドポイントの再試行の数は制御できます。詳細については、「HTTP/HTTPS エンドポイントに対する Amazon SNS 配信再試行ポリシーの設定」を参照してください。

AWS CLI でトピックを作成する

aws sns create-topic --name test_20150715 --region ap-northeast-1

出力例:

Read more...