[EC2] SSH 接続時のログインメッセージにインスタンスタイプとかリージョンとか表示する

対象は Amazon Linux で動いてる EC2。
SSH接続して作業するときに、このインスタンスってどのインスタンスタイプで動いてたっけ?って知りたいときとかに便利。

こんな感じのシェルスクリプトを /etc/update-motd.d/40-instance-meta とかって名前で保存して実行権限与えておいてください。

/etc/update-motd.d/40-instance-meta
#!/bin/sh
instance_type=$(curl -s http://169.254.169.254/latest/meta-data/instance-type/)
az=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)
region=$(echo ${az} | sed -e 's/[a-z]$//g')

cat << EOF
 INSTANCE TYPE : ${instance_type}
 REGION : ${region} (${az})

EOF

そのあとで update-motd コマンドを root 権限で実行すると、次回 SSH ログイン時からログインメッセージ変わります。あら便利

Last login: Wed Mar 15 15:05:40 2017 from xxx.xxx.xxx.xxx
      ___         _            __
     / _ | __ _  (_)_ _  ___  / /____
    / __ |/  ' / /  ' / _ / __/ _ 
   /_/ |_/_/_/_/_/_/_/_/___/__/___/

https://aws.amazon.com/amazon-linux-ami/2016.09-release-notes/

 Nginx 1.11.10, PHP 7.1.2, Percona MySQL 5.6.35, WP-CLI 1.1.0

 amimoto     https://www.amimoto-ami.com/
 digitalcube https://en.digitalcube.jp/

 INSTANCE TYPE : t2.small
 REGION : ap-northeast-1 (ap-northeast-1c)

続きを読む

初めてのAWSで、WebアプリケーションからプライベートサブネットのRDSへ接続までを実施した。

AWSの人気が非常に高いことは存じ上げておりました。
しかしながら、現職の業務上だと触る機会が皆無であるため、
プライベートで触ろうとしました。

しかし…
AWS、ぜんぜんわかりませーーーん。

何がわからん?

目標

  • RDSを使用して、DBの構築、自作WebアプリケーションからDBアクセスを可能にする。

実施したこと

AWSユーザー設定

  1. アカウントを作成する
  2. 仮想MFAデバイスをインストールする
    • 自分のiPhoneに「Google Authenticator」をインストールする
  3. MFAを設定する
    • 2つの認証コードは、以下

      • 表示された6桁の番号を、「認証コード1」に入力する
      • 約30秒後、続けて表示された6桁の番号を、「認証コード2」に入力する
      • 2行表示されるものだ、と思ってはまった。
  4. MFAを用いてサインインする
  5. グループを作成する
  6. IAMアカウントを作成する
    • キーなどが記載されたCSVをダウンロードできる。紛失しないようにする。
    • 一番最初に作成したアカウントは、ルートアカウントと呼ばれる。それで作業することは、基本的にしない。
  7. パスワードポリシーを設定する
  8. 作成したユーザへMFA割り当てる

AWS 環境構築

アカウント登録は完璧! さあ構築だ! と思ったら…。

  • 「サービスへのお申し込みはあと少しで完了です!」ページが表示されてしまうッッ!!

??? と思いましたが、以下が終わっていませんでした。
* クレジットカードの登録
* 電話により本人確認

アカウント登録、完璧ではありませんでした。
「サービスへのお申し込みはあと少しで完了です!」ページの「AWS への登録を完了してください。」をクリックし、
残りを登録・本人確認をしました。

環境構成

  • VPC

    • パブリックサブネット

      • EC2(踏み台)
    • プライベートサブネット
      • RDS

VPC作成

  1. 項目を入力して作成する

    • ネームタグ

      • vpc-employee-mask-management
    • IPv4 CIDR Block
      • x.x.x.x/xx
    • テナンシー
      • デフォルト
  2. 右クリックして「DNSホスト名の編集」を「はい」にする

サブネット作成

  1. 項目を入力してパブリックサブネットを作成する

    • ネームタグ

      • EM-public-subnet
    • VPC
      • vpc-employee-mask-management
    • アベイラビリティーゾーン
      • ap-northeast-1a
    • IPv4 CIDR Block
      • x.x.x.y/xx
  2. 項目を入力してプライベートサブネットを作成する
    • ネームタグ

      • EM-private-subnet
    • VPC
      • vpc-employee-mask-management
    • アベイラビリティーゾーン
      • ap-northeast-1a
    • IPv4 CIDR Block
      • x.x.x.z/xx
  3. パブリックサブネットの「自動割り当てパブリックIP」を有効化する

インターネットゲートウェイ作成

  1. 項目を入力してインターネットゲートウェイを作成する

    • ネームタグ

      • EM-internet-gateway
  2. インターネットゲートウェイにVPCをアタッチする

ルートテーブル作成

  1. 項目を入力してルートテーブルを作成する

    • ネームタグ

      • EM-root-table
    • VPC
      • vpc-employee-mask-management
  2. ルートタブにて、新しいルートを作成する
    • 送信先

      • 0.0.0.0/0
    • ターゲット
      • EM-internet-gateway

サブネットへルートテーブルを割り当て

  1. サブネット「EM-public-subnet」のルートテーブルタブで、ルートテーブルを割り当てる

セキュリティグループ作成

  1. 項目を入力してパブリック用のセキュリティグループを作成する

    • ネームタグ

      • EM-public-DMZ
    • グループ名
      • EM-public-DMZ
    • 説明
      • Employee Management Public Security Group
    • VPC
      • vpc-employee-mask-management
  2. 項目を入力してプライベート用のセキュリティグループを作成する
    • ネームタグ

      • EM-private-DMZ
    • グループ名
      • EM-private-DMZ
    • 説明
      • Employee Management Private Security Group
    • VPC
      • vpc-employee-mask-management
  3. インバウンドを変更する
    • EM-public-DMZ

      • 1行目

        • タイプ

          • SSH
        • プロトコル
          • TCP
        • ポート
          • 22
        • 送信元
          • マイIP
      • 2行目
        • タイプ

          • PostgreSQL
        • プロトコル
          • TCP
        • ポート
          • 5432
        • 送信元
          • 0.0.0.0/0
    • EM-private-DMZ
      • 1行目

        • タイプ

          • PostgreSQL
        • プロトコル
          • TCP
        • ポート
          • 5432
        • 送信元
          • EM-public-DMZ

DBサブネットグループ作成

  1. RDSを開き、項目を入力し、DBサブネットグループを作成する

    • 名前

      • EM-dbsubnet-mask
    • 説明
      • Employee management DB subnet
    • VPC
      • vpc-employee-mask-management
    • 追加するサブネット
      • ap-northeast-1a

        • アベイラビリティーゾーン

          • ap-northeast-1a
        • サブネットID
          • EM-private-subnetのID
      • ap-northeast-1c
        • アベイラビリティーゾーン

          • ap-northeast-1c
        • サブネットID
          • EM-private-subnet-CのID

RDSインスタンス作成

  1. エンジンを選択する

    • PostgreSQL
  2. インスタンスの仕様を入力する
    • ライセンスモデル

      • postgresql-license
    • バージョン
      • PostgreSQL 9.5.4-R1
    • インスタンスのクラス
      • db.t2.micro
    • DBインスタンス識別子
      • employee-mask-management
    • マスタユーザの名前
      • adminuser
    • マスターパスワード
      • ********
    • パスワードの確認
      • ********
  3. 詳細設定の設定
    • VPC

      • vpc-employee-mask-management
    • サブネットグループ
      • EM-dbsubnet-mask
    • パブリックアクセス
      • いいえ
    • アベイラビリティーゾーン
      • 指定なし
    • VPCセキュリティグループ
      • EM-private-DMZ
    • データベースの名前
      • employeemanagement
    • データベースのポート
      • 5432
    • DB パラメータグループ
      • default.postgres9.5

EC2インスタンス作成

  1. マシンイメージを選択する

    • Amazon Linux AMI 2016.09.1 (HVM), SSD Volume Type
  2. インスタンスタイプを選択する
    • t2.micro
  3. インスタンスの設定をする
    • インスタンス数

      • 1
    • ネットワーク
      • vpc-employee-mask-management
    • サブネット
      • EM-public-subnet
    • 自動割り当てパブリックIP
      • サブネット設定を使用
  4. ストレージの設定をする
    • 全てデフォルトのまま
  5. Add Tags
    • Name

      • EM-Server
  6. セキュリティグループの設定をする
    • 既存のセキュリティグループを選択する

      • EM-public-DMZ
  7. キーペアを作成、ダウンロードする
    • キーペア名

      • EM_Server_Key

EC2インスタンスへの接続

  • ssh -i {key file name} {your user name}@{your address.com}

ローカルの開発環境にあるWebアプリからRDSへ接続する方法

  • Webアプリ側で、JSchを使用して、SSHポートフォワーディングする

結果

  • ローカルのWebアプリから、プライベートサブネットのRDSへ接続することができた。

わからないこと

  • EC2によるポートフォワーディングが、AWS上に存在しないアプリケーションがRDSへ接続する方法として、適切なのか?

    • 別のAWSサービスを利用した、もっとよい方法があるのではないか?

参考にさせて頂きました

続きを読む

Salesforce Apex で独自の Salesforce REST API を作成する (取引先責任者をLIKE検索して表示)

はじめに

本資料では、独自のSalesforce REST APIを作成する手順について記しています。

 (1) Salesforce Apexクラスを作成し、独自のSalesforce REST APIを作成する手順
 (2) PHPから作成したSalesforce REST APIを実行するサンプルコード

参考資料

ApexによるSalesforce REST API作成については、以下の資料を参考にさせて頂きました。ありがとうございました。

http://kayakuguri.github.io/blog/2014/09/08/apex-restapi/
https://developer.salesforce.com/page/Creating_REST_APIs_using_Apex_REST

Apexで独自に作成したSalesforce REST APIについては、以下の手順により構築したAmazon EC2インスタンス(Amazon Linux)上で実行しています。

http://qiita.com/na0AaooQ/items/157c28a80948c4b97bed

Apexクラスで独自のSalesforce REST APIを作成する

(1) https://login.salesforce.com/ へログインします。

(2)「設定」->「ビルド」->「開発」->「Apexクラス」->「新規」をクリックします。

スクリーンショット 2017-03-14 1.54.49.png

(3)「Apex Class」画面が表示されます。Apexクラスを作成します。

「Apex Class Edit」テキストエリアに以下のApexコードを貼り付けます。

これは、取引先責任者(Contact)のName項目について、指定した文字列が含まれているレコードを返すApexクラスです。

例えば、今回作成するSalesforce REST APIに対して ‘テスト’ というパラメータをGETで指定した場合、取引先責任者(Contact)のName項目をLIKE検索して ‘テスト’ という文字列が含まれているレコードを返します。

@RestResource(urlMapping='/CustomContact/*')
global with sharing class CustomContactSample {
    @HttpGet
    global static sObject doGet() {
        RestRequest req = RestContext.request;
        String ContactName = req.params.get('name');
        ContactName = '%' + ContactName + '%';
        try {
            Contact acc = [SELECT Id, Name, Email, Account.Name FROM Contact WHERE Name LIKE :ContactName LIMIT 1];
            return acc;
        } catch (exception e) {
            return null;
        }
    }
}

「Save」をクリックして、Apexクラスを作成します。

スクリーンショット 2017-03-14 1.58.01.png

(4) 「設定」->「ビルド」->「開発」->「Apexクラス」をクリックします。Apexクラス「CustomContactSample」が作成されている事を確認します。

スクリーンショット 2017-03-14 2.01.36.png

「CustomContactSample」をクリックします。先ほどApexクラス作成時に貼り付けたコードが表示される事を確認します。

スクリーンショット 2017-03-14 2.03.31.png

(5)「設定」->「管理」->「ユーザの管理」->「プロファイル」をクリックします。

スクリーンショット 2017-03-14 2.10.38.png

(6)「テストオブジェクトプロファイル」をクリックします。

(7) プロファイル画面が表示されます。「有効な Apex クラス」をクリックします。

スクリーンショット 2017-03-14 2.12.10.png

(8)「有効な Apex クラス」の「編集」をクリックします。

スクリーンショット 2017-03-14 2.13.09.png

(9)「Apex クラスアクセスを有効化」画面が表示されます。「利用可能な Apex クラス」で「CustomContactSample」を選択して「追加」をクリックします。

「有効化された Apex クラス」に「CustomContactSample」が追加された事を確認します。

スクリーンショット 2017-03-14 2.15.33.png

(10) .bashrcにSalesforce REST APIのクレデンシャルを追加します。

以下を参考にして、.bashrcにSalesforce REST APIクレデンシャルを追加します。

http://qiita.com/na0AaooQ/items/157c28a80948c4b97bed

.bashrcにSalesforce REST APIクレデンシャルを追加します。

[ec2-user@salesforce-api-test ~]$ vi /home/ec2-user/.bashrc
 (末尾に以下を追加する)

### Sandbox環境へ接続する場合のAPIエンドポイント
##export DATABASEDOTCOM_HOST="test.salesforce.com"
### 本番環境へ接続する場合のAPIエンドポイント
export DATABASEDOTCOM_HOST="login.salesforce.com"

export DATABASEDOTCOM_CLIENT_ID="前述の「コンシューマ鍵」(OAuthコンシューマキー)を記載します。"
export DATABASEDOTCOM_CLIENT_SECRET="前述の「コンシューマの秘密」(OAuthコンシューマシークレット)を記載します。"
export DATABASEDOTCOM_CLIENT_USERNAME="APIを有効化しているSalesforceユーザアカウント名を記載します。"
export DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD="APIを有効化しているSalesforceユーザアカウントのパスワードを記載します。"

.bashrcに追加した環境変数を読み込みます。

[ec2-user@salesforce-api-test ~]$ source /home/ec2-user/.bashrc
[ec2-user@salesforce-api-test ~]$ 

作成した独自のSalesforce REST APIをPHPから実行する

(11) 独自に作ったSalesforce REST APIを呼び出すPHPサンプルプログラムを作成します。

[ec2-user@salesforce-api-test ~]$ php -v
PHP 5.3.29 (cli) (built: May 12 2015 22:42:19) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2014 Zend Technologies
[ec2-user@salesforce-api-test ~]$ 
[ec2-user@salesforce-api-test ~]$ vi /home/ec2-user/select_salesforce_custom_api_contact.php
/home/ec2-user/select_salesforce_custom_api_contact.php
<?php

require_once("/home/ec2-user/Force.com-OAuth-Toolkit-for-PHP/oauth.php");

if ( $argc == 2 ) {
  $name = "$argv[1]";
}
else {
  echo "[Usage]: $argv[0] テストn";
  exit;
}

///// Salesforce REST API接続用の環境変数を.bashrcから取得する
// Salesforce REST APIで接続するアプリケーションの「コンシューマ鍵」
$DATABASEDOTCOM_CLIENT_ID = getenv('DATABASEDOTCOM_CLIENT_ID');

// Salesforce REST APIで接続するアプリケーションの「コンシューマの秘密」を.bashrcから取得する
$DATABASEDOTCOM_CLIENT_SECRET = getenv('DATABASEDOTCOM_CLIENT_SECRET');

// Salesforce REST API接続用のSalesforceユーザ(Salesforceログインに使用しているEメールアドレスを設定)を.bashrcから取得する
$DATABASEDOTCOM_CLIENT_USERNAME = getenv('DATABASEDOTCOM_CLIENT_USERNAME');

// Salesforce REST API接続用のSalesforceユーザのパスワードを.bashrcから取得する
$DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD = getenv('DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD');

// Salesforce REST APIエンドポイントを.bashrcから取得する
$DATABASEDOTCOM_HOST = getenv('DATABASEDOTCOM_HOST');
$LOGIN_URL = "https://" . $DATABASEDOTCOM_HOST . "/";

///// Salesforce REST API接続用の設定
$CACHE_DIR = '/home/ec2-user/tmp/session';
$CALLBACK_URL = 'https://localhost/callback';

/////
// Salesforce REST API接続用のOauthインスタンスを生成
$oauth = new oauth( $DATABASEDOTCOM_CLIENT_ID, $DATABASEDOTCOM_CLIENT_SECRET, $CALLBACK_URL, $LOGIN_URL, $CACHE_DIR);

// Salesforce REST API接続にあたりSalesforceへの認証を実行
$oauth->auth_with_password( $DATABASEDOTCOM_CLIENT_USERNAME, $DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD );

// カスタムAPIのURLを指定する
$url = $oauth->instance_url . "/services/apexrest/CustomContact/?name=" . $name;
$curl = curl_init($url);
var_dump($url);

curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Authorization: OAuth " . $oauth->access_token));

// Salesforce REST API実行結果を保存
$response = json_decode(curl_exec($curl), true);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);

if ( $status != 200 ) {
    print("Salesforce Custom REST API Access Failed  StatusCode =[" . $status . "]n");
} else {
    print("Salesforce Custom REST API Access Success StatusCode =[" . $status . "]n");
}

var_dump( $response );

curl_close($curl);

$oauth->auth_with_refresh_token();

?>

(12) 作成したPHPサンプルプログラムの構文に問題ない事をチェックします。

[ec2-user@salesforce-api-test ~]$ php -l /home/ec2-user/select_salesforce_custom_api_contact.php 
No syntax errors detected in /home/ec2-user/select_salesforce_custom_api_contact.php
[ec2-user@salesforce-api-test ~]$ 

(13) PHPサンプルプログラムを実行し、独自に作ったSalesforce REST APIを呼び出します。

PHPサンプルプログラムを実行すると、独自に作ったSalesforce REST APIを呼び出します。

以下の例では、Salesforce REST APIに対して ‘テスト’ というパラメータをGETで渡して、取引先責任者(Contact)のName項目をLIKE検索して ‘テスト’ という文字列が含まれているレコードを表示しています。

[ec2-user@salesforce-api-test ~]$ php /home/ec2-user/select_salesforce_custom_api_contact.php テスト
string(74) "https://ap2.salesforce.com/services/apexrest/CustomContact/?name=テスト"
Salesforce Custom REST API Access Success StatusCode =[200]
array(6) {
  ["attributes"]=>
  array(2) {
    ["type"]=>
    string(7) "Contact"
    ["url"]=>
    string(56) "/services/data/v39.0/sobjects/Contact/00**************AS"
  }
  ["Id"]=>
  string(18) "00**************AS"
  ["Name"]=>
  string(16) "テスト 太郎"
  ["Email"]=>
  string(19) "example@example.com"
  ["AccountId"]=>
  string(18) "00**************AH"
  ["Account"]=>
  array(3) {
    ["attributes"]=>
    array(2) {
      ["type"]=>
      string(7) "Account"
      ["url"]=>
      string(56) "/services/data/v39.0/sobjects/Account/00**************AH"
    }
    ["Id"]=>
    string(18) "00**************AH"
    ["Name"]=>
    string(21) "テスト株式会社"
  }
}
[ec2-user@salesforce-api-test ~]$ 

今回のAPIでは、取引先責任者の「テスト 太郎」のレコードを表示しています。

スクリーンショット 2017-03-14 2.28.14.png


以上になります。

続きを読む

AWS Lambda (Node.js 4.3) で PhantomJS + WebdriverIO を使用してヘッドレスWebブラウザを操作する

目的

  • 社内グループウェア (Aipo) での出勤操作を自動化したかったんだ….

    • Amazon Dash ボタン + maddox/dasher + API Gateway + Lambda で社内グループウェア へログイン → 出勤ボタンをクリック
    • LT用のネタとして

構成

AWS Lambda (Node.js 4.3)

下記の設定でひとまず動作した。

  • メモリ: 512MB
  • タイムアウト: 3分

コードは npm でパッケージ管理を行い、Apex でデプロイを行った。

PhantomJS

実際には、下記のprebuiltなnpmモジュール: phantomjs-prebuilt を使用した。

開発時・デプロイ時は、このビルド済み PhantomJS バイナリをデプロイパッケージに含めて Lambda へアップロードするため、数十秒〜1分程度かかるつらみがある…..

WebdriverIO

phantomjs-prebuiltのREADME を見ると、下記の2通りの実行方法が記載されている。

  • Running via node: PhantomJS に処理を記載したjsファイルを食わせる方法
  • Running with WebDriver: Selenium WebDriver のプロトコルを介して (WebdriverIO から) 操る方法

主観的に、なんとなく WebdriverIO を使用した記述方法のほうが見通しが良さそうだったのでこっちの方法を選択した。

準備

# package.json
---
.
.
.
"dependencies": {
  "phantomjs-prebuilt": "^2.1.14",
  "webdriverio": "^4.6.2"
}
.
.
.
---
$ env PHANTOMJS_PLATFORM="linux" PHANTOMJS_ARCH="x64" npm install

phantomjs-prebuilnpm install 時にシェルの実行環境を判定してふさわしいバイナリをダウンロードするらしい。

そのため、

macOS でデプロイパッケージ作成

Lambda (Amazon Linux? x64) へアップロード

などの状況の場合は、下記の説明のとおりに環境変数を設定して、Linux x64 用のバイナリをダウンロードさせる (もしくは、Linux x64 な環境で作業を行う)。

If you know in advance that you want to install PhantomJS for a specific architecture, you can set the environment variables: PHANTOMJS_PLATFORM (to set target platform) and PHANTOMJS_ARCH (to set target arch), where platform and arch are valid values for process.platform and process.arch.
Cross-Platform Repositories

Lambda関数

Running with WebDriver に従って記述。

'use strict';

const phantomjs = require('phantomjs-prebuilt');
const webdriverio = require('webdriverio');

const webDriverOpts = {
    desiredCapabilities: {
        browserName: 'phantomjs',
        logLevel: 'verbose',
        host: 'localhost',
        port: '4444'
    }
};

exports.handler = (event, context, callback) => {
    phantomjs
        .run('--webdriver=4444')
        .then((phantom) => {
            const client = webdriverio.remote(webDriverOpts).init();
            return client
                .url("http://example.com/aipo")
                .waitForExist('.button[value="ログイン"]', 10000)
                .setValue('#member_username', "ユーザー名")
                .setValue('#password', "パスワード")
                .click('.button[value="ログイン"]')
                .waitForExist('=Aipo', 10000)
                .click('//input[@type="button" and (@value="出勤" or @value="退勤")]')
                .pause(5000)
                .then(() => {
                    phantom.kill();
                    return Promise.resolve();
                })
                .catch((err) => {
                    console.error(`error: ${err}`);
                    phantom.kill();
                    return Promise.reject(err);
                });
        })
        .then(() => {
            console.log("done");
            context.succeed({
                statusCode: 200,
                body: JSON.stringify({ "message": "done" })
            });
        })
        .catch((err) => {
            console.error(`failed: ${err}`);
            context.fail({
                statusCode: 500,
                body: JSON.stringify({ "message": `failed:${err}` })
            });
        });
};

実際に書いたコード

hiraro/lambda-phantomjs

続きを読む

Deep Security 10 へバージョンアップする(9.5sp1 Linux/Oracle Database環境 から)

こんにちは、ひろかずです。

前回、readmeも読んだことなので、早速バージョンアップしてみたいと思います。
Deep Security10.0 アップグレードガイドブックに記載されているとおり、バージョンアップは一筋縄では行きません。

以下のような検証環境を用意しましたので、作戦を考えてみましょう。

参考情報

トレンドマイクロ社ダウンロードページ
Deep Security10.0 アップグレードガイドブック

検証環境

DSMサーバ

  • t2.large
  • RHEL-7.3_HVM_GA-20161026-x86_64-1-Hourly2-GP2 (ami-6f68cf0f)
  • Deep Security Manager 9.5.5600
  • Deep Security Agent 9.5.3.2754
  • Oracle RDS ( 11.2.0.4.v10 )

DSA導入サーバ

  • t2.large
  • amzn-ami-hvm-2016.03.3.x86_64-gp2 (ami-7172b611)
  • Deep Security Agent 9.5.3.7523

ざっくり構成

DSMdiagram.png

作戦

今回の検証環境のポイントは、Deep Security Managerが、直接アップデートできる9.5 sp1 patch3ではないことです。
前回確認したとおり、10へのアップデートには、データベーススキーマを更新することになりますが、トレンドマイクロ Q&Aページ DSMデータベーススキーマアップグレード方法では、 本製品 Q&A に記載している手順は、SQL Server 2005 や Oracle データベースはサポートしていません。 と書かれているため、一旦9.5 sp1 patch3(9.5.7008)に上げることにします。

readmeにも、9.5系旧バージョンからのバージョンアップからの注意は記載されていませんね。

というわけで、工程は以下になります。

工程

  1. バックアップの取得
  2. DSMサーバを9.5 sp1 patch3(9.5.7008)にバージョンアップする
  3. DSMサーバを10にバージョンアップする
  4. DSA(Relay)を10にバージョンアップする
  5. DSAを10にバージョンアップする

1. バックアップの取得

当然ですが、DSM両サーバのAMIバックアップと、RDSのスナップショットを取得しておきます。

1. DSMを9.5 sp1 patch3(9.5.7008)にバージョンアップする

各DSMサーバの作業ディレクトリに9.5 sp1 patch3(9.5.7008)をダウンロードします。

# curl -O http://files.trendmicro.com/products/deepsecurity/en/9.5/Manager-Linux-9.5.7008.x64.sh

実行権を付けて、インストール時に使用した dsm.properties を使用してインストールします。

# chmod +x Manager-Linux-9.5.7008.x64.sh
# ./Manager-Linux-9.5.7008.x64.sh  -q -console -varfile ./dsm.properties
Unpacking JRE ...
Preparing JRE ...
Starting Installer ...
3 11, 2017 9:02:44 午後 java.util.prefs.FileSystemPreferences$2 run
情報: Created system preferences directory in java.home.
Trend Micro Deep Security Managerサービスを停止しています...
以前のバージョンのTrend Micro Deep Security Managerを確認しています...
アップグレードの確認画面の設定を許可...
すべての設定を許可しました。実行準備ができました...
以前のバージョンをアンインストールしています
ファイルを解凍しています...
設定しています...
データベースに接続しています...
他のManagerを終了しています...
データベーススキーマをアップデートしています...
データベースのデータをアップデートしています...
データベースのデータをアップデートしています (カウンタをアップグレード)...
作業ディレクトリを作成しています...
レポートをインストールしています...
モジュールとプラグインをインストールしています...
ヘルプシステムを作成しています...
ソフトウェアパッケージをインポートしています...
廃止機能の削除...
検索キャッシュの設定をインポートしています...
パフォーマンスプロファイルをインポートしています...
インストールの記録を記録しています...
セッションをクリアしています...
プロパティファイルを作成しています...
ショートカットを作成しています...
SSLを設定しています...
サービスを設定しています...
Javaセキュリティを設定しています...
Javaのログを設定しています...
クリーンナップしています...
Deep Security Managerを開始しています...
インストールを終了しています...

もう一台も実施する必要がありますので注意です。(出力は省略します。)

できたようです。
dsm9_5_7008.png

状態も良好ですね。
dsm95state.png

お好みで、この時点のAMIバックアップやスナップショットを取得しておきます。

2. DSMを10にバージョンアップする

各DSMサーバの作業ディレクトリに10.0(10.0.3259)のインストールモジュールをダウンロードします。

# curl -O http://files.trendmicro.com/products/deepsecurity/en/10.0/Manager-Linux-10.0.3259.x64.sh

実行権を付けて、インストール時に使用した dsm.properties を使用してインストールします。

# chmod +x Manager-Linux-10.0.3259.x64.sh
# ./Manager-Linux-10.0.3259.x64.sh -q -console -varfile ./dsm.properties
Unpacking JRE ...
Starting Installer ...
3 11, 2017 9:53:36 午後 java.util.prefs.FileSystemPreferences$2 run
情報: Created system preferences directory in java.home.
無人 (サイレント) モードが開始されました
以前のバージョンのTrend Micro Deep Security Managerを確認しています...
アップグレードの確認画面の設定を許可...
アップグレードのシステムチェックを開始します。
システムチェック概要レポートが生成されました。パス: /current-work-directory/DeepSecurityInstallerReport.csv
アップグレードのシステムチェックが完了しました。
すべての設定を許可しました。実行準備ができました...
Trend Micro Deep Security Managerサービスを停止しています...
他のManagerを終了しています...
以前のバージョンをアンインストールしています
ファイルを解凍しています...
設定しています...
データベースに接続しています...
他のManagerを終了しています...
データベーススキーマを分析しています...
既存のデータベーススキーマの分析: 20 % ...
既存のデータベーススキーマの分析: 40 % ...
既存のデータベーススキーマの分析: 60 % ...
既存のデータベーススキーマの分析: 80 % ...
既存のデータベーススキーマの分析: 100 % ...
データベーススキーマをアップデートしています...
スキーマのアップデート: 20 % ...
スキーマのアップデート: 40 % ...
スキーマのアップデート: 60 % ...
スキーマのアップデート: 80 % ...
スキーマのアップデートを終了しています...
スキーマのアップデート: 100 % ...
作業ディレクトリを作成しています...
レポートをインストールしています...
モジュールとプラグインをインストールしています...
ソフトウェアパッケージをインポートしています...
廃止機能の削除...
検索キャッシュの設定をインポートしています...
パフォーマンスプロファイルをインポートしています...
インストールの記録を記録しています...
セッションをクリアしています...
プロパティファイルを作成しています...
ショートカットを作成しています...
SSLを設定しています...
サービスを設定しています...
Javaセキュリティを設定しています...
Javaのログを設定しています...
クリーンナップしています...
Deep Security Managerを開始しています...
インストールの完了...

もう一台も実施する必要がありますので忘れずに実行してください。(出力は省略します。)

インストールプロセスに システムチェック概要レポートが生成されました。 とありますね。
新機能の Better upgrade experience のことでしょうか。
中身を確認してみましょう。

$ cat DeepSecurityInstallerReport.csv
Deep Security Manager 10.0アップグレードのシステム概要レポート,,,
,,,
このレポートは、既存のDeep Securityインフラストラクチャの各コンポーネントについて、Deep Security Manager 10.0をインストール/アップグレードする準備ができているかを示したものです。,,,
,,,
アップグレードの準備が100%完了していない場合は、アップグレード手順に進む前に、表示される手順に従って準備してください。,,,
https://help.deepsecurity.trendmicro.com/ja-jp/upgrade-deep-security.html?combo=0&db=2&dsa=3&dsm=1&dsmhw=0&dsmos=0%2C1&dsr=2&dsva=&nodes=1&ten=0&i=2,,,
,,,
,,,
結果,コンポーネント,,理由
,ip-xxx-xxx-xxx-xxx.us-west-2.compute.internal (現在のノード),,
準備完了,,Deep Security Managerバージョン,Deep Security Manager 9.5.7008は10.0に直接アップグレードできます。
準備完了,,Deep Security ManagerのホストOS,Red Hat Linux 7.3はサポートされます。
準備完了,,Deep Security Managerホストのディスク容量,46 GBの空き
準備完了 (警告あり),,Deep Security Managerホストのメモリ,7.4 GBしかRAMがなく、システム要件を満たしていません。パフォーマンスが低下します。
,ip-xxx-xxx-xxx-xxx-us-west-2.compute.internal (他のノード),,
準備完了,,Deep Security Managerバージョン,Deep Security Manager 9.5.7008は10.0に直接アップグレードできます。
準備未完了,,Deep Security ManagerのホストOS,特定のLinuxディストリビューションを検出できません。
準備完了,,Deep Security Managerホストのディスク容量,46.8 GBの空き
N/A,,Deep Security Managerホストのメモリ,他のDeep Security ManagerノードのRAMについては、直接テストすることはできません。他のサーバで別のハードウェアを使用している場合は、RAMが要件を満たしているかどうかを手動で確認してください。
,,,
準備完了,データベース,,Oracle Database 11g Standardエディション
,,,
準備ができました。新しい機能を使用するには、Managerをアップグレードしてから10.0にアップグレードしてください。また、依存関係もアップグレードしてください。,Deep Security Agentバージョン,,1個のAgentがサポートされています。
,,,
準備ができました。新しい機能を使用するには、Managerをアップグレードしてから10.0にアップグレードしてください。また、依存関係もアップグレードしてください。,Deep Security Relayバージョン,,2個のRelayがサポートされています。
,,,
準備完了,Deep Security Virtual Applianceバージョン,,Virtual Applianceは検出されませんでした。
,,,

これは手厳しいですね。
メモリで怒られてしまっています。
検証用途なので、t2.large(vcpu 2, Memory 8GB)を選択しましたが、厳密には8GBに達していません

# free -m
              total        used        free      shared  buff/cache   available
Mem:           7565        1561        2501          24        3502        5652
Swap:             0           0           0

System requirementsに記載されている内訳はクリアしているので、気にせず進みましょう。

おっ、来ましたね。
login.png

状態も良好なようです。
dsm10state.png

3. DSA(Relay)を10バージョンアップする

10モジュールのインポート

[管理]タブ>[ダウンロード]とクリックし、DS10のモジュールをインポートします。
今すぐインポート アイコンをクリックすれば、インポート開始です。
DSA(Relay)を導入しているプラットフォームのものを選択しましょう。
ModuleDL_01.png

緑のチェックが入ればインポート完了です。
KSM(Kernel Support Module)も自動的にダウンロードされました。

続けてDSA(Relay)のバージョンアップ

[コンピュータ]タブから、Relayアイコンの付いているコンピュータをダブルクリックします。
DSA_update00.png

[概要]>[処理]タブ>[Agentのアップデート]ボタンをクリックします。
DSA_update01.png

バージョン10.0が選択されているのを確認して、[OK]ボタンをクリック
DSA_update02.png

無事に終わったようです。
DSA_update03.png

もう一台も忘れずにバージョンアップしておきます。(画像は省略します)

4. DSAを10バージョンアップする

10モジュールのインポート

プラットフォームがDSA(Relay)と異なる場合、先の手順と同様にモジュールのインポートを行います。
Amazon Linuxの10モジュールもインポートすることができました。
ModuleDL_03.png

Agentアップデートの手順は、先程のDSA(Relay)のバージョンアップと変わりません。
Relayの有効化ボタンをクリックしてしまうと、Agentの再導入(アンインストール/インストール)になるので注意して下さい。
DSA_update012.png

無事にできました。
DSA_update04.png

最終的なステータスも良好です。
Final_state.png

無事にバージョンアップができました。
今後は、この環境を使っていろいろ検証していきます。

今日はここまでです。
お疲れ様でした。

続きを読む

RubyからSalesforce REST APIを実行する (restforceを使用してSalesforceカスタムオブジェクトへレコードを追加する)

はじめに

Salesforceに対して、様々な操作を行えるSalesforce REST APIというものがあります。

Salesforce REST APIを使用する事で、RubyからSalesforceカスタムオブジェクトにレコードを追加したり、レコードを取得したりといった操作が可能です。

RubyからSalesforce REST APIを実行する事で、Salesforceカスタムオブジェクトにレコードを追加するサンプルプログラムを記します。

また、Salesforceカスタムオブジェクトに登録したレコード一覧を表示するサンプルプログラムも合わせて記します。

実行環境

RubyからSalesforce REST APIを呼び出す環境については、以下の手順を参考にして、AWS EC2インスタンス(Amazon Linux)に作成しました。
http://qiita.com/na0AaooQ/items/d7f814b184c6c1bd9d9c

レコード追加対象のSalesforceカスタムオブジェクト(カスタムオブジェクト名: QuickStart__c)については、以下の手順で作成したものを使用します。また、EC2インスタンスからSalesforce REST APIを呼び出す為のSalesforce OAuth設定も以下をご参照下さい。
http://qiita.com/na0AaooQ/items/157c28a80948c4b97bed

Salesforce REST API接続に使用したRubyのGem

今回の手順では「databasedotcom」ではなく「restforce」というGemを使用して、RubyからSalesforce REST APIを実行します。
https://github.com/ejholmes/restforce

Gem「databasedotcom」を使用したSalesforce REST APIの実行方法については、以下をご参照下さい。
http://qiita.com/na0AaooQ/items/1ac53c3899755f935c7b

EC2インスタンス(Amazon Linux)へのRubyインストール

(1) EC2インスタンス(Amazon Linux)にRubyをインストールします。

以下の手順でEC2インスタンス(Amazon Linux)にRubyをインストールします。

http://qiita.com/na0AaooQ/items/d7f814b184c6c1bd9d9c

EC2インスタンス(Amazon Linux)へのrestforce(Gem)インストール

(2) .bashrcにSalesforce REST API接続用の設定を追加します。

[ec2-user@example-ruby-sinatra-server ~]$ cp -p /home/ec2-user/.bashrc /home/ec2-user/.bashrc.ORG
[ec2-user@example-ruby-sinatra-server ~]$ diff /home/ec2-user/.bashrc /home/ec2-user/.bashrc.ORG
[ec2-user@example-ruby-sinatra-server ~]$ 
[ec2-user@example-ruby-sinatra-server ~]$ vi /home/ec2-user/.bashrc
 (末尾に以下を追加する)

### Sandbox環境へ接続する場合のAPIエンドポイント
##export DATABASEDOTCOM_HOST="test.salesforce.com"
### 本番環境へ接続する場合のAPIエンドポイント
export DATABASEDOTCOM_HOST="login.salesforce.com"

export DATABASEDOTCOM_CLIENT_ID="前述の「コンシューマ鍵」(OAuthコンシューマキー)を記載します。"
export DATABASEDOTCOM_CLIENT_SECRET="前述の「コンシューマの秘密」(OAuthコンシューマシークレット)を記載します。"
export DATABASEDOTCOM_CLIENT_USERNAME="salesforce_api_testuser@**********.salesforce.example.com"
export DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD="APIを有効化しているSalesforceユーザアカウントのパスワードを記載します。"

(3) .bashrcに追加した環境変数を読み込みます。

[ec2-user@example-ruby-sinatra-server ~]$ source /home/ec2-user/.bashrc
[ec2-user@example-ruby-sinatra-server ~]$ 

(4) EC2インスタンス(Amazon Linux)に/home/ec2-user/select_salesforce_restforce_api_testディレクトリを作成し、restforce(Gem)をインストールします。

今回の例では、レコード追加とレコード表示プログラムを各ディレクトリに作成していく事にします。

プログラム内容 作成するディレクトリ名
カスタムオブジェクトにレコードを追加するプログラム /home/ec2-user/insert_salesforce_restforce_api_test
カスタムオブジェクトのレコードを表示するプログラム /home/ec2-user/select_salesforce_restforce_api_test
[ec2-user@example-ruby-sinatra-server ~]$ hostname
example-ruby-sinatra-server
[ec2-user@example-ruby-sinatra-server ~]$ id
uid=500(ec2-user) gid=500(ec2-user) groups=500(ec2-user),10(wheel)
[ec2-user@example-ruby-sinatra-server ~]$ mkdir /home/ec2-user/select_salesforce_restforce_api_test
[ec2-user@example-ruby-sinatra-server ~]$ cd /home/ec2-user/select_salesforce_restforce_api_test
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ ls -lrta /home/ec2-user/select_salesforce_restforce_api_test/
合計 8
drwx------ 8 ec2-user ec2-user 4096  3月 11 13:02 ..
drwxrwxr-x 2 ec2-user ec2-user 4096  3月 11 13:02 .
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ 

Gemfileを作成します。

[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ pwd
/home/ec2-user/select_salesforce_restforce_api_test
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ bundle init
Writing new Gemfile to /home/ec2-user/select_salesforce_restforce_api_test/Gemfile
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ 
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ ls -lrta /home/ec2-user/select_salesforce_restforce_api_test/
合計 12
drwx------ 8 ec2-user ec2-user 4096  3月 11 13:02 ..
-rw-r--r-- 1 ec2-user ec2-user   75  3月 11 13:03 Gemfile
drwxrwxr-x 2 ec2-user ec2-user 4096  3月 11 13:03 .
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ 

念の為、作業開始前のGemfileをバックアップしておきます。

[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ cp -p /home/ec2-user/select_salesforce_restforce_api_test/Gemfile /home/ec2-user/select_salesforce_restforce_api_test/Gemfile.ORG
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ diff /home/ec2-user/select_salesforce_restforce_api_test/Gemfile /home/ec2-user/select_salesforce_restforce_api_test/Gemfile.ORG
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ 

[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ cat /home/ec2-user/select_salesforce_restforce_api_test/Gemfile
# frozen_string_literal: true
source "https://rubygems.org"

# gem "rails"
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ 

Gemfileにrestforce ( https://github.com/ejholmes/restforce )を追記します。

[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ echo 'gem "restforce"' >> /home/ec2-user/select_salesforce_restforce_api_test/Gemfile
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ 
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ cat /home/ec2-user/select_salesforce_restforce_api_test/Gemfile
# frozen_string_literal: true
source "https://rubygems.org"

# gem "rails"
gem "restforce"
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ 
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ diff /home/ec2-user/select_salesforce_restforce_api_test/Gemfile /home/ec2-user/select_salesforce_restforce_api_test/Gemfile.ORG
5d4
< gem "restforce"
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ 

restforce(Gem)がまだインストールされていない事を確認します。

[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ pwd
/home/ec2-user/select_salesforce_restforce_api_test
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ 
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ bundle list
Could not find gem 'restforce' in any of the gem sources listed in your Gemfile or available on this machine.
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ 

restforce(Gem)をインストールします。

2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ pwd
/home/ec2-user/select_salesforce_restforce_api_test
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ ls -lrta /home/ec2-user/select_salesforce_restforce_api_test/
合計 16
drwx------ 8 ec2-user ec2-user 4096  3月 11 13:02 ..
-rw-r--r-- 1 ec2-user ec2-user   75  3月 11 13:03 Gemfile.ORG
drwxrwxr-x 2 ec2-user ec2-user 4096  3月 11 13:06 .
-rw-r--r-- 1 ec2-user ec2-user   91  3月 11 13:06 Gemfile
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ 
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/.........
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/.
Resolving dependencies...
Installing multipart-post 2.0.0
Installing hashie 3.5.5
Installing json 2.0.3 with native extensions
Using bundler 1.13.2
Installing faraday 0.9.2
Installing faraday_middleware 0.11.0.1
Installing restforce 2.5.0
Bundle complete! 1 Gemfile dependency, 7 gems now installed.
Bundled gems are installed into ./vendor/bundle.
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ 

restforce(Gem)がインストールされた事を確認します。

[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ pwd
/home/ec2-user/select_salesforce_restforce_api_test
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ 
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ bundle list | grep restforce
  * restforce (2.5.0)
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ 
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ bundle list
Gems included by the bundle:
  * bundler (1.13.2)
  * faraday (0.9.2)
  * faraday_middleware (0.11.0.1)
  * hashie (3.5.5)
  * json (2.0.3)
  * multipart-post (2.0.0)
  * restforce (2.5.0)
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ 
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ ls -lrta /home/ec2-user/select_salesforce_restforce_api_test/
合計 28
drwx------ 8 ec2-user ec2-user 4096  3月 11 13:02 ..
-rw-r--r-- 1 ec2-user ec2-user   75  3月 11 13:03 Gemfile.ORG
-rw-r--r-- 1 ec2-user ec2-user   91  3月 11 13:06 Gemfile
drwxrwxr-x 2 ec2-user ec2-user 4096  3月 11 13:08 .bundle
drwxrwxr-x 3 ec2-user ec2-user 4096  3月 11 13:08 vendor
-rw-rw-r-- 1 ec2-user ec2-user  433  3月 11 13:08 Gemfile.lock
drwxrwxr-x 4 ec2-user ec2-user 4096  3月 11 13:08 .
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ 

(5) EC2インスタンス(Amazon Linux)に/home/ec2-user/insert_salesforce_restforce_api_testディレクトリを作成し、restforce(Gem)をインストールします。

[ec2-user@example-ruby-sinatra-server ~]$ hostname
example-ruby-sinatra-server
[ec2-user@example-ruby-sinatra-server ~]$ mkdir /home/ec2-user/insert_salesforce_restforce_api_test
[ec2-user@example-ruby-sinatra-server ~]$ cd /home/ec2-user/insert_salesforce_restforce_api_test
[ec2-user@example-ruby-sinatra-server insert_salesforce_restforce_api_test]$ pwd
/home/ec2-user/insert_salesforce_restforce_api_test
[ec2-user@example-ruby-sinatra-server insert_salesforce_restforce_api_test]$ ls -lrta /home/ec2-user/insert_salesforce_restforce_api_test
合計 8
drwx------ 9 ec2-user ec2-user 4096  3月 11 13:13 ..
drwxrwxr-x 2 ec2-user ec2-user 4096  3月 11 13:13 .
[ec2-user@example-ruby-sinatra-server insert_salesforce_restforce_api_test]$ 

前述の手順(4)を参考にして、restforce(Gem)をインストールします。

[ec2-user@example-ruby-sinatra-server insert_salesforce_restforce_api_test]$ ls -lrta /home/ec2-user/insert_salesforce_restforce_api_test
合計 28
drwx------ 9 ec2-user ec2-user 4096  3月 11 13:13 ..
-rw-r--r-- 1 ec2-user ec2-user   75  3月 11 13:14 Gemfile.ORG
-rw-r--r-- 1 ec2-user ec2-user   91  3月 11 13:15 Gemfile
drwxrwxr-x 2 ec2-user ec2-user 4096  3月 11 13:15 .bundle
drwxrwxr-x 3 ec2-user ec2-user 4096  3月 11 13:15 vendor
-rw-rw-r-- 1 ec2-user ec2-user  433  3月 11 13:15 Gemfile.lock
drwxrwxr-x 4 ec2-user ec2-user 4096  3月 11 13:15 .
[ec2-user@example-ruby-sinatra-server insert_salesforce_restforce_api_test]$ 
[ec2-user@example-ruby-sinatra-server insert_salesforce_restforce_api_test]$ bundle list | grep restforce
  * restforce (2.5.0)
[ec2-user@example-ruby-sinatra-server insert_salesforce_restforce_api_test]$ 
[ec2-user@example-ruby-sinatra-server insert_salesforce_restforce_api_test]$ bundle list
Gems included by the bundle:
  * bundler (1.13.2)
  * faraday (0.9.2)
  * faraday_middleware (0.11.0.1)
  * hashie (3.5.5)
  * json (2.0.3)
  * multipart-post (2.0.0)
  * restforce (2.5.0)
[ec2-user@example-ruby-sinatra-server insert_salesforce_restforce_api_test]$ 

RubyからSalesforce REST APIを実行してSalesforceカスタムオブジェクトのレコードを表示する

Rubyからrestforce(Gem)経由でSalesforce REST APIを呼び出し、Salesforceカスタムオブジェクトのレコードを表示します。

Salesforceカスタムオブジェクト「テストオブジェクト」(例としてオブジェクト名が QuickStart__c であるとします)のレコードを表示するRubyプログラムを作成します。

SOQL(Salesforce Object Query Language)のWHERE句により、以下の条件に一致するレコードのみ表示しています。

 [WHERE句の条件]
  本日登録したレコード ( create_date__c >= TODAY )

SOQLの日付形式と日付リテラルの詳細については Force.com SOQL および SOSL リファレンス をご参照下さい。

これを実行すると、Salesforceカスタムオブジェクトに登録されているレコードを表示出来ます。

[ec2-user@example-ruby-sinatra-server ~]$ cd /home/ec2-user/select_salesforce_restforce_api_test/
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ pwd
/home/ec2-user/select_salesforce_restforce_api_test
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ ls -lrta /home/ec2-user/select_salesforce_restforce_api_test/
合計 32
-rw-r--r-- 1 ec2-user ec2-user   75  3月 11 13:03 Gemfile.ORG
-rw-r--r-- 1 ec2-user ec2-user   91  3月 11 13:06 Gemfile
drwxrwxr-x 2 ec2-user ec2-user 4096  3月 11 13:08 .bundle
drwxrwxr-x 3 ec2-user ec2-user 4096  3月 11 13:08 vendor
-rw-rw-r-- 1 ec2-user ec2-user  433  3月 11 13:08 Gemfile.lock
drwx------ 9 ec2-user ec2-user 4096  3月 11 13:24 ..
drwxrwxr-x 4 ec2-user ec2-user 4096  3月 11 13:24 .
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ 
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ vi /home/ec2-user/select_salesforce_restforce_api_test/select_salesforce_api_test.rb
/home/ec2-user/select_salesforce_restforce_api_test/select_salesforce_api_test.rb
#!/bin/env ruby
#
require 'bundler/setup'
require 'restforce'

# Salesforce接続用インスタンス作成とSalesforce API認証
client = Restforce.new(
     host: ENV['DATABASEDOTCOM_HOST'],
     username: ENV['DATABASEDOTCOM_CLIENT_USERNAME'],
     password: ENV['DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD'],
     client_id: ENV['DATABASEDOTCOM_CLIENT_ID'],
     client_secret: ENV['DATABASEDOTCOM_CLIENT_SECRET']
)

# Salesforceカスタムオブジェクトに登録されているレコード一覧を表示
client.query("SELECT user_name__c, user_email__c, create_date__c FROM QuickStart__c WHERE create_date__c >= TODAY").each do|record|
  p "#{record.user_name__c} : #{record.user_email__c} #{record.create_date__c}"
end

Rubyプログラムを実行すると、Salesforceカスタムオブジェクトに登録されているレコードを表示出来ます。

[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ pwd
/home/ec2-user/select_salesforce_restforce_api_test
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ 
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ ruby /home/ec2-user/select_salesforce_restforce_api_test/select_salesforce_api_test.rb
"testname_Ruby_20170311_133426 : testname_Ruby_20170311_133426@hoge.example.com 2017-03-11"
"testname_Ruby_20170311_134741 : testname_Ruby_20170311_134741@hoge.example.com 2017-03-11"
"testname_Node_20170311_114548 : testname_Node_20170311_114548@hoge.example.com 2017-03-11"
"testname_Node_20170311_122544 : testname_Node_20170311_122544@hoge.example.com 2017-03-11"
"testname_Ruby_20170311_114515 : testname_Ruby_20170311_114515@hoge.example.com 2017-03-11"
"testname_Node_20170311_122603 : testname_Node_20170311_122603@hoge.example.com 2017-03-11"
"testname_Ruby_20170311_114654 : testname_Ruby_20170311_114654@hoge.example.com 2017-03-11"
"testname_Node_20170311_121201 : testname_Node_20170311_121201@hoge.example.com 2017-03-11"
"testname_Ruby_20170311_134744 : testname_Ruby_20170311_134744@hoge.example.com 2017-03-11"
"testname_Node_20170311_123050 : testname_Node_20170311_123050@hoge.example.com 2017-03-11"
"testname_Ruby_20170311_114637 : testname_Ruby_20170311_114637@hoge.example.com 2017-03-11"
"testname_Ruby120170311_134632 : testname_Ruby120170311_134632@hoge.example.com 2017-03-11"
"testname_Ruby1_20170311_134643 : testname_Ruby1_20170311_134643@hoge.example.com 2017-03-11"
"testname_Node_20170311_114546 : testname_Node_20170311_114546@hoge.example.com 2017-03-11"
"testname_Node_20170311_122616 : testname_Node_20170311_122616@hoge.example.com 2017-03-11"
[ec2-user@example-ruby-sinatra-server select_salesforce_restforce_api_test]$ 

RubyからSalesforce REST APIを実行してSalesforceカスタムオブジェクトにレコードを追加する

Rubyからrestforce(Gem)経由でSalesforce REST APIを呼び出し、Salesforceカスタムオブジェクトにレコードを追加します。

Salesforceカスタムオブジェクトへのレコード追加後、合わせてSOQL(Salesforce Object Query Language)のWHERE句により、以下の条件にANDで一致するレコードのみ表示しています。

 [WHERE句の条件1]
  Salesforceカスタムオブジェクトのuser_email_c項目に’Ruby’という文字列が含まれる ( useremail__c LIKE ‘%Ruby%’ )

   AND
 [WHERE句の条件2]
  本日登録したレコード ( create_date__c >= TODAY )

Salesforceカスタムオブジェクト「テストオブジェクト」(例としてオブジェクト名が QuickStart__c であるとします)にレコードを追加するRubyプログラムを作成します。

[ec2-user@example-ruby-sinatra-server ~]$ cd /home/ec2-user/insert_salesforce_restforce_api_test
[ec2-user@example-ruby-sinatra-server insert_salesforce_restforce_api_test]$ 

[ec2-user@example-ruby-sinatra-server insert_salesforce_restforce_api_test]$ vi /home/ec2-user/insert_salesforce_restforce_api_test/insert_salesforce_api_test.rb
/home/ec2-user/insert_salesforce_restforce_api_test/insert_salesforce_api_test.rb
#!/bin/env ruby
#
require 'bundler/setup'
require 'restforce'
require 'date'

# Salesforce接続用インスタンス作成とSalesforce API認証
client = Restforce.new(
     host: ENV['DATABASEDOTCOM_HOST'],
     username: ENV['DATABASEDOTCOM_CLIENT_USERNAME'],
     password: ENV['DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD'],
     client_id: ENV['DATABASEDOTCOM_CLIENT_ID'],
     client_secret: ENV['DATABASEDOTCOM_CLIENT_SECRET']
)

now = Time.now
create_date = now.strftime("%Y-%m-%d")
insert_time = now.strftime("%Y%m%d_%H%M%S")
insert_name = "testname_Ruby_" + insert_time
insert_email = insert_name + "@hoge.example.com"

# Salesforceカスタムオブジェクトにレコードを登録する
client.create(
  'QuickStart__c',
  user_name__c: insert_name,
  user_email__c: insert_email,
  create_date__c: create_date
)

# Salesforceカスタムオブジェクトに登録されているレコード一覧を表示
client.query("SELECT user_name__c, user_email__c, create_date__c FROM QuickStart__c WHERE user_email__c LIKE '%Ruby%' AND create_date__c >= TODAY").each do|record|
  p "#{record.user_name__c} : #{record.user_email__c} #{record.create_date__c}"
end

これを実行すると、Salesforceカスタムオブジェクトへレコードを追加出来ます。

[ec2-user@example-ruby-sinatra-server ~]$ cd /home/ec2-user/insert_salesforce_restforce_api_test/
[ec2-user@example-ruby-sinatra-server insert_salesforce_restforce_api_test]$ pwd
/home/ec2-user/insert_salesforce_restforce_api_test
[ec2-user@example-ruby-sinatra-server insert_salesforce_restforce_api_test]$ 
[ec2-user@example-ruby-sinatra-server insert_salesforce_restforce_api_test]$ ruby /home/ec2-user/insert_salesforce_restforce_api_test/insert_salesforce_api_test.rb
"testname_Ruby_20170311_133426 : testname_Ruby_20170311_133426@hoge.example.com 2017-03-11"
"testname_Ruby_20170311_134741 : testname_Ruby_20170311_134741@hoge.example.com 2017-03-11"
"testname_Ruby_20170311_114515 : testname_Ruby_20170311_114515@hoge.example.com 2017-03-11"
"testname_Ruby_20170311_114654 : testname_Ruby_20170311_114654@hoge.example.com 2017-03-11"
"testname_Ruby_20170311_134744 : testname_Ruby_20170311_134744@hoge.example.com 2017-03-11"
"testname_Ruby_20170311_114637 : testname_Ruby_20170311_114637@hoge.example.com 2017-03-11"
"testname_Ruby120170311_134632 : testname_Ruby120170311_134632@hoge.example.com 2017-03-11"
"testname_Ruby1_20170311_134643 : testname_Ruby1_20170311_134643@hoge.example.com 2017-03-11"
"testname_Ruby_20170311_135450 : testname_Ruby_20170311_135450@hoge.example.com 2017-03-11"
[ec2-user@example-ruby-sinatra-server insert_salesforce_restforce_api_test]$ 

Salesforceカスタムオブジェクトに追加されたレコード

前述のRubyプログラムを実行する事で、Salesforceカスタムオブジェクト(QuickStart__c = テストオブジェクト)に以下のようにレコードが追加されました。

スクリーンショット 2017-03-11 13.57.52.png

スクリーンショット 2017-03-11 13.58.13.png

スクリーンショット 2017-03-11 13.58.20.png


以上になります。

続きを読む

AWS EC2にApache2.4, PHP7環境を構築するメモ

yum更新
$ sudo yum -y update
Apache2.4インストール
$ sudo yum -y install httpd24
PHP7.0インストール
$ sudo yum -y install php70 php70-mbstring php70-pdo
PHP7.0利用可能パッケージ確認(必要に応じて)
$ sudo yum list available | grep php70
インストールモジュールの確認
$ sudo yum list installed | grep httpd24
$ sudo yum list installed | grep php70
php.ini編集
$ sudo vi /etc/php.ini
httpd起動設定
$ sudo chkconfig httpd on
$ sudo chkconfig --list httpd
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off
httpd.conf編集
$ sudo vi /etc/httpd/conf/httpd.conf
httpd.conf シンタックスチェック&起動
$ sudo /etc/init.d/httpd configtest
Syntax OK
$ sudo /etc/init.d/httpd start
Starting httpd:                                            [  OK  ]
その他参考ページ

続きを読む

Linux リモートユーザー追加の手順メモ

Amazon Linux にユーザーを追加したときのメモ

サーバー側作業

rootユーザーでユーザー追加

# useradd hogeuser

新規追加したユーザになり設定

# su - hogeuser
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh

# 鍵の作成
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hogeuser/.ssh/id_rsa): (Enterで次へ)
Enter passphrase (empty for no passphrase): (パスフレーズ入力)
Enter same passphrase again: (パスフレーズ再入力)
Your identification has been saved in /home/hogeuser/.ssh/id_rsa.
Your public key has been saved in /home/hogeuser/.ssh/id_rsa.pub.

$ cd ~/.ssh
$ chmod 600 id_rsa.pub
$ mv id_rsa.pub authorized_keys
  • パスフレーズ無しでログインしたい場合はパスフレーズ入力は Enter のみ

クライアント作業

接続元のクライアントPCに秘密鍵をもっていってログインする準備

  • サーバーで作った秘密鍵(/home/hogeuser/.ssh/id_rsa)を接続元のクライアントPCに持って行く( 例:himitsu-hogeuser.pemとして保存する)
  • 保存した秘密鍵のパーミッションを変更する。
chmod 600 himitsu-hogeuser.pem

ログインしてみる

ssh -l hogeuser -i himitsu-hogeuser.pem (ログインしたいサーバーホスト or IPアドレス)
  • パスフレーズを入力した場合は、パスワードプロンプトが表示されるので鍵を作成する時に登録した
    パスフレーズを入力すればログインできる。
    # 作成したユーザーがsudoユーザーとする
  • サーバー側にてrootユーザで作業
  • (例)以下の様な /etc/sudoers.d/hogeuserファイルをつくる
hogeuser ALL = NOPASSWD: ALL
  • ユーザー名を間違わないように注意!
  • /etc/sudoers.d/hogeuser のパーミッション/オーナー設定
chmod 440 /etc/sudoers.d/hogeuser
chown root:root /etc/sudoers.d/hogeuser
  • 以上です。

続きを読む

[JAWS-UG 磐田] EC2サーバの作成

◆[JAWS-UG 磐田] ハンズオンの補足資料 EC2編 #3

EC2サーバを作成します。

◆コンソールを使用してEC2サーバを作成するには

1.Amazon EC2コンソールを開きます。
 ※リンク先をクリックすると、東京リージョンのコンソールに接続します。


2.ナビゲーションペインで[インスタンス]をクリックします。

image.png


3.[新しいインスタンスの作成]をクリックします。

image.png


4.インスタンス作成ウイザードのステップ1で、[Amazon Linux AMI xxx]を選択します。

image.png


5.ステップ2はデフォルトのまま、[次の手順:インスタンスの詳細の手順]をクリックします。

image.png

image.png
 ※ブラウザ画面の右下にあります。


6.ステップ3の[IAMロール]で作成したロールを選択します。

image.png


7.[高度な詳細]をクリックして、ユーザーデータを設定します。
 ※設定内容は、ハンズオン資料を参照願います。

image.png


8.[次の手順:ストレージの追加]をクリックします。

image.png
 ※ブラウザ画面の右下にあります。


9.ステップ4はデフォルトのまま、[次の手順:Add Tags]をクリックします。

image.png

image.png
 ※ブラウザ画面の右下にあります。


10.ステップ5で[値]にNameキーの値を入力して、[次の手順:セキュリティグループの設定]をクリックします。

image.png

image.png
 ※ブラウザ画面の右下にあります。


11.ステップ6で[セキュリティグループの割り当て]で既存のセキュリティグループを選択後、作成したセキュリティグループをチェックして、[確認と作成]をクリックします。

image.png

image.png
 ※ブラウザ画面の右下にあります。


12.ステップ7で内容を確認後、[作成]をクリックします。

image.png

image.png
 ※ブラウザ画面の右下にあります。


13.キーペアの設定画面で、[既存のキーペアの選択]=>作成したキーペアを選択、チェックボックスをチェックし、[インスタンスの作成]をクリックします。

image.png

・作成に成功すると下記画面を表示します。
 ※EC2サーバ作成に数分程度かかります。
image.png


※公式マニュアルから抜粋
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/EC2_GetStarted.html

続きを読む