Lambdaを実行するときのIAM Role設定方法


AWS LambdaのIAM Role設定のメモです。

AWS LambdaのFunctionを作ってAWS SDK Javaから利用しようとしたときの話です。

開発時はAdminまたはPowerに類するAWSアカウントで開発をするので良いと思いますが、いざ本番環境でAWS LambdaをコールするJavaプログラムを動かすとなると話は変わってきます。

場合によると思いますが、そのプログラムを動くマシンや、そのマシンが利用するAWSアカウントが制限されたユーザ(ロール)だったりする場合に少し困ります。たいていそういうケースで初めてLambdaを使う開発をした場合はLambdaのFunctionをコールする権限が設定されていないのではないでしょうか?

自分はそうでした・・・。というわけでその設定に少し手間取ったのでメモしておきます。

設定方法

と言ってもそれほど難しい話では無いです。

IAMのコンソールに行って

IAM_Management_Console

まずはポリシーを作成。

Policy Generatorで設定します。

IAM_Management_Console

アクションの部分はInvokeAsyncとInvokeFunctionを選択します。

ARNは自分が持っているLambdaFunctionのARNです。「arn:aws:lambda:ap-northeast-1:xxxxx:function:*」とか設定しておけば全関数使えます。(xxxxxのとこあたりは人によって違うはず)

「ステートメントを追加」を押して、後は作成したPolicyを自分の対象のRoleやUserに割り当てれば完了です。自分はなぜかJavaプログラムがうまく動かなかったので、プログラム(JVM)を再起動したらちゃんと権限いけてました。

人によってはこれだけでは足りません。自分の場合はLambdaから他のAWSリソースにアクセスしないのでこれで終わりですが、アクセスする人は例えばDynamoDBへのExecution権限も必要になります。

以下の記事が参考になると思います。自分も助けられました・・・!

http://qiita.com/studio-kakky/items/3791ba5f383f1797f73f

まとめ

  • Policyを作って自分のLambdaFunctionをInvokeできるようにしよう
  • LambdaFunctionが他のAWSリソースにアクセスする場合は権限追加しよう(自分はやってないので詳細不明)
  • PolicyをRoleかUserに割り当てよう
  • 一応AWS SDKを利用するプログラムを再起動したほうがいいかも

できればこういうところでは躓きたくないですよね!誰かの役に立てば幸いです。