CloudFormation StackSetsのターゲットアカウントゲートを試してみた

StackSetsオペレーション前に簡単なチェックができるよ
2022.08.02

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、おんづか(@onzuka_muscle)です!

みなさんAWS CloudFormation StackSetsにターゲットアカウントゲートという機能があることをご存知でしょうか。

アカウントゲートは、「AWS Lambda」関数を指定して、AWS CloudFormation StackSets でそのアカウントのスタックオペレーションが開始する前に、ターゲットアカウントが特定の要件を満たしていることを検証できるオプション機能です。

つまりこういうイメージでオペレーション前のチェックができるようです。

やってみた

ターゲットアカウントにLambda関数を作成

ドキュメントに載っていた必ずFAILEDステータスを返すサンプルCloudFormationテンプレートで試してみたいと思います。

Lambdaを作成するのはターゲットアカウントです。

管理者アカウントではないので注意してください。

作成されたLambda関数がこちらです。

(なぜかコード内のステータスがFAILになってたのでFAILEDに書き換えてます。)

注意点として関数名はAWSCloudFormationStackSetAccountGateにする必要があります。

Lambda関数にリソースベースポリシー追加

管理者アカウントがLambda関数を呼び出せるようにアクセス許可を与える必要があります。

Lambda関数>設定>アクセス権限を開き、リソースベースポリシーより「アクセス権限を追加」をクリックします。

アクションはlambda:InvokeFunctionを選択し、管理者カウントのIDを入力します。

出来上がったポリシーを参考に載せておきます。

{
  "Version": "2012-10-17",
  "Id": "default",
  "Statement": [
    {
      "Sid": "test-account-gate",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::{管理者アカウント}:root"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:us-east-1:{ターゲットアカウント}:function:AWSCloudFormationStackSetAccountGate"
    }
  ]
}

StackSetを展開してみる

管理者アカウントよりStackSetsを展開してみます。

展開の手順は通常の方法と変わらないので割愛します。(最後に参考ブログを載せておきます。)

AccountGate check failedと表示されて失敗しました!

次はSUCCEEDEDに書き換えて同様に試してみます。

成功しました。

所感

ユースケースとしてドキュメントでは下記のように挙げていました。

アカウントゲートの一般的な例としては、ターゲットアカウントにアクティブまたは未解決の CloudWatch アラームがないことを検証することが挙げられます。

他にはどんな使い方があるだろうと考えてみたのですがイマイチこれだ!という使い方が思いつかなかったです。

もし良いものありましたらTwitterアカウント(@onzuka_muscle)まで連絡ください!

 

アカウントゲートが存在するターゲットアカウントに対して複数のStackSetsでスタックを展開している(する)場合、その全てのオペレーションに反応してLambdaが実行されます。

そのため、特定スタック固有のチェックを入れてしまうのはアンチパターンになると感じました。

他のスタックを操作したときに無意味なチェックが走ってしまうことになりますからね。

参考

本ブログ中に出てきた用語について不明なものがある場合はご参考ください。

基本的なStackSets操作に関するブログについても紹介しています。