開発をスムーズに行うための、たった 2 つの AWS/IAM プラクティス ## はじめに AWS を使った開発をしていて、こんな困ったことがありました。 * ○○を操作する権限が欲しいのに、IAM を操作できる担当者が捕まらなくて開発が進められない * 特定のプロジェクトに関するリソースだけアクセス許可したいけど、○○にはリソースによる制限ができない * マネジメントコンソールを使えるようにしようと思うと、あまり権限を絞れない これらによって、開発スピードが上がらないというのが大きな問題になりました。 さて、原因はなんでしょうか。 * ○○を操作する権限が欲しいのに、IAM を操作できる担当者が捕まらなくて開発が進められない ⇒ **開発者に権限が与えられていない**から、権限を持った人に頼らなければならない * 特定のプロジェクトに関するリソースだけアクセス許可したいけど、○○にはリソースによる制限ができない ⇒ 開発者にアクセスさせられないリソースがあるから、**開発者の権限を絞らなければならない** * マネジメントコンソールを使えるようにしようと思うと、あまり権限を絞れない ⇒ 開発者にアクセスさせられないリソースがあるから、**開発者の権限を絞らなければならない** 後ろの二つは同じ原因ですね。 つまり、**開発者の権限を絞らなければならない環境**だから、**開発者に権限が与えられていない**わけです。 ならば**開発者の権限を絞らなくてもいい環境**なら、**開発者に権限を与えられる**ということで、次のプロジェクトでは 2 つの対策を講じてみました。 基本的には公式のベストプラクティスの通りなので、まずはこちらを読みましょう。 http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/best-practices.html ## 2 つの対策 ### AWS アカウントをサンドボックスにする つまり、**プロジェクト毎に AWS アカウント自体を分けてしまいます**。 これによって、その AWS アカウントの中ではリソースによる制限をかける必要がなくなるため、**開発者の権限を絞らなくてもいい環境**になります。 AWS アカウントを分けることによるデメリットは * Elastic IP の上限など、リソースの制限解除は AWS アカウント毎に行わなければならない * そのままだと請求が分かれてしまうので、必要であれば一括請求の設定をしなければならない 等が考えられますが、開発スピードを落とさないためには十分受け入れられるものだと思います。 この方針は、新規に開発を始める際にはいいのですが、既存の AWS アカウントに複数のプロジェクトを運用していて、そこから別の AWS アカウントに切り出すとなると、かなり大変だなぁというのが悩みどころです。 (DocBase はまさにこの悩みを抱えているところです。。。) ### 開発者はみんな Administrator AWS アカウントをサンドボックスにしたことで、開発者に権限を与えられるようになったので、Administrator 権限を与えてしまいます。 公式の「最小限の特権を認める」というプラクティスを真っ向から否定してしまうようですが、開発をスムーズに行うためにはとても効果的です。 これによって、開発者は特権ユーザとなるため、「特権ユーザーに対して、MFA を有効化する」という公式のプラクティスも、開発者全員に適用することになります。 さらにもう 1 つ、以下の制限を課しています。 #### 開発者用の IAM ユーザにはアクセスキーを発行しない 開発者には Administrator 権限を付与するので、その IAM ユーザでアクセスキーを発行すると、そのキーで全ての操作ができてしまいます。 万が一これが漏洩してしまった場合に影響が大きすぎるので、開発者用の IAM ユーザにはアクセスキーを発行しないようにします。 アクセスキーを使って操作する必要がある場合、別途必要な権限だけを与えた IAM ユーザを作成して、そのユーザに対してアクセスキーを発行します。 ## あとがき もちろん、これらはどこでも適用できるわけではありません。 特に本番環境は**権限を絞らなくていい環境**にするのは難しいでしょうし、大きなプロジェクトでは、機能毎に開発チームは分けたいけど、AWS アカウントは分けられないということもありそうです。 ですが、**開発者に権限を付与することで、自由に試行錯誤できる**ようになり、開発をスムーズに行うことが出来ます。 最低でも開発環境では Administrator 権限を付与して、スムーズな開発ができるようにしたいですね。 ## 宣伝 ![1b846adc-35ee-4346-a210-821208befaf1-668x438.png](https://image.docbase.io/uploads/c38226d4-e201-49b3-a9cb-091412ca0b8d.png =WxH) ### DocBaseとは **情報共有を活発にし、チームを育てる**をコンセプトにした情報共有サービスです。 柔軟な権限設定と使いやすさ、社内の人も社外の人も全員を招待できるから、さまざまな人やツールに散らばっていた情報を一元化できます。 積極的な情報共有と業務の効率化を実現し、チームの成長を促します。 詳しくはこちらから。 [https://docbase.io](https://docbase.io/?utm_source=kray.jp&utm_medium=blog&utm_campaign=aws-iam-practice-for-smooth-development)