メンバーアカウントの AWS エンタープライズサポートアクティベーションを自動化する

## モチベーション
エンタープライズサポート加入以降に AWS Organizations 内に追加されたメンバーアカウントはエンタープライズサポートに登録されていません。新規メンバーアカウントをエンタープライズプランの対象とするには組織の管理アカウントでサポートケースを起票し、アクティベーション (有効化) を依頼する必要があります。

これを自動化したいケースを想定しています。

## 実装例
英語窓口にエンタープライズサポートの有効化を依頼した場合は自動的にアクティベーションが実施され、ケースのクローズまで行われます。これを前提に AWS Step Functions でケース起票、クローズ確認、通知までをステートマシン化するシンプルな例です。


### 入力
Amazon EventBrige で AWS Organizations の `CreateAccount` イベントや AWS Control Tower の `CreateManagedAccount` イベントをトリガーにステートマシンを起動させることを想定して、入力は以下のように単一アカウントとしています。1つのサポートケースで複数アカウント ID の有効化を依頼すること自体は可能です。

```json
{
  "AccountId": "<有効化を依頼する Account ID>"
}
```
### ステートマシン定義

処理の流れは以下のようになります。
ケースの起票とステータスの確認は AWS SDK service integrations を使用しています。

* CeateCase ステートでステートマシン起動時の入力から受け取ったアカウント ID を有効化対象として、英語窓口のサポートケースを起票
* CreateCase ステートのタスク結果として返される Case ID をもとに DescribeCases ステートを実行
  * DescribeCases API には Case ID をリストで渡す必要があるため、組み込み関数の [States.Array](https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/amazon-states-language-intrinsic-functions.html#asl-intrsc-func-arrays) を利用する
  * タスク結果もリストになるため、OutputPath で `$.Cases[0]` を指定
* Choise ステートで DescirbeCases のアウトプットからケースのステータスを確認
  * `resolved` なら SNS Pulibsh ステートに進む
  * それ以外の場合は Wait ステートで指定時間の待機後、再度 DescribeCases を実行
* SNS Publish ステートで指定の SNS Topic にメッセージを発行
  * Message には DescribeCases ステートのアウトプットをそのまま渡す


```statemachine.asl.json
{
  "Comment": "A description of your state machine",
  "StartAt": "CreateCase",
  "States": {
    "CreateCase": {
      "Type": "Task",
      "Parameters": {
        "Subject": "Enterprise Activation Request for Linked account",
        "ServiceCode": "customer-account",
        "SeverityCode": "low",
        "CategoryCode": "other-account-issues",
        "CommunicationBody.$": "States.Format('Please enable Enterprise support for following account ID:\n{}\n', $.AccountId)",
        "Language": "en",
        "IssueType": "customer-service"
      },
      "Resource": "arn:aws:states:::aws-sdk:support:createCase",
      "Next": "DescribeCases"
    },
    "DescribeCases": {
      "Type": "Task",
      "Parameters": {
        "CaseIdList.$": "States.Array($.CaseId)",
        "IncludeResolvedCases": true
      },
      "Resource": "arn:aws:states:::aws-sdk:support:describeCases",
      "Next": "Choice",
      "OutputPath": "$.Cases[0]"
    },
    "Choice": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.Status",
          "StringEquals": "resolved",
          "Next": "SNS Publish"
        }
      ],
      "Default": "Wait"
    },
    "SNS Publish": {
      "Type": "Task",
      "Resource": "arn:aws:states:::sns:publish",
      "Parameters": {
        "Message.$": "$",
        "TopicArn": "arn:aws:sns:us-east-1:123456789012:your-sns-topic"
      },
      "End": true
    },
    "Wait": {
      "Type": "Wait",
      "Seconds": 30,
      "Next": "DescribeCases"
    }
  }
}
```

Workflow Studio 上では以下のように表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/2671423f-ef73-508e-4abb-e888fdfcd69f.png)

### 実行例
といってもこの画像からは正常終了していることくらいしかわからないですが。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/8dce1ad2-49f7-eb50-60ea-24754d03ef39.png)


以上です。
参考になれば幸いです。