みな様こんにちは。
私はBriswellのSonと申します。
最近、CIでAWSにOIDC方法でデプロイしてみました。
最初に私が作成した図を見ましょう!
添付した画像を参照したら、大体な処理がわかると思いますが、詳しい流れを書きます。
初めに
普通にAWSにソースコードをデプロイするために、aws_access_key_id
とaws_secret_access_key
が必須な情報じゃないでしょうか。
しかし、OIDC方法を利用する際には、上記の2つの情報が先に設定する必要がない、その情報をAWS側で提供します。
基本的に流れは下記の通りです。
I. idPでTokenの発行
最初に、Buildは、CI idPへTokenの作成の命令を送ります。CI idPでもらったパラメーターとPrivateキーを利用し、Tokenを作成します。
Tokenの内容については、例えば:AWS側で案件のIdとユーザのIdで確認したい場合、Buildがパラメーターを渡す情報をTokenに入れる必要があります。
作成が完了した後にBuildに返却します。
II. AWSへTokenの送信
CI idPにTokenを作成してもらったら、BuildでAWS cliのassume-role-with-web-identity
の関数でrole-arn
とweb-identity-token
をAWS送信します。送信の目的としてはAWSサービスにアクセスする時に使うためのAccessKeyId
、SecretAccessKey
、SessionToken
を3つ取得したいからです。
- role-arnは、AWSでロールを作成しておきました。例えば:arn:aws:iam::xxxxxxxxxxx:role/Test-Role-deploy-dev
- web-identity-tokenは、CI idPでTokenを発行したばかりです。
assume-role-with-web-identity
のパラメーターの中にrole-arn
とweb-identity-token
の以外、他のパラメーターもあります。
例えば:duration-seconds
, role-session-name
III. AWSでIAMの認証
AWS側では、IAMがもらったrole-arn
で「ID プロバイダ」を参照します。
上の画像はサンプルのロールです。
上の画像はサンプルの「ID プロバイダ」です。
設定したプロバイダの連絡情報でCI idPに連絡して、Publicのキーを取得します。連絡先は「プロバイダのURL + '.well-known/openid-configuration'」の形です。
Publicのキーを取得したら、IAMがTokenをパラメーターに変換します。
その後に、パラメーターとロールの設定した「信頼されたエンティティ」の比較を行います。ロールにしている場合、一時的な情報(AccessKeyId、SecretAccessKey、SessionToken)を発行し、Buildに返却します。もらったデータが指定していない場合、エラーを返却する。
IV. BuildでAWS認証の設定
最後にBuild側ではAWS認証情報をもらったら、「aws configure」のコマンドで保持します。
AWSにデプロイやアクセスなどするために、この情報を使います。この情報は一時的な情報なので、Buildが完了したら、このキーがなくなり、CI側に保存しないです。
最後に
上記は、CIからAWSにOIDCの方法でデプロイに関する基本的な共有です。
拙い文章でしたが、最後まで読んでいただきありがとうございました。
疑問があれば、コメントをしてください。
よろしくお願いします。