AWS IAM Policyをawscliで作成・取得・更新

AWSのIAM Policyをawscliで取得、作成や更新をすることはできますが、以下の理由でとても手間です。

  • Policyにバージョンの概念があるため、バージョン番号を確認するワンクッションが必要
  • Policyの名前を指定する箇所とARNを指定する箇所があり分かりづらい上に、ARNの場合はコマンドラインがとても長くなりがち

これを簡略化するためのスクリプトを書きました。

IAM Policyを取得

aws-get-iam-policy というファイル名の実行権限付きのファイルです。

#!/bin/bash

set -Ceu
set -o pipefail

profile=default
name=

# スクリプトのコマンドラインパラメータを解釈
while [ "$#" != 0 ]; do
    case "$1" in
        --profile )
            profile=$2
            shift
            ;;
        * )
            if [ -n "$name" ]; then
                echo "Option \`${1}\` is not supported." >&2
                exit 1
            fi
            name=$1
            ;;
    esac
    shift
done

# IAM Policyを取得

account_id=$(aws --profile $profile --output json sts get-caller-identity | jq -r .'Account')

arn="arn:aws:iam::${account_id}:policy/${name}"

policy_version=$(aws --profile $profile --output json iam get-policy --policy-arn $arn | jq -r '.Policy.DefaultVersionId')

aws --profile $profile --output json iam get-policy-version --policy-arn $arn --version-id $policy_version | jq -r '.PolicyVersion.Document'

実行例

$ aws-get-iam-policy --profile foo BarPolicy

IAM Policyを作成・更新

aws-put-iam-policy というファイル名の実行権限付きのファイルです。

#!/bin/bash

set -Ceu
set -o pipefail

profile=default
name=

# スクリプトのコマンドラインパラメータを解釈
while [ "$#" != 0 ]; do
    case "$1" in
        --profile )
            profile=$2
            shift
            ;;
        * )
            if [ -n "$name" ]; then
                echo "Option \`${1}\` is not supported." >&2
                exit 1
            fi
            name=$1
            ;;
    esac
    shift
done

# IAM Policyを作成・更新

account_id=$(aws --profile $profile --output json sts get-caller-identity | jq -r .'Account')

arn="arn:aws:iam::${account_id}:policy/${name}"

if aws --profile $profile --output json iam get-policy --policy-arn $arn >/dev/null 2>&1; then
    # 既存更新
    aws --profile $profile iam create-policy-version --policy-arn $arn --policy-document file:///dev/stdin --set-as-default
else
    # 新規作成
    aws --profile $profile iam create-policy --policy-name $name --policy-document file:///dev/stdin
fi

JSONのポリシードキュメントを標準入力から取り込みます。

実行例

$ aws-put-iam-policy --profile foo BarPolicy < policy.json

取得と更新をパイプでつなげばコピーもできます。

foo1 アカウントにある BarPolicy ポリシーを foo2 アカウントに同名でコピー。

$ aws-get-iam-policy --profile foo1 BarPolicy | aws-put-iam-policy --profile foo2 BarPolicy

IAM Policyを更新 その2

ポリシードキュメントのJSONファイルをローカルに置かなくても、vipeコマンドを使えばポリシーをその場で編集できます。

$ aws-get-iam-policy BarPolicy | vipe | aws-put-iam-policy BarPolicy

vipeコマンドのインストールはUbuntuであれば以下のとおり。

$ sudo apt install -y moreutils

関連