Y_Yamashitaのブログ

勉強したことのアウトプット・メモ中心。たまに日記とか。

JAWS-UG CLI専門支部 #181R SQS入門を噛みしめながら復習する(①事前作業編)

はじめに

先日、JAWS-UG CLI専門支部 #181R SQS入門に参加した。

jawsug-cli.connpass.com

CloudShell、Cloud9を使ってSQSを作成、メッセージの送付/受信/削除を実施した。忘れないうちに、再度復習を実施する。
前回の復習同様、出来るだけ一つ一つのコマンドの中身を噛みしめながら復習していく。

※とか何とか言っていたら、噛みしめ過ぎてしまい、事前作業だけで1記事分のボリュームになってしまった。。仕方ないので、2回に分けて記載することにする。

IAMロールへのポリシーアタッチ

今回はCloud9でSQSを扱うので、Cloud9用のIAMロールに対し、IAMポリシー"AmazonSQSFullAccess"をアタッチする。IAMポリシーのアタッチはCloudShellで実施する。

変数の準備

前回のハンズオン同様、まずは変数を用意する。

[cloudshell-user@ip-10-0-167-94 ~]$ IAM_ROLE_NAME='handson-cloud9-environment-role'
[cloudshell-user@ip-10-0-167-94 ~]$ IAM_POLICY_NAME='AmazonSQSFullAccess'
[cloudshell-user@ip-10-0-167-94 ~]$ 
[cloudshell-user@ip-10-0-167-94 ~]$ echo ${IAM_ROLE_NAME} ; echo ${IAM_POLICY_NAME}
handson-cloud9-environment-role
AmazonSQSFullAccess
[cloudshell-user@ip-10-0-167-94 ~]$ 
[cloudshell-user@ip-10-0-167-94 ~]$ set | grep IAM_*
IAM_POLICY_NAME=AmazonSQSFullAccess
IAM_ROLE_NAME=handson-cloud9-environment-role
[cloudshell-user@ip-10-0-167-94 ~]$ 

続いて、"AmazonSQSFullAccess"のARNを取得する。IAMロールにポリシーをアタッチする際に、ポリシー名ではなくARNで指定する必要があるため。

[cloudshell-user@ip-10-0-167-94 ~]$ IAM_POLICY_ARN=$( \
>   aws iam list-policies \
>     --scope AWS \
>     --max-items 1000 \
>     --query "Policies[?PolicyName==\`${IAM_POLICY_NAME}\`].Arn" \
>     --output text \
> ) \
>   && echo "${IAM_POLICY_ARN}"
arn:aws:iam::aws:policy/AmazonSQSFullAccess
[cloudshell-user@ip-10-0-167-94 ~]$

ARNの取得部分のコマンドの詳細は以下。

コマンド 内容
aws iam list-policies IAMポリシーの一覧を表示する
--scope AWS AWS管理ポリシーに絞る
--max-items 1000 表示の最大数を1000にする
--query "Policies[?PolicyName==${IAM_POLICY_NAME}].Arn" PolicyNameが"AmazonSQSFullAccess"(変数IAM_POLICY_NAMEの中身)のポリシーの、ARN部分を指定する
--output text 結果をJSON形式ではなくテキスト形式で出力する

ちなみに、aws iam list-policiesコマンドをそのまま出力した結果はこんな感じだった。(※全部出力するととんでもない量になるので、headで冒頭20行だけ出してみた)

[cloudshell-user@ip-10-0-35-205 ~]$ aws iam list-policies --scope AWS | head -n 20
{
    "Policies": [
        {
            "PolicyName": "AWSDirectConnectReadOnlyAccess",
            "PolicyId": "ANPAI23HZ27SI6FQMGNQ2",
            "Arn": "arn:aws:iam::aws:policy/AWSDirectConnectReadOnlyAccess",
            "Path": "/",
            "DefaultVersionId": "v4",
            "AttachmentCount": 0,
            "PermissionsBoundaryUsageCount": 0,
            "IsAttachable": true,
            "CreateDate": "2015-02-06T18:40:08+00:00",
            "UpdateDate": "2020-05-18T18:48:22+00:00"
        },
        {
            "PolicyName": "AmazonGlacierReadOnlyAccess",
            "PolicyId": "ANPAI2D5NJKMU274MET4E",
            "Arn": "arn:aws:iam::aws:policy/AmazonGlacierReadOnlyAccess",
            "Path": "/",
            "DefaultVersionId": "v2",
[cloudshell-user@ip-10-0-35-205 ~]$ 
[cloudshell-user@ip-10-0-35-205 ~]$ 
[cloudshell-user@ip-10-0-35-205 ~]$ aws iam list-policies --scope Local | head -n 20
{
    "Policies": [
        {
            "PolicyName": "AWSQuickSightIAMPolicy",
            "PolicyId": "ANPATO53NFKUB4O64JFIN",
            "Arn": "arn:aws:iam::xxxxxxxxxxxx:policy/service-role/AWSQuickSightIAMPolicy",
            "Path": "/service-role/",
            "DefaultVersionId": "v1",
            "AttachmentCount": 1,
            "PermissionsBoundaryUsageCount": 0,
            "IsAttachable": true,
            "CreateDate": "2021-05-06T14:26:15+00:00",
            "UpdateDate": "2021-05-06T14:26:15+00:00"
        },
        {
            "PolicyName": "handson-Cloud9EnvironmentOwner-policy",
            "PolicyId": "ANPATO53NFKUB6T4HF7QC",
            "Arn": "arn:aws:iam::xxxxxxxxxxxx:policy/handson-cloud9/handson-Cloud9EnvironmentOwner-policy",
            "Path": "/handson-cloud9/",
            "DefaultVersionId": "v1",
[cloudshell-user@ip-10-0-35-205 ~]$

頭にPoliciesがあって、その中にPolicyName, PolicyId, Arnなどが格納されているのが分かる。そのため、先ほどの--queryでは、Arnを指定するためにPolicies[].Arnという記載を行っていた事が分かる。
また、--scopでAWSを指定した場合とLocalを指定した場合で出力が変わっていることも分かる。AWSを指定した場合は、AWS管理ポリシー(AWSがあらかじめ用意しているポリシー)が出力されていて、Localを指定した場合は、カスタマー管理ポリシー(ユーザーが自分で作成したポリシー)が出力されている。そのため、Localの方のポリシーは、ArnにアカウントID(xxxでマスキングしている所)が含まれている。

IAMロールへのIAMポリシーのアタッチ

だいぶ脱線してしまったが、これで変数の取得が終わったので、IAMロールにIAMポリシーをアタッチする。IAMロールへのポリシーのアタッチはaws iam attach-role-policyコマンドを使用する。(管理ポリシーの場合。インラインポリシーの場合はaws iam put-role-policyコマンドになる。管理ポリシーとインラインポリシーの違いはこちらを参照。)

[cloudshell-user@ip-10-0-35-205 ~]$ aws iam attach-role-policy \
>   --role-name ${IAM_ROLE_NAME} \
>   --policy-arn ${IAM_POLICY_ARN}
[cloudshell-user@ip-10-0-35-205 ~]$

問題なくアタッチされたようなので、確認してみる。ロールにアタッチされた管理ポリシーを確認するには、aws iam list-attached-role-policiesコマンドを使用する。(インラインポリシーの場合はaws iam list-role-policies

[cloudshell-user@ip-10-0-35-205 ~]$ aws iam list-attached-role-policies \
>   --role-name ${IAM_ROLE_NAME} \
>   --query "AttachedPolicies[?PolicyName == \`${IAM_POLICY_NAME}\`].PolicyName" \
>   --output text
AmazonSQSFullAccess
[cloudshell-user@ip-10-0-35-205 ~]$

問題なくアタッチされていることを確認した。念のためマネコンでも確認してみる。

f:id:YuY_83:20210606004214p:plain
IAMポリシーアタッチ確認
問題なくアタッチされていた。加えて、ReadOnlyAccessもアタッチされている。先ほどのコマンドで、queryでPolicyNameでフィルタしなければ、両方出力されるだろうか。

[cloudshell-user@ip-10-0-35-205 ~]$ aws iam list-attached-role-policies \
>   --role-name ${IAM_ROLE_NAME} \
>   --query "AttachedPolicies[].PolicyName" \
>   --output text
AmazonSQSFullAccess     ReadOnlyAccess
[cloudshell-user@ip-10-0-35-205 ~]$ 
[cloudshell-user@ip-10-0-35-205 ~]$

想定通り、二つとも出力された。

おわりに

当日のハンズオンでは5分くらい?であっという間に終わらせた事前準備だが、あれこれ脱線して調べてみると、色々気づきがあって面白い。とはいえ、SQS入門というタイトルなのに、今回はSQSのことを何もしていない。。さすがにこのままではアレなので、次回はちゃんとSQSに関する作業を復習してブログにする。