awsでruby on railsとapacheとの連携構築方法

すべての手順

必要なミドルウェアのインストール

$ sudo yum update
$ sudo yum install curl-devel ncurses-devel gdbm-devel readline-devel sqlite-devel ruby-devel
$ sudo yum install gcc gcc-c++ openssl-devel zlib-devel make patch git gettext perl rpm-build libxml2

rbenvのインストール

$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:${PATH}"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
$ env | grep RBENV
RBENV_SHELL=bash
$ rbenv --version
rbenv 1.1.0-2-g4f8925a

ruby2.4.0 のインストール

$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ rbenv install -l
.....
2.3.0-dev
  2.3.0-preview1
  2.3.0-preview2
  2.3.0
  2.3.1
  2.3.2
  2.3.3
  2.4.0-dev
  2.4.0-preview1
  2.4.0-preview2
  2.4.0-preview3
  2.4.0-rc1
  2.4.0
  2.5.0-dev
  jruby-1.5.6
  jruby-1.6.3
  jruby-1.6.4
  jruby-1.6.5
  jruby-1.6.5.1
...
$ rbenv install -v 2.4.0
$ rbenv rehash
$ rbenv global 2.4.0
$ ruby -v
 ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-linux]

Railsのインストール

$ gem update --system
$ gem install bundler --no-rdoc --no-ri
$ gem install --no-ri --no-rdoc rails
$ rbenv rehash    
$ rails -v
Rails 5.0.2
$ gem install bundler

sqlite3のインストール

$ wget https://www.sqlite.org/2017/sqlite-autoconf-3170000.tar.gz
$ tar xvzf sqlite-autoconf-3170000.tar.gz
$ cd ./sqlite-autoconf-3170000
$ ./configure
$ make
$ make install
$ source ~/.bash_profile
$ rm -rf sqlite-autoconf-317000*
$ sqlite3 --version
; 3.17.0 2017-02-13.....

Hello World アプリ作成

$ cd ~
$ rails new hello_world
$ cd hello_world
$ vim Gemfile
$ bundle install
- # gem 'therubyracer', platforms: :ruby
+ gem 'therubyracer', platforms: :ruby
$ bundle exec rails s -e production
=> Booting Puma
=> Rails 5.0.2 application starting in production on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.8.2 (ruby 2.4.0-p0), codename: Sassy Salamander
* Min threads: 5, max threads: 5
* Environment: production
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop

apache2.4のインストール

$ sudo yum install httpd24 httpd24-devel

Passengerのインストール

$ gem install passenger
$ rbenv rehash
$ sudo dd if=/dev/zero of=/swap bs=1M count=1024
$ sudo mkswap /swap
$ sudo swapon /swap
$ passenger-install-apache2-module
.....
linking shared-object passenger_native_support.so

--------------------------------------------
Almost there!

Please edit your Apache configuration file, and add these lines:

   LoadModule passenger_module /home/ec2-user/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/passenger-5.1.2/buildout/apache2/mod_passenger.so
   <IfModule mod_passenger.c>
     PassengerRoot /home/ec2-user/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/passenger-5.1.2
     PassengerDefaultRuby /home/ec2-user/.rbenv/versions/2.4.0/bin/ruby
   </IfModule>

After you restart Apache, you are ready to deploy any number of web
applications on Apache, with a minimum amount of configuration!
....

Apacheの設定

$ sudo chown -R apache. ~/hello_world

$ sudo vim /etc/httpd/conf.d/passenger.conf
+   LoadModule passenger_module /home/ec2-user/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/passenger-5.1.2/buildout/apache2/mod_passenger.so
+   <IfModule mod_passenger.c>
+     PassengerRoot /home/ec2-user/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/passenger-5.1.2
+     PassengerDefaultRuby /home/ec2-user/.rbenv/versions/2.4.0/bin/ruby
+   </IfModule>
$ sudo vim /etc/httpd/conf.d/apps.conf
 <VirtualHost *:80>
    ServerAlias ip address
    ServerName ip address

    <Directory "/home/ec2-user/hello_world/public/">
        PassengerAppRoot /home/ec2-user/hello_world
        RailsEnv production        
        Options -MultiViews
        Options Indexes FollowSymLinks
        Require all granted
    </Directory>
 </VirtualHost>

Apacheの起動

$ sudo service httpd start
$ sudo service httpd status

続きを読む

JAWS DAYS 2017 ワークショップ Docker on Elastic Beanstalk 〜Days after tomorrow〜 (1)

この記事では、複数のDockerコンテナで構成される環境を構築するための設定例を具体的に解説します。ワークショップのフォローアップではありますが、一般的な事柄を扱いますので、ワークショップに参加されていない方にもお読み頂ける内容です。

ワークショップ

こんにちは。Emotion Techの子安です。3月もそろそろ終わりだというのに、まだ寒い日が続きますね。陽だまりの恋しい今日このごろです。

さて、先日開催されたJAWS DAYS 2017にて、ワークショップ「Docker on Elastic Beanstalk 〜明日から本番で使えるかも〜」を担当いたしました。多数のお申込みとご参加ありがとうございました。

当日の様子はこんな感じでした。

P3110990.JPG

ハンズオンがメインということで、環境を構築して動かすことにフォーカスした内容だったのですが、終了後に記入して頂いたアンケートの中で、コンテナの設定や、ファイルの内容についてよく知りたいというご要望を頂きました。そこで、今回はワークショップで触れられなかった、そのあたりのことを解説したいと思います。(Dockerそのものについての解説は行いません) 長くなりそうなので、2,3回に分けて掲載する予定です。

リポジトリとコンテナの構成

リポジトリはこちらです。ハンズオンの手順書やコンテナの設定などが入っています。
https://github.com/akirakoyasu/elastic-beanstalk-workshop

コンテナの構成

workshop (1).png

静的コンテンツ配信かつRailsへのプロキシとなるwebコンテナがあり、Railsが動いているappコンテナがあり、更にdbコンテナがあるという構成です。

コンテナ定義ファイル

まずはコンテナを定義するファイルから具体的に見ていきます。 docker-compose.yml を参照ください。docker-compose.ymlは、大きく services volumes networks の3つのセクションに分けられます。

※ 実はElastic Beanstalkはdocker-compose.ymlファイルを参照しませんので、同様の内容をDockerrun.aws.jsonに記述しています。Dockerrun.aws.json固有の設定は次回以降に解説します。

services

コンテナをサービスとして定義するセクションです。ここで、 web app db コンテナをそれぞれ定義しています。

volumes

ホストからコンテナへマウントするディスク領域(ボリューム)を定義するセクションです。ここで、DBのデータ領域となるボリューム eb.workshop.db を名前付きボリュームとして定義しています。イメージがボリュームを要求する場合、定義しなくても自動的にボリュームが作成されますが、名前を付けて定義しておいたほうが後で扱いやすいので明示的に定義するようにしています。

networks

コンテナが接続するネットワークを定義するセクションです。ここで、ネットワーク eb.workshop を定義しています。docker-composeを使用した場合、定義しなくてもデフォルトで1つネットワークが作成されますが、定義しておいたほうが後で扱いやすいので明示的に定義するようにしています。

各コンテナの設定

以降では、順にそれぞれのコンテナで利用している設定を見ていきましょう。

webコンテナ

まずは一番単純なwebコンテナから行きます。

  • image: 公式のnginxイメージを指定しています。予期していない変更を予防するため、バージョンタグを必ず指定しましょう。
  • environment: 環境変数を指定します。コンテナの役割やDEV/PROD環境の区別などを持たせておくとよいでしょう。
  • labels: コンテナにつけるラベルを指定します。必須ではありませんが、付けておくとCLIでのフィルタリングなどがしやすくなります。
  • ports: ホスト側の80番ポートとコンテナ側の80番ポートをマッピングしています。
  • networks: コンテナが接続するネットワーク(networksのセクションで定義したもの)を指定します。
  • depends_on: このコンテナが依存するコンテナを指定します。webコンテナはappコンテナへプロキシしますので、appコンテナを指定しています。
  • volumes: コンテナにマウントするボリュームを指定します。ボリュームのマウントにはいくつか種類がありますが、ここではホスト側のディレクトリをdocker-compose.ymlファイルからの相対パスで指定して、nginxの設定ファイルと、配信する静的コンテンツをコンテナ側で読み込めるようにしています。

dbコンテナ

次はdbコンテナです。使用しているMySQLイメージの挙動による設定がいくつかあります。(webコンテナと重複する項目は割愛します)

  • image: 公式のmysqlイメージを指定しています。
  • environment: MySQLのrootユーザのパスワードを環境変数 MYSQL_ROOT_PASSWORD で指定する必要があります。
  • volumes: ここでは3つのマウントを指定しています。1つめはMySQLの設定ファイル、2つめは初期化時に実行されるSQLスクリプトファイル、3つめはデータ領域となるディレクトリです。

MySQLイメージの挙動により、 MYSQL_ROOT_PASSWORD 環境変数がrootパスワードとして使用され、初期化時に /docker-entrypoint-initdb.d/db-init.sql のSQLが実行されます。このあたりの挙動については、 Docker Hubのページ に記載されています。

次回へ

次はappコンテナですが、少し長くなりそうなので、つづきは次回にしたいと思います。

続きを読む

[JAWS-UG CLI] Lambda #25 StepFunctions用関数 (FailFunction)

前提条件

Lambdaへの権限

Lambdaに対してフル権限があること。

AWS CLI

以下のバージョンで動作確認済

  • AWS CLI 1.10.60
コマンド
aws --version

結果(例):

  aws-cli/1.11.34 Python/2.7.10 Darwin/15.6.0 botocore/1.4.91

バージョンが古い場合は最新版に更新しましょう。

コマンド
sudo -H pip install -U awscli

IAM Role

‘lambdaBasicExecution’ロールが存在すること。

0. 準備

まず変数の確認をします。

変数の確認
cat << ETX

        AWS_DEFAULT_PROFILE: (0.1) ${AWS_DEFAULT_PROFILE}
        AWS_DEFAULT_REGION:  (0.2) ${AWS_DEFAULT_REGION}
        IAM_ROLE_ARN:        (0.3) ${IAM_ROLE_ARN}

ETX

結果(例):

  AWS_DEFAULT_PROFILE: (0.1) lambdaFull-prjz-mbp13
  AWS_DEFAULT_REGION:  (0.2) ap-northeast-1
  IAM_ROLE_ARN:        (0.3) arn:aws:iam::XXXXXXXXXXXX:role/lambdaBasicExecution

変数が入っていない、適切でない場合は、それぞれの手順番号について作業を
行います。

0.1. プロファイルの指定

プロファイルの一覧を確認します。

コマンド
cat ~/.aws/credentials \
       | grep '\[' \
       | sed 's/\[//g' | sed 's/\]//g'

結果(例):

  iamFull-prjz-mbpr13
  lambdaFull-prjz-mbp13
変数の設定
export AWS_DEFAULT_PROFILE='lambdaFull-prjz-mbp13'

0.2. リージョンの指定

変数の設定
export AWS_DEFAULT_REGION='ap-northeast-1'

0.3. IAMロールの指定

変数の設定
IAM_ROLE_NAME='lambdaBasicExecution'
コマンド
aws iam get-role \
         --role-name ${IAM_ROLE_NAME}

結果(例):

  {
      "Role": {
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Action": "sts:AssumeRole",
                    "Principal": {
                        "Service": "lambda.amazonaws.com"
                    },
                    "Effect": "Allow",
                    "Sid": ""
                }
            ]
        },
        "RoleId": "AROAXXXXXXXXXXXXXXXXX",
        "CreateDate": "2017-03-19T01:23:45Z",
        "RoleName": "lambdaBasicExecution",
        "Path": "/",
        "Arn": "arn:aws:iam::XXXXXXXXXXXX:role/lambdaBasicExecution"
      }
  }
コマンド
IAM_ROLE_ARN=$( \
        aws iam get-role \
          --role-name ${IAM_ROLE_NAME} \
          --query 'Role.Arn' \
          --output text \
) \
        && echo ${IAM_ROLE_ARN}

結果(例):

  arn:aws:iam::XXXXXXXXXXXX:role/lambdaBasicExecution

1. 事前作業

1.1. Lambda関数名の決定

変数の設定
LAMBDA_FUNC_NAME='FailFunction'

同名のLambda関数の不存在確認

コマンド
aws lambda get-function \
        --function-name ${LAMBDA_FUNC_NAME}

結果(例):

  A client error (ResourceNotFoundException) occurred when calling the GetFunction operation: Function not found: arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:FailFunction

1.2. Lambda関数

変数の設定
FILE_LAMBDA_FUNC='FailFunction.js'
コマンド
cat << EOF > ${FILE_LAMBDA_FUNC}
exports.handler = function(event, context, callback) {
   function AccountAlreadyExistsError(message) {
       this.name = "AccountAlreadyExistsError";
       this.message = message;
   }
   AccountAlreadyExistsError.prototype = new Error();

   const error = new AccountAlreadyExistsError("Account is in use!");
   callback(error);
};
EOF
  cat ${FILE_LAMBDA_FUNC}

結果(例):

  exports.handler = function(event, context, callback) {
     function AccountAlreadyExistsError(message) {
         this.name = "AccountAlreadyExistsError";
         this.message = message;
     }
     AccountAlreadyExistsError.prototype = new Error();

     const error = new AccountAlreadyExistsError("Account is in use!");
     callback(error);
  };
コマンド
zip ${LAMBDA_FUNC_NAME}.zip ${FILE_LAMBDA_FUNC}

結果:

  adding: FailFunction.js (deflated 43%)

2. Lambda関数の作成

変数の設定
LAMBDA_FUNC_DESC='Always generate an error.'
LAMBDA_RUNTIME='nodejs4.3'
LAMBDA_HANDLER="${LAMBDA_FUNC_NAME}.handler"
FILE_LAMBDA_ZIP="${LAMBDA_FUNC_NAME}.zip"
変数の確認
cat << ETX

        LAMBDA_FUNC_NAME:  ${LAMBDA_FUNC_NAME}
        LAMBDA_FUNC_DESC: "${LAMBDA_FUNC_DESC}"
        LAMBDA_RUNTIME:    ${LAMBDA_RUNTIME}
        FILE_LAMBDA_ZIP    ${FILE_LAMBDA_ZIP}
        IAM_ROLE_ARN:      ${IAM_ROLE_ARN}
        LAMBDA_HANDLER:    ${LAMBDA_HANDLER}

ETX
コマンド
aws lambda create-function \
        --function-name ${LAMBDA_FUNC_NAME} \
        --description "${LAMBDA_FUNC_DESC}" \
        --zip-file fileb://${FILE_LAMBDA_ZIP} \
        --runtime ${LAMBDA_RUNTIME} \
        --role ${IAM_ROLE_ARN} \
        --handler ${LAMBDA_HANDLER}

結果(例):

  {
    "CodeSha256": "uW+ZzaP1iDzaUfhFUyed0CdaOcSxbcsFd7yJXjHbWX8=",
    "FunctionName": "FailFunction",
    "CodeSize": 353,
    "MemorySize": 128,
    "FunctionArn": "arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:FailFunction",
    "Version": "$LATEST",
    "Role": "arn:aws:iam::XXXXXXXXXXXX:role/lambdaBasicExecution",
    "Timeout": 3,
    "LastModified": "2017-03-19T01:23:45.678+0000",
    "Handler": "FailFunction.handler",
    "Runtime": "nodejs4.3",
    "Description": "Always generate an error."
  }
コマンド
aws lambda get-function \
        --function-name ${LAMBDA_FUNC_NAME}

結果(例):

  {
    "Code": {
      "RepositoryType": "S3",
      "Location": "https://awslambda-ap-ne-1-tasks.s3-ap-northeast-1.amazonaws.com/snapshots/XXXXXXXXXXXX/FailFunction-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx?x-amz-security-token=AQxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&AWSAccessKeyId=ASIAXXXXXXXXXXXXXXXX&Expires=xxxxxxxxxx&Signature=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  },
  "Configuration": {
      "Version": "$LATEST",
      "CodeSha256": "uW+ZzaP1iDzaUfhFUyed0CdaOcSxbcsFd7yJXjHbWX8=",
      "FunctionName": "FailFunction",
      "MemorySize": 128,
      "CodeSize": 353,
      "FunctionArn": "arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:FailFunction",
      "Handler": "FailFunction.handler",
      "Role": "arn:aws:iam::XXXXXXXXXXXX:role/lambdaBasicExecution",
      "Timeout": 3,
      "LastModified": "2017-03-19T01:23:45.678+0000",
      "Runtime": "nodejs4.3",
      "Description": "Always generate an error."
    }
  }
コマンド
aws lambda get-function-configuration \
        --function-name ${LAMBDA_FUNC_NAME}

結果(例):

  {
    "CodeSha256": "uW+ZzaP1iDzaUfhFUyed0CdaOcSxbcsFd7yJXjHbWX8=",
    "FunctionName": "FailFunction",
    "CodeSize": 353,
    "MemorySize": 128,
    "FunctionArn": "arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:FailFunction",
    "Version": "$LATEST",
    "Role": "arn:aws:iam::XXXXXXXXXXXX:role/lambdaBasicExecution",
    "Timeout": 3,
    "LastModified": "2017-03-19T01:23:45.678+0000",
    "Handler": "FailFunction.handler",
    "Runtime": "nodejs4.3",
    "Description": "Always generate an error."
  }

3. Lambda関数の動作確認

3.1. サンプルデータの作成

変数の設定
FILE_INPUT="${LAMBDA_FUNC_NAME}-data.json" \
          && echo ${FILE_INPUT}

サンプルデータ:

  cat << EOF > ${FILE_INPUT}
  {
    "key3": "value3",
    "key2": "value2",
    "key1": "value1"
  }
  EOF

  cat ${FILE_INPUT}

JSONファイルを作成したら、フォーマットが壊れてないか必ず確認します。

コマンド
jsonlint -q ${FILE_INPUT}

エラーが出力されなければOKです。

3.2. lambda関数の手動実行

変数の設定
FILE_OUTPUT_LAMBDA="${LAMBDA_FUNC_NAME}-out.txt"
FILE_LOG_LAMBDA="${LAMBDA_FUNC_NAME}-$(date +%Y%m%d%H%M%S).log"
変数の確認
cat << ETX

        LAMBDA_FUNC_NAME:   ${LAMBDA_FUNC_NAME}
        FILE_INPUT:         ${FILE_INPUT}
        FILE_OUTPUT_LAMBDA: ${FILE_OUTPUT_LAMBDA}
        FILE_LOG_LAMBDA:    ${FILE_LOG_LAMBDA}

ETX
コマンド
aws lambda invoke \
        --function-name ${LAMBDA_FUNC_NAME} \
        --log-type Tail \
        --payload file://${FILE_INPUT} \
        ${FILE_OUTPUT_LAMBDA} \
        > ${FILE_LOG_LAMBDA}
コマンド
cat ${FILE_LOG_LAMBDA} \
        | jp.py 'StatusCode'

結果(例):

  200

3.3. lambda関数の実行結果の確認

コマンド
cat ${FILE_OUTPUT_LAMBDA}

結果:

  {"errorMessage":"Account is in use!","errorType":"AccountAlreadyExistsError","stackTrace":["exports.handler (/var/task/FailFunction.js:6:42)"]}

3.4. lambda関数のログの確認

コマンド
cat ${FILE_LOG_LAMBDA} \
        | jp.py 'LogResult' \
        | sed 's/\"//g' \
        | base64 --decode

結果(例):

  START RequestId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Version: $LATEST
  2017-03-19T01:23:45.678Z     xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx    {"errorMessage":"Account is in use!","errorType":"AccountAlreadyExistsError","stackTrace":["exports.handler (/var/task/FailFunction.js:6:42)"]}
  REPORT RequestId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx      Duration: 41.14 ms      Billed Duration: 100 ms         Memory Size: 128 MB        Max Memory Used: 10 MB

完了

続きを読む

[JAWS-UG CLI] Lambda #24 StepFunctions用関数 (Hello World)

前提条件

Lambdaへの権限

Lambdaに対してフル権限があること。

AWS CLI

以下のバージョンで動作確認済

  • AWS CLI 1.10.63
コマンド
aws --version

結果(例):

  aws-cli/1.11.63 Python/2.7.10 Darwin/15.6.0 botocore/1.5.26

バージョンが古い場合は最新版に更新しましょう。

コマンド
sudo -H pip install -U awscli

IAM Role

‘lambdaBasicExecution’ロールが存在すること。

0. 準備

まず変数の確認をします。

変数の確認
cat << ETX

        AWS_DEFAULT_PROFILE: (0.1) ${AWS_DEFAULT_PROFILE}
        AWS_DEFAULT_REGION:  (0.2) ${AWS_DEFAULT_REGION}
        IAM_ROLE_ARN:        (0.3) ${IAM_ROLE_ARN}

ETX

結果(例):

  AWS_DEFAULT_PROFILE: (0.1) lambdaFull-prjz-mbp13
  AWS_DEFAULT_REGION:  (0.2) ap-northeast-1
  IAM_ROLE_ARN:        (0.3) arn:aws:iam::XXXXXXXXXXXX:role/lambdaBasicExecution

変数が入っていない、適切でない場合は、それぞれの手順番号について作業を
行います。

0.1. プロファイルの指定

プロファイルの一覧を確認します。

コマンド
cat ~/.aws/credentials \
       | grep '\[' \
       | sed 's/\[//g' | sed 's/\]//g'

結果(例):

  iamFull-prjz-mbpr13
  lambdaFull-prjz-mbp13
変数の設定
export AWS_DEFAULT_PROFILE='lambdaFull-prjz-mbp13'

0.2. リージョンの指定

変数の設定
export AWS_DEFAULT_REGION='ap-northeast-1'

0.3. IAMロールの指定

変数の設定
IAM_ROLE_NAME='lambdaBasicExecution'
コマンド
aws iam get-role \
         --role-name ${IAM_ROLE_NAME}

結果(例):

  {
      "Role": {
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Action": "sts:AssumeRole",
                    "Principal": {
                        "Service": "lambda.amazonaws.com"
                    },
                    "Effect": "Allow",
                    "Sid": ""
                }
            ]
        },
        "RoleId": "AROAXXXXXXXXXXXXXXXXX",
        "CreateDate": "2017-03-18T01:23:45Z",
        "RoleName": "lambdaBasicExecution",
        "Path": "/",
        "Arn": "arn:aws:iam::XXXXXXXXXXXX:role/lambdaBasicExecution"
      }
  }
コマンド
IAM_ROLE_ARN=$( \
        aws iam get-role \
          --role-name ${IAM_ROLE_NAME} \
          --query 'Role.Arn' \
          --output text \
) \
        && echo ${IAM_ROLE_ARN}

結果(例):

  arn:aws:iam::XXXXXXXXXXXX:role/lambdaBasicExecution

1. 事前作業

1.1. Lambda関数名の決定

変数の設定
LAMBDA_FUNC_NAME='HelloFunction'

同名のLambda関数の不存在確認

コマンド
aws lambda get-function \
        --function-name ${LAMBDA_FUNC_NAME}

結果(例):

  A client error (ResourceNotFoundException) occurred when calling the GetFunction operation: Function not found: arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:HelloFunction

1.2. Lambda関数

変数の設定
FILE_LAMBDA_FUNC='HelloFunction.js'
コマンド
cat << EOF > ${FILE_LAMBDA_FUNC}
exports.handler = (event, context, callback) => {
    callback(null, "Hello, " + event.who + "!");
};
EOF

cat ${FILE_LAMBDA_FUNC}

結果(例):

  exports.handler = (event, context, callback) => {
      callback(null, "Hello, " + event.who + "!");
  };
コマンド
zip ${LAMBDA_FUNC_NAME}.zip ${FILE_LAMBDA_FUNC}

結果:

  adding: HelloFunction.js (deflated 43%)

2. Lambda関数の作成

変数の設定
LAMBDA_FUNC_DESC='Say Hello to someone'
LAMBDA_RUNTIME='nodejs4.3'
LAMBDA_HANDLER="${LAMBDA_FUNC_NAME}.handler"
FILE_LAMBDA_ZIP="${LAMBDA_FUNC_NAME}.zip"
変数の確認
cat << ETX

        LAMBDA_FUNC_NAME:  ${LAMBDA_FUNC_NAME}
        LAMBDA_FUNC_DESC: "${LAMBDA_FUNC_DESC}"
        LAMBDA_RUNTIME:    ${LAMBDA_RUNTIME}
        FILE_LAMBDA_ZIP    ${FILE_LAMBDA_ZIP}
        IAM_ROLE_ARN:      ${IAM_ROLE_ARN}
        LAMBDA_HANDLER:    ${LAMBDA_HANDLER}

ETX
コマンド
aws lambda create-function \
        --function-name ${LAMBDA_FUNC_NAME} \
        --description "${LAMBDA_FUNC_DESC}" \
        --zip-file fileb://${FILE_LAMBDA_ZIP} \
        --runtime ${LAMBDA_RUNTIME} \
        --role ${IAM_ROLE_ARN} \
        --handler ${LAMBDA_HANDLER}

結果(例):

  {
    "CodeSha256": "aNNHoAV+4ERLB3aO2i72HiCZzsDDNF/22V4HSO+7Gk0=",
    "FunctionName": "HelloFunction",
    "CodeSize": 270,
    "MemorySize": 128,
    "FunctionArn": "arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:HelloFunction",
    "Version": "$LATEST",
    "Role": "arn:aws:iam::XXXXXXXXXXXX:role/lambdaBasicExecution",
    "Timeout": 3,
    "LastModified": "2017-03-18T01:23:45.678+0000",
    "Handler": "HelloFunction.handler",
    "Runtime": "nodejs4.3",
    "Description": "Say Hello to someone"
  }
コマンド
aws lambda get-function \
        --function-name ${LAMBDA_FUNC_NAME}

結果(例):

  {
    "Code": {
      "RepositoryType": "S3",
      "Location": "https://awslambda-ap-ne-1-tasks.s3-ap-northeast-1.amazonaws.com/snapshots/XXXXXXXXXXXX/HelloFunction-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx?x-amz-security-token=AQxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&AWSAccessKeyId=ASIAXXXXXXXXXXXXXXXX&Expires=xxxxxxxxxx&Signature=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  },
  "Configuration": {
      "Version": "$LATEST",
      "CodeSha256": "aNNHoAV+4ERLB3aO2i72HiCZzsDDNF/22V4HSO+7Gk0=",
      "FunctionName": "HelloFunction",
      "MemorySize": 128,
      "CodeSize": 270,
      "FunctionArn": "arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:HelloFunction",
      "Handler": "HelloFunction.handler",
      "Role": "arn:aws:iam::XXXXXXXXXXXX:role/lambdaBasicExecution",
      "Timeout": 3,
      "LastModified": "2017-03-18T01:23:45.678+0000",
      "Runtime": "nodejs4.3",
      "Description": "Say Hello to someone"
    }
  }
コマンド
aws lambda get-function-configuration \
        --function-name ${LAMBDA_FUNC_NAME}

結果(例):

  {
    "CodeSha256": "aNNHoAV+4ERLB3aO2i72HiCZzsDDNF/22V4HSO+7Gk0=",
    "FunctionName": "HelloFunction",
    "CodeSize": 270,
    "MemorySize": 128,
    "FunctionArn": "arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:HelloFunction",
    "Version": "$LATEST",
    "Role": "arn:aws:iam::XXXXXXXXXXXX:role/lambdaBasicExecution",
    "Timeout": 3,
    "LastModified": "2017-03-18T01:23:45.678+0000",
    "Handler": "HelloFunction.handler",
    "Runtime": "nodejs4.3",
    "Description": "Say Hello to someone"
  }

3. Lambda関数の動作確認

3.1. サンプルデータの作成

変数の設定
FILE_INPUT="${LAMBDA_FUNC_NAME}-data.json" \
          && echo ${FILE_INPUT}
サンプルデータ
cat << EOF > ${FILE_INPUT}
{
        "who": "AWS Step Functions"
}
EOF

cat ${FILE_INPUT}

JSONファイルを作成したら、フォーマットが壊れてないか必ず確認します。

コマンド
jsonlint -q ${FILE_INPUT}

エラーが出力されなければOKです。

3.2. lambda関数の手動実行

変数の設定
FILE_OUTPUT_LAMBDA="${LAMBDA_FUNC_NAME}-out.txt"
FILE_LOG_LAMBDA="${LAMBDA_FUNC_NAME}-$(date +%Y%m%d%H%M%S).log"
変数の確認
cat << ETX

        LAMBDA_FUNC_NAME:   ${LAMBDA_FUNC_NAME}
        FILE_INPUT:         ${FILE_INPUT}
        FILE_OUTPUT_LAMBDA: ${FILE_OUTPUT_LAMBDA}
        FILE_LOG_LAMBDA:    ${FILE_LOG_LAMBDA}

ETX
コマンド
aws lambda invoke \
        --function-name ${LAMBDA_FUNC_NAME} \
        --log-type Tail \
        --payload file://${FILE_INPUT} \
        ${FILE_OUTPUT_LAMBDA} \
        > ${FILE_LOG_LAMBDA}
コマンド
cat ${FILE_LOG_LAMBDA} \
        | jp.py 'StatusCode'

結果(例):

  200

3.3. lambda関数の実行結果の確認

コマンド
cat ${FILE_OUTPUT_LAMBDA}

結果:

  "Hello, AWS Step Functions!"

3.4. lambda関数のログの確認

コマンド
cat ${FILE_LOG_LAMBDA} \
        | jp.py 'LogResult' \
        | sed 's/\"//g' \
        | base64 --decode

結果(例):

  START RequestId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Version: $LATEST
  END RequestId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
  REPORT RequestId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx      Duration: 2.08 ms       Billed Duration: 100 ms         Memory Size: 128 MB        Max Memory Used: 11 MB

完了

続きを読む

EC2 タグに repo名/ブランチ/スクリプトパスを書いておいて GitHub push に勝手に反応させる

GitHub への push イベントを SNS で受け取って、「<リポジトリ名>:<ブランチ名>:<実行スクリプト>」というタグが付いている EC2 インスタンスを探して指定スクリプトを実行する、という話です。

で、スクリプト内で “git pull” するもヨシ、追加でごにょごにょするもヨシ。

前置き

CircleCI とかそんなんでなく、GitHub に push したら pull してくれればそれでいいんですよ、というケースは地味に多いわけです。

これは GitHub > SNS > Lambda > Run Command でスクリプト実行すれば良いのですが、「じゃぁリポジトリ毎に Lambda ファンクション作るの?」って話で。

そこで EC2 タグに関連するリポジトリ名とブランチ名、実行スクリプトを書いておけば 1つの lambda が全て面倒みてくれるようにします。

リポジトリが増えた時、サーバが増えた時も EC2 インスタンスにタグ付けるだけなので簡単です。

仕組み

DropShadow ~ 3.png

GitHub > SNS > Lambda はいろいろな方がやられている通り。
あとは EC2 インスタンスに

  • key = GitHub-Webhook
  • val = <リポジトリ名>:<ブランチ名>:<実行スクリプト>

というタグをつけておいて、lambda で対象 EC2 インスタンスを探して Rum Command でスクリプトを実行する。
で、スクリプトの中で git pull とか好きにせい、という構成。

例えば repo_1 というリポジトリの master に push したら、「key=GitHub-Webhook、val=repo_1:master:/hoge/hoge.sh」というタグが付いている EC2 インスタンスの /hoge/hoge.sh を実行します。

作る

SSM エージェントをインストールする

Run Command を実行するには対象インスタンスに SSM エージェントを入れておく必要があります。

SSMエージェントのインストール

40秒で支度しましょう。

$ cd /tmp
$ curl https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm -o amazon-ssm-agent.rpm
$ sudo yum install -y amazon-ssm-agent.rpm

EC2ロール割り当て

で、EC2 インスタンスに AmazonEC2RoleforSSM ポリシーをアタッチしておく。

001.png

SNS topic、GitHub webhook 専用 IAM ユーザの作成、GitHub の設定

「github-webhook」という SNS topic を作ります。
CLI でシュッと。

$ aws sns create-topic --name github-webhook

GitHub webhook 用に「github-webhook」という名前の IAM ユーザを作って、以下のようなインラインポリシーを付ける。
つまり github-webhook topic にパブリッシュする事しかできないユーザ。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "sns:Publish"
            ],
            "Sid": "Stmt0000000000000",
            "Resource": [
                "[さっき作った SNS の ARN]"
            ],
            "Effect": "Allow"
        }
    ]
}

で、GitHub 側もぱぱっと。

DropShadow ~ qiita_002.png

Lambda 準備

特になんもしてない。
エラー処理もないのでやさしく使う。

# -*- coding: utf-8 -*-

import json
import boto3

# key="GitHub-Webhook", val=<repoName>:<branchName>:<command>
# というタグを持つインスタンスを列挙する。
def search_target_instance(repoName, branchName):
    # 実行中の EC2 インスタンスを取得
    ec2 = boto3.client('ec2')
    response = ec2.describe_instances(
        Filters=[
            {
                'Name': 'instance-state-name',
                'Values': ['running']
            }
        ]
    )

    targetInstances = []

    for resv in response['Reservations']:
        for instance in resv['Instances']:
            for tag in instance['Tags']:
                if tag['Key'] == 'GitHub-Webhook':
                    tagValue = tag['Value']

                    if tagValue.startswith(repoName + ":" + branchName + ":"):
                        target = instance['InstanceId'], tagValue.split(':')[-1]
                        targetInstances.append(target)

    return targetInstances

# Run Command で指定スクリプトを実行する。
def execute_command(instanceId, command):
    print instanceId + " : " + command
    ssm = boto3.client('ssm')

    ssmRes = ssm.send_command(
        InstanceIds = [instanceId],
        DocumentName = "AWS-RunShellScript",
        Parameters = {
            "commands": [ command ]
        })

    commandId = ssmRes['Command']['CommandId']
    return commandId

# Lambda エントリポイント
def lambda_handler(event, context):
    message = event['Records'][0]['Sns']['Message']
    gitHubJson = json.loads(message)

    # SNS からリポジトリ名とブランチ名を取得する。
    repoName = gitHubJson["repository"]["name"]
    branchName = gitHubJson["ref"].replace('refs/heads/', '')

    # デプロイ対象 EC2 インスタンスを取得
    targetInstances = search_target_instance(repoName, branchName)

    # EC2 タグで指定されているコマンドを実行する
    for instance in targetInstances:
        instanceId, command = instance
        print execute_command(instanceId, command)

    return {'status': 'ok'}

EC2 タグつけて push

ココまで来たら、タグ付けて GitHub に push すればよい。
Run Command の結果は AWS コンソールの EC2 / Run Command から確認できます。

002.png

※ スクリプトは root で実行されるので注意。

結果はどうやって知るのよ?

本当は list_command_invocations() で Run Command の結果をみて Slack に通知とかすべきですが長くなるので割愛。

とりあえずスクリプト内から curl で slack に post しても良いかもしれないですね。

結論

大切なこと:「ssh ログインなんか絶対にしないぞ!」という強い意思。

続きを読む

AWS Batchを使ってバッチ処理を実装してみた。

今回やりたかったこと

  • 社内で適用しているセキュリティのSaaSサービスのアップデートの自動化をしたい
  • 処理内容は、基本的にapiをコールしてこねこねしていくだけ

Lambdaでいいのでは?

  • SaaSが提供しているapiサーバーが、アクセス集中時だと5分経ってもレスポンスを返してくれない

そこでAWS BATCH

AWS BATCHとは

  • Job queueを受けた段階で、予め指定しておいたスペック(スペックが足りなかったら自動で最適なものを立ててくれるらしい?)のEC2を立ち上げてECRからコンテナイメージを持ってきてタスク実行してくれる
  • スケジュールを設定して実行してくれる!とかは無さそう。

アーキテクチャ

スクリーンショット 2017-03-19 22.05.34.png

Dockerfileはこんな感じ

FROM centos:latest
RUN curl -kl https://bootstrap.pypa.io/get-pip.py | python
RUN pip install awscli
RUN yum install -y git
ADD init.sh /opt/
CMD ["sh","/opt/init.sh","test"]

事前に処理実行に必要なコードだったりシェルスクリプトなんかは、ECRに含めておく。
シェルには、コードコミットから実行ソースをcloneするのに必要なssh key(事前にKMSとかで暗号化しておいたもの)、復号化処理、処理実行とかを書いておく。

あとは、Job queueを送ってあげれば、自動でEC2を立ち上げ、コンテナをマウントして最新のソースコードをcloneしてきて、処理を実行してくれます。
自動で立ち上がったEC2はタスク処理終了後(CMDのとこのやつ)、1時間単位の課金が切れるタイミング?で自動で削除されます。(立ち上がりっぱなしとかの心配なし!)

job queueに送信
aws --profile <profile> --region <region> batch submit-job --job-name <好きな名前> --job-queue <job queueの名前> --job-definition <定義したjob>

結果については、 Jobsの画面で確認することができます。
スクリーンショット 2017-03-19 22.17.59.png

まとめ

先日参加した「JAWS-UG KOBE」のコンテナまつりでHiganWorks sawanobolyさんがElasticDockerRunって呼んでるって言ってました。
DockerImageを基にいい感じに実行してくれるが、逆にBatch?なのかって印象でした。
もし、スケジュール実行で定期的にbatch処理をしたい!とかでれば、lambdaなんかを使ってqueueに送信してやるといいかなぁと思いました。

追記

シェル内にkmsで暗号化したssh keyを含めているのですが、出来れば外出ししたい。。
パラメーターストアとかに出せるかと思ったのですが、文字数制限の関係で無理でした。

続きを読む

p2インスタンス上にCUDA, cuDNNを用いたChainer環境を構築する

やったこと

AWSのp2.xlargeにCUDA, cuDNNを利用可能なChainer環境を作成してみました。

前提

以下のバージョンを利用しました。(実施時点のものです)

version
OS Ubuntu14.04
pyenv 1.0.8
Anaconda 4.3.0
python 3.6.2
CUDA 8.0
cuDNN v5.1
Chainer 1.2.21

必要なライブラリのインストール

sudo apt-get install -y git gcc make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev

pyenvのインストール

pyenvのインストールは以下を参考にしました。
http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c

git clone https://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc

Anacondaのインストール

Anacondaのインストールは以下を参考にしました。
http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c

pyenv install -l | grep anaconda
pyenv install anaconda3-4.3.0
pyenv rehash
pyenv global anaconda3-4.3.0
echo 'export PATH="$PYENV_ROOT/versions/anaconda3-4.3.0/bin/:$PATH"' >> ~/.bashrc
source ~/.bashrc
conda update conda
python --version

CUDAのインストール

wget https://developer.nvidia.com/compute/cuda/8.0/Prod2/local_installers/cuda-repo-ubuntu1404-8-0-local-ga2_8.0.61-1_amd64-deb
sudo dpkg -i cuda-repo-ubuntu1404-8-0-local-ga2_8.0.61-1_amd64-deb
sudo apt-get update
sudo apt-get install cuda -y
echo 'export CUDA_HOME=/usr/local/cuda' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${CUDA_HOME}/lib64' >> ~/.bashrc
echo 'export PATH=$PATH:${CUDA_HOME}/bin' >> ~/.bashrc

cuDNNのインストール

別途nvidiaのサイトから取得。

mkdir .cudnn
tar xvzf ./cudnn-8.0-linux-x64-v5.1.tgz
mv ./cuda ./.cudnn
mv ./.cudnn/cuda ./.cudnn/5.1
sudo ln -s ~/.cudnn/5.1/include/cudnn.h /usr/local/cuda/include/cudnn.h
sudo ln -s ~/.cudnn/5.1/lib64/libcudnn* /usr/local/cuda/lib64/
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

Chainerのインストール

pip install chainer

動作確認

mkdir mnist
wget https://raw.githubusercontent.com/pfnet/chainer/master/examples/mnist/train_mnist.py ./mnist
# GPU使用
time python ./mnist/train_mnist.py -g 0 -e 10
# GPU不使用
time python ./mnist/train_mnist.py -g -1 -e 10

実行時間に差が出たら成功です。

続きを読む

PHP Warning: Unknown: Unable to clear session lock record in

HTTPのセッションをmemcachedでメモリ管理したいのだが・・・

環境

  • Apache 2.4.23
  • php 7.0.13
  • memcached 1.4.33 (ElastiCache)

症状

sessionへのアクセス時にエラーになり、$_SESSIONが使えない

session.lazy_write = Off
を設定すると少し動作が改善されて数回に1回の割合で$_SESSIONへのアクセスがエラーになる。

memcached.sess_lock_wait_min = 250
を設定すると、さらに安定するが、数十回に1回ぐらいの割合で$_SESSIONへのアクセスがエラーになる。

workaround

memcached をやめて、redis に変更(php?のバージョンアップで改善されると思われるので・・・)。
https://pecl.php.net/package/redis/3.1.1 このあたりからモジュールをインストール

[Session]
session.save_handler = redis
session.save_path = "aws-XXXXX-XXXXX.XXXXX.XXXXX.cache.amazonaws.com:6379"

この設定だけで、動作確認OK。

AWSなので、memcached/redisどちらを使ってもコストは一緒。
最終的に、redisのクラスタ構成で安定稼働を目指します。

2017-03-19 17_46_04-phpinfo().png

参考:
https://github.com/magento/magento2/issues/5319
https://forums.aws.amazon.com/thread.jspa?threadID=240538

続きを読む

AWSの各サービスを雑に紹介する

えー、投稿しておいて何ですが、本稿本当に雑ですので、ご利用にあたってはあくまで自己責任ということで、よろしくお願いします。

コンピューティング

  • Elastic Compute Cloud (EC2)
    仮想専用サーバ、従量課金制 ≫公式

  • EC2 Container Registry (ECR)
    DockerHubみたいなやつ ≫英語公式 / Google翻訳 ≫Developers.IO

  • EC2 Container Service (ECS)
    Dockerオーケストレーション(デプロイ、起動停止制御) ≫公式 ≫@IT

  • Lightsail
    仮想専用サーバ、定額制 ≫公式

  • AWS Batch
    ECS対応バッチジョブスケジューラ ≫公式 ≫公式 ≫Developers.IO

  • Elastic Beanstalk
    プログラム実行環境 (Java, PHP, .NET, Node.js, Python, Ruby)、EC2を使用 ≫公式 ≫YouTube

  • AWS Lambda
    プログラム実行環境 (Node.js, Java, C#, Python)、サーバレス ≫公式

  • Auto Scaling
    EC2対応オートスケール制御 ≫公式

  • Elastic Load Balancing
    負荷分散、BIG-IPとかその手のヤツのクラウド版 ≫公式 ≫@IT

ストレージ

  • Amazon Simple Storage Service (S3)
    オブジェクトストレージ。ファイルサーバとしても一応使える ≫公式

  • Amazon Elastic Block Store (EBS)
    ブロックデバイス ≫CodeZine

  • Elastic File System (EFS)
    ファイルサーバ ≫公式

  • Glacier
    バックアップストレージ ≫公式

  • Snowball
    HDDをFedExで送るオフラインデータ転送

  • Storage Gateway
    バックアップデバイスはお客様各自のオンプレミスにてご用意下さい、AWSは対向するインターフェースを提供します、というもの ≫CodeZine ≫Developers.IO

データベース

ネットワーキング & コンテンツ配信

移行

  • Application Discovery Service
    オンプレミスサーバの構成管理情報を収集する ≫公式

  • Database Migration Service (DMS)
    RDBをオンプレミスからAWSへ乗り換えるときに使う支援ツール

  • Server Migration Service (SMS)
    サーバをオンプレミスからAWSへ乗り換えるときに使う支援ツール

開発者用ツール

  • CodeCommit
    GitHubみたいなやつ

  • CodeBuild
    従量課金制ビルド

  • CodeDeploy
    コードデプロイ

  • CodePipeline
    Continuous Integration (CI) オーケストレーション。ビルド→デプロイの自動実行フロー定義。

  • AWS X-Ray
    分散アプリケーションのトレース ≫Serverworks

管理ツール

セキュリティ、アイデンティティ、コンプライアンス

  • AWS Identity and Access Management (IAM)
    AWSの認証、権限管理単位 ≫Developers.IO

  • Inspector
    脆弱性検出 ≫公式

  • Certificate Manager
    X.509証明書の管理 ≫公式

  • AWS Cloud Hardware Security Module (HSM)
    秘密鍵の保管(暗号、署名) ≫公式

  • AWS Directory Service
    Active Directory ≫Developers.IO

  • AWS Web Application Firewall (WAF)
    ファイアーウォール ≫公式

  • AWS Shield
    DDoS対策 ≫公式

分析

人工知能

IoT

ゲーム開発

モバイルサービス

  • Mobile Hub
    AWSのいろんなmBaaS系サービスを統合的に使えるコンソール画面 ≫Qiita

  • Cognito
    ソーシャル認証+データ同期。FacebookログインとかTwitterログインとか ≫Cookpad

  • AWS Device Farm
    テスト環境。Android, iOSの実機にリモートアクセスしてテストができる ≫公式

  • Mobile Analytics
    アプリの使用データの測定、追跡、分析 ≫公式 ≫Developers.IO

  • Pinpoint
    プッシュ ≫Qiita

アプリケーションサービス

  • Step Functions
    フローチャートみたいなビジュアルワークフローを画面上に描いて分散アプリケーションを構築する、というもの ≫公式

  • Amazon Simple Workflow (SWF)
    旧世代サービス。現在はStep Functionsを推奨 ≫公式

  • API Gateway
    HTTP API化 ≫公式

  • Elastic Transcoder
    動画、音声のフォーマット変換。つんでれんこaaSみたいなヤツ ≫Serverworks

メッセージング

  • Amazon Simple Queue Service (SQS)
    メッセージキュー ≫公式

  • Amazon Simple Notification Service (SNS)
    プッシュ ≫公式

  • Amazon Simple Email Service (SES)
    E-mail配信。メルマガとか ≫公式

ビジネスの生産性

デスクトップとアプリケーションのストリーミング

  • Amazon WorkSpaces
    仮想デスクトップ ≫impress

  • Amazon WorkSpaces Application Manager (WAM)
    Amazon WorkSpaces端末にアプリを配信するツール ≫serverworks

  • AppStream 2.0
    Citrix XenAppみたいなやつ ≫Developers.IO

参考文献

AWS ドキュメント
https://aws.amazon.com/jp/documentation/

AWS re:Invent 2016 発表サービスを三行でまとめる
http://qiita.com/szk3/items/a642c62ef56eadd4a12c

続きを読む