開発をスムーズに行うための、たった 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)