AWS, 優総研

ポートフォリオ制作なうなんだが…

 

 

 

内容

本の感想投稿掲示板 + Amazon APIとのマッシュアップ

  • 収益という目的性があるよって存在意義
  • 感想掲示板というコミュニティとしての社会性
  • AmazonのAPIがアプリの外見に華やかさを与えてくれる

 

機能

  • 検索
  • 書評投稿
  • 会員機能 + 投稿
  • 書評ランキング
  • レビュアランキング
  • レコメンド(余裕があれば実装したい)

 

技術要素

  • 自動デプロイ:Docker + GitHub + CodePipeline + CodeBuild + ECR +ECS 済
  • CI:CodeBuild + PHPUnit
  • クラスタ + WAF:CloudFront + WAF + ALB
  • フレームワーク:Laravel 済
  • データベースGUI管理ツール:phpMyAdmin on Docker 済
  • 言語:PHP7 済
  • バッチ処理:Lambda, CloudWatch(定期スナップショット) 済
  • RDBMS:RDS(MySQL) 済
  • NoSQL:Elasticache for Redis(セッション, ランキング機能)
  • CDN:CloudFront + S3
  • ログ分析基盤:Cloudwatch + S3 + Athena, Elasticsearch+kibana 済
  • DNS:Route53 済
  • 証明書自動更新:Route53 + ACM + [ ALB|CloudFront ] 済
  • メール送信管理:SQS + SNS + SES + Cloudwatch + Lambda + DynamoDB or Sisimai + Sisito

 

 

Laravel

  • CRUD
  • ログイン
  • セッション
  • バリデーション
  • テストコード
  • ページネーション
  • Artisan:Request, Middleware,

 

 

 

Docker composeインストール

 

 

Dockerインストール

 

Composerインストール

 

 

PHP7.2などインストール

 

Laravelインストール

yomuyoというプロジェクトを作成

 

treeで構造確認

 

 

docker-compose.yml

 

NginxコンテナDockerfile

 

Nginx設定ファイル

 

PHP-FPMコンテナDockerfile

 

php.ini

 

 

storage, cacheディレクトリのパーミッション設定

 

docker-composeによるビルド

 

※2回目以降

 

 

 

http://IPアドレス/

 

 

http://IPアドレス:8080
※セキュリティグループでIP制限しておくこと。

 

ソースディレクトリとNginxとPHP-FPMコンテナはdocker-composeのvolumesによりつながっている。だから$HOME/yomuyo/内でartisanなど使って開発すれば良い。

 

RDSはCI/CDパイプラインの後で用意する。

RDSがあれば、phpMyAdminにログインして接続できることを確認する。

 

 

CodeBuild用builspec.yml作成

 

@see

 

 

 

Dockerのログ確認

 

まずコンテナのIDを確認します。

 

リアルタイムでログを確認する

サイトにアクセスするたびに標準出力がログとして出ているか確認できる。

 

 

ECR

 

 

 

 

 

AWS CLI

 

 

IAMのプログラムアクセスユーザでIDとキーを取得して設定

 

ECRにログイン

 

イメージの確認

 

ECRにイメージにタグ付け

URI:タグという形で設定できます。

 

ECRにPushします。

 

こんな風にイメージがECRに格納されます。

 

 

ECS

 

タスク定義

  • タスク定義名:yomuyo

 

 

 

EC2を選択して【次のステップ】

 

 

 

 

コンテナの追加

 

 

PHP-FPMコンテナ

  • コンテナ名:php-fpm
  • イメージ:xxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/yomuyo/php-fpm:latest
  • メモリ制限:ハード制限 300(MB)
  • 作業ディレクトリ:/app

※イメージを指定すること

 

 

ログの設定を行います。

 

 

 

 

Nginxコンテナ

  • コンテナ名:nginx
  • イメージ:xxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/yomuyo/nginx:latest
  • メモリ制限:ハード制限 300(MB)
  • ポートマッピング(TCP):0 , 80
  • リンク:php-fpm

 

ホストポートは「0」、コンテナは80にします。

80, 80にするとデプロイで失敗します。

 

ログの設定を行います。

 

 

 

 

 

 

 

【作成】をクリックします。

 

 

 

 

 

 

クラスタの作成

 

 

 

メモリなどのスペック不足でECSでうまく動かなかったりする、EC2インスタンスタイプは【t2.small】以上のインスタンスを選ぶようにする。

 

 

 

 

ALB

 

 

 

ECSのインスタンスが利用しているVPCを選択する。

 

 

 

ターゲットに登録して、【次の手順】へ。

 

【作成】で完了

 

 

サービスの登録

 

 

 

 

 

新規作成のところを選択して、

 

こうする。

 

 

 

 

 

 

 

 

 

ALBとECSとの連携での重要な設定

ECSのEC2インスタンスのセキュリティグループのインバウンドにALBのSGを全許可受け入れを行う。こうすることでECSが行うコンテナへの動的ポートマッピングに対応しできる。公式にも書いてある。

ユーザの80番アクセスがALBに渡り、ALBからクラスタ化されたコンテナに伝わる。

 

ALB経由でアクセスを確認

http://yomuyo-alb-xxxxxxxx.ap-northeast-1.elb.amazonaws.com/

 

GitHub

GitHub上で「yomuyo.git」リポジトリを作る

 

GitHubにアップロードできるようにする

 

 

 

 

 

 

 

 

 

 

 

 

 

CodePipeline

【パイプラインを作成する】をクリックします。

 

※なんでCircleCIじゃないの?GitHub + CodePipeline + CodeBuild + ECR + ECSの理由

  • CircleCIは複数Dockerfileでの設定は辛い。
    ただし1つだけのDockerfileであればCircleCI Orbsを利用すると簡単。
  • AWS CodePipelineを利用すればセキュリティが向上する
    認証キーなどの環境変数をCircleCI上に保存するよりセキュア。

そういうわけで今回はCodePipelineで構築、お客様の要望によってCircleCIは触らざるを得ないという辛みがある。

 

 

 

 

 

 

CodeBuild

 

  • AmazonEC2ContainerRegistryFullAccess
  • AmazonEC2ContainerServiceFullAccess

 

  • AWS_ACCOUNT_ID
    9xxxxxx7
  • AWS_DEFAULT_REGION
    ap-northeast-1
  • PROJECT_NAMESPACE
    yomuyo

 

 

これでCodeBuildはおしまい。

 

CodePipelineに戻る

 

 

 

Deployまで成功すればOK

 

※エラー対応

[Container] 2019/06/14 16:22:45 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: $(aws ecr get-login –no-include-email –region ap-northeast-1. Reason: exit status 2

ロールにポリシーが付与されていないことが原因

ロールを確認して、IAMからポリシーを付与する。

ここのロールに後でポリシーをつけよう。

 

  • AmazonEC2ContainerRegistryFullAccess
  • AmazonEC2ContainerServiceFullAccess

ポリシーを付与する

 

CodePipelineから確認して、ECSへのデプロイまで完了したか確認出来たら完了。

 

自動デプロイ環境が出来たので、アプリ開発に集中しましょう~!

 

ログ分析基盤

 

Elasticsearch Service

 

 

例の如く、「t2.small.elasticsearch」で最小インスタンスを狙っていきます。

 

 

 

 

アクセス許可を行うIPを指定します。

 

 

 

きちんと作成されるまでには10分程度かかる。

 

待つのじゃ。

 

Kibana

ElasticsearchのKibanaのURLをクリックする

 

Kibanaにアクセスできる。

 

 

Cloudwatch Logs

Dockerのログについて、Nginx, PHP-FPMコンテナのログ標準出力になっており、awslogsドライバを通してCloudwatch Logsに出力される。

 

S3 + Athenaへ

S3にエクスポートできる。S3にエクスポートしたら「Athena」でクエリ検索が可能

ただし、この場合は手動になってしまうので、実際はLambdaで定期的にバッチ処理するか、Kinesis FirehoseからS3にエクスポートされるようにする。

 

Elasticsearch Serviceへ

 

「Elasticsearch Service」へ連携し、Kibanaで可視化できる。

 

 

 

 

 

 

 

  • AWSLambdaVPCAccessExecutionRole

ポリシーを付与します。

 

 

 

【次へ】をクリックしたら画面が遷移するので、【ストリーミングの作成】をクリックする。

 

 

 

RDS(MySQL8.0)

本当は絶対Auroraを使いたいところだけれど、お財布に厳しいのでリーンスタートとしてRDSのMySQL8.0で行きます。

 

パラメータグループの作成

 

これでパラメータグループ作成は完了。

 

 

 

 

 

 

 

 

 

 

 

データベースの作成

開発用EC2, ECSのインスタンスと同じVPCを選択しよう。

 

 

先ほど作成したパラメータグループを指定します。

 

 

 

 

 

 

セキュリティグループ設定

 

MySQL/Auroraに対して、開発用EC2, ECSのインスタンスのセキュリティグループIDをソースに指定する。

これでEC2からRDSにセキュアに接続できるようになる。

 

LaravelからRDSに接続する

 

.envを含めてすべてをGitHubにアップロードできるようにする

※この記事を参考にされている方がいるかはわからないですけれど、プライベートリポジトリのみでお願いします。

 

GitHubにアップロード

ECSまで自動デプロイされる。

 

本番のALBにアクセスして問題ないことを確認する
http://yomuyo-alb-xxx.ap-northeast-1.elb.amazonaws.com/

 

 

Route53 + ACM + ALBで自動証明書更新環境

 

Route53

「yomuyo.net」のホストゾーンを作成します。

 

 

【レコードセットの作成】をクリックします。

 

 

www.yomuyo.netとALBをエイリアスで紐づけます。CNAMEよりエイリアスのほうが通信コスパが良いです。

 

 

yomuyo.netとALBをエイリアスで紐づけます。

 

 

これでRoute53の設定はおしまい。

 

 

バリュードメインのDNSサーバの設定にAWSのネームサーバを設定します。

 

http://yomuyo.net/

これでアクセスが出来ました。

 

ACM(Certificate Manager)

AWSの証明書発行フルマネージドサービス

 

「yomuyo.net」, 「www.yomuyo.net」を取得します。

 

 

 

 

 

 

 

 

10分程度待ってからリロードさせてください。

 

証明書が発行されていますね!

 

ALBにACM証明書を適用する

 

【保存】をクリックします。

 

https://yomuyo.net/

アクセス出来ました。
※アクセスできない場合はセキュリティグループのインバウンドに443で接続できる設定になっているか見直してください。

 

HTTPのアクセスをHTTPSにリダイレクトする

一昔前はNginx側でリダイレクトしていたけれど、今はALBのルールから設定が行えます。

 

 

 

 

 

 

http://yomuyo.net/にアクセスした時に、

https://yomuyo.net/にリダイレクトがかかれば設定は大丈夫。

 

Amazon Product Advertising API(PA API)

amazonアソシエイトの「ツール」から取得できます。

 

 

 

 

 

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)