aws sso-admin コマンドを用いて、特定のユーザグル－プに対する権限付与を自動化

# はじめに
本記事は、下記のリンクを参考に、SSO認証を用いたAWS権限付与の自動化をまとめたものである。

https://dev.classmethod.jp/articles/aws-sso-just-in-time-policy-cli/

# 前提条件
* 本記事は、Azureを用いたSSO認証を設定している環境で、AWS権限付与をまとめたものであり、権限付与対象に関しては、ユーザグループ単位とする。※ユーザ単位の場合、コマンドが違くなるので、注意が必要。
* shellscript の実行環境は、AWS CloudShell とする。

# 権限付与
## (0)概要説明

今回の実施する内容としては、「Azure側で割り当て済みのユーザグループ」に対して、「特定のAWSアカウント」に「特定の許可セット」を付与する内容である。
今回は、aws sso-adminコマンドを実施し、権限付与をする内容であり、実際のコマンドとしては、下記となります。

```
aws sso-admin create-account-assignment  \
  --instance-arn xxxxxxxxxxxxx \
  --target-id xxxxxxxxxxxxx \
  --target-type AWS_ACCOUNT \
  --permission-set-arn xxxxxxxxxxxxx  \
  --principal-type  GROUP \
  --principal-id xxxxxxxxxxxxx
```

上記CLIコマンドで実行する際、事前に「instance-arn」「target-id(AWSアカウントNoである12桁の数字)」「permission-set-arn(許可セットのarn)」「principal-id(グループID)」を確認する必要がある。
下記コマンドを実施することで、「instance-arn」と「principal-id(グループID)」は確認することができます。

```
#Store IdentityStoreId in variable
IDSTORE_ID=$(aws sso-admin list-instances | jq -r '.Instances[].IdentityStoreId')
#Store InstanceArn in variable
INSTANCE_ARN=$(aws sso-admin list-instances | jq -r '.Instances[].InstanceArn')
#Store group name in variable
GROUP=GroupName
#Store group id in variable
GROUP_ID=$(aws identitystore list-groups --identity-store-id $IDSTORE_ID --filters AttributePath=DisplayName,AttributeValue=$GROUP  | jq -r '.Groups[].GroupId')
```

「permission-set-arn(許可セットのarn)」の確認は、コンソールで確認となります。
[IAM Identity Center](https://us-east-1.console.aws.amazon.com/singlesignon/home?region=ap-northeast-1#/dashboard) にアクセスし、下記の赤枠で囲っている許可セットにアクセスし、対象の許可セットのarnを確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252895/6bbbe060-aa54-5bb6-950e-c73ab03279f0.png)

これで、必要な情報は全て手に入ったので、次項で実際に権限付与をしていきます。

## (1)AWS権限付与

実際にAWS権限付与する際は、「許可対象のAWSアカウントのリスト」と「実行用のShell」を用意します。


**許可対象のAWSアカウントのリスト**

```aws_account_list.txt
111111111111
222222222222
333333333333
444444444444

```

**実行用のShell**

```
#!/bin/bash

#Variable definition
#Store IdentityStoreId in variable
IDSTORE_ID=$(aws sso-admin list-instances | jq -r '.Instances[].IdentityStoreId')
#Store InstanceArn in variable
INSTANCE_ARN=$(aws sso-admin list-instances | jq -r '.Instances[].InstanceArn')
#Store group name in variable
GROUP=GroupName
#Store group id in variable
GROUP_ID=$(aws identitystore list-groups --identity-store-id $IDSTORE_ID --filters AttributePath=DisplayName,AttributeValue=$GROUP  | jq -r '.Groups[].GroupId')
#Store AWS AccountNo in variable
AWS_ACCOUNT=aws_account_list.txt
#Store in PermissionSet variable
#ReadOnlyAccess
PERMISSION_SETS_ARN1=arn:aws:sso:::permissionSet/ssoins-xxxxxxxxxxxxxxxx/ps-1111111111111111
#AdministratorAccess
PERMISSION_SETS_ARN1=arn:aws:sso:::permissionSet/ssoins-xxxxxxxxxxxxxxxx/ps-2222222222222222

#Grant Privileges
cat $AWS_ACCOUNT | while read LINE
do
    AWS_CODE=$(echo $LINE)
    #ReadOnlyAccess
    aws sso-admin create-account-assignment --instance-arn $INSTANCE_ARN --target-id ${AWS_CODE} --target-type AWS_ACCOUNT --permission-set-arn $PERMISSION_SETS_ARN1 --principal-type GROUP --principal-id $GROUP_ID
    #AdministratorAccess
    aws sso-admin create-account-assignment --instance-arn $INSTANCE_ARN --target-id ${AWS_CODE} --target-type AWS_ACCOUNT --permission-set-arn $PERMISSION_SETS_ARN2 --principal-type GROUP --principal-id $GROUP_ID
done
```

上記のシェルを実行することで、複数のAWSアカウントに対して、同一の権限付与をすることができる内容となります。
「while read 変数名」で、リストの数だけ処理を繰り返す内容です。※下記記事を参考。

https://blog.serverworks.co.jp/shell-script-while

# 備考
Windows で作成したShellをAWS CloudShellで実行すると改行コードが違うため、スクリプトが失敗してしまいます。
そんな時は、sedコマンドにて、対象のファイルの改行コードを変更してから、実行しましょう。

```
sed -i -e 's/\r//g' "FileName"
```

# 最後に
私の環境では、AWS権限付与は特定のユーザグループ単位に付与する運用を行っているが、「案件スタートタイミング」や「チームの改変時」には依頼が立て続けにきてしまい、てんやわんやしてしまってました。
そんな時に、CLIコマンドがあることを発見し、うれしさから本記事を書かせていただきました。
本記事がどなたかのお役に立てれば幸いです。