虎の穴ラボのH.Hです。AWSのLambdaを使用した際に調べた内容をまとめました。
AWSのユーザーには細かなIAMポリシーが設定できるが、細かすぎるために新しくサービスを使用する際に必要なIAMポリシーの確認に時間がかかってしまう。だが時間の短縮のために関連するサービスの全てのIAMポリシーをつけると様々な操作ができてしまい、後々問題が発生する可能性が出てきます。
今回Lambdaをデプロイする作業があり調べましたが、必要なIAMポリシーについてまとめられているページが見つかりませんでした。ということでデプロイする際に使用するユーザーを新設し必要なIAMポリシーを確認したのでまとめました。
コマンドラインからAWSにLambda関数をデプロイするためのツール
コマンドラインからデプロイするには「AWS SAM CLI」が必要になります。詳細は以下のAWS公式ページを参照してください。
#デプロイの流れ
コマンドラインからローカルで作成した関数でデプロイする流れは以下の通りです。
今回はMac上で作成した関数をデプロイします。関数はNode.jsで作成したものとし、ZIP形式でアップロードするものとします。
1)デプロイユーザーの作成
AWS上でデプロイに使用するユーザーは以下のページから作成する。必要なIAMポリシーは後述します。
2)デプロイユーザーの設定
AWSで作成したユーザーのアクセスキーやシークレットアクセスキーを取得して、ローカルの環境に設定します。
ローカルに設定するコマンドは以下の通りです。
$ aws configure
AWS Access Key ID [None]:(作成したユーザーのAccess Key)
AWS Secret Access Key [None]: (作成したユーザーのSecret Access Key)
Default region name [None]: (リージョンの名前、東京の場合はap-northeast-1)
Default output format [None]: json
3)ビルド
以下のコマンドを実行します
$ sam build
Building codeuri: (パス) runtime: nodejs14.x metadata: {} functions: ['(関数名)']
Running NodejsNpmBuilder:NpmPack
Running NodejsNpmBuilder:CopyNpmrc
Running NodejsNpmBuilder:CopySource
Running NodejsNpmBuilder:NpmInstall
Running NodejsNpmBuilder:CleanUpNpmrc
Build Succeeded
Built Artifacts : .aws-sam/build
Built Template : .aws-sam/build/template.yaml
Commands you can use next
=========================
[*] Invoke Function: sam local invoke
[*] Deploy: sam deploy --guided
4)デプロイ
以下のコマンドでデプロイが実行される。初回には後述するCloudFormationのスタックの設定を行います。2回目以降は初回に設定した設定を利用できるので細かな指定をスキップすることができます。
#初回の場合
$sam deploy --guided
#2回目以降
$sam deploy
#デプロイに利用されるAWSサービス
デプロイはソースコードをS3にアップロードし、その後Lambdaに関数が展開されます。
これらの流れを管理しているのがCloudFormationで、個別の処理ごとに名前をつけることができ、処理毎の単位をスタックと呼びます。
東京リージョンのCloudFormationのURLは以下のURLになります。
デプロイ時に同じスタックの名前を使用することで、以前に作成した関数に上書きが行われます。
またデプロイした関数にはポリシーが設定された専用のロールが付与されます。
#デプロイに必要なIAMポリシー
さて本題です。Lambdaをデプロイするのに必要なサービスは4つあります。(CloudFormation、IAM、S3、Lambda)デプロイを行うユーザーがこれらのサービスに対してアクションを行うためのポリシーを所有していないとデプロイに失敗します。(厳密には処理中に問題が発生し、取り消しが行われた際の削除のIAMポリシーも含まれています)
サービス毎に必要なIAMポリシーの一覧を記載します。
1)CloudFormation
DescribeStackEvents
DescribeStackSetOperation
CreateChangeSet
DescribeChangeSet
ExecuteChangeSet
GetTemplateSummary
DescribeStacks
2)IAM
GetRole
PassRole
DetachRolePolicy
CreateRole
DeleteRole
AttachRolePolicy
UpdateRole
PutRolePolicy
CreateUser
3)S3
GetBucketTagging
GetBucketWebsite
GetJobTagging
GetObjectVersionTagging
RestoreObject
GetBucketAcl
GetBucketNotification
GetBucketPolicy
GetObjectVersionTorrent
PutObject
GetObject
GetIntelligentTieringConfiguration
GetObjectTagging
GetMetricsConfiguration
GetBucketLocation
GetObjectVersion
4)Lambda
GetFunction
CreateFunction
UpdateFunctionCode
DeleteFunction
AddPermission
#まとめ
今回のIAMポリシーの確認で関数のコードをアップするために使用されているS3のIAMポリシーが多く必要であることがわかりました。またロールの作成などでIAMに対してもIAMポリシーが必要になったのは盲点だと思いました。
外部からアクセス可能にするにはAPIGateWayなどLambdaの関数を起動するサービス追加で必要になるのでご注意ください。