📝
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 のアーカイブルール追加時に既存の結果をアーカイブする方法を紹介しました。
どなたかの参考になれば幸いです。
参考資料
- IAM Access AnalyzerのアーカイブルールをCLIやCloudFormationで追加した場合はアーカイブルールの適用を忘れずに | DevelopersIO
- apply_archive_rule - Boto3 1.37.22 documentation
- AWS::AccessAnalyzer::Analyzer ArchiveRule - Support retrospective archival of Access Analyzer rules · Issue #766 · aws-cloudformation/cloudformation-coverage-roadmap
Discussion