こんにちは。今年8月に発足したラクスル事業本部 HoE(※)室 でインターンをしています、灰原です。
HoE室では、プロダクト開発チームの生産性を可視化するのための社内システムを開発しています。このシステムはAWS上にサーバーレスアプリケーションとして構築しました。構築の際に問題となったのが、新たにAWSリソースを追加する際に発生する、インフラチームと開発者側とのコミュニケーションコストです。この記事では、迅速な開発と堅牢な統制を両立させるために、AWS CDKとPermissions Boundaryを組み合わせて利用する方法をご紹介します。 ※ HoE:Head of Engineering
AWS CDKの導入
前述の社内システムは、大まかに以下のようなアーキテクチャになっています。Lambda関数でGitHubやClickUpなどのAPIを叩いてその結果をS3に保存し、Glueを通してS3内のデータをAthenaでクエリするというものです。実際にはLambda関数やGlueテーブルは複数あり、今後も増えていく予定です。 弊社ではAWSのリソースをTerraformで構築しており、このTerraformをインフラチームが管理しています。そのためAWSのリソースを変更する場合には、TerraformのレポジトリにPRを送るか、インフラチームに作業を依頼する必要があります。
例えばLambda関数に渡す環境変数を追加したり、Glueテーブルのフィールドを1つ修正したりするような軽微な変更であっても、インフラチームには工数が、開発側には待ち時間が発生します。これではサーバーレスであることの恩恵が小さく、インフラ・開発双方の負担が大きくなってしまっていました。
この問題を解決するため、AWS CDKを導入することにしました。AWS CDKは、TypeScriptやPythonなどのプログラミング言語でAWSのリソースを定義してデプロイできるフレームワークです。上図のLambda関数やGlueテーブルなどをCDKで定義し、これを開発側で管理できれば、インフラチームとの調整なしにリソースを変更できます。
ここで問題になるのが権限の管理です。例えばAthenaのクエリを実行するLambda関数を追加したい場合、新たにIAMロールを作成する必要があります。しかし、IAMロールを自由に作成できる権限を開発側に与えてしまうのは、統制の観点で避けるべきです。このようなジレンマを解消してくれるのがPermissions Boundaryという仕組みです。
Permissions BoundaryでIAMロールの発行を制限する
Permissions BoundaryはIAMの発行に対して制限をかける機能です。Permissions Boundaryを使えば、IAM管理者が設けた制限の範囲内であれば自由にIAMを作成できるようになります。このPermissions BoundaryとCDKを組み合わせることで、開発者がCDKで定義するリソースに対してインフラチームが制限をかけることができます (下図)。こうすることでインフラチームが設けた制限の中で、開発者が自由にリソースを定義できるようになります。 CDKでPermissions Boundaryを設定するコードは以下のようになります。
const app = new cdk.App(); const stack = new CodePipelineStack(app, 'PipelineStack'); const policy = iam.ManagedPolicy.fromManagedPolicyName(stack, 'PermissionsBoundary', 'RestrictedAccessBoundaryPolicy'); iam.PermissionsBoundary.of(stack).apply(policy);
PermissionsBoundary Class を使って、stack
で使われる全てのIAMロール・IAMユーザーに対して、policy
をPermissions Boundaryとして適用しています。ここでstack
はリソースを定義したクラスのインスタンスです。またpolicy
はインフラチームがTerraformで定義したIAMポリシーです。これでPermissions Boundaryの制限についてはインフラチームが、CDKで定義する内容については開発者側がそれぞれ管理できます。
おわりに
AWS CDKとPermissions Boundaryの組み合わせで、高速かつ安全にサーバーレスアプリを開発できるようになりました!
今回のAWS CDK導入に関しましては、インフラチームのKobayashiさんに多大なるご協力をいただきました。ありがとうございます。