AWS CloudFormationは、インフラストラクチャをコードとして管理できる強力なツールです。これにより、クラウドリソースのデプロイ、管理、更新が簡単に行えます。しかし、CloudFormationを使用してリソースを作成または変更する際に、「Capabilities」と呼ばれる特別な権限設定が必要になる場合があります。この記事では、AWS CloudFormationのCapabilitiesについて詳しく解説します。
Capabilitiesとは?
AWS CloudFormationのCapabilitiesは、スタックを作成または更新する際に、CloudFormationが特定のアクションを実行するための明示的な許可を意味します。これにより、意図しないリソースの作成や変更を防ぎ、安全にインフラを管理できます。
主に次のCapabilitiesが存在します:
- CAPABILITY_IAM
- CAPABILITY_NAMED_IAM
- CAPABILITY_AUTO_EXPAND
1. CAPABILITY_IAM
CAPABILITY_IAM
は、CloudFormationテンプレートがIAMリソース(例えば、IAMユーザー、IAMロール、IAMポリシーなど)を作成または変更する場合に必要なCapabilityです。
使用例
例えば、以下のようなテンプレートでIAMリソースを作成する場合、CAPABILITY_IAM
を指定しなければ、CloudFormationはエラーを返します:
Resources:
MyIAMRole:
Type: "AWS::IAM::Role"
Properties:
AssumeRolePolicyDocument:
Statement:
- Effect: "Allow"
Principal:
Service: "ec2.amazonaws.com"
Action: "sts:AssumeRole"
Path: "/"
このテンプレートを使用してスタックを作成する場合、CLIやSDKでCAPABILITY_IAM
を指定する必要があります:
aws cloudformation create-stack --stack-name my-stack --template-body file://template.yaml --capabilities CAPABILITY_IAM
2. CAPABILITY_NAMED_IAM
CAPABILITY_NAMED_IAM
は、CAPABILITY_IAM
に加えて、特定の名前を持つIAMリソースを作成または更新する場合に必要なCapabilityです。通常、IAMリソースはCloudFormationによって自動生成される名前を持ちますが、特定の名前を指定する場合は、このCapabilityを指定する必要があります。
使用例
例えば、以下のテンプレートでIAMロールに特定の名前を付ける場合:
Resources:
MyIAMRole:
Type: "AWS::IAM::Role"
Properties:
RoleName: "MyCustomRoleName"
AssumeRolePolicyDocument:
Statement:
- Effect: "Allow"
Principal:
Service: "ec2.amazonaws.com"
Action: "sts:AssumeRole"
Path: "/"
この場合、スタックを作成するには、CAPABILITY_NAMED_IAM
を指定する必要があります:
aws cloudformation create-stack --stack-name my-stack --template-body file://template.yaml --capabilities CAPABILITY_NAMED_IAM
3. CAPABILITY_AUTO_EXPAND
CAPABILITY_AUTO_EXPAND
は、CloudFormationマクロを使用する場合に必要なCapabilityです。マクロは、テンプレートを動的に変更できる機能で、テンプレートの一部を展開したり、テンプレート全体を変更することが可能です。このCapabilityは、テンプレートに含まれるマクロが自動的に展開されることを許可するものです。
使用例
マクロを使用してテンプレートを動的に変更する場合、以下のようにCAPABILITY_AUTO_EXPAND
を指定します:
aws cloudformation create-stack --stack-name my-stack --template-body file://template-with-macro.yaml --capabilities CAPABILITY_AUTO_EXPAND
Capabilitiesの指定が必要な理由
Capabilitiesを指定することで、CloudFormationがテンプレート内の特定のアクションを実行する際に、ユーザーの明示的な許可を要求します。これにより、特にIAMリソースやマクロなど、セキュリティや運用に大きな影響を与えるリソースの作成や変更を慎重に行うことができます。
例えば、IAMロールやポリシーを誤って作成してしまうと、セキュリティリスクが発生する可能性があります。Capabilitiesを指定することで、そのような誤りを防ぎ、意図した通りにリソースを管理できるようになります。
Capabilitiesの適切な使用方法
1. 最小権限の原則
Capabilitiesを指定する際は、最小権限の原則を適用することが重要です。不要な権限を与えることは避け、必要なCapabilitiesのみを指定するようにしましょう。
2. 自動化と監査
スタックの作成や更新を自動化する際にCapabilitiesを指定することを忘れないようにしましょう。また、監査ログを使用して、どのCapabilitiesがいつ使用されたかを確認し、必要に応じてセキュリティポリシーを調整します。
3. テンプレートの検証
CloudFormationテンプレートをデプロイする前に、内容をしっかりと検証し、必要なCapabilitiesが適切に指定されているか確認します。これは特にCI/CDパイプラインでの自動デプロイメントプロセスにおいて重要です。
まとめ
AWS CloudFormationのCapabilitiesは、インフラストラクチャの管理とセキュリティにおいて重要な役割を果たします。CAPABILITY_IAM
、CAPABILITY_NAMED_IAM
、およびCAPABILITY_AUTO_EXPAND
の各Capabilityは、それぞれ異なるシナリオで使用され、リソースの安全な作成と管理をサポートします。これらのCapabilitiesを正しく理解し、適切に使用することで、CloudFormationをより安全かつ効率的に活用できるようになります。