👏

[Bash]連想配列と配列で2次元配列のループ処理を作り、複数のIAMグループ(+複数ポリシー付与)作成する

2022/12/31に公開

複数のIAMグループを作るスクリプトを作りたい

IAMグループを複数作成するスクリプトを作成したので備忘録として残します。

検討

シェル作成にあたり検討したこと

  • IAMグループはAWS cliaws iam create-groupコマンドで作成
  • IAMグループに付与する許可ポリシーは、aws iam attach-group-policyコマンドを使用
  • attach-group-policyドキュメントをみると1度の実行で付与できるポリシーは1つっぽい(←あってる?)
  • 複数のポリシーを付与できるように処理を工夫する必要あり
  • 工夫どうするか→多次元の配列を作りループ処理すればできそう
  • 多次元のループ処理は、連想配列と配列を組み合わせれば実装できそう

連想配列と配列を組み合わせたシェルスクリプトサンプル

まずは、連想配列と配列を組み合わせ疑似的に2次元配列のループを行うスクリプトのサンプルを作成しました。

シェルスクリプトサンプル

zigen.bash
#!/bin/bash
set -eu

declare -A rt00=(
        ["rt00-1"]="
                hoge-01
                hoge-02
                hoge-03
                "
        ["rt00-2"]="
                fuga-11
                fuga-12
                fuga-13
                fuga-14
                "
        ["rt00-3"]="
                piyo-21
                piyo-22
                piyo-23
                piyo-24
                "
)

for rt in "${!rt00[@]}"; do
    echo "${rt}"
    nxt=(`echo ${rt00[${rt}]}`)
    for v in "${nxt[@]}"; do
        echo $'\t'${v}
    done
done

実行結果

実行結果
[cloudshell-user@ip-10-10-178-186 ~]$ bash zigen.bash 
rt00-1
        hoge-01
        hoge-02
        hoge-03
rt00-3
        piyo-21
        piyo-22
        piyo-23
        piyo-24
rt00-2
        fuga-11
        fuga-12
        fuga-13
        fuga-14
[cloudshell-user@ip-10-10-178-186 ~]$ 

シェルスクリプトでIAMグループを複数作成する

さきほど紹介した"連想配列と配列を組み合わせたシェルスクリプトサンプル"を元に、IAMグループとIAMグループに許可ポリシーを付与するシェルスクリプトを作成します。

シェルスクリプト

#!/bin/bash
set -eu

AWSID=123456789012

declare -A iam_groups=(
        ["MyIamGroup001"]="
              arn:aws:iam::${AWSID}:policy/service-role/AWSQuickSightIAMPolicy
              arn:aws:iam::${AWSID}:policy/ExecPolicy
              arn:aws:iam::aws:policy/AWSDirectConnectReadOnlyAccess
              "
        ["MyIamGroup002"]="
              arn:aws:iam::aws:policy/AmazonEKSClusterPolicy
              arn:aws:iam::aws:policy/job-function/Billing
              arn:aws:iam::aws:policy/service-role/AWS_ConfigRole
              "
        ["MyIamGroup003"]="
              arn:aws:iam::aws:policy/job-function/SupportUser
              arn:aws:iam::${AWSID}:policy/service-role/AWSQuickSightRedshiftPolicy
              "
      )

for group_name in "${!iam_groups[@]}"; do
     echo "IAMGroup-Name:${group_name}"
     aws iam create-group --group-name ${group_name}
     iam_policys=(`echo ${iam_groups[${group_name}]}`)
     for iam_policy in "${iam_policys[@]}"; do
        echo $'\t'attached policy ${iam_policy}
        aws iam attach-group-policy --group-name ${group_name} --policy-arn ${iam_policy}
    done
done

実行結果

[cloudshell-user@ip-10-10-178-186 ~]$ ./create-iamgroups.bash 
IAMGroup-Name:MyIamGroup002
{
    "Group": {
        "Path": "/",
        "GroupName": "MyIamGroup002",
        "GroupId": "USOANAYYVS2BMXJWQGDXCMK",
        "Arn": "arn:aws:iam::123456789012:group/MyIamGroup002",
        "CreateDate": "2022-12-30T22:27:06+00:00"
    }
}
        attached policy arn:aws:iam::aws:policy/AmazonEKSClusterPolicy
        attached policy arn:aws:iam::aws:policy/job-function/Billing
        attached policy arn:aws:iam::aws:policy/service-role/AWS_ConfigRole
IAMGroup-Name:MyIamGroup003
{
    "Group": {
        "Path": "/",
        "GroupName": "MyIamGroup003",
        "GroupId": "USOANAYYVS2BMXKEHKEN3KX",
        "Arn": "arn:aws:iam::123456789012:group/MyIamGroup003",
        "CreateDate": "2022-12-30T22:27:11+00:00"
    }
}
        attached policy arn:aws:iam::aws:policy/job-function/SupportUser
        attached policy arn:aws:iam::123456789012:policy/service-role/AWSQuickSightRedshiftPolicy
IAMGroup-Name:MyIamGroup001
{
    "Group": {
        "Path": "/",
        "GroupName": "MyIamGroup001",
        "GroupId": "USOANAYYVS2BMXKFNG5KV3X",
        "Arn": "arn:aws:iam::123456789012:group/MyIamGroup001",
        "CreateDate": "2022-12-30T22:27:15+00:00"
    }
}
        attached policy arn:aws:iam::123456789012:policy/service-role/AWSQuickSightIAMPolicy
        attached policy arn:aws:iam::123456789012:policy/ExecPolicy
        attached policy arn:aws:iam::aws:policy/AWSDirectConnectReadOnlyAccess
[cloudshell-user@ip-10-10-178-186 ~]$ 

実行後、IAMグループが作成されたかコンソールからも確認します

  • IAMグループが作成されていました。

  • MyIamGroup1の許可ポリシー

  • MyIamGroup2の許可ポリシー

  • MyIamGroup3の許可ポリシー


以上です。

連想配列と配列をもっと組み合わせると3次元以上の配列を作ったり、3次元以上の多層ループもできそうな気がします。気が向いたら挑戦しようと思います。

Discussion