
AWSマネジメントコンソールのスイッチロール履歴を個別削除できるブックマークレットを作ってみた
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、CX事業本部 IoT事業部の若槻です。
以前のエントリで、AWSマネジメントコンソールのスイッチロール履歴を、CookieデータをVS Codeで編集することにより、個別削除する方法を紹介しました。

不要になった履歴がいつまでも残っているのはよろしくないので個別削除はやるべきなのですが、上記方法だと少しばかり手間が掛かります。
そこで今回は、Google Chromeでブックマークレットを開くだけでスイッチロール履歴を個別削除できるようにしてみたので、方法をご紹介します。
やってみた
準備
次のようなJavaScriptスクリプトを使用します。(2022/5/8修正。旧スクリプトは記事末尾にあります。)
javascript: (() => {
  const cookies = document.cookie;
  const cookiesArray = cookies.split(';');
  const targetCookieName = 'noflush_awsc-roleInfo';
  for (const c of cookiesArray) {
    const cArray = c.split('=');
    if (cArray[0].trim() == targetCookieName) {
      const decoded = decodeURIComponent(cArray[1]);
      const parsed = JSON.parse(decoded);
      const roleList = parsed.rl;
      if (roleList.length === 0) {
        window.alert('削除可能なスイッチロール履歴が見つかりませんでした。');
        return;
      };
      var roleListText = '';
      var selectableNumArray = [];
      roleList.forEach((role, i) => {
        roleListText = `${roleListText}\n${i + 1} ${role.d}`;
        selectableNumArray.push((i + 1).toString());
      });
      var loopFlag = true;
      var input = undefined;
      do {
        input = window.prompt(`削除したいロール(表示名)を番号で指定して下さい。${roleListText}`);
        if (selectableNumArray.includes(input)) {
          if (!window.confirm(`${input} ${roleList[Number(input) - 1].d} を削除しますか?`)) {
            window.alert('削除を中止しました。');
            return;
          };
          loopFlag = false;
        } else if (input === null) {
          window.alert('削除を中止しました。');
          return;
        } else {
          window.alert(`1〜${selectableNumArray.slice(-1)[0]}の間の番号を指定して下さい。`);
        };
      } while (loopFlag);
      const finAlertText = `${input} ${roleList[Number(input) - 1].d} をスイッチロール履歴から削除しました。`;
      roleList.splice(Number(input) - 1, 1);
      parsed.rl = roleList;
      const stringified = JSON.stringify(parsed);
      const encoded = encodeURIComponent(stringified);
      document.cookie = `${targetCookieName}=${encoded};domain=.aws.amazon.com;path=/`;
      window.alert(finAlertText);
      return;
    };
  };
  window.alert('削除可能なスイッチロール履歴が見つかりませんでした。');
})();
上記スクリプトを[URL]に指定したブックマークをブラウザに登録します。

動作確認
現在3つのスイッチロール履歴が残っています。

AWSマネジメントコンソールをブラウザで開いた状態で、先程登録したブックマークを開きます。

各ロール履歴に番号が振られるので、いずれかを指定して[OK]。

削除して問題無ければ[OK]。

削除が完了しました。

画面を更新しスイッチロール履歴を見ると、削除したロール履歴が表示されなくなっています!

ハマった箇所
AWSマネジメントコンソールのスイッチロール履歴はHTTP Cookieで管理されるので、スクリプトではCookie周りの処理を行っているのですが、その辺りでいくつかハマりました。
取得したCookieの名前の先頭にスペースが入る
取得したCookieの名前(noflush_awsc-roleInfo)の先頭になぜかスペースが入るため、Cookie名での判定処理でトリムする必要がありました。
  const targetCookie = 'noflush_awsc-roleInfo';
  for (const c of cookiesArray) {
    const cArray = c.split('=');
    if (cArray[0].trim() == targetCookie) {
CookieのAttributeの指定
AWSマネジメントコンソールのスイッチロール履歴はAttributeが次のようになっている必要があります。
- Domain:
.aws.amazon.com - Path:
/ 

始めCookieの設定処理を下記のようにしたところ、
      document.cookie = `${targetCookie}=${encoded}`;
Attributeが次のように設定されるためうまく動作しませんでした。
- Domain:
<region>.console.aws.amazon.com - Path:
/console 

よって、Attributeを下記のように明示的に指定する必要がありました。
      document.cookie = `${targetCookie}=${encoded};domain=.aws.amazon.com;path=/`;
おわりに
AWSマネジメントコンソールのスイッチロール履歴を個別削除できるブックマークを作ってみました。
Chromeでのブックマークレットによるスクリプト実行は、下記エントリで完全に味をしめたので今回もやってみました。便利すぎますね、この機能。
参考
- try_it - JSON.parse() - JavaScript | MDN
 - decodeURIComponent() - JavaScript | MDN
 - Using HTTP cookies - HTTP | MDN
 - String.prototype.trim() - JavaScript | MDN
 
旧スクリプト
javascript: (() => {
  const cookies = document.cookie;
  const cookiesArray = cookies.split(';');
  const targetCookieName = 'noflush_awsc-roleInfo';
  for (const c of cookiesArray) {
    const cArray = c.split('=');
    if (cArray[0].trim() == targetCookieName) {
      const decoded = decodeURIComponent(cArray[1]);
      const parsed = JSON.parse(decoded);
      console.log('==削除前==');
      console.log(parsed);
      const roleList = parsed.rl;
      var promptText = '削除対象のロール(表示名)を指定して下さい。';
      roleList.forEach(role => {
        promptText = promptText + '\n- ' + role.d;
      });
      const targetRoleName = window.prompt(promptText);
      const newRoleList = roleList.filter(role => role.d != targetRoleName);
      parsed.rl = newRoleList;
      console.log('==削除後==');
      console.log(parsed);
      const stringified = JSON.stringify(parsed);
      const encoded = encodeURIComponent(stringified);
      document.cookie = `${targetCookieName}=${encoded};domain=.aws.amazon.com;path=/`;
      break;
    };
  };
})();
以上






