Serverless Framework の resources で暗号化やブロックパブリックアクセスを有効化した S3 バケットを定義する

Serverless Framework の resources で暗号化などのいくつかのプロパティを設定した S3 バケットを定義する機会があったので、その内容についてご紹介します。
2022.11.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは、筧(@TakaakiKakei)です。

Serverless Framework には resources というプロパティがあります。 このプロパティを使用すると、serverless deploy した際に、SNS トピック や S3 バケット などのリソースを作成することができます。

Serverless Framework - AWS Infrastructure Resources

今回、Serverless Framework で S3 バケットを作成するにあたり、 バケット側の暗号化やブロックパブリックアクセスを有効化したものを作成する機会があったので、 その設定内容についてご紹介します。

前提

Serverless Framework とは

サーバレス・アプリケーションを簡単に構築するためのツールです。

Develop, deploy, troubleshoot and secure your serverless applications with radically less overhead and cost by using the Serverless Framework. The Serverless Framework consists of an open source CLI and a hosted dashboard. Together, they provide you with full serverless application lifecycle management.

Serverless Framework Documentation

serveless.yml とは

Serverless Framework のメインとなる設定ファイルです。 必要なプラグインを定義したり、今回のように AWS リソースを定義したりします。

Serverless Framework - AWS Lambda Guide - Serverless.yml Reference

結論

serveless.yml

service: {{サービス名}}
frameworkVersion: '3'
provider:
  name: aws
  runtime: python3.9
  stage: ${opt:stage, 'dev'}
  region: ${opt:region, "ap-northeast-1"}
  environment: ${self:custom.environment.${self:provider.stage}}
custom:
  environment:
    dev:
      BUCKET_NAME: {{バケット名}}
resources:
  Resources:
    Bucket:
      Type: AWS::S3::Bucket
      Properties:
        AccessControl: Private
        BucketName: ${self:provider.environment.BUCKET_NAME}
        BucketEncryption:
          ServerSideEncryptionConfiguration:
            - ServerSideEncryptionByDefault:
                SSEAlgorithm: AES256
        OwnershipControls:
          Rules:
            - ObjectOwnership: BucketOwnerEnforced
        PublicAccessBlockConfiguration:
          BlockPublicAcls: true
          BlockPublicPolicy: true
          IgnorePublicAcls: true
          RestrictPublicBuckets: true
        VersioningConfiguration:
          Status: Enabled
        LifecycleConfiguration:
          Rules:
            - Id: Expire-30days-life-cycle-rule
              Status: 'Enabled'
              ExpirationInDays: 30

serveless.yml の関連箇所を記載しました。 ハイライトは S3 バケットのプロパティに関する箇所です。 プロパティの設定内容について以下です。

  • AccessControl:
    • アクセスコントロールリスト。バケット所有者に FULL_CONTROL を付与。
  • BucketName:
    • バケット名。各ステージの BUCKET_NAMEに定義したものを参照。
  • BucketEncryption:
    • バケットの暗号化。Amazon S3 マネージドキー (SSE-S3)で有効化。
  • OwnershipControls:
    • オブジェクト所有者。バケット所有者に強制。
  • PublicAccessBlockConfiguration:
    • ブロックパブリックアクセス。すべてブロック。
  • VersioningConfiguration:
    • バケットのバージョニング。有効化。
  • LifecycleConfiguration:
    • ライフサイクルルール。オブジェクト作成から30日で削除するルール。

やってみた

Serverless Framework 初心者向けに実際にデプロイまでご紹介します。

公式サイトに従い、ローカル端末に Serverless Framework をインストールしてください。

Setting Up Serverless Framework With AWS

ターミナルで以下のコマンドを実行して、バージョンが表示されればOKです。

$ serverless --version
Framework Core: 3.24.0
Plugin: 6.2.2
SDK: 4.3.2

任意のプロジェクトフォルダを作成後、サービスを作成します。

$ mkdir {{プロジェクトフォルダ}}
$ cd {{プロジェクトフォルダ}}
$ serverless create --template aws-python3 --path .

前述した serveless.yml に書き換えます。 以下の箇所は任意のものに編集ください。

  • {{サービス名}}
  • {{バケット名}}

ターミナルで以下のコマンドを実行して、デプロイします。

sls deploy --stage dev

デプロイ完了したら、マネジメントコンソールを確認してみましょう。 作成した S3バケットの設定を見てみると、想定通りのバケットが作成できているはずです。

AccessControl

BucketName

省略

BucketEncryption

OwnershipControls

PublicAccessBlockConfiguration

VersioningConfiguration

LifecycleConfiguration

おわりに

最後まで読んでいただきありがとうございます。

今回は備忘録的な意味を込めてブログを書いてみました。 どなたかの役に立てば幸いです。

それではまた!