Cognitoユーザー認証によるS3 のAccess制御をAmplifyとReactとDropzoneを使って実装する。(その2)

Cognitoで認証されたユーザーの権限を設定します。

AWS Serviceを利用する事に対する権限の設定にはIAM UserとIAM Roleの2種類があります。IAM Userは、UserがManagement ConsoleにLoginしてAWS Serviceを利用するための権限設定と言えます。Management Consoleを操作できない仮想のUserを設定することも可能です。個人的な理解はIAM UserはAWS Serviceを外側から利用することを想定した権限設定です。IAM Roleは、AWS Serviceが他のAWS Serviceを利用するための権限設定と言えます。こちらは、AWS Serviceを内側から利用することを想定した権限設定と理解しています。
IAM UserもIAM Roleも個々の権限を直に記述して設定することができます。また、IAM Policyに権限の設定を記述し、複数のIAM PolicyをIAM UserやIAM RoleにAttachして権限を構成することもできます。

Cognitoユーザー認証で認証されたユーザーは、Cognitoで設定されたIAM Roleの権限でAWS Serviceを利用することになります。今回は、Congintoの設定時に生成されたIAM RoleにS3 Accessに必要な権限をIAM Policyに設定し、IAM RoleにAttachします。

Management ConsoleからIAMを開き、「ポリシー」をクリックします。「ポリシーのフィルタ」に「S3」を入力すると、S3の名前を含んだIAM Policyが表示されます。AmazonS3FullAccessの▶をクリックして、ポリシーの書き方を確認します。

「ポリシーの作成」をクリックして、 「JOSN」タブを開き、 ポリシーを設定します。 (その1)で作成したBucketだけにAccess出来るように、(その1)で確認したARNは「arn:aws:s3:::upload.hacya.com」なので、次のJSONのTemplateの{enter bucket name}に「upload.hacya.com」を入れます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::{enter bucket name}/public/*",
                "arn:aws:s3:::{enter bucket name}/protected/${cognito-identity.amazonaws.com:sub}/*",
                "arn:aws:s3:::{enter bucket name}/private/${cognito-identity.amazonaws.com:sub}/*"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::{enter bucket name}/uploads/*"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::{enter bucket name}/protected/*"
            ],
            "Effect": "Allow"
        },
        {
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "public/",
                        "public/*",
                        "protected/",
                        "protected/*",
                        "private/${cognito-identity.amazonaws.com:sub}/",
                        "private/${cognito-identity.amazonaws.com:sub}/*"
                    ]
                }
            },
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::{enter bucket name}"
            ],
            "Effect": "Allow"
        }
    ]
}

「ポリシーの確認」をクリックし、ポリシーの確認をします。
ポリシーの確認では、「名前」を設定します。今回は「CognitoS3UploadPolicy」としました。「ポリシーの作成」をクリックし、ポリシーを作成します。

ポリシーが作成できたら、左側の「ロール」をクリックします。ロールが表示されるので、CognitoのUser Poolを作成する時に作成した「Cognito_UserPoolAuth_Role」をクリックします。「ポリシーをアタッチします」をクリックし、「ポリシーのフィルタ」に「S3」を入力し、先ほど作成した 「CognitoS3UploadPolicy」の左側のチェックボックスをクリックしてチェックを入れます。「ポリシーのアタッチ」をクリックして、ポリシーをアタッチします。

これで、Cognitoの認証ユーザーが持つRoleに、S3のAccessに必要な権限を追加したことになります。

コメントを残す