Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
15
Help us understand the problem. What are the problem?

AWS Lambdaのデプロイに必要なIAMポリシーについて

虎の穴ラボの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の関数を起動するサービス追加で必要になるのでご注意ください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
15
Help us understand the problem. What are the problem?