AWS CloudFormation StackとStackSetのテンプレートを一括エクスポートするBashスクリプト

# 概要
AWS CloudFormation スタックとスタックセットのテンプレートを一括で取得、保存するスクリプトをAWS CLIを使用して作成しました。

# コード
```bash

#!/bin/bash

# AWSアカウントIDを取得する
account_id=$(aws sts get-caller-identity --query 'Account' --output text)

# CloudFormationスタックのリストを取得する
stacks=$(aws cloudformation describe-stacks --query 'Stacks[].StackName' --output text)

# CloudFormationスタックセットのリストを取得する
stack_sets=$(aws cloudformation list-stack-sets --status ACTIVE --query 'Summaries[].StackSetName' --output text)

# スタックまたはスタックセットがない場合
if [ -z "$stacks" ] && [ -z "$stack_sets" ]; then
  echo "No CloudFormation stacks and stack sets found in AWS Account ${account_id}."
  exit 0
fi

# stack-templatesディレクトリを作成する
if [ -n "$stacks" ]; then
  mkdir "stack-templates"

  # 各スタックに対してテンプレートを保存する
  for stack in $stacks; do
    aws cloudformation get-template --stack-name "$stack" --query 'TemplateBody' --output text > "stack-templates/${stack}.yml"
  done
fi

# stack-sets-templatesディレクトリを作成する
if [ -n "$stack_sets" ]; then
  mkdir "stack-sets-templates"

  # 各スタックセットに対してテンプレートを保存する
  for stack_set in $stack_sets; do
    aws cloudformation describe-stack-set --stack-set-name "$stack_set" --query 'StackSet.TemplateBody' --output text > "stack-sets-templates/${stack_set}.yml"
  done
fi

# テンプレートディレクトリのZIPアーカイブを作成する
zip -r "${account_id}.zip" stack-templates stack-sets-templates
rm -rf stack-templates stack-sets-templates
```

# 呼び出し方
1. ローカルでファイルを保存します。ファイル名：describe-cf-resources.sh
2. AWS CloudShellを起動して、ローカルからファイルをアップロードします。
3. コマンドを入力してスクリプトを実行します。コマンド：sh describe-cf-resources.sh
実行すると、カレントディレクトリ内にZIPアーカイブが作成され、その中にスタックとスタックセットが格納されたフォルダが入っています。
4. クラウドシェルからローカルにZIPアーカイブをダウンロードします。
    1. [Actions] の [ダウンロード ファイル] を選択します。
    2. ダウンロードファイルダイアログボックス、ダウンロードするファイルのパスを入力します。
ファイルのパスの例：/home/cloudshell-user/123456789012.zip
    3. [ダウンロード] を選択します。

参考：[AWS CloudShellの使用](https://docs.aws.amazon.com/ja_jp/cloudshell/latest/userguide/working-with-cloudshell.html)

# 仕組みの説明
## AWS アカウント ID の取得
[get-caller-identity](https://docs.aws.amazon.com/ja_jp/cli/latest/reference/sts/get-caller-identity.html)コマンドを使用して AWS アカウント ID を取得します。このアカウント ID は、ZIP アーカイブ名に使用します。

## CloudFormation スタックの一覧取得
[describe-stacks](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stacks.html)コマンドを使用して CloudFormation スタックの一覧を取得します。

## CloudFormation スタックセットの一覧取得
[list-stack-sets](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-stack-sets.html)コマンドを使用して CloudFormation スタックセットの一覧を取得します。このコマンドは、アカウント内のすべてのスタックセットの概要を表示するものです。このリストには削除されたものも含まれます。削除されて実際には存在しないものは除外するため、statusオプションで "ACTIVE"を指定しています。

## スタックやスタックセットの有無の確認
どちらも存在しない場合は、「No CloudFormation stacks and stack sets found in AWS Account 123456789012」というメッセージを表示します。

## stack-templates ディレクトリの作成して、スタックのテンプレートを保存
CloudFormationスタックが存在する場合は、「stack-templates」ディレクトリを作成します。[get-template](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/get-template.html)コマンドを使用して、各CloudFormationスタックのテンプレートを取得します。取得したテンプレートは、"stack-templates/${stack}.yml"という名前のファイルに保存します。

## stack-sets-templatesディレクトリの作成して、スタックセットのテンプレートを保存
CloudFormationスタックセットが存在する場合は、「stack-sets-templates」ディレクトリを作成します。
[describe-stack-set](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stack-set.html)コマンドを使用して、各CloudFormationスタックセットのテンプレートを取得します。取得したテンプレートは、"stack-sets-templates/${stack_set}.yml"という名前のファイルに保存します。

## テンプレートディレクトリのZIPアーカイブの作成
「stack-templates」ディレクトリと「stack-sets-templates」ディレクトリを含むZIPアーカイブを作成します。ZIPアーカイブの名前は「AWSアカウントID.zip」としています。