AWS の IAM ロールとポリシーをどうやって管理していますか?
JSON ファイルでロールとポリシー定義を管理できるのに便利なツール(npmライブラリ)を作りました。
github.com/tilfin/aws-iam-policy-tool
できること
- ローカルの JSON ファイルと IAM のロールとポリシー定義の相互インポート・エクスポート
- ローカルの定義ファイルに沿って IAM ロールとポリシーが構成されているかの検証
- 正規表現マッチするカスタムポリシーの複数削除(AWS Management Console では一個ずつしか消せない)
できないこと
- ロールのインラインポリシーはサポートしていない
どのように使えるのか
- IAM ロールとポリシー定義を JSON ファイルでソースコード同様にGit等のリポジトリで管理できる。
- npm ライブラリなので Lambda から定期的にデプロイ環境のロールとポリシーが正しいかの検証ができる。
定義ファイルの仕組み
- IAM のブラウザ上で編集する JSON とほぼ同じです。
- デプロイ環境別にリソース名に prefix/suffix を付けている場合は
ENV
としておくことで、コマンド実行時に引数で指定します。 - AWS アカウント ID も
ACCOUNT_ID
でコマンド実行時に引数指定することで変えることができます。
ロール
{
"Role": {
"RoleName": "yourapp-ec2-api-ENV",
"Path": "/",
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
},
"AttachedPolicies": [
{
"PolicyName": "yourapp-s3-storage-ENV",
"PolicyArn": "arn:aws:iam::ACCOUNT_ID:policy/yourapp-s3-storage-ENV"
}
]
}
ポリシー
ポリシー名は内容に含まれないため JSON ファイル名そのものが適用されます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::yourapp-storage-ENV/*"
}
]
}
導入と使い方
npm からインストールします。
$ npm install -g aws-iam-policy-tool
現状のロールを ./roles
とポリシーを ./policies
にそれぞれ書き出します。
$ awsiamtool export-role ./roles
$ awsiamtool export-policy ./policies
各ファイルの ARN 内の AWS アカウント ID の部分を ACCOUNT_ID
に置換します。動作環境を示すもの (例. dev, staging など) が名前に含まれていれば、ENV
に置換します。ポリシーの場合はファイル名もリネームします。
検証してみます。
$ awsiamtool validate-role -i 111122223333 -e dev roles
$ awsiamtool validate-policy -i 111122223333 -e dev policies
本番環境に定義を作成します。
$ AWS_PROFILE=prod awsiamtool import-policy -i 111122224444 -e prd policies
$ AWS_PROFILE=prod awsiamtool import-role -i 111122224444 -e prd roles
※ポリシー修正時 import-policy
に上書きオプションを --overwrite
を指定します。
ライブラリとして使う(別の変数を適用するには)
現状コマンド引数ではサポートしていませんがライブラリとして使えば可能です。
const awsIamPolicyLib = require('aws-iam-policy-tool');
const opts = {
json: true,
overwrite: true
};
const varSets = {
ACCOUNT_ID: '000011112222',
ENV: 'stg',
COMMON_ACCOUNT_ID: '333344445555'
};
awsIamPolicyLib.importPolicy('./policies', varSets, opts);
.then(() => {
return awsIamPolicyLib.importRole('./roles', varSets, opts);
})
.then(() => { console.info('Importing done') })
.catch(err => { console.error(err) });
その他、コマンドの実行結果例などは README を見てください。