[AWS CDK]S3へローカルファイルをデプロイしてWebサイトを公開する

2019.08.14

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

コンニチハ、千葉です。

S3を使って、静的なWebサイトをホスティングする場合のコンテンツアップロード方法に新たな手法が。今までは、aws s3 sync --delete を使ったり、マネジメントコンソールから更新したりと方法がありました。

CDKのモジュール一覧を見ていたところaws-s3-deployment なるものを発見したので早速使ってみたいと思います。なおaws-s3-deploymentはデプロイソースとして以下指定できます。

  1. ローカルディレクトリのデプロイ
  2. ローカルのzipファイルのデプロイ
  3. S3バケット上に配置したzipのデプロイ

今回は1をソースにしてデプロイしてみました。

aws-s3-deploymentモジュールは現在、Stability: Experimental(実験的)となっており、今後変更される可能性があります。実稼働環境での利用は非推奨となっています。導入する際は、STABLEになってからにしましょう。

参考: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バケット自体の管理と一緒にコンテンツのデプロイもできるので、かなり便利だなと思いました。

参考