AWS CloudFormationで特定CloudFrontディストリビューションのキャッシュクリア専用IAMグループとユーザーを作成してみた
クラウド事業本部の梶原@福岡です。
今回は、Amazon CloudFrontの特定ディストリビューションのエッジキャッシュをクリア(Invalidation)する権限だけを持つIAMグループとユーザーを、AWS CloudFormationで作成する方法を紹介します。こちらの記事(CloudFrontエッジキャッシュクリアのみを行うユーザーの作成)を参考にしつつ、特定のディストリビューションIDに限定したポリシーと、グループ・ユーザーの作成を分離したテンプレートを作成しました。またパラメータでディストリビューションIDなど指定できるようにしました。
やりたいこと
- 目的: CloudFrontの特定ディストリビューション(指定したID)に対してのみキャッシュ無効化(
CreateInvalidation
)を許可するIAMグループを作成。 - 要件:
- IAMグループとユーザーを別々のCloudFormationテンプレートで管理する
- パラメータでグループ名、ユーザー名、ディストリビューションIDを指定可能にする。
- セキュリティを考慮し、キャッシュクリアに必要な最小限の権限のみを付与。
- 対象者: AWSのIAMやCloudFormationを使ったことがあり、CloudFrontのキャッシュ管理を安全かつ効率的に行いたい方。
全体の構成
- IAMグループのテンプレート:
- CloudFrontの特定ディストリビューションに対するキャッシュ無効化権限を持つIAMグループを作成。
- ポリシーは
CreateInvalidation
、GetInvalidation
、ListInvalidations
、および関連する読み取りアクションを許可。 - ディストリビューションIDをパラメータで指定。
- IAMユーザーのテンプレート:
- IAMユーザーを作成し、指定したグループに所属させる。
- ユーザー名とグループ名をパラメータで指定。
- デプロイとテスト: 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
)。- 必要なアクションのみ許可。
ListDistributions
やListStreamingDistributions
は特定ディストリビューションに限定するため不要。
- 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を
CloudFrontInvalidationGroup.yaml
として保存。 - 以下のコマンドを実行:
$ 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リソース作成に必要。
- スタック作成が完了したら、出力でグループ名とARNを確認。
テンプレート2(ユーザー)のデプロイ
- テンプレート2を
CloudFrontInvalidationUser.yaml
として保存。 - 以下のコマンドを実行:
$ 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
)
- スタック作成が完了したら、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
)が発生することを確認してください。
注意点
- ディストリビューションIDの確認: CloudFrontディストリビューションIDはAWSマネジメントコンソールのCloudFrontダッシュボードで確認できます(例:
E1A2B3C4D5E6F7
)。 - コスト: CloudFrontのInvalidationは無料枠(月1000パスまで)を超えると課金が発生します。詳細はAWSの料金表を確認。
- セキュリティ: ユーザーにMFAや強力なパスワードポリシーを設定することを推奨。
- エラー対応: デプロイ時にエラーが発生した場合、CloudFormationのスタックイベントログを確認し、入力パラメータやIAM権限をチェック。
まとめ
この記事では、CloudFrontの特定ディストリビューションのキャッシュクリア専用IAMグループとユーザーを、CloudFormationで効率的に作成する方法を紹介しました。テンプレートを2つに分け、パラメータで柔軟にカスタマイズできるようにすることで、運用やメンテナンスが容易になるかと思います。
参考