CloudFormationでS3バケットを作る最小構成と、初学者がつまずきやすい設定
はじめに
CloudFormationを学び始めると、まず最初に作成するAWSリソースの1つがAmazon S3ではないでしょうか。
S3バケット自体は数行のYAMLで作成できますが、実際に試してみると
- バケット名重複で作成できない
- パブリックアクセス設定がよく分からない
- スタック削除時に削除できない
といったポイントでつまずくことがあります。
この記事では、CloudFormationでS3バケットを作成する最小構成と、初学者が理解しておきたい設定について解説します。
最小構成
まずは最小構成です。
AWSTemplateFormatVersion: '2010-09-09'
Description: Simple S3 bucket template
Resources:
SampleBucket:
Type: AWS::S3::Bucket
これだけでS3バケットを作成できます。
CloudFormationでは AWS::S3::Bucket を定義するだけで、バケット名が自動生成されます。
バケット名を指定する場合
バケット名を固定したい場合は BucketName を指定します。
Resources:
SampleBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: my-sample-bucket-12345
つまずきやすいポイント① バケット名はグローバルで一意
S3バケット名はAWSアカウント単位ではなく、世界中で一意である必要があります。
例えば以下のような名前は既に使われている可能性が高いです。
test-bucket
sample
my-bucket
スタック作成時に次のようなエラーになることがあります。
Bucket already exists
そのため、
- プロジェクト名
- 環境名(dev / stg / prod)
- ランダム文字列
などを組み合わせることが一般的です。
つまずきやすいポイント② パブリックアクセス設定
S3は静的Webサイト公開でも利用できますが、基本は非公開を前提に考えるのが安全です。
CloudFormationでは次の設定をよく利用します。
PublicAccessBlockConfiguration:
BlockPublicAcls: true
BlockPublicPolicy: true
IgnorePublicAcls: true
RestrictPublicBuckets: true
完全に有効化すると、意図しない公開を防止できます。
学習中は
「なぜ公開できないのか」
ではなく
「なぜ公開されないようになっているのか」
という視点で理解すると分かりやすいです。
つまずきやすいポイント③ 暗号化設定
現在はS3側でも暗号化が有効になりますが、CloudFormation上で明示しておくと設定意図が分かりやすくなります。
BucketEncryption:
ServerSideEncryptionConfiguration:
- ServerSideEncryptionByDefault:
SSEAlgorithm: AES256
チーム開発では特に明示しておくことをおすすめします。
つまずきやすいポイント④ スタック削除で消えない
CloudFormation初心者が意外とハマるポイントです。
S3バケット内にオブジェクトが存在すると、スタック削除時にバケット削除が失敗する場合があります。
The bucket you tried to delete is not empty
検証環境でよく遭遇するエラーです。
DeletionPolicyを利用する
削除時の扱いを明示したい場合は DeletionPolicy を利用できます。
Resources:
SampleBucket:
Type: AWS::S3::Bucket
DeletionPolicy: Retain
この設定を入れると、スタック削除後もS3バケットを残せます。
少し実用的な構成例
AWSTemplateFormatVersion: '2010-09-09'
Description: S3 bucket with basic security settings
Resources:
SampleBucket:
Type: AWS::S3::Bucket
DeletionPolicy: Retain
Properties:
BucketName: my-sample-bucket-12345
PublicAccessBlockConfiguration:
BlockPublicAcls: true
BlockPublicPolicy: true
IgnorePublicAcls: true
RestrictPublicBuckets: true
BucketEncryption:
ServerSideEncryptionConfiguration:
- ServerSideEncryptionByDefault:
SSEAlgorithm: AES256
学習用途であれば、このあたりの設定を理解しておくとS3の基本を一通り確認できます。
まとめ
S3バケットはCloudFormationで簡単に作成できますが、実際には次のポイントを理解しておくことが重要です。
- バケット名はグローバルで一意
- パブリックアクセス設定は慎重に扱う
- 暗号化設定を明示する
- スタック削除時の挙動を理解する
最初は最小構成から始めて、少しずつ設定を追加していくのがおすすめです。
おまけ
私は現在、CloudFormationをGUIで作成できる学習支援ツール IaCraft を個人開発しています。
S3やCloudFrontなどの設定をフォーム入力で作成し、CloudFormationテンプレートを生成できるようにしています。
現在は試験公開中で、どのような機能が役立つかを検証しています。
もし興味があれば触ってみていただき、感想をいただけると嬉しいです。