AWS CloudFormationで特定CloudFrontディストリビューションのキャッシュクリア専用IAMグループとユーザーを作成してみた

AWS CloudFormationで特定CloudFrontディストリビューションのキャッシュクリア専用IAMグループとユーザーを作成してみた

Clock Icon2025.06.10

クラウド事業本部の梶原@福岡です。
今回は、Amazon CloudFrontの特定ディストリビューションのエッジキャッシュをクリア(Invalidation)する権限だけを持つIAMグループとユーザーを、AWS CloudFormationで作成する方法を紹介します。こちらの記事(CloudFrontエッジキャッシュクリアのみを行うユーザーの作成)を参考にしつつ、特定のディストリビューションIDに限定したポリシーと、グループ・ユーザーの作成を分離したテンプレートを作成しました。またパラメータでディストリビューションIDなど指定できるようにしました。

やりたいこと

  • 目的: CloudFrontの特定ディストリビューション(指定したID)に対してのみキャッシュ無効化(CreateInvalidation)を許可するIAMグループを作成。
  • 要件:
    • IAMグループとユーザーを別々のCloudFormationテンプレートで管理する
    • パラメータでグループ名、ユーザー名、ディストリビューションIDを指定可能にする。
    • セキュリティを考慮し、キャッシュクリアに必要な最小限の権限のみを付与。
  • 対象者: AWSのIAMやCloudFormationを使ったことがあり、CloudFrontのキャッシュ管理を安全かつ効率的に行いたい方。

全体の構成

  1. IAMグループのテンプレート:
    • CloudFrontの特定ディストリビューションに対するキャッシュ無効化権限を持つIAMグループを作成。
    • ポリシーはCreateInvalidationGetInvalidationListInvalidations、および関連する読み取りアクションを許可。
    • ディストリビューションIDをパラメータで指定。
  2. IAMユーザーのテンプレート:
    • IAMユーザーを作成し、指定したグループに所属させる。
    • ユーザー名とグループ名をパラメータで指定。
  3. デプロイとテスト: AWS CLIでテンプレートをデプロイし、キャッシュ無効化をテスト。

やってみた

1. IAMグループのCloudFormationテンプレート

まず、CloudFrontの特定ディストリビューションのキャッシュクリアを許可するIAMグループを作成します。以下のテンプレートを使用します。

AWSTemplateFormatVersion: '2010-09-09'
Description: CloudFormation template to create an IAM group with CloudFront cache invalidation permissions for a specific distribution

Parameters:
  GroupName:
    Type: String
    Description: Name of the IAM group
    Default: CloudFrontInvalidationGroup
    MinLength: 1
    MaxLength: 128
    AllowedPattern: '[a-zA-Z0-9+=,.@_-]+'
    ConstraintDescription: Group name must be 1-128 characters and contain only alphanumeric characters, +=,.@_-.
  DistributionId:
    Type: String
    Description: CloudFront Distribution ID to allow invalidation
    MinLength: 1
    MaxLength: 20
    AllowedPattern: '[A-Z0-9]+'
    ConstraintDescription: Distribution ID must be 1-20 characters and contain only uppercase letters and numbers.

Resources:
  # IAM Group for CloudFront Invalidation
  CloudFrontInvalidationGroup:
    Type: AWS::IAM::Group
    Properties:
      GroupName: !Ref GroupName
      Path: /

  # IAM Policy for CloudFront Invalidation
  CloudFrontInvalidationPolicy:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: !Sub ${GroupName}-Policy
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Action:
              - cloudfront:GetDistribution
              - cloudfront:GetDistributionConfig
              - cloudfront:ListInvalidations
              - cloudfront:CreateInvalidation
              - cloudfront:GetInvalidation
            Resource:
              - !Sub arn:aws:cloudfront::${AWS::AccountId}:distribution/${DistributionId}
      Groups:
        - !Ref CloudFrontInvalidationGroup

Outputs:
  GroupName:
    Description: Name of the IAM Group
    Value: !Ref CloudFrontInvalidationGroup
  GroupArn:
    Description: ARN of the IAM Group
    Value: !GetAtt CloudFrontInvalidationGroup.Arn

ポイント

  • Parameters:
    • GroupName: IAMグループの名前(デフォルト: CloudFrontInvalidationGroup)。
    • DistributionId: キャッシュクリアを許可するCloudFrontディストリビューションのID(例: E1A2B3C4D5E6F7)。
  • IAM Policy:
    • Resourceに特定ディストリビューションのARNを指定(arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID)。
    • 必要なアクションのみ許可。ListDistributionsListStreamingDistributionsは特定ディストリビューションに限定するため不要。
  • Outputs: グループ名とARNを後で参照できるように出力。

2. IAMユーザーのCloudFormationテンプレート

次に、IAMユーザーを作成し、上で作成したグループに所属させるテンプレートです。

AWSTemplateFormatVersion: '2010-09-09'
Description: CloudFormation template to create an IAM user and assign to a CloudFront invalidation group

Parameters:
  UserName:
    Type: String
    Description: Name of the IAM user
    Default: CloudFrontInvalidationUser
    MinLength: 1
    MaxLength: 64
    AllowedPattern: '[a-zA-Z0-9+=,.@_-]+'
    ConstraintDescription: User name must be 1-64 characters and contain only alphanumeric characters, +=,.@_-.
  GroupName:
    Type: String
    Description: Name of the IAM group to assign the user to
    Default: CloudFrontInvalidationGroup
    MinLength: 1
    MaxLength: 128
    AllowedPattern: '[a-zA-Z0-9+=,.@_-]+'
    ConstraintDescription: Group name must be 1-128 characters and contain only alphanumeric characters, +=,.@_-.

Resources:
  # IAM User
  CloudFrontInvalidationUser:
    Type: AWS::IAM::User
    Properties:
      UserName: !Ref UserName
      Path: /
      Groups:
        - !Ref GroupName

Outputs:
  UserName:
    Description: Name of the IAM User
    Value: !Ref CloudFrontInvalidationUser
  UserArn:
    Description: ARN of the IAM User
    Value: !GetAtt CloudFrontInvalidationUser.Arn

ポイント

  • Parameters:
    • UserName: 作成するIAMユーザーの名前(デフォルト: CloudFrontInvalidationUser)。
    • GroupName: ユーザーを所属させるIAMグループの名前。テンプレート1のGroupNameと一致させる。
  • Resources: ユーザーを指定したグループに所属させる。
  • Outputs: ユーザー名とARNを出力。

3. デプロイ手順

以下の手順でテンプレートをデプロイします。CloudFormation のデプロイツールはrainを使用します。

テンプレート1(グループ)のデプロイ

  1. テンプレート1をCloudFrontInvalidationGroup.yamlとして保存。
  2. 以下のコマンドを実行:
    $ rain deploy CloudFrontInvalidationGroup.yaml 
    Enter a value for parameter 'GroupName' "Name of the IAM group" (default value: CloudFrontInvalidationGroup):MyInvalidationGroup
    Enter a value for parameter 'DistributionId' "CloudFront Distribution ID to allow invalidation": E1A2B3C4D5E6F7
    
    • YourCustomGroupName: 任意のグループ名(例: MyInvalidationGroup)。
    • YourDistributionId: 対象のCloudFrontディストリビューションID(例: E1A2B3C4D5E6F7)。
    • --capabilities CAPABILITY_NAMED_IAM: 名前付きIAMリソース作成に必要。
  3. スタック作成が完了したら、出力でグループ名とARNを確認。

テンプレート2(ユーザー)のデプロイ

  1. テンプレート2をCloudFrontInvalidationUser.yamlとして保存。
  2. 以下のコマンドを実行:
    $ rain deploy CloudFrontInvalidationUser.yaml 
    Enter a value for parameter 'GroupName' "Name of the IAM group to assign the user to" (default value: CloudFrontInvalidationGroup): MyInvalidationGroup
    Enter a value for parameter 'UserName' "Name of the IAM user" (default value: CloudFrontInvalidationUser): MyInvalidationUser
    
    
    • YourCustomUserName: 任意のユーザー名(例: MyInvalidationUser)。
    • YourCustomGroupName: テンプレート1で指定したグループ名と一致させる。(例: MyInvalidationGroup
  3. スタック作成が完了したら、AWSマネジメントコンソールのIAMダッシュボードでユーザーがグループに所属していることを確認。

4. 動作確認

デプロイ後、作成したユーザーの認証情報(アクセスキーなど)を使用して、CloudFrontのキャッシュ無効化をテストします。

  • コンソールアクセスパスワードの作成
  • アクセスキーの作成、設定手順などは割愛します。

以下はAWS CLIでの例:

$ aws cloudfront create-invalidation \
    --distribution-id E1A2B3C4D5E6F7 \
    --paths "/example-path/example-file.jpg" "/example-path/example-file2.png"
  • distribution-id: テンプレート1で指定したディストリビューションID。
  • paths: クリアしたいパス

成功すれば、指定したディストリビューションのキャッシュがクリアされます。他のディストリビューションを指定すると、権限エラー(AccessDenied)が発生することを確認してください。

CloudFront-Specific-Distribution-Invalidation1

注意点

  • ディストリビューションIDの確認: CloudFrontディストリビューションIDはAWSマネジメントコンソールのCloudFrontダッシュボードで確認できます(例: E1A2B3C4D5E6F7)。
  • コスト: CloudFrontのInvalidationは無料枠(月1000パスまで)を超えると課金が発生します。詳細はAWSの料金表を確認。
  • セキュリティ: ユーザーにMFAや強力なパスワードポリシーを設定することを推奨。
  • エラー対応: デプロイ時にエラーが発生した場合、CloudFormationのスタックイベントログを確認し、入力パラメータやIAM権限をチェック。

まとめ

この記事では、CloudFrontの特定ディストリビューションのキャッシュクリア専用IAMグループとユーザーを、CloudFormationで効率的に作成する方法を紹介しました。テンプレートを2つに分け、パラメータで柔軟にカスタマイズできるようにすることで、運用やメンテナンスが容易になるかと思います。

参考

https://dev.classmethod.jp/articles/cloudfront_invalidation_onlyuser/

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.