DynamoDBのチュートリアルを読み解く【2: Lambda 実行ロールを作成する】

# はじめに
[前回](https://qiita.com/kkino1985/items/f9091c1e1efb35009ce7)に引き続き[DynamoDBのチュートリアル](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Streams.Lambda.Tutorial.html)を実施しました。
今日はIAM関連になります。

# 2.1 IAMポリシー作成（Lambda用）

    {
       "Version": "2012-10-17",
       "Statement": [
         {
           "Effect": "Allow",
           "Principal": {
             "Service": "lambda.amazonaws.com"
           },
           "Action": "sts:AssumeRole"
         }
       ]
    }


## Effect

- 書式 : "Effect": "Allow|Deny"

ステートメントの内容を許可するか拒否するかを設定。


## Principal

- 書式 :

  - AWS アカウント : "Principal": {"AWS": "arn:aws:iam::`(aws-account-id)`:root"} （※{"`(aws-account-id)`" も可）

  - IAM ユーザー : "Principal": { "AWS": "arn:aws:iam::`(aws-account-id)`:user/`(user-name)`" }

  - IAM ロール : "Principal": { "AWS": "arn:aws:iam::`(aws-account-id)`:role/`(role-name)`" }

  - AWS サービス : "Principal": { "Service": "`(service-name)`.amazonaws.com" }

ポリシーの適用先を設定。
（指定できるプリンシパルは他にもたくさんあるものの、差し当たりよく使いそうなものをピックアップ）


## Action

- 書式 : "Action": "`(action)`" }

許可または拒否される特定のアクション（操作）。
"sts:AssumeRole"は一時的に（本来持っていない）権限を要求するアクションで、今回の場合Lambdaが一時的な権限を要求することを許可する設定になります。

https://docs.aws.amazon.com/ja_jp/STS/latest/APIReference/API_AssumeRole.html


# 2.2 IAMロール作成

    aws iam create-role --role-name WooferLambdaRole \
        --path "/service-role/" \
        --assume-role-policy-document file://trust-relationship.json


## --role-name

- 書式 : --role-name `(value)`

ロールの名前を指定。ちなみに大文字と小文字は区別されない。


## --path
- 書式 : --path `(path)`

ロールへのパスを指定。例えば会社の組織構造などをディレクトリパスの形式（/aaa/bbb/cccのように）記載しておくことで、パスの値を基にアクセス許可（または拒否）のポリシーを作成したりできる。（デフォルトは"/"）
あくまでユーザ側がIAMユーザの権限管理をしやすくするためのもので、AWS側では特に使用しない。
（例えばIAMグループのパス配下にIAMユーザを作成したからと言って、自動的にグループの配下になるわけではない）


## --assume-role-policy-document

- 書式 : --assume-role-policy-document file://`(filepath)`

エンティティに役割を引き受ける許可を与える信頼関係ポリシードキュメント。

公式リファレンスの文言を翻訳しただけだと「何のこっちゃ」となりますが、要はこのロールはjsonファイルの内容と信頼関係、つまり利用を許可しているわけです。
つまり、これによりLambdaはWooferLambdaRoleの権限も（利用の度に）取得できるようになりました。

# 2.3 IAMポリシー作成（WooferLambdaRole用）

オプションは2.1と（ほぼ）同じなので割愛。regionとaccountIDはそれぞれ自分の環境に置き換えています。

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "lambda:InvokeFunction",
                "Resource": "arn:aws:lambda:region:accountID:function:publishNewBark*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "logs:CreateLogGroup",
                    "logs:CreateLogStream",
                    "logs:PutLogEvents"
                ],
                "Resource": "arn:aws:logs:region:accountID:*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "dynamodb:DescribeStream",
                    "dynamodb:GetRecords",
                    "dynamodb:GetShardIterator",
                    "dynamodb:ListStreams"
                ],
                "Resource": "arn:aws:dynamodb:region:accountID:table/BarkTable/stream/*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "sns:Publish"
                ],
                "Resource": [
                    "*"
                ]
            }
        ]
    }

# IAMポリシーをロールにアタッチ

    aws iam put-role-policy --role-name WooferLambdaRole \
        --policy-name WooferLambdaRolePolicy \
        --policy-document file://role-policy.json

（ほとんどそのままですが、一応引数についても記載）

## --role-name

- 書式 : --role-name `(value)`

ポリシーをアタッチするIAMロール名を指定。

## --policy-name

- 書式 : --policy-name `(value)`

アタッチするIAMポリシー名を指定。

## --policy-document

- 書式 : --policy-document file://`(filepath)`

ポリシーの内容を記載したファイルを指定。

# 参考URL

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_elements.html

https://docs.aws.amazon.com/cli/latest/reference/iam/create-role.html

https://docs.aws.amazon.com/cli/latest/reference/iam/put-role-policy.html

https://qiita.com/knaka/items/69724ee0b5aaf6108a55