[アップデート] AWS Amplify で SSR コンピューティングサービスに IAM ロールを付与できるようになりました
いわさです。
AWS Amplify は SSR フレームワークをサポートしています。
従来 Amplify の SSR 向けには CloudWatch Logs を出力するための IAM サービスロールの概念はあったのですが、サーバーサイドでレンダリングされる際にサービスロールのような形で IAM ロールを使ってポリシーを設定することは出来ませんでした。
先日のアップデートで新たに「コンピューティングロール」の機能が追加され、SSR が実行されるコンピューティングサービスに IAM ロールを割り当てることができるようになりました。
これによって他の AWS マネージドサービスと同様に、コンピューティング側で取得済みのクレデンシャルをアプリケーションコードが使えるようになり、SSR のために独自でクレデンシャルの取得や設定を行わなくても良くなります。
使い方については AWS 公式ブログでも紹介されているのですが、Amplify コンソール周りの設定方法などもう少しいくつか確認したかった点があったので試してみることにしました。
基本的なアプリケーションコードは以下のブログ記事を踏襲しています。
上記記事のように S3 に格納されている画像をクライアントコンポーネントでレンダリングさせます。事前に S3 バケットを作成し、適当な画像を格納済みです。
ローカル実行
まずローカルで実行してみます。
画像を表示させようとしても表示されませんでした。
コンソールのログから Access Denied が発生していることが確認できます。
✓ Compiled /api/image in 189ms (649 modules)
[S3 Image Request] Starting - Bucket: hoge0220amplify, Key: hoge.png
[S3 Image Request] Creating GetObjectCommand...
[S3 Image Request] Sending request to S3...
[S3 Image Request] AWS S3 Error: {
message: 'Access Denied',
code: 'AccessDenied',
requestId: '45X3BVZQ8X3RC9RK',
statusCode: 403
}
[S3 Image Request] Request completed
GET /api/image 500 in 599ms
Amplify デプロイしてサーバー実行
続いてこのアプリケーションを Git リポジトリにプッシュし、Amplify の Git 連携機能で新規アプリケーションとして作成します。
まず、新規アプリケーション作成時には今回追加されたコンピューティングロールを指す項目はありませんでした。アプリケーション作成時に指定できるのは従来どおりのログ用のロールのみみたいです。
この時点で一度アプリケーションを Amplify Hosting 経由で実行してみますが、当然ながら S3 のオブジェクトにはアクセスすることが出来ません。
モニタリングメニューから SSR コンピューティングが出力するログを確認することが出来ます。
こちらを見てみましょう。
クレデンシャルの取得が出来ていないですね。SSR の権限周りでうまくいかない場合はこのあたりのログをチェックするとトラブルシューティングが出来そうですね。
[S3 Image Request] Unexpected error: Error [CredentialsProviderError]: Could not load credentials from any providers
コンピューティングロールを設定
今回のアップデートで次のメニューが追加されています。
サービスロールの概念は前からありましたが IAM ロールのメニューはありませんでしたね。
そしてその中にコンピューティングロールのエリアが用意されています。これか。
ここで設定できるロールですが、amplify.amazonaws.com
サービスを信頼してsts:AssumeRole
させれる必要があります。
上記を手動で設定するか信頼されたエンティティタイプで Amplify を選択しましょう。
コンピューティングロールですが、全てのブランチがデフォルトで使用するロールを基本的に使うことが出来ますが、ブランチごとにその設定を無視して別のコンピューティングロールを使うことも出来ます。
本番・ステージングの権限分離とか、うまくコントロールできそうです。
なお、全ての IAM ロールが選択肢として表示されるのですが前述のとおり Amplify を信頼したロール以外は次のようにエラーとなります。
The compute role provided cannot be assumed by Amplify. Please verify the role exists and has the correct trust relationship.
以下の状態で IAM ロールの設定が保存されている状態です。
ロールの更新をアプリケーションへ反映させるために特に再起動などのステップはないので、このまま先ほどのアプリケーション上でリロードしてみます。
次は SSR の処理で S3 バケットに無事アクセスすることが出来ました。
さいごに
本日は AWS Amplify で SSR コンピューティングサービスに IAM ロールを付与できるようになったので試してみました。
これは地味に嬉しいですね。
SSR が前提であれば今後は基本的に必須な機能になるのではないでしょうか。やむを得ずアクセスキーの利用をしていた方などは是非こちらを試してみてください。