Help us understand the problem. What is going on with this article?

CloudFormation (公開S3バケット)

More than 1 year has passed since last update.

概要

CloudFormationに慣れるため、静的なファイルを外部公開するS3バケットを自動作成してみる。

前提条件

  • macOS
  • Docker Toolbox ( Docker for mac )

ファイル構成

下記のようなファイルを作成します。

ファイル構成
opt
 ├ docker
 │ └ aws-cli
 │    └ Dockerfile
 ├ src
 │  └ template.yml
 │
 └ docker-compose.yml

Dockerfile作成

aws-cliコマンドが使えるコンテナを構築するファイルです。

docker/aws-cli/Dockerfile
FROM python:3.6

ARG pip_installer="https://bootstrap.pypa.io/get-pip.py"
ARG awscli_version="1.16.168"

# install aws-cli
RUN pip install awscli==${awscli_version}

# install sam
RUN pip install --user --upgrade aws-sam-cli
ENV PATH $PATH:/root/.local/bin

# install command.
RUN apt-get update && apt-get install -y less vim

# copy source code.
COPY ./src /src

WORKDIR /root

docker-compose.yml作成

下記の内容で作成します。

docker-compose.yml
version: '3'
services:
  aws-cli:
    container_name: 'aws-cli'
    image: aws-s3/aws-cli
    build:
      context: ./
      dockerfile: ./docker/aws-cli/Dockerfile
    tty: true
    environment:
      AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
      AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
      AWS_DEFAULT_REGION: ap-northeast-1
      AWS_DEFAULT_OUTPUT: json

template.yml作成

CloudFormationの設定ファイルを作成します。
※ 「 <image-bucket> 」には、自分の作りたいS3バケット名を記載ください。

src/template.yml
AWSTemplateFormatVersion: 2010-09-09
Description: "create public s3 bucket."
Resources:

  # S3Bucket作成
  ImageBucket:
    Type: "AWS::S3::Bucket"
    DeletionPolicy: "Retain"
    Properties:
      AccessControl: "PublicRead"
      BucketName: !Sub <image-bucket>

  # S3Bucketのポリシーを定義する
  ImageBucketPolicy:
    Type: "AWS::S3::BucketPolicy"
    Properties:
      Bucket: !Sub ${ImageBucket}
      PolicyDocument:
        Statement:
          - Action:
              - s3:GetObject
            Effect: "Allow"
            Principal: "*"
            Resource: !Sub arn:aws:s3:::${ImageBucket}/*

Outputs:
  ImageBucket:
    Value: !Ref ImageBucket
    Export:
      Name: !Sub "${AWS::StackName}-ImageBucket"

サーバ構築

下記コマンドにてdockerコンテナのイメージを構築します。

ターミナル
$ docker-compose build

AWSの環境設定

下記のように環境変数を定義します。
※ ここで定義した環境変数は、自動的にdockerコンテナに取り込まれます

ターミナル
$ export AWS_ACCESS_KEY_ID='xxxxxxxxxxxxx'
$ export AWS_SECRET_ACCESS_KEY='xxxxxxxxxxxxxxxxxx'

CloudFormation実行

下記コマンドにて実行し、S3バケットとそのS3バケットのバケットポリシーを自動作成します。

ターミナル
# aws-cliコンテナ起動&接続
$ docker-compose run --rm aws-cli bash

# aws-cliコンテナ内でcloudformationのデプロイを実行する
$ aws cloudformation deploy \
        --template-file /src/template.yml \
        --stack-name "{ここにスタック名を入力する}"

$ exit  <- aws-cliコンテナの接続解除 (コンテナも破棄されます)

以上

reflet
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away