こんにちは、クラウドソリューション事業部の本田です。ブログを書くのが久しぶりになってしまいました。ここから頑張って書いていきたいと思います。
最近携わっている案件でAWS Amplifyを触る機会が多いです。チュートリアルでは触ったことがあるが、実際の運用となるとそこまで使われているケースはまだまだ多くないのかと思います。そんな中である程度の規模感でかつ成長しているAmplifyで動いている案件に携われているのは幸せなことですし、実際の運用中で得たtipsを記事にしていければと思います。
今回書く内容として、AWSの認証サービスであるAWS CognitoをGoogleフェデレーション対応させる内容の一環でGCP側のクレデンシャルを設定する必要があります。Googleフェデレーション対応とは、アプリケーションでログインする際にGoogleのアカウントでログインできる機能です。普段使われているサービスなどではよくある設定かと思います。使うサービスが増えるごとにIDとパスワードが増えないので、最近ではマストな機能と言っても過言ではないかと思います。
本記事ではGoogleフェデレーションの具体的な接続方法は記載しません。実際にAmplifyで設定をしていく中でクレデンシャルをいい感じに共有するのってどうすればいいんだ?となったのでそちらの方法を記載していきます。
やりたいこと
Amplify override authでGoogleなどのソーシャルログイン機能を有効化するサンプルは以下のページに記載されています。https://docs.amplify.aws/cli/auth/override/#customize-amplify-generated-cognito-user-group-resources
ただclient_idとclient_secretがハードコーディングされてる形になっていて、最悪とりあえず適当な情報を入れておいて作成されてから値を更新するなどの方法もありますが、せっかくのAmplifyなので自動で入力できるようにしたいと思います。
AWSにおけるシークレット情報
Googleフェデレーションの設定をする際に設定する情報はGCPのシークレット情報なので、取り扱いには注意です。もちろんgithubにあげてしまうなんてのもNGです。AWSにはそういったシークレットな情報を扱えるサービスがありますので、今回はその中でもAWS Secrets Managerを利用します。cognitoを作成する際に、AWS Secrets Managerから値を取得してセットするようにします。
override.tsで実装する
上記でサンプルコードが載っているページがありましたが、ベースはそちらを使います。
1import { AmplifyAuthCognitoStackTemplate } from "@aws-amplify/cli-extensibility-helper";
2
3export function override(resources: AmplifyAuthCognitoStackTemplate) {
4 resources.addCfnResource(
5 {
6 type: "AWS::Cognito::UserPoolIdentityProvider",
7 properties: {
8 AttributeMapping: {
9 email: "email",
10 username: "sub"
11 },
12 ProviderDetails: {
13 client_id: "{{resolve:secretsmanager:gcp-credential:SecretString:client_id}}",
14 client_secret: "{{resolve:secretsmanager:gcp-credential:SecretString:client_secret}}",
15 authorize_scopes: "openid email profile",
16 },
17 ProviderName: "Google",
18 ProviderType: "Google",
19 UserPoolId: {
20 Ref: "UserPool",
21 },
22 },
23 },
24 "Google-social-provider"
25 );
記載の方法としてはCloudformationのテンプレートと同じになります。AWS Secrets Managerのシークレットに動的参照で値を参照します。パラメータストアでもセキュアな文字列を保存することができ、その際にはresolve:ssm-securecognitoで動的参照を行いますが、cognitoのリソースには対応していないため今回はAWS Secrets Managerに値を保存しています。
最後に
amplifyを使っていて、これどうしよう?みたいな小ネタを書いていこうと思います。また次回でお会いしましょう。