0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【コツコツAWS】AWS CDK - S3バケットを作る -

0
Posted at

AWS Cloud Development Kit (AWS CDK)を使いこなすため、勉強したことを残していきます。
CDKとは何ぞやであったり、認証/権限の設定だったりは他の記事に記載。
今回はAmazon S3のバケットをCDKで作り、オプション周りの確認や、作ったバケットにオブジェクトをアップロードするまでの実装を行います。

デフォルトに任せて作成

S3を作るために、CDK用のディレクトリを作成します。
そのまま仮想環境のアクティベートまで実行。

下準備
mkdir MakeS3
cd MakeS3
cdk init app --language python
source .venv/bin/activate
pip install -r requirements.txt

作成されたディレクトリ内の.pyファイルにS3の定義を書きます。

ディレクトリ
MakeS3/
├── app.py
├── make_s3/
│   └── make_s3_stack.py   ← これを編集
make_s3_stack.py
from aws_cdk import (
    Stack,
    aws_s3 as s3,
)
from constructs import Construct

class MakeS3Stack(Stack):
    def __init__(self, scope: Construct, id: str, **kwargs):
        super().__init__(scope, id, **kwargs)
        bucket = s3.Bucket(
            self,
            "MyBucket",
        )

cdk deployで実際にリソースを作る必要まではないので、cdk synthでどんなリソースができるのか確認します。
出力されたcdk.out中のMakeS3Stack.template.jsonの中身が以下の通り。

~template.json
{
 "Resources": {
  "MyBucketF68F3FF0": {
   "Type": "AWS::S3::Bucket",
   "UpdateReplacePolicy": "Retain",
   "DeletionPolicy": "Retain",
   "Metadata": {
    "aws:cdk:path": "MakeS3Stack/MyBucket/Resource"
   }
  },
...以下略

MyBucketF68F3FF0がランダムに生成されたバケット名です。(MyBucketはCDKが今回のApp内で識別するための名前)
DeletionPolicyといった他の設定も記載されています。
s3.Bucketのデフォルト設定があるため、とりあえずバケットを作るだけならこれだけでOKです。

設定を調整して作成

デフォルトでは削除/更新時にバケットを残す(Retain)設定がされますが、今回はお試しなので、Stack削除/更新時に消してもらう設定に変更します。

削除設定
from aws_cdk import (
    Stack,
    RemovalPolicy,
    aws_s3 as s3,
)
from constructs import Construct

class MakeS3Stack(Stack):
    def __init__(self, scope: Construct, id: str, **kwargs):
        super().__init__(scope, id, **kwargs)

        bucket = s3.Bucket(
            self,
            "MyBucket",
            removal_policy=RemovalPolicy.DESTROY,
        )

RemovalPolicy.DESTROYにすることで、Stack削除/更新時に古いバケットが自動で削除されるようになります。
他にもブロックパブリックアクセスや暗号化, バージョニングといった設定がS3にはありますが、指示しなければデフォルトの設定で作られます。
(デフォルトではブロックパブリックアクセス: 有効, 暗号化: SSE-S3, バージョニング: 無効)
代表的な設定を明言すると以下のような形になります。

代表的な設定
from aws_cdk import (
    Stack,
    RemovalPolicy,
    aws_s3 as s3,
)
from constructs import Construct

class MakeS3Stack(Stack):
    def __init__(self, scope: Construct, id: str, **kwargs):
        super().__init__(scope, id, **kwargs)
        bucket = s3.Bucket(
            self,
            "MyBucket",
            # バケット名
            bucket_name="cdk-test-sample-bucket-123456",
            # バージョニング
            versioned=True,
            # ブロックパブリックアクセス
            block_public_access=s3.BlockPublicAccess.BLOCK_ALL,
            # 暗号化
            encryption=s3.BucketEncryption.S3_MANAGED,
            # スタック削除時の挙動
            removal_policy=RemovalPolicy.DESTROY,
            # バケット削除時に中身も削除
            auto_delete_objects=True,
        )

上記の内容で作ったテンプレートの中身がこちら

~template.json
{
 "Resources": {
  "MyBucketF68F3FF0": {
   "Type": "AWS::S3::Bucket",
   "Properties": {
    "BucketEncryption": {
     "ServerSideEncryptionConfiguration": [
      {
       "ServerSideEncryptionByDefault": {
        "SSEAlgorithm": "AES256"
       }
      }
     ]
    },
    "BucketName": "cdk-test-sample-bucket-123456",
    "PublicAccessBlockConfiguration": {
     "BlockPublicAcls": true,
     "BlockPublicPolicy": true,
     "IgnorePublicAcls": true,
     "RestrictPublicBuckets": true
    },
    "Tags": [
     {
      "Key": "aws-cdk:auto-delete-objects",
      "Value": "true"
     }
    ],
    "VersioningConfiguration": {
     "Status": "Enabled"
    }
   },
   "UpdateReplacePolicy": "Delete",
   "DeletionPolicy": "Delete",
   "Metadata": {
    "aws:cdk:path": "MakeS3Stack/MyBucket/Resource"
   }
  },
...以下略

CDKで定義した内容がCloudFormationテンプレートの方にも反映されていました。

オブジェクトのアップロード

バケットを作って、さらにオブジェクトをアップロードするまでをCDKで実装します。
まず、アップロード用のファイルを格納するassetsディレクトリを作成し、お試し用のデータsample.jsonを入れます。

ディレクトリ
MakeS3/
├── app.py
├── make_s3/
├── assets/
│   └── sample.json   ← これを格納

次に、バケット作成とオブジェクトアップロードを定義します。

バケット作成+アップロード
from aws_cdk import (
    Stack,
    RemovalPolicy,
    aws_s3 as s3,
)
from constructs import Construct

class MakeS3Stack(Stack):
    def __init__(self, scope: Construct, id: str, **kwargs):
        super().__init__(scope, id, **kwargs)
        bucket = s3.Bucket(
            self,
            "MyBucket",
            removal_policy=RemovalPolicy.DESTROY,
            auto_delete_objects=True,
        )
        # JSONファイルをアップロード
        s3deploy.BucketDeployment(
            self,
            "DeployJson",
            sources=[
                s3deploy.Source.asset("assets"),
            ],
            destination_bucket=bucket,
        )

cdk synthcdk deploy後のリソースを見ると分かりますが、指示したバケットとは別に、Lambda関数も作られます。
上記のコードではデータアップロード用の関数と、削除用の関数が作られていました。
2つ共CDKの内部実装で作られるもののようです。

まとめ

CDKでS3のバケットを作成し、データをアップロードするまでを実施。

  • デフォルト設定があるため、バケットを作るだけなら数行のコードで可能
    (実際にはある程度コードで明記した方が管理面で良さそう)
  • 削除関連の設定は環境によって要調整 (本番環境で削除にするのは危険)
  • バケット作成と併せて、データのアップロードも可能
  • 定義したリソースとは別にアップロードや削除用のLambdaも作られる場合あり
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?