この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
コンニチハ、千葉です。
S3を使って、静的なWebサイトをホスティングする場合のコンテンツアップロード方法に新たな手法が。今までは、aws s3 sync --delete
を使ったり、マネジメントコンソールから更新したりと方法がありました。
CDKのモジュール一覧を見ていたところaws-s3-deployment
なるものを発見したので早速使ってみたいと思います。なおaws-s3-deploymentはデプロイソースとして以下指定できます。
- ローカルディレクトリのデプロイ
- ローカルのzipファイルのデプロイ
- S3バケット上に配置したzipのデプロイ
今回は1をソースにしてデプロイしてみました。
参考:https://docs.aws.amazon.com/cdk/api/latest/docs/aws-s3-deployment-readme.html
やってみた
前提
- CDKはインストール済み
- 言語はPythonを利用
参考: [AWS CDK入門] CloudFormationをプログラミングで生成!?ワークショップをやってプロジェクト作成からデプロイまでを理解する
プロジェクトの作成
S3デプロイ用のCDKプロジェクトを作成します。
$ mkdir cdk-s3-deploy && cd cdk-s3-deploy
$ cdk init --language python
$ source .env/bin/activate # Linuxの場合
$ .env/Scripts/activate.bat # Windowsの場合
$ pip install --upgrade pip
$ pip install -r requirements.txt
$ pip install aws_cdk.aws-s3 aws_cdk.aws-s3-deployment
$ cdk bootstrap
コード
公開用のS3バケットを作成しつつ、デプロイを行うコードはこんな感じになりました。
cdk_s3_deploy/cdk_s3_deploy_stack.py
を編集します。
from aws_cdk import (
aws_s3_deployment as s3deploy,
aws_s3 as s3,
core
)
class CdkS3DeployStack(core.Stack):
def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
super().__init__(scope, id, **kwargs)
# ステージング用S3バケットの作成
stgWebsiteBucket = s3.Bucket(self, 'stgSiteChiba',
website_index_document = 'index.html',
public_read_access = True,
removal_policy = core.RemovalPolicy.DESTROY
)
# ローカルファイルのデプロイ
deploy = s3deploy.BucketDeployment(self, 'DeployLocal',
source = s3deploy.Source.asset('./website-src'),
destination_bucket = stgWebsiteBucket,
)
デプロイするコンテンツを配置します。
$ mkdir ./website-src
$ echo "Hello World" > ./website-src/index.html
デプロイ
CloudFormationの生成とデプロイを行います。
$ cdk synth
$ cdk deploy
更新するときは、再度CloudFormationの生成とデプロイを実行すればOKです。
デプロイされたスタックを見ると、様々なリソースが作成されてます。(Lambdaとか)
公開用のS3バケットが作成され、アクセスするとindex.htmlがデプロイできました!
最後に
CDKを利用してS3公開サイトのデプロイをしてみました。S3バケット自体の管理と一緒にコンテンツのデプロイもできるので、かなり便利だなと思いました。