【AWS】サーバーレスで問い合わせフォーム (s3,Lambda,SES)

はじめに

AWSome Day(awsのセミナー)に参加しまして、
学習意欲が湧いたので、早速、サーバーレスで
お問い合わせフォーム有りのウェブサイト製作をしてみました。

Amazon Web Service初めて使ってみました。
備忘録としてまとめます。

やりたいこと洗い出し

  • 静的なWebサイトホスティング
  • お問い合わせ機能
  • 問い合わせの通知 ⇨ 私 & 担当者
  • SSL化

使ったサービス

  • Route53
  • Cloudfront
  • ACM (AWS Certificate Manager)
  • s3 (Simple Strage Service)
  • Cognito
  • Lambda
  • SES (Simple Email Service)

それぞれのサービスの説明は、
こちらの記事が簡潔で分かりやすいです!
「AWS is 何」を3行でまとめてみるよ

構成図

aws_Diagram_.png

進め方

正直、初めてAWSを触るということもあり、
どこから手をつければ良いのか分かりませんでした..
なんとなく機能を分割して手をつけていきました。

  • 0. 静的サイト制作
  • 1. s3からs3にput、Cognito認証
  • 2. Lambda、SES
  • 3. Route 53
  • 4. CloudFront,ACMの設定

こちらの記事、大変参考にさせて頂きました。
初心者にも分かりやすく、助かりました。

詳細

メモレベルですが、やったことを残しておきます。

① s3 / Cognito

aws_Diagram (3) (2).png

上記サイトのjsを参照し、s3からs3にputできるようにしました。

やったこと
  • s3 バケット作成、html,css,img,js配置
  • Cognito IAM独自のポリシーを作成を作成し、アタッチ。Acctionでputを追加し、s3バケット名を指定するだけで大丈夫です。
  • ACLのデフォルトは”public-read”なので、明示的に”authenticated-read”とかに設定する必要があります。
  • CROS設定で、alloworiginを設定する必要があったのですが、Route53の設定をまだしてなかったので、後回しにしました。

② SES / Lambda

aws_Diagram (_3).png

まず、SESのメール認証を行います。

  • SES ⇨ Email Addresses ⇨ Verify a New Email Address
    自分のメールアドレスを入力し、申請するとメールが届くのでリンクを押せば完了です。

  • ①でs3からs3にput出来るようになったので、そのイベントをトリガーにLambdaの設定を行います。
    こちらのサイトのjsをほぼそのまま使わせて頂きました。

  • IAMロールは、AmazonSESFullAccessを付与します。

③ Route53

お名前.comで既にドメイン購入済みでした。
AWSで発行したNSレコードを、お名前.comの方に追加する必要がありました。手順をこちらにまとめたので参考にして頂ければ幸いです。
【Route 53】【お名前.com】【Amazon S3】Webサイト作成

④ CloudFront / ACM

大変参考にさせて頂きました。

ACM

  • 2017年10月より、DNS認証が追加され、設定が簡単になりました。またワイルドカード証明書も無料で発行できるので、CloudFront使う際は使っておきたいですね。
  • 適応されたらCloudFront側で、http to https設定を行います。

  • 設定完了後、s3のCROS設定に、下記を追加します。
    <alloworigin>https://www.ドメイン.com</alloworigin>

まとめ / 反省点

設定項目が多すぎて、何をどこまで設定するべきなのか難しい。使った分だけ課金されてしまうこともあり、ちゃんと把握しておきたい。

続きを読む

AWS再入門2018 Amazon Route 53(DNS)

こんにちは。池田です。先日スキーの初滑りをしたのですが、ほぼ毎週通っているテニスのおかげなのか、あまり息切れはしませんでした。継続は力なりと信じ、続けていこうと思います。 はじめに. AWS再入門2018シリーズとしては第四弾となります。今回はクラウドドメインネームシステム (DNS) ウェブサービスであるAmazon … 続きを読む

【Route 53】【お名前.com】【Amazon S3】Webサイト作成

AWS s3

バケットを作成し、サイトを公開する

Route 53

Hosted Zoneを作成し、
お名前.comで購入したドメインを入力する
Screen Shot 2018-01-13 at 19.57.11.png

Recodeをsetする
Alias Targetにs3で作成したバケットを選択する

Screen Shot 2018-01-13 at 19.54.52.png

作成したHosted zonesのNSレコードのvalueをメモする
※赤字の部分!

Screen Shot 2018-01-13 at 20.03.16.png

お名前.com

お名前.com ログイン
ネームサーバーの設定 -> 対象ドメイン選択 -> 他のネームサーバーを利用
Screen Shot 2018-01-13 at 20.09.18.png

Hosted zonesのNSレコードのvalueを4つ入力する。
Screen Shot 2018-01-13 at 20.09.32.png

確認画面に進み、完了!!
なかなか反映されない場合はTTL秒数を短めに。

続きを読む

Qiitaやはてなのエンジニア記事を丸ごとコピーしているサイトを発見

Qiitaに投稿した記事が丸ごとコピーされているサイト発見

ずいぶん前にQiitaに書いたAWSの記事が、たまたまGoogleで検索かけたら 丸ごとコピーして掲載しているサイト を発見。

しかも私のQiitaでのユーザー名や記事中の画像すらコピー。
一字一句何も手を加えていないのがすごい度胸。

ちなみに丸ごとコピーされた記事の掲載されているサイトURLはこちら。

http://helloworld-yaruzo.com/author/schabibi/

screencapture-helloworld-yaruzo-author-schabibi-1515276455401.png

私の書いた元のQiita記事はこちら。

「Route 53 で独自ドメインをホストして、Amazon s3で静的ウェブサイトを公開」https://qiita.com/schabibi/items/bb2e6bd4e5a1f29eeb90

screencapture-qiita-schabibi-items-bb2e6bd4e5a1f29eeb90-1515276595315.png

さらに呆れたのが、 他のエンジニアの方のQiita記事やはてな記事もたくさん丸ごとコピー しているところ。

http://helloworld-yaruzo.com/

ドメイン名が「Hello, world. やるぞ」の時点で明らかにテキトー感が伝わりますね。

WordPressの超初期でテーマを有効化したときに掲載される、サンプルページの文章も、恥ずかしくないのか、そのまま載せられています。

AWS関連の記事をQiitaやはてななどで掲載されているエンジニアの方、気をつけてください。

(※ Googleにすでに通報済みです)

追記

この記事すらアップロードした瞬間にコピーされてるって感じなので、フィードリーダーのボットかなという感じがしますが。

続きを読む

AWS Lambdaを使ってEC2インスタンスを定時にcronで停止、起動させる。

イベントソースに「CloudWatchイベント」を指定することで、Lambda関数を一定時間ごとに実行させることができます。
イベントソースとは、Lambda関数を呼び出す引き金となるもののことです。
イベントソースにはS3やDynamoDB、API Gatewayなど色々なものを指定することができます。

EC2の利用料金を節約するために、使わない時間はインスタンスを停止しておきたいという人もいると思います。

使わない時間に停止して、使いたい時間に起動させるという使い方ができれば、EC2の利用料金を大きく削減できる可能性があります。
たとえば、開発用の環境は夜の20時には落として、朝の7時に上げるように設定するとかですね。

今回はLambda関数を使って、定時にEC2を停止、起動させてみます。

まずはLambdaで関数を作成します。スクラッチ(1から作成する)でOKです。
Lambda Management Console - Google Chrome 2018-01-03 08.58.24.png

イベントにCloudWatchイベントを設定します。
Lambda Management Console - Google Chrome 2018-01-03 08.59.10.png

CloudWatchイベントの詳細を設定していきます。
Lambda Management Console - Google Chrome 2018-01-03 08.46.20.png

ルールタイプは「スケジュール式」とします。

cron 式は、協定世界時 (UTC) です。

とあります。
つまり、このcron式で設定された時刻+9時間が日本時間となります。

ルールのスケジュール式については以下のページが参考になります。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.html

フィールド ワイルドカード
0-59 , – * /
時間 0-23 , – * /
1-31 , – * ? / L W
1-12 または JAN-DEC , – * /
曜日 1-7 または SUN-SAT , – * ? / L #
1970-2199 , – * /
cron(0 13 * * ? *)

と指定しているので、22時にLambda関数が起動する設定ですね。

では実際にLambda関数を作成していきます。

「StopEC2Instance」という自分が作成した関数名をクリックします。
Lambda Management Console - Google Chrome 2018-01-03 09.01.12.png

画面の下の方でコードを書く部分があるので、そこに以下のような関数を書きます。

import boto3

region = 'ap-xxxxxxxx-x'
instances = ['x-xxxxxxxx']
def lambda_handler(event, context):
    # TODO implement
    ec2 = boto3.client('ec2', region_name=region)
    ec2.stop_instances(InstanceIds=instances)

    return 'Stopped these instances: ' + str(instances)

instance = ['x-xxxxx']にはEC2のインスタンスIDを指定して下さい。

region = 'ap-xxxxxxxx-x'にはリージョンのIDを指定します。
https://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html
東京だったらap-northeast-1ですね。

リージョン名 サービス対象 エンドポイント プロトコル Amazon Route 53 ホストゾーン ID*
米国東部 (オハイオ) us-east-2 apigateway.us-east-2.amazonaws.com HTTPS ZOJJZC49E0EPZ
米国東部(バージニア北部) us-east-1 apigateway.us-east-1.amazonaws.com HTTPS Z1UJRXOUMOOFQ8
米国西部 (北カリフォルニア) us-west-1 apigateway.us-west-1.amazonaws.com HTTPS Z2MUQ32089INYE
米国西部 (オレゴン) us-west-2 apigateway.us-west-2.amazonaws.com HTTPS Z2OJLYMUO9EFXC
アジアパシフィック (ムンバイ) ap-south-1 apigateway.ap-south-1.amazonaws.com HTTPS Z3VO1THU9YC4UR
アジアパシフィック (ソウル) ap-northeast-2 apigateway.ap-northeast-2.amazonaws.com HTTPS Z20JF4UZKIW1U8
アジアパシフィック (シンガポール) ap-southeast-1 apigateway.ap-southeast-1.amazonaws.com HTTPS ZL327KTPIQFUL
アジアパシフィック (シドニー) ap-southeast-2 apigateway.ap-southeast-2.amazonaws.com HTTPS Z2RPCDW04V8134
アジアパシフィック (東京) ap-northeast-1 apigateway.ap-northeast-1.amazonaws.com HTTPS Z1YSHQZHG15GKL
カナダ (中部) ca-central-1 apigateway.ca-central-1.amazonaws.com HTTPS Z19DQILCV0OWEC
欧州 (フランクフルト) eu-central-1 apigateway.eu-central-1.amazonaws.com HTTPS Z1U9ULNL0V5AJ3
欧州 (アイルランド) eu-west-1 apigateway.eu-west-1.amazonaws.com HTTPS ZLY8HYME6SFDD
欧州 (ロンドン) eu-west-2 apigateway.eu-west-2.amazonaws.com HTTPS ZJ5UAJN8Y3Z2Q
南米 (サンパウロ) sa-east-1 apigateway.sa-east-1.amazonaws.com HTTPS ZCMLWB8V5SYIT

関数の作成が終わったら右上の「保存」を押します。

複数のインスタンスを指定したい場合はinstances = ['x-xxxxxxxx','x-xxxxxxxx','x-xxxxxxxx']のように配列にIDを入れます。

ここまで作ったら関数をテストします。

右上のテストをクリックして、「テストイベントの設定」を選択してください。
Lambda Management Console - Google Chrome 2018-01-03 11.14.00.png

イベントテンプレートは「Scheduled Event」とします。
Lambda Management Console - Google Chrome 2018-01-03 09.07.42.png

作成できたら、上部には以下のように表示されているはずです。
Lambda Management Console - Google Chrome 2018-01-03 10.44.32.png

「テスト」を実行してEC2インスタンスが停止することを確認します。

次に、起動用のLambda関数を作成します。
基本的には停止の関数を作ったときと同じことをやります。

スクリプトは以下の通りです。

import boto3

region = 'ap-xxxxxxxx-x'
instances = ['x-xxxxxx','x-xxxxx','x-xxxxxxx','x-xxxxxx']
def lambda_handler(event, context):
    # TODO implement
    ec2 = boto3.client('ec2', region_name=region)
    ec2.start_instances(InstanceIds=instances)

    return 'Started these instances: ' + str(instances)

この関数を実行すると、EC2インスタンスが起動することが確認できました。

続きを読む

Amazon Route53 でドメインにALBを割り当てる

全体の流れ

  1. ドメインを取得する
  2. ドメインにALBを割り当てる ←今回の投稿
  3. HTTPS化する

もくじ

  1. ドメインにALBを割り当て
  2. アクセス確認

参考

ドメイン名を登録する方法 – アマゾンウェブサービス

前提条件

  • ALB(Application Load Balancer)は事前に作成済み
  • ドメインは事前に取得済み

1. ドメインにALBを割り当て

Route 53のコンソールでドメインにALBを割り当てます。

elb01.png
elb02.png
elb03.png

補足:
Alias TargetテキストボックスをクリックするとALBの一覧が表示される

elb04.png

elb05.png

2. アクセス確認

ブラウザで登録したURLにアクセスする。

elb06.png

続きを読む

Serverless+SPAで低費用な個人サービス構築のススメ

Serverless+SPA構成

最近低費用でサービス運用できないかと、色々試してたのをまとめてみます。
Serverless構成だとEC2と比べて費用が安くなり、SPAであればルーティングがサーバ側制御ではないためS3のバケットに静的html、css、js、画像の配置にてサービス構築が可能となります。
SPAにはReactJSを採用してますが、VueやUnityとかのサービスでもいけると思います。
良い点ばかりではなく、デメリットも結構あるのでそれを考慮した上で導入しましょう。
個人でお金をかけたくなくてサービス運用したい場合などには良いかもしれません。
(Lambdaの無料枠+アクセス量のみで計算される。まだ1ヶ月経ってないからきちんと計測できていませんがドメイン費込みでも月$2もかからないかもしれない・・・)

メリット
・ とにかく費用が安い
・ AWSの設定周りの変更だけでスケールする
デメリット
・ 利用しているサービスが多いため、デプロイ時などの障害発生ポイントが多い、各サービスに関する知識もある程度必要
・ Lambdaに関するAPI処理実行時の起動速度制限やメモリ上限がある
・ LambdaのNodeJSのバージョンが6系(async/awaitがまだ使えない)
・ DBがDynamoDBでないとスケールしずらい
・ バックエンド側は完全AWS依存のため、別の環境に簡単には移行できない

Serverlessについてや各種AWSサービス料金に関しては下記参考にしてください
AWS料金早見表

ServerlessアーキテクチャとSPA(ReactJS)でサービス構築するには
以下のような構成になります。

スクリーンショット 2017-12-29 5.37.03.png

利用用途:
– CloudFormation: Serverlessフレームワーク経由でデプロイジョブを実行
– IAM: Lambdaの実行権限やDynamoDBアクセスをLambdaに付与
– CloudWatch: ログ収集
– Route53: ドメイン割当
– ACM: SSL証明書作成、SSL認証
– CloudFront: CDN、ドメインでの公開配信
– S3: SPAファイルを配置(ReactJSリリースビルド済みのファイル群)
– API Gateway: APIのエンドポイント作成
– Lambda: APIの処理を実行
– DynamoDB: データ保存

Serverlessフレームワーク+ReactJSによる実装

下記リンクにてサンプルサービスをデプロイしました(そのうち消すかも)
https://static.teradonburi.info
サンプルのソースコードは次gitにあります。
serverless-react

API側の実装とデプロイはserverlessフレームワークにて行います。
serverlessフレームワークはバージョン別で破壊的変更が入り、互換性がないことが多いので注意です。
今回はv1.24.1にて実装を行っています。
下記コマンドでServerlessフレームワークをインストールします。

$ npm install -g serverless

サンプルの構成です。
clientフォルダにはReactJSでのフロントエンドの実装、
serverless-apiフォルダにはServerlessフレームワークでのバックエンドの実装がそれぞれ格納してあります。
configフォルダにはnode-configの設定ファイルがあります。今回はAPIサーバの起動ドメインの設定を記述してあります。
今回はTODOサービスのサンプルを作成しました。
ReactJSからAPI経由でのDynamoDBのCRUD操作を行います。(create.js、list.js、update.js、delete.js)

├── client
│   ├── package.json
│   ├── src
│   │   ├── App.js
│   │   ├── components
│   │   │   ├── NotFound.js
│   │   │   ├── TodoPage.js
│   │   │   └── TopPage.js
│   │   ├── index.js
│   │   ├── reducer
│   │   │   ├── reducer.js
│   │   │   └── todo.js
│   │   └── static
│   │       └── index.html
│   ├── webpack.build.js
│   ├── webpack.config.js
│   └── yarn.lock
├── config
│   ├── default.js
│   └── production.js
└── serverless-api
    ├── lib
    │   └── dynamodb.js
    ├── offline
    │   └── migrations
    │       └── todo.json
    ├── package.json
    ├── serverless.yml
    ├── src
    │   ├── create.js
    │   ├── delete.js
    │   ├── list.js
    │   └── update.js
    └── yarn.lock

今回のサンプルをデプロイする上でドメインが必要です。(ローカルでの起動は問題はない)
ドメインを未購入の人は下記記事を参考にドメインの購入をしてください。(ドメインがないとデプロイ時にAWS側で自動割当されたものとなり、色々不便なので)
Amazon Route 53でドメインを購入する

ローカルでの起動

次のコマンドでローカルでのサーバのシミュレーション起動ができます。

server.sh
$ cd serverless-api
$ yarn
$ sls dynamodb install
$ SLS_DEBUG=* sls offline start

デバック方法は下記記事を参考にしてください(Node6.1なので–inspectオプションがまだ使えない・・・)
Serverlessフレームワークでデバッグする(ブレークポイントかける)方法

上記サーバを立ち上げた状態で
クライアント側は下記コマンドでwebpack-dev-serverにて起動します。

client.sh
$ cd client
$ yarn 
$ NODE_CONFIG_DIR=../config webpack-dev-server
# ブラウザを開く
$ open http://localhost:3001

スクリーンショット 2017-12-29 5.26.35.png

スクリーンショット 2017-12-29 5.26.55.png

デプロイ(初回)

クライアント(ReactJS)のリリースビルドとserverlessフレームワークでのデプロイを行います。
ローカル時は下記node-configの設定ファイルにてクライアント側から指定のAPIサーバに対してリクエストを投げます。

config/default.js
module.exports = {
  API_SERVER: 'http://localhost:3000',
  PORT: 3000,
}

リリースビルド時は下記production.jsの方が参照されます。
teradonburi.infoの部分は各自取得したドメインで書き換えてください
私はapi.(ドメイン名)にしました。

config/producation.js
module.exports = {
  API_SERVER: 'https://api.teradonburi.info',
}

クライアント側は下記コマンドでwebpackにてリリースビルドを行えるようにしました。
distフォルダにビルドされたリリース用のSPAのファイル群が作成されます。

$ cd client
$ yarn
$ rm -rf dist;NODE_ENV=production NODE_CONFIG_DIR=../config parallel-webpack -p --config webpack.build.js

ReactJSでのSPA作成方法やリリースビルドの詳細に関しては下記を参考にしてください。
ReactJSで作る今時のSPA入門(基本編)
ReactJSで作る今時のSPA入門(リリース編)

serverlessの設定ファイルのclientのbucketNameのteradonburi.infoの部分は各自取得したドメインで書き換えてください
私はstatic.(ドメイン名)にしました。

serverless.yml
custom:
  client:
    bucketName: static.teradonburi.info

下記コマンドでCloudFormation経由で各サービスにデプロイします。
(CloudFormation、API Gateway、Lambda、S3、DynamoDB、CloudWatch)

deploy.sh
# デプロイ先のAWSアカウントを明示的に指定(~/.aws/credentialsのアカウントが複数ある場合)
$ export AWS_ACCESS_KEY_ID=(アクセスキー)
$ export AWS_SECRET_ACCESS_KEY=(プライベートキー)
$ SLS_DEBUG=* sls deploy
# distフォルダを新規作成S3バケットにアップロード
$ SLS_DEBUG=* serverless client deploy

デプロイが完了するとCloudFormationのスタックが作成されます。

スクリーンショット 2017-12-29 3.41.14.png

API Gatewayのエンドポイントが作成されます。

スクリーンショット 2017-12-29 3.44.03.png

Lambdaの関数が作成されます。

スクリーンショット 2017-12-29 3.40.58.png

DynamoDBのテーブルが作成されます。

スクリーンショット 2017-12-29 3.41.37.png

S3のバケットが作成されます。

スクリーンショット 2017-12-29 3.39.37.png

serverless.ymlについて

serverless.ymlにはデプロイの設定情報を記述します。
pluginsに追加のプラグインを記述します。
ローカル実行用にserverless-offlineserverless-dynamodb-localを導入しました。
S3へdistフォルダアップロード用にserverless-finchを導入しています。

plugins:
  - serverless-offline
  - serverless-dynamodb-local
  - serverless-finch

providerにはlamdaから実行できるIAMロールの指定を記述します。
今回はLambdaからDynamoDBアクセスするため、DynamoDBのIAMロールを追加します。

provider:
  name: aws
  runtime: nodejs6.10
  environment:
    DYNAMODB_TABLE: ${self:service}-${opt:stage, self:provider.stage}
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:Query
        - dynamodb:Scan
        - dynamodb:GetItem
        - dynamodb:PutItem
        - dynamodb:UpdateItem
        - dynamodb:DeleteItem
      Resource: "arn:aws:dynamodb:${opt:region, self:provider.region}:*:table/${self:provider.environment.DYNAMODB_TABLE}"

customにはその他の設定を記述します。
今回はやっていませんが、開発環境stage、商用環境stage別の設定なども可能です。
dynamodbにはローカルでdynamodbをシミュレーション起動する設定を記述しています。
clientにはserverless-finchでのdistフォルダのデプロイ先S3バケットを指定しています。

custom:
  dynamodb:
    start:
      port: 8000
      inMemory: true
      migrate: true
    migration:
      dir: offline/migrations
  client:
    bucketName: static.teradonburi.info
    distributionFolder: ../client/dist

API Gatewayレスポンスの注意点

statusCode、headers、bodyには下記のようなレスポンスが必要です。
Access-Control-Allow-Credentials、Access-Control-Allow-Origin、Content-Typeに関してheaderの指定が必要です。
bodyはJSON文字列である必要があります。(今回はapplication/json想定、binaryの場合などはまた別の設定が必要)

create.js
const response = {
  statusCode: 200,
  headers: {
    "Access-Control-Allow-Credentials": true,
    "Content-Type": "application/json",
    "Access-Control-Allow-Origin" : "*" // Required for CORS support to work
  },
  body: JSON.stringify(result.Attributes),
}
callback(null, response)

Serverlessフレームワークでの設定は未検証ですがAPI Gateway+Lambda経由の画像のアップロードも今では可能です。
参考:API Gatewayがバイナリデータをサポートしたので試してみました

CloudFrontの設定

参考:S3 CloudFront Route 53 でReactで作ったSPAを配信する
参考:CloudFrontでS3のウェブサイトをSSL化する

CloudFrontを作成します。
Origin Domain NameにはS3のバケット名を指定します。
Origin IDは自動で入ります。
Object CachingをCustomizeにします。
TTLを全て0にしてます。(キャッシュを有効にする場合はS3デプロイ時に手動でInvalidationsにてキャッシュクリアする必要が出てきます。)
Forward CookiesをAllにします。
Compress Objects Automaticallyを有効にします。(gzip圧縮されてレスポンスが早くなるので)
Price ClassesはAll Edgeにすると日本からのアクセスは早くなりますが値段は上がります。(お財布と相談で)
Altanative Domain Names(CNAME)にはstatic.(ドメイン名)を指定します。
SSL CertificateをCustom SSL Certificateにします。
→Request or Import a Certificate with ACMにてSSL証明書を作成します(後述)
Default Root Objectをindex.htmlにします。

スクリーンショット 2017-12-29 5.28.23.png
スクリーンショット 2017-12-29 5.30.43.png
スクリーンショット 2017-12-29 5.30.57.png
スクリーンショット 2017-12-29 5.31.10.png

CloudFront作成後に払い出されたDomain Nameをコピーします。
スクリーンショット 2017-12-29 5.22.44.png

Route53にてstatic.(ドメイン名)にCloudFrontのDomain NameをAレコードのaliasとして指定します。
スクリーンショット 2017-12-29 5.21.14.png

ACMで独自ドメインのSSL証明書作成

ACMにてSSL証明書を作成します。
*.(ドメイン名)でサブドメインを作成します。
スクリーンショット 2017-12-29 5.04.44.png

DNSの検証を選択し、確定とリクエストします。
スクリーンショット 2017-12-29 5.09.58.png

Route53にて払い出されたCNAMEを登録します。(Route53でのレコードの作成)
スクリーンショット 2017-12-29 5.10.44.png

スクリーンショット 2017-12-29 5.12.51.png

SPAのルーティングを有効にする

デフォルトのままだと
S3のエラーページが表示されてしまい、SPAのルーティングが有効になりません(Reactの場合、React-Routerが効かない)
そこでCloudFront側でエラーページの遷移を修正します。

Create Custom Error Responseを作成します。
スクリーンショット 2017-12-29 5.14.00.png

403エラーコードの場合にindex.htmlを指定するように修正します。
スクリーンショット 2017-12-29 5.16.41.png

API Gatewayの設定

参考:Amazon API Gateway にカスタムドメインを設定する
参考:【新機能】Amazon API GatewayがACM (AWS Certificate Manager)に対応。簡単に独自ドメインAPIがSSL化。

API Gatewayにカスタムドメインを割り振ります。
API Gatewayのカスタムドメイン名から作成します。
私はapi.(ドメイン名)にしました。(config/production.jsと合わせてください)
作成にはかなり時間がかかります。(30分以上?)

スクリーンショット 2017-12-29 4.23.28.png

保存するとターゲットドメイン名が出力されますのでコピーします。

スクリーンショット 2017-12-29 4.26.23.png

Route53にてCreate Record SetsでAレコードを作成します。
aliasをyesにして先程のターゲットドメインを指定します。

スクリーンショット 2017-12-29 4.29.23.png

本番環境の確認

上記すべての設定が完了すれば
https://static.(ドメイン名)
にアクセスするとReactJSのSPAページが表示され、
https://api.(ドメイン名)
でAPI Gateway→Lambda→DynamoDBでのRest APIが動作するようになります。

APIの再デプロイ

API部分は次コマンドで再デプロイします。

# デプロイ先のAWSアカウントを明示的に指定(~/.aws/credentialsのアカウントが複数ある場合)
$ export AWS_ACCESS_KEY_ID=(アクセスキー)
$ export AWS_SECRET_ACCESS_KEY=(プライベートキー)
$ SLS_DEBUG=* sls deploy

S3の再デプロイ(アップロード)

シンプルにバケット内のindex.htmlとjsフォルダを削除して

スクリーンショット 2017-12-29 2.35.37.png

distフォルダ内の再ビルドしたファイルをアップロードすれば大丈夫です。

スクリーンショット 2017-12-29 2.36.40.png

続きを読む

AWS認定 ソリューションアーキテクトを取得するには?

先日、AWSソリューションアーキテクトになってきたので、記念して初投稿してみます。
っても、アソシエイトですが。
これから受験しようとしている方々の参考にでもなればと。

自己紹介

35歳のSEです。
主にパッケージ製品の保守や・ちょっとした開発が多く、がっつりの開発はしてませんでした。
その後、ようやくJAVAで大きな開発を経験し、去年末くらいからAWSを触り始めました。
しかもいきなりサーバーレス(APIGateway+Lambda)から入った異端児です。

触ってみて、今はこんなに便利なものがあるんだ!と感動して興味を持つ。
と同時に、世の中のIT業界の動きに戦慄を感じ、AWSを使う&勉強して資格取得しました。

資格を取得するには?

あくまで私が学んだ方法なのですが。

1.AWSのサービスの内容を知る
2.AWSのサービスを実際に使う
3.AWSのサービスに関する問題を解く
※これを各サービスに関して繰り返します。

中でも「2.AWSのサービスを実際に使う」が重要でした。
やはり実際に触ると、実行したことを情報として吸収します。
本やネットの情報を見ているだけではなかなか頭に入っていきません。

触った上でまた調べると、最初はよく分からなかったことが分かるようになります。
そしてまた触って・・・と繰り返すと、また調べたくなります。また触ります。
このループに入っていくといい流れですw

同じサービスばかり使っていると飽きてきますので、違うサービスを同じように調べる→触る、です。

もし、会社に所属している方で補助が出るのであれば、AWSの研修に行くのが手っ取り早いです。
そして、研修を受けたらなるべく早く受験しましょう。時間が空くと、絶対忘れます。
https://aws.amazon.com/jp/training/course-descriptions/architect/

サービスがいっぱいあるけど、何を勉強すればいいの?

世の中はサーバーレスだ、コンテナだ、Fargateだ、いやLambdaだ、とどんどん進んでいきますね。
私もどこまで勉強したらいいんじゃい、と思いました。
そして書店に行ったらありました、試験対策本。

合格対策 AWS認定ソリューションアーキテクト -アソシエイト

ここに載っているサービスは学習必須だと思って頂ければと。
・EC2
・EBS
・VPC
・AutoScaling
・S3
・RDS
・ELB
・SNS
・SQS
・Route 53
・IAM
・CloudFront
・DynamoDB
・ElastiCache
・Glacier

試験対策本だけでいいの?

どのサービスを勉強すればいいかはこれで十分ですが、各サービスの詳細は載っていません。
それはまた別の情報で調べる方がいいです。
私が実際に参考にしたのはコチラです。

AWS クラウドサービス活用資料集
各サービスの詳細を知ることができます。
調べたいサービスが決まっている場合はこちらを参照するといいかと思います。
通勤中にスマホで見ることができるので、ここにはとてもお世話になりました。

Amazon Web Services実践入門
本を読みながら実践していくことができます。
主要サービスに関して手を動かして学ぶことができますのでオススメです。

サンプル問題
ソリューションアーキテクト以外のデベロッパーやシスオペの問題も解きました。

学習するにあたっては、何ができて何ができないのか、は覚えておいた方がよいです。

受験結果

結構勉強したつもりでしたが、ギリッギリでした。あっぶな。
やはり実務でEC2やRDS、AutoScalingを使っていなかったことが完全に響いてますね。

分野 得点割合
1.0 高可用性、コスト効率、対障害性、スケーラブルなシステムの設計 66%
2.0 実装/デプロイ 50%
3.0 データセキュリティ 72%
4.0 トラブルシューティング 72%

振り返って

何度もスライドや本を読んで覚えたつもりでも、試験会場の席で問題を見ると、
「あれ?なんだっけ?」となることが多々ありました。

やはり、実践に勝る学習はないのかと思います。
このページをもし参考にしている方がいらっしゃいましたら、是非とも手を動かしてみてください。
AWSは無料枠も多いですので、怖がらずに使って頂ければと思います。

最後に

初投稿ということもあってか、何をどう書いたらいいか、みたいな感じで完全に手探りです。
それでもなんとか一通り書いてみましたので、どなたかの参考になれば幸いです。
ありがとうございました。

また何か投稿します!!!

続きを読む

Aws default nameservers

Aws default nameservers. The Amazon EC2 instances you launch into a nondefault VPC are private by default; they’re Configure Route 53 to check the health of your resources and to respond to DNS queries using only healthy resources. After the TTL settings expire, you can safely delete the records … 続きを読む