AWS+Reactアプリ作成入門(IAM Role編）

[AWS+Reactアプリ作成入門(Cognito編)](https://qiita.com/sand/items/e1f4ec830d13569a7128 "AWS+Reactアプリ作成入門(Cognito編)")
[AWS+Reactアプリ作成入門(S3編）](https://qiita.com/sand/items/94cd85c3c0426dc768bd "AWS+Reactアプリ作成入門(S3編）")
[AWS+Reactアプリ作成入門(DynamoDB編）](https://qiita.com/sand/items/70018f322d6fe986fe60 "AWS+Reactアプリ作成入門(DynamoDB編）")
[AWS+Reactアプリ作成入門(IAM Role編）](https://qiita.com/sand/items/a07a08f7c1ccc2e8b967 "AWS+Reactアプリ作成入門(IAM Role編）")
[AWS+Reactアプリ作成入門(ログイン後のAdmin編)](https://qiita.com/sand/items/260a6a0b360e574642cf "AWS+Reactアプリ作成入門(ログイン後のAdmin編)")


今回作成したアプリ ==>[久喜SNS](http://kuki-app-bucket.s3-website-ap-northeast-1.amazonaws.com/ "久喜SNS")

　AWSのIAMサービスにRoleというものがあります。Roleは、AWSサービスのリソースへのアクセスを制御します。今回のアプリの例で言えば、Conginitoサービスを使っていますので、そのCognitoアプリがどのリソースへアクセスできるかをRoleによって決められています。CognitoアプリのRoleは、非ログインユーザとログインユーザで別のものが用意されていますので、ログイン状態によってユーザはアクセス権限が異なります。ちなみにRoleはPolicyのセットとして定義されます。実際に制御の記述はPolicyに記載します。つまりあるPolicyが複数のRoleに割り当てられることが可能です。但しこの記事の中ではRoleとPolicyを混同して使うことがありますが、文脈から読み取っていただければ幸いです。以下に今回のアプリで使われているRoleを説明していきます。

　※未確認ですが、以下の複数のRoleでs3:GetObjectをAllowしていますが、バケットポリシーで既にAllowしているので不要かもしれません。

# １．Cognito_sandAppIDPoolUnauth_Role
　このRoleは「AWS+Reactアプリ作成入門(Cognito編」でsandAppIDPoolというフェデレーテッドアイデンティティを作成した時に指定したものです。ログイン前のCognitoアプリユーザの権限です。非ログインユーザがどのような権限でS3やDynamoDBのリソースにアクセスできるかを記述しています。

```json:Cognito_sandAppIDPoolUnauth_Role
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "mobileanalytics:PutEvents",
                "cognito-sync:*"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::バケット名/contents/cache.json"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:Query",
                "dynamodb:Update",
                "dynamodb:UpdateItem"
            ],
            "Resource": [
                "arn:aws:dynamodb:ap-northeast-1:xxxxxx:table/掲示板テーブル名",
                "arn:aws:dynamodb:ap-northeast-1:xxxxxx:table/掲示板テーブル名/index/partitionYear-uploadTime-index"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:Query",
                "dynamodb:Put",
                "dynamodb:PutItem"
            ],
            "Resource": [
                "arn:aws:dynamodb:ap-northeast-1:xxxxxx:table/コメントテーブル名"
            ]
        }
    ]
}
```


# ２．Cognito_sandAppIDPoolAuth_Role
　このRoleも「AWS+Reactアプリ作成入門(Cognito編」でsandAppIDPoolというフェデレーテッドアイデンティティを作成した時に指定したものです。ログイン後のCognitoアプリユーザの権限です。ログインユーザがどのような権限でS3やDynamoDBのリソースにアクセスできるかを記述しています。

```json:Cognito_sandAppIDPoolAuth_Role
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "mobileanalytics:PutEvents",
                "cognito-sync:*",
                "cognito-identity:*"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::バケット名/contents/images/*",
                "arn:aws:s3:::バケット名/contents/thumbnail/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::バケット名/contents/cache.json"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:PutItem",
                "dynamodb:Put",
                "dynamodb:DeleteItem",
                "dynamodb:Update",
                "dynamodb:UpdateItem",
                "dynamodb:Query"
            ],
            "Resource": [
                "arn:aws:dynamodb:ap-northeast-1:xxxxxx:table/掲示板テーブル",
                "arn:aws:dynamodb:ap-northeast-1:xxxxxx:table/掲示板テーブル/index/partitionYear-uploadTime-index"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:Query",
                "dynamodb:DeleteItem",
                "dynamodb:Put",
                "dynamodb:PutItem"
            ],
            "Resource": [
                "arn:aws:dynamodb:ap-northeast-1:xxxxxx:table/コメントテーブル"
            ]
        }
    ]
}
```



# ３．CreateKukiThumbnailAndStoreInDB
　このアプリには画像がS3にアップロードされたタイミングで起動するLambda関数があります。これはオリジナル画像を縮小しサムネイル画像に変換し、再度S3にアップロードするものです。１つの画像に対してS3には常に２つの画像が存在します。オリジナル画像とサムネイル画像です。このRoleはこのLambda関数の定義の時に指定するものです。

```json:CreateKukiThumbnailAndStoreInDB
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::バケット名/contents/images/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::バケット名/contents/thumbnail/*"
            ]
        }
    ]
}
```

# ４．xxxPool-SMS-Role
　このRoleも「AWS+Reactアプリ作成入門(Cognito編」でxxxPoolというユーザプールを作成した時に定義したものです。ユーザ登録時とかにSNSサービスを使って確認メールを送信しますが、その権限を規定したものです。

```json:xxxPool-SMS-Role
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sns:publish"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

今回は以上です。