[小旅]cliでrole削除に失敗したので解決策をhelpで探した

cliでroleを削除するにはpolicyを先に削除する必要があるため、helpを使用して必要なコマンドの検索と使い方について調べました
2020.09.14

cliはなれてくるととても便利です。cliコマンド(aws iam delete-role)で不要になったrole削除時にpolicyとの依存関係にハマりhelpを使用してroleを削除するまで必要なコマンドを探したのでまとめます。

最終的に使用したコマンド

最終的にroleを削除するまでに使用したコマンドをまとめます。

  1. policyのarnを取得する
  2. list-attached-role-policiesを使用して削除したいroleにアタッチされているpolicyを確認します。削除したいrole名を指定します。

    $ aws iam list-attached-role-policies --role-name role名 --profile プロファイル名
  3. policyのarnを使用してroleからデタッチする
  4. detach-role-policyを使用してroleからpolicyをデタッチします。削除したいrole名とデタッチするpolicyのarnを指定します。

    $ aws iam detach-role-policy --role-name role名 --policy-arn ポリシーarn --profile プロファイル名
  5. roleの削除
  6. delete-roleを使用して削除したいrole名を指定し削除します。

    $ aws iam delete-role --role-name role名 --profile プロファイル名

roleを削除するコマンド探しの旅

では、上記の流れになるまでに調べたコマンドについてまとめます。

1. role削除時のpolicyとの依存関係

delete-roleを使用しroleを削除します。すると以下のエラーが発生しました。

$ aws iam delete-role --role-name ロール名 --profile プロファイル名
An error occurred (DeleteConflict) when calling the DeleteRole operation: Cannot delete entity, must detach all policies first.

must detach all policies firstより、role削除の前にpolicyをroleからデタッチする必要があることがわかります。

2. デタッチ方法の検索

aws iamにデタッチする方法がないかhelpコマンドを使用して検索しました。

$ aws iam help
...
AVAILABLE COMMANDS
...
       o detach-group-policy
       o detach-role-policy
       o detach-user-policy

detachコマンドがありました!6行目のdetach-role-policyを使用することでroleからpolicyをデタッチできそうです。こちらのコマンドについてhelpで使い方を調べます。

$ aws iam detach-role-policy help
...
SYNOPSIS
            detach-role-policy
          --role-name <value>
          --policy-arn <value>
          [--cli-input-json | --cli-input-yaml]
          [--generate-cli-skeleton <value>]
          [--cli-auto-prompt <value>]

実行時にrole名policyのarnが必要であることがわかりました。

3. policyのarn取得方法の模索

デタッチするには、削除するroleにアタッチされているpolicyのarnを取得する必要があります。

roleにアタッチしているpolicyのarnを検索する方法をhelpで検索します。

$ aws iam help
...
AVAILABLE COMMANDS
...
       o get-policy

       o get-role

       o get-role-policy
...
       o list-attached-group-policies

       o list-attached-role-policies

       o list-attached-user-policies

getかlistで取得できそうです。名前からroleにアタッチされているpolicyを探せそうな、get-roleget-role-policylist-attached-role-policiesについて深掘りします。

  • get-role
  • Outputを確認しアタッチされているpolicyの情報は取得できない事がわかりました。

    $ aws iam get-role help
    ...
    Output:
    
    {
        "Role": {
            "Description": "Test Role",
            "AssumeRolePolicyDocument":"<URL-encoded-JSON>",
            "MaxSessionDuration": 3600,
            "RoleId": "AROA1234567890EXAMPLE",
            "CreateDate": "2019-11-13T16:45:56Z",
            "RoleName": "Test-Role",
            "Path": "/",
            "RoleLastUsed": {
                "Region": "us-east-1",
                "LastUsedDate": "2019-11-13T17:14:00Z"
            },
            "Arn": "arn:aws:iam::123456789012:role/Test-Role"
        }
    }
  • get-role-policy
  • 実行時にpolicyの名前を指定する必要があり今回の用途にあいません。

    $ aws iam get-role-policy help
    ...
    SYNOPSIS
        get-role-policy
      --role-name <value>
      --policy-name <value>
  • list-attached-role-policies
  • Outputの項目よりPolicyArnが取得できる事が確認出来ました!実行時の指定もrole名のみで今回の用途に最適です。

    $ aws iam list-attached-role-policies help
    ...
    SYNOPSIS
        list-attached-role-policies
      --role-name <value>
    ...
    Output:
    
      {
        "AttachedPolicies": [
          {
            "PolicyName": "SecurityAudit",
            "PolicyArn": "arn:aws:iam::aws:policy/SecurityAudit"
          }
        ],
        "IsTruncated": false
      }

4. policyをデタッチする

先ほど調べたlist-attached-role-policiesを使用してpolicyのarnを調べます。

$ aws iam list-attached-role-policies --role-name role名 --profile cm-da
{
    "AttachedPolicies": [
        {
            "PolicyName": policy名1,
            "PolicyArn": policy-arn1
        },
        {
            "PolicyName": policy名2,
            "PolicyArn": policy-arn2
        }
    ]
}

結果より2つのpolicyがアタッチされていることがわかります。

取得したpolicyのarnを使用してroleからpolicyをデタッチします。

$ aws iam detach-role-policy --role-name role名 --policy-arn policy-arn1 --profile プロファイル名
$ aws iam detach-role-policy --role-name role名 --policy-arn policy-arn2 --profile プロファイル名

5. roleを削除する

roleからpolicyをデタッチしたので、roleの削除を行います。

$ aws iam delete-role --role-name ロール名 --profile プロファイル名

エラー文もなく今度は無事に削除されました!

まとめ

helpを使用して必要なコマンドを探す旅について沖縄の下地がお届けしました。cliでroleを削除するのは簡単だろうと思っていたらpolicyとの依存関係により一発では出来ませんでしたが、helpを使用してコマンドを探したり構文を確認したりとても便利だと実感しました。この記事がどなたかの助けになれば幸いです。

参考リンク