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 ← これを編集
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の中身が以下の通り。
{
"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,
)
上記の内容で作ったテンプレートの中身がこちら
{
"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 synthやcdk deploy後のリソースを見ると分かりますが、指示したバケットとは別に、Lambda関数も作られます。
上記のコードではデータアップロード用の関数と、削除用の関数が作られていました。
2つ共CDKの内部実装で作られるもののようです。
まとめ
CDKでS3のバケットを作成し、データをアップロードするまでを実施。
- デフォルト設定があるため、バケットを作るだけなら数行のコードで可能
(実際にはある程度コードで明記した方が管理面で良さそう) - 削除関連の設定は環境によって要調整 (本番環境で削除にするのは危険)
- バケット作成と併せて、データのアップロードも可能
- 定義したリソースとは別にアップロードや削除用のLambdaも作られる場合あり