
本記事はFIXER Advent Calendar 2024( FIXER Advent Calendar 2024 ~ Tech編 ~ )12月16日の記事です。
はじめに
こんにちは、アドベントカレンダー16日目AWSマネジメントコンソールをDiscord認証でSSO設定する手順のPart2です。
前回はDiscordとKeycloakの連携を行ったので、今回はAWSとKeycloakの連携を行っていきます。
AWSとKeycloakの連携
1. Keycloakの管理コンソールにサインインします。
2. 左ペインの「Realm settings」から「SAML 2.0 Identity Provider Metadata」 を開き、別タブで開くXMLをCtrl+Sなどで保存しておきます。

3. 次にAWSのマネジメントコンソールにサインインし、「IAM Identity Center」の設定を開きます。
4. アイデンティティソースタブで、「Action」から「アイデンティティソース」の変更をクリックします。
5. 外部プロバイダーを選択しNextをクリックします。
6. 「サービスプロバイダーのメタデータ」から、メタデータファイルをダウンロードして下さい。
7. その後、「IdP SAML メタデータ」の部分にKeycloakでダウンロードしたxmlファイルをアップロードしてNextをクリックします。
8. 承諾してアイデンティティソースを変更出来たら、再度Keycloakに戻ります。
9. 左ペインの「Clients」から「Import client」をクリックします。

10. 「Browse」から、先ほどAWSのマネジメントコンソールからダウンロードしたしたメタデータファイルのXMLをアップロードし「Save」をクリックします。

これでKeycloakとAWSの連携は完了です。続いてAWS IAM Identity Centerでユーザと許可セットの作成を行います。
AWS IAM Identity Centerでユーザの作成
ここではKeyCloakからフェデレーションするユーザを作成します。
実際にAWSのリソースを操作するのはここで作成するユーザになります。
1. AWS IAM Identity Centerの左ペインで「User」を選択し、「ユーザを追加」をクリックします。
2. ユーザの情報を入力していきます。このとき注意点が1つあり、ユーザ名は必ずDiscordのアカウント作成に使ったメールアドレスにしてください。
ここで違うものをユーザ名にしてしまうとサインインできなくなってしまいます。
今回は、ひとまず自分がサインインできれば良しとしてグループは作成していないので、このまま画面に沿ってユーザの作成を完了させます。
許可セットの作成
続いて先ほど作成したユーザに割り当てる権限(ポリシー)を作成していきます。
1. AWS IAM Identity Centerの左ペインで「Permission sets」を選択し、「許可セットを作成」をクリックします。
2. 今回は事前定義された許可セットのAdministratorAccessを選択します。

そのまま画面に沿って許可セットの作成を完了させます。
許可セットの割り当て
せっかく作成した許可セットもアカウントに割り当てないと意味がないのでここで割り当てていきます。
1. AWS IAM Identity Centerの左ペインで「AWS accounts」を選択し、「許可セットを作成」をクリックします。

2. 「ユーザ」タブで先ほど作成したユーザを選択します。

3. 先ほど作成した許可セットを選択します。

そのまま画面に沿って割り当てを完了させます。
実際にSSOでサインインする。
以上でSSOする準備が整いました。
「AWS access portal URL」にアクセスすると、Discordの(ログインしていない場合はログイン画面と)認証画面にリダイレクトされます。
認証するとAWSアクセスポータルにリダイレクトされるので、許可セット名をクリックすることでサインインすることができます。
終わりに
直接は不可能なDiscordの認証情報を使ったSSOを、OSSであるKeycloakを用いることで実現することができました。
ただし、本ブログ投稿時点(2024/12/16)でKeycloakにSCIM v2.0 プロトコルは実装されていないため、AWSへのユーザ追加およびグループへの割り当ては手動で行う必要があります。
一応いくつかSCIM同期を可能にするアドオンも存在している(その1、その2)ようなのですが、今回は検証していません。
現在Keycloak本体にSCIM v2.0 プロトコルを実装しようというIssueも立っており、優先度もかなり高く設定されているので近日中には実装されそうな予感がしています。
また、AWS IAM Identity Centerでのユーザと許可セット作成、許可セットの割り当てに関しては、過去に先輩が丁寧なブログを書いているのでそちらも参考にしてもらえばと思います。
それではよいAWSライフを!