AWS Amplify Gen1 で作成される AuthRole に擬似パラメータ参照を使ったカスタムポリシーを設定してみた

AWS Amplify Gen1 で作成される AuthRole に擬似パラメータ参照を使ったカスタムポリシーを設定してみた

Clock Icon2024.11.01

いわさです。

先日、AWS Amplify がamplify add <category>で自動作成するリソースをカスタマイズする方法を紹介しました。

https://dev.classmethod.jp/articles/amplify-gen1-s3-lifecycle/

一方で、Amplify Gen1 では上記のような追加したバックエンドリソース以外にamplify initを実行した際に自動生成されるリソースがあります。よくカスタマイズしたくなるものとしては、UnauthRole と AuthRole です。

% amplify init
⚠️ For new projects, we recommend starting with AWS Amplify Gen 2, our new code-first developer experience. Get started at https://docs.amplify.aws/react/start/quickstart/
✔ Do you want to continue with Amplify Gen 1? (y/N) · yes

:

? Please choose the profile you want to use hoge
Adding backend environment dev to AWS Amplify app: d13usmn4tugsni

Deployment completed.
Deploying root stack nextamplified [ ==========------------------------------ ] 1/4
        amplify-nextamplified-dev-f5b… AWS::CloudFormation::Stack     CREATE_IN_PROGRESS             Thu Oct 31 2024 16:42:01…     
        UnauthRole                     AWS::IAM::Role                 CREATE_IN_PROGRESS             Thu Oct 31 2024 16:42:03…     
        AuthRole                       AWS::IAM::Role                 CREATE_IN_PROGRESS             Thu Oct 31 2024 16:42:03…     
        DeploymentBucket               AWS::S3::Bucket                CREATE_COMPLETE                Thu Oct 31 2024 16:42:18…     

:

実はこれらについても Amplify のコード上でカスタマイズすることが可能です。

https://docs.amplify.aws/gen1/react/tools/cli/project/override-iam/

今回は上記機能を使って、Amplify 外部で管理する Lambda 関数を Invoke 出来るカスタムポリシーを設定しましたのでその様子を紹介します。
また、そのカスタムポリシー内では CloudFormation の擬似パラメータを参照出来るかも試してみました。
Amplify のコード上はどの AWS アカウントにデプロイされるかわからないので AWS アカウント ID のハードコーディングを避けたかったためです。

プロジェクトレベルのリソースをオーバーライドする

まずは、amplify override projectを実行します。
そうすると前回のバケットカスタマイズと同じようにオーバーライド用のスケルトンコードが生成されます。

% amplify override project
✅ Successfully generated "override.ts" folder at /Users/iwasa.takahito/work/hoge1031authcustom/next-amplified/amplify/backend/awscloudformation
✔ Do you want to edit override.ts file now? (Y/n) · yes
Edit the file in your editor: /Users/iwasa.takahito/work/hoge1031authcustom/next-amplified/amplify/backend/awscloudformation/override.ts
? Press enter to continue 

9F4B5CAF-B112-497C-B05F-A8B8F53AE0B1.png

今回は AuthRole をカスタマイズしたいので、公式ドキュメントのとおりカスタムポリシーを追加してみます。

amplify/backend/awscloudformation/override.ts
import { AmplifyProjectInfo, AmplifyRootStackTemplate } from '@aws-amplify/cli-extensibility-helper';

export function override(resources: AmplifyRootStackTemplate, amplifyProjectInfo: AmplifyProjectInfo) {
    const authRole = resources.authRole;
    const basePolicies = Array.isArray(authRole.policies)
        ? authRole.policies
        : [authRole.policies];
    authRole.policies = [
        ...basePolicies,
        {
            policyName: "amplify-permissions-custom-resources",
            policyDocument: {
                Version: "2012-10-17",
                Statement: [
                    {
                        Resource: {
                            "Fn::Join": [
                                "",
                                ["arn:aws:lambda:ap-northeast-1:", {"Ref": "AWS::AccountId"}, ":function:hoge-function"]
                            ]
                        },
                        Action: "lambda:InvokeFunction",
                        Effect: "Allow",
                    },
                ],
            },
        },
    ];
}

上記コードを実装したらamplify pushあるいはパイプラインなどでバックエンドリソースをデプロイしてみましょう。

% amplify push
✔ Successfully pulled backend environment dev from the cloud.

    Current Environment: dev
    
┌──────────┬───────────────┬───────────┬─────────────────┐
│ Category │ Resource name │ Operation │ Provider plugin │
└──────────┴───────────────┴───────────┴─────────────────┘
✔ Are you sure you want to continue? (Y/n) · yes

Deployment completed.
Deploying root stack nextamplified [ ---------------------------------------- ] 0/1
        amplify-nextamplified-dev-f5b… AWS::CloudFormation::Stack     UPDATE_IN_PROGRESS             Thu Oct 31 2024 16:56:33…     

Deployment state saved successfully.

デプロイ後にマネジメントコンソールで確認してみると...

E5A62D23-8339-42E7-B9C3-5A9F68D19EA6.png

良いですね!
ストレージも add して、Amplify が標準管理するインラインポリシーに影響していないかも確認してみます。

% amplify add storage
? Select from one of the below mentioned services: Content (Images, audio, video, etc.)
✔ You need to add auth (Amazon Cognito) to your project in order to add storage for user files. Do you want to add auth now? (Y/n) · yes
Using service: Cognito, provided by: awscloudformation
 
 The current configured provider is Amazon Cognito. 
 
 Do you want to use the default authentication and security configuration? Default configuration
 Warning: you will not be able to edit these selections. 
 How do you want users to be able to sign in? Username
 Do you want to configure advanced settings? No, I am done.
✅ Successfully added auth resource nextamplified58bd2806 locally

✅ Some next steps:
"amplify push" will build all your local backend resources and provision it in the cloud
"amplify publish" will build all your local backend and frontend resources (if you have hosting category added) and provision it in the cloud

✔ Provide a friendly name for your resource that will be used to label this category in the project: · s35527cc53
✔ Provide bucket name: · nextamplifiedac6e782a7dad4ccfb8dc984f21657adc
✔ Who should have access: · Auth users only
✔ What kind of access do you want for Authenticated users? · create/update, read, delete
✔ Do you want to add a Lambda Trigger for your S3 Bucket? (y/N) · no
✅ Successfully added resource s35527cc53 locally

⚠️ If a user is part of a user pool group, run "amplify update storage" to enable IAM group policies for CRUD operations
✅ Some next steps:
"amplify push" builds all of your local backend resources and provisions them in the cloud
"amplify publish" builds all of your local backend and front-end resources (if you added hosting category) and provisions them in the cloud

1362FA3F-0A34-4E98-8E68-F35663AF8CCE.png

良いですね。追加した部分が個別のカスタマーインラインポリシーとして分離されています。

さいごに

本日は AWS Amplify Gen1 で作成される AuthRole に擬似パラメータ参照を使ったカスタムポリシーを設定してみました。

Amplify デプロイ後に AuthRole に手動で独自ポリシーを追加したい際はこの方法をぜひ試してみてください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.