AWS Amplify Gen1 で作成される AuthRole に擬似パラメータ参照を使ったカスタムポリシーを設定してみた
いわさです。
先日、AWS Amplify がamplify add <category>
で自動作成するリソースをカスタマイズする方法を紹介しました。
一方で、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 のコード上でカスタマイズすることが可能です。
今回は上記機能を使って、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
今回は AuthRole をカスタマイズしたいので、公式ドキュメントのとおりカスタムポリシーを追加してみます。
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.
デプロイ後にマネジメントコンソールで確認してみると...
良いですね!
ストレージも 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
良いですね。追加した部分が個別のカスタマーインラインポリシーとして分離されています。
さいごに
本日は AWS Amplify Gen1 で作成される AuthRole に擬似パラメータ参照を使ったカスタムポリシーを設定してみました。
Amplify デプロイ後に AuthRole に手動で独自ポリシーを追加したい際はこの方法をぜひ試してみてください。