マイナビニュースマイナビ

SQS/S3の構築

【連載】

AWSで実践! 基盤構築・デプロイ自動化

【第32回】SQS/S3の構築

[2020/04/22 08:00]川畑 光平 ブックマーク ブックマーク

本連載では、以下のイメージの構成にあるAWSリソース基盤自動化環境の構築を実践しています。

本連載で構築していく基盤自動化環境のイメージ

前回は、ElastiCacheを構築するテンプレートを実装しました。続く今回は、S3およびSQSを構築するテンプレートを作成します。

なお、実際のソースコードはGitHub上にコミットしています。以降のソースコードでは本質的でない記述を一部省略しているので、実行コードを作成する場合は、必要に応じて適宜GitHub上のソースコードも参照してください。

S3スタック構築テンプレート

S3は、連載「AWSで作るクラウドネイティブアプリケーションの基本」の第25回で実施したのと同じ要領で構築します。S3をCloudFormationで構築する場合、リソースタイプが、「AWS::S3::Bucket」であるリソース定義が必要です。プロパティとして設定可能な属性は、上記リンク先の通りですが、加えて、S3を「商用環境」「ステージング環境」「開発環境」という3つのパターンに分けて作成するようにします。テンプレートのサンプルは以下の通りです。

AWSTemplateFormatVersion: '2010-09-09'

// omit

Mappings:
  BucketDefinitionMap:                                                                               #(A)
    Production:
      "BucketName" : debugroom-mynavi-sample-cloudformation-bucket-production
      "AccessControl" : "Private"
      "BlockPublicAcls" : True
      "BlockPublicPolicy" : True
      "IgnorePublicAcls" : True
      "RestrictPublicBuckets" : True

 // omit

Parameters:
  EnvType:                                                                                           #(B)
    Description: Which environments to deploy your service.
    Type: String
    AllowedValues: ["Dev", "Staging", "Production"]
    Default: Dev

Resources:
  S3Bucket:                                                                                          #(C)
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !FindInMap [BucketDefinitionMap, !Ref EnvType, BucketName]                         #(D)
      AccessControl: !FindInMap [BucketDefinitionMap, !Ref EnvType, AccessControl]
      PublicAccessBlockConfiguration:
        BlockPublicAcls: !FindInMap [BucketDefinitionMap, !Ref EnvType, BlockPublicAcls]
        BlockPublicPolicy: !FindInMap [BucketDefinitionMap, !Ref EnvType, BlockPublicPolicy]
        IgnorePublicAcls: !FindInMap [BucketDefinitionMap, !Ref EnvType, IgnorePublicAcls]
        RestrictPublicBuckets: !FindInMap [BucketDefinitionMap, !Ref EnvType, RestrictPublicBuckets]

Outputs:
  S3Bucket:                                                                                          #(E)
    Description: Mynavi S3 bucket name
    Value: !Ref S3Bucket
    Export:
      Name: !Sub MynaviSampleS3Bucket-${EnvType}

S3のテンプレートの記述の基本となるポイントは下表の通りです。

記述 説明
A Mappingsとして、EnvTypeパラメータの値に応じて、3つの環境ごとの論理名とパラメータを定義します。Mappings定義方法の詳細はアプリケーションロードバランサー(ALB)スタック構築テンプレートと同様なので適宜参照してください
B S3を商用環境、ステージング環境、開発環境用に分けるよう、EnvTypeパラメータとして指定可能にします。このパラメータに応じて、Mappingsに定義したパラメータを切り替え、リソース定義を分けて作成できるようにします
C S3のリソース定義を行います。定義するプロパティの詳細はAWS::S3::Bucketを参照してください
D 環境によって異なる値を定義したい箇所は、EnvTypeパラメータを引数としたFindInMap関数でデータ取得します
E S3のバケット名をOutputs出力します

作成したテンプレートに対して、以下のようにスタック名とテンプレートパスを変更してヘルパースクリプトを実行します。

#!/usr/bin/env bash

stack_name="mynavi-sample-s3"
template_path="sample-s3-cfn.yml"

parameters="EnvType=Dev"

aws cloudformation deploy --stack-name ${stack_name} --template-file ${template_path} --parameter-overrides ${parameters} --capabilities CAPABILITY_IAM

実行が正常に終了すると、S3のバケットが作成されます。

S3のバケットが作成される

続いて、SQSのスタックテンプレートを実装します。

SQSスタック構築テンプレート

SQSは連載「AWSで作るクラウドネイティブアプリケーションの基本」の第28回で実施したのと同じ要領で構築します。SQSをCloudFormationで構築する場合、リソースタイプが、AWS::SQS::Queueであるリソース定義が必要です。プロパティとして設定可能な属性は、各リンク先の通りですが、加えて、SQSを「商用環境」「ステージング環境」「開発環境」という3つのパターンに分けて作成するようにします。

AWSTemplateFormatVersion: '2010-09-09'

// omit

Mappings:
  SQSDefinitionMap:                                                                                              #(A)
    Production:
      "QueueName" : mynavi-sample-queue-production
      "VisibilityTimeout": 30
      "DelaySeconds" : 5
      "MaximumMessageSize" : 26144
      "MessageRetentionPeriod" : 345600
      "ReceiveMessageWaitTimeSeconds" : 0
    // omit

Parameters:
  EnvType:                                                                                                       #(B)
    Description: Which environments to deploy your service.
    Type: String
    AllowedValues: ["Dev", "Staging", "Production"]
    Default: Dev

Resources:
  SQSSampleQueue:                                                                                                #(C)
    Type: AWS::SQS::Queue
    Properties:
      QueueName: !FindInMap [SQSDefinitionMap, !Ref EnvType, QueueName]                                          #(D)
      VisibilityTimeout: !FindInMap [SQSDefinitionMap, !Ref EnvType, VisibilityTimeout]
      DelaySeconds:  !FindInMap [SQSDefinitionMap, !Ref EnvType, DelaySeconds]
      MaximumMessageSize: !FindInMap [SQSDefinitionMap, !Ref EnvType, MaximumMessageSize]
      MessageRetentionPeriod:  !FindInMap [SQSDefinitionMap, !Ref EnvType, MessageRetentionPeriod]
      ReceiveMessageWaitTimeSeconds:  !FindInMap [SQSDefinitionMap, !Ref EnvType, ReceiveMessageWaitTimeSeconds]

Outputs:
  SQSServiceEndpoint:                                                                                            #(E)
    Description: SQS service endipoint
    Value: !Sub https://sqs.${AWS::Region}.amazonaws.com
    Export:
      Name: !Sub MynaviSampleSQS-${EnvType}-ServiceEndpoint

  SQSServiceRegion:                                                                                              #(F)
    Description: SQS service region
    Value: !Sub ${AWS::Region}
    Export:
      Name: !Sub MynaviSampleSQS-${EnvType}-Region

  SQSSampleQueue:                                                                                                #(G)
    Description: SQS sample queue
    Value: !Ref SQSSampleQueue
    Export:
      Name: !Sub MynaviSampleSQS-${EnvType}

SQSのテンプレートの記述の基本となるポイントは下表の通りです。

記述 説明
A Mappingsとして、EnvTypeパラメータの値に応じて、3つの環境ごとの論理名とパラメータを定義します。Mappings定義方法の詳細はアプリケーションロードバランサー(ALB)スタック構築テンプレートと同様なので適宜参照してください
B SQSを「商用環境」「ステージング環境」「開発環境」用に分けるよう、EnvTypeパラメータとして指定可能にします。このパラメータに応じて、Mappingsに定義したパラメータを切り替え、リソース定義を分けて作成できるようにします
C SQSのリソース定義を行います。定義するプロパティの詳細はAWS::SQS::Queueを参照してください
D 環境によって異なる値を定義したい箇所は、EnvTypeパラメータを引数としたFindInMap関数でデータ取得します
E SQSのサービスエンドポイントをOutputs出力します
F SQSを構築したリージョンをOutputs出力します
G SQSのキュー名をOutputs出力します

作成したテンプレートに対して、ヘルパースクリプトを以下のように、スタック名とテンプレートパスを変更して実行します。

#!/usr/bin/env bash

stack_name="mynavi-sample-sqs"
template_path="sample-sqs-cfn.yml"

parameters="EnvType=Dev"

aws cloudformation deploy --stack-name ${stack_name} --template-file ${template_path} --parameter-overrides ${parameters} --capabilities CAPABILITY_IAM

実行が正常に終了すると、SQSのキューが作成されます。

SQSのキューが作成される

以上、今回はS3、SQSを構築するCloudFormationテンプレートを実装しました。次回は、これまで作成してきたテンプレートを一括で実行できるよう親子関係でネスト化する手順について解説します。

著者紹介


川畑 光平(KAWABATA Kohei) - NTTデータ 課長代理

金融機関システム業務アプリケーション開発・システム基盤担当を経て、現在はソフトウェア開発自動化関連の研究開発・推進に従事。

Red Hat Certified Engineer、Pivotal Certified Spring Professional、AWS Certified Solutions Architect Professional等の資格を持ち、アプリケーション基盤・クラウドなどさまざまな開発プロジェクト支援にも携わる。2019 APN AWS Top Engineers & Ambassadors選出。

本連載の内容に対するご意見・ご質問は Facebook まで。

※ 本記事は掲載時点の情報であり、最新のものとは異なる場合がございます。予めご了承ください。

一覧はこちら

連載目次

もっと知りたい!こちらもオススメ

【連載】対話システムをつくろう! Python超入門 [21] サードパーティ製ライブラリを使おう(前編)

【連載】対話システムをつくろう! Python超入門 [21] サードパーティ製ライブラリを使おう(前編)

今回、そして次回は「半角文字を全角文字に変換する」というタスクを題材に、サードパーティ製のライブラリをインストールする方法について紹介するとともに、あらかじめ入力されたテキストを一定の形式に変換する処理を「前処理」についても解説したいと思います。

関連リンク

この記事に興味を持ったら"いいね!"を Click
Facebook で TECH+ の人気記事をお届けします
注目の特集/連載
[解説動画] Googleアナリティクス分析&活用講座 - Webサイト改善の正しい考え方
Google Workspaceをビジネスで活用する
ニューノーマル時代のオウンドメディア戦略
ミッションステートメント
教えてカナコさん! これならわかるAI入門
AWSではじめる機械学習 ~サービスを知り、実装を学ぶ~
Kubernetes入門
SAFeでつくる「DXに強い組織」~企業の課題を解決する13のアプローチ~
AWSで作るマイクロサービス
マイナビニュース スペシャルセミナー 講演レポート/当日講演資料 まとめ
セキュリティアワード特設ページ

一覧はこちら

今注目のIT用語の意味を事典でチェック!

一覧はこちら

会員登録(無料)

ページの先頭に戻る