📝

CloudFormation で IAM Access Analyzer のアーカイブルール追加時に既存の結果をアーカイブする方法

に公開

IAM Access AnalyzerのアーカイブルールをCLIやCloudFormationで追加した場合はアーカイブルールの適用を忘れずに | DevelopersIO

EventBridgeルールでアーカイブルールの作成や更新がされたタイミングでアーカイブルールを適用するLambda関数 or Step Functionsのステートマシンを実行するような実装をすれば対応できるかもしれません。

上記の部分を実装してみました。

IAM Access Analyzer の有効化

以下の CloudFormation テンプレートをデプロイして有効化しました。
コメントアウト部分は更新時に使用します。

AWSTemplateFormatVersion: "2010-09-09"
Resources:
  IAMAccessAnalyzer:
    Type: AWS::AccessAnalyzer::Analyzer
    Properties:
      AnalyzerName: IAMAccessAnalyzer
      Type: ACCOUNT
      ArchiveRules:
        - RuleName: ArchiveIAMRoles
          Filter:
            - Property: resourceOwnerAccount
              Eq:
                - "<your-account-id>"
            # - Property: resourceType
            #   Eq:
            #     - "AWS::IAM::Role"

Lambda 関数の作成

Python 3.13 の Lambda 関数を作成しました。

import json
import time
import boto3

cloudformation = boto3.client('cloudformation')
accessanalyzer = boto3.client('accessanalyzer')

def lambda_handler(event, context):
    stack_name = event['detail']['requestParameters']['stackName']

    for attempt in range(3): 
        response = cloudformation.describe_stacks(StackName=stack_name)
        stack_status = response['Stacks'][0]['StackStatus']

        if stack_status == 'UPDATE_COMPLETE':

            response = accessanalyzer.apply_archive_rule(
                analyzerArn='your-analyzer-arn',
                ruleName='your-rule-name', 
            )
            print("Archive Rule applied successfully")
            return

        time.sleep(3)
  • CloudFormation スタックの更新が完了しているかどうかをチェック
  • 更新が完了していればアーカイブを実行する
  • 更新が完了していなければ 3 回までリトライ
  • リトライする都合上、関数のタイムアウトは 10 秒以上に設定
  • Lambda 実行ロールには AdministratorAccess 権限を付与

EventBridge ルール作成

CloudFormation のスタック更新イベントを検知するイベントパターンを定義しました。

{
  "source": ["aws.cloudformation"],
  "detail-type": ["AWS API Call via CloudTrail"],
  "detail": {
    "eventSource": ["cloudformation.amazonaws.com"],
    "eventName": ["UpdateStack"],
    "requestParameters": {
      "stackName": ["your-stack-name"]
    }
  }
}
  • スタック名は IAM Access Analyzer を作成した CloudFormation スタック名
  • ターゲットは上記で作成済みの Lambda 関数

IAM Access Analyzer の更新

以下の CloudFormation テンプレートで更新しました。

AWSTemplateFormatVersion: "2010-09-09"
Resources:
  IAMAccessAnalyzer:
    Type: AWS::AccessAnalyzer::Analyzer
    Properties:
      AnalyzerName: IAMAccessAnalyzer
      Type: ACCOUNT
      ArchiveRules:
        - RuleName: ArchiveIAMRoles
          Filter:
            - Property: resourceOwnerAccount
              Eq:
                - "<your-account-id>"
            - Property: resourceType
              Eq:
                - "AWS::IAM::Role"

動作確認

IAM Access Analyzer の既存の結果がアーカイブされていれば成功です。

まとめ

今回は CloudFormation で IAM Access Analyzer のアーカイブルール追加時に既存の結果をアーカイブする方法を紹介しました。
どなたかの参考になれば幸いです。

参考資料

Discussion