CodeBuildのbuildspec.ymlを別の名前にしたいときの手順

TL;DR

CodeBuildを使っていると、ビルドの成果物が違うからビルドスペックのファイル(buildspec.ymlというもの)の単位で成果物を分けたいということがあります。調べてみると、ドキュメントに1にやり方が載っていたのでやってみました。方向性としては、AWS CLIで変更操作をする手順です。2

(2017-10-13 22:00 追記。 今さっき見てみたら、Consoleでファイル名を指定できるようになっていました。ちょろっと直すならConsoleでいいですね。)

概要

nantoka-buildというプロジェクトのビルドスペックのファイルをnantoka-kantoka-buildspec.ymlに変えたいとします。windowsの例ですが、mac でも linuxでも概ね同じでしょう。

プロジェクトの名前を確認する

Consoleから確認することもできますが、CLIと同じものが見えているか確認する意味も込めてやってみましょう。

>aws codebuild list-projects
{
    "projects": [
        "nantoka-build",
        "kantoka-build-project",
        "test-test-project"
    ]
}

>

各環境とかリージョンとかで色々あると思いますが、Console 
https://ap-northeast-1.console.aws.amazon.com/codebuild/home?region=ap-northeast-1#/projects
で、見えるプロジェクトとおなじビルドプロジェクトが見えていればOKです。nantoka-build以外のプロジェクトも、存在するなら見えていることでしょう。

プロジェクト名を指定して、プロジェクト構造のJSONファイルを取得する

更新の操作はプロジェクト構造のJSONファイルをアップロードする形になります。アップロードするファイルを作るため、現状のファイルをダウンロードします。

>aws codebuild batch-get-projects --names nantoka-build
{
    "projectsNotFound": [],
    "projects": [
        {
            "name": "nantoka-build",
            "serviceRole": "arn:aws:iam::1234123412341234:role/service-role/nantokarole",
            "tags": [],
            "artifacts": {
                "packaging": "NONE",
                "type": "CODEPIPELINE",
                "name": "nantoka-artifact"
            },
            "lastModified": 1512341234.783,
            "timeoutInMinutes": 60,
            "created": 1512341234.68,
            "environment": {
                "computeType": "BUILD_GENERAL1_SMALL",
                "privilegedMode": false,
                "image": "aws/codebuild/java:openjdk-8",
                "type": "LINUX_CONTAINER",
                "environmentVariables": []
            },
            "source": {
                "type": "CODEPIPELINE"
            },
            "encryptionKey": "arn:aws:kms:ap-northeast-1:1234123412341234:alias/aws/s3",
            "arn": "arn:aws:codebuild:ap-northeast-1:1234123412341234:project/nantokanantoka"
        }
    ]
}

>

(arnなどは内容を適当にいじっています。表示される項目はあなたのプロジェクトの内容と同じはずです。)

プロジェクト構造のJSONファイルを

コマンドプロンプトに主力されたJSONをファイルに落として修正を入れます。

  • JSONのルートの"projects"の配下を取り出す。
  • "buildspec": "nantoka-kantoka-buildspec.yml"という1行を入れる。JSONなのでカンマ忘れずに。
  • "lastModified" "created" "arn" は消す。JSONの構造が違うというエラーになるので。無くても多分実害ないと想像する次第。本当は正しい書き方あると思いますが未確認です。
update.buildproject.json
{
    "name": "nantoka-build",
    "serviceRole": "arn:aws:iam::1234123412341234:role/service-role/nantokarole",
    "tags": [],
    "artifacts": {
        "packaging": "NONE",
        "type": "CODEPIPELINE",
        "name": "nantoka-artifact"
    },
    "timeoutInMinutes": 60,
    "environment": {
        "computeType": "BUILD_GENERAL1_SMALL",
        "privilegedMode": false,
        "image": "aws/codebuild/java:openjdk-8",
        "type": "LINUX_CONTAINER",
        "environmentVariables": []
    },
    "source": {
        "type": "CODEPIPELINE",
        "buildspec": "nantoka-kantoka-buildspec.yml"
    },
    "encryptionKey": "arn:aws:kms:ap-northeast-1:1234123412341234:alias/aws/s3"
}

修正をアップロード

update.buildproject.jsonをカレントディレクトリに置いて、下記コマンドを実行する。

>aws codebuild update-project --cli-input-json file://update.buildproject.json
{
    "project": {
        "name": "nantoka-build",
        "serviceRole": "arn:aws:iam::1234123412341234:role/service-role/nantokarole",
        "tags": [],
        "artifacts": {
            "packaging": "NONE",
            "type": "CODEPIPELINE",
            "name": "nantoka-artifact"
        },
        "timeoutInMinutes": 60,
        "environment": {
            "computeType": "BUILD_GENERAL1_SMALL",
            "privilegedMode": false,
            "image": "aws/codebuild/java:openjdk-8",
            "type": "LINUX_CONTAINER",
            "environmentVariables": []
        },
        "source": {
            "type": "CODEPIPELINE",
            "buildspec": "nantoka-kantoka-buildspec.yml"
        },
        "encryptionKey": "arn:aws:kms:ap-northeast-1:1234123412341234:alias/aws/s3"
    }
}

>

Consoleで確認する。

Consoleからプロジェクトを選択し、プロジェクト詳細 -> ビルド仕様の表示 とクリックして進むと、nantoka-kantoka-buildspec.yml と表示されます。


  1. http://docs.aws.amazon.com/codebuild/latest/userguide/build-spec-ref.html#build-spec-ref-name-storage 今のところ日本語にはなってないようです。 

  2. ぶっちゃけた話、Consoleがすぐにでも対応しそうな気もしますが、今時点での手順を残します。 

続きを読む

AWS→Azure移行 Lambda→Azure Functions編

概要

AWS上に構築されているサーバーレスなAPIをAzure上に移行する機会があったので
移行についてのメモや注意点などのまとめました。

既存AWS環境で使用しているサービスは以下の通り。

  • API環境:Lambda + API Gateway
  • NoSQLDB:DynamoDB
  • ストレージ:S3

移行先のAzure想定環境として使用予定のサービスは以下の通り。

  • API環境:Azure Functions
  • NoSQLDB:Azure Table Storage
  • ストレージ:Azure Storage(BLOB)

前提条件(環境など)

開発環境

  • Windows 10 Pro 64bit 1703
  • node.js 6.11.3 64bit
  • Visual Studio Code 64bit 1.16.1
    • Azure Functions Tools 0.3.1
    • ESLint 1.3.2

Azure Functionsをローカルで開発するためのVisual Studio Code環境は以下のblog記事を参考にしました。
かずきのBlog@hatena:Azure Functions を始めてみました(node.js + VSCode)

その他

  • Azureのアカウントを作成済み
  • Azure Portal で初めての関数を作成するを参照し関数を作っていること。
  • Lambdaの開発言語はNode.js、Azure Functionsも同様にNode.jsを使用する。
    ※今回は移行元がNode.jsのためNode.jsで開発しましたが、新規の場合はC#の方がいいかもしれません。Web上の情報の多さが違います。

LambdaからAzure Functionsにソースを移行するに際して気を付ける点

  • 開発言語を変更しない場合、SDKを使用している箇所以外のソースをそのまま使用可能。
  • AWS SDKを使用している箇所については、Lambdaには無いバインドを使用して変更する箇所と、Lambdaと同様にAzure SDKを使用して変更する箇所があります。
  • DynamoDBではキー項目については自由な項目名に出来るが、Azure Table StorageではRowKeyという項目名固定になるため、その部分は変更する必要があります。
  • context.doneメソッドを呼ぶことで関数が完了したと判断される。呼び出していない場合、タイムアウトとなります。
    ※context.doneメソッドを呼び出した箇所以降に処理が記述されている場合、記述された処理は実行されます。
    そのためエラー処理などで処理を終了する場合はreturnメソッドを呼び出す必要があります。
    メイン処理完了後に非同期で処理を行いたい場合はあえてreturnメソッドを記述しないことも出来ます。

実際に移行してみる

DynamoDBからデータの取得・追加・更新・削除を行うコードを
Azure Table Storageからデータの取得・追加・更新・削除を行うコードに移行します。

データの取得

LambdaではDynamoDBからデータの取得を行う場合、AWS SDKを使用します。
サンプルコード(usersテーブルから指定したuserIdのデータを取得)

index.js
const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient();

exports.handler = (event, context, callback) => {
    let userId = event.userId;

    const params = {
        TableName: 'users',
        FilterExpression : "userId = :val",
        ExpressionAttributeValues : {":val" : userId}
    };

    // 該当するuserIdのデータを取得
    docClient.scan(params, function(err, data) {
        var user = data.Items[0];
        callback(null, user);
    })
};

Azure Functionsでは事前に定義したバインドを元にデータの取得が行えます。

バインド定義は以下の手順で設定します。

関数の一覧から統合を選択
007.png

新しい入力を選択
008.png

Azure Table Storageを選択し、選択ボタンをクリック
009.png

Azure Table Storageの入力バインドの設定画面が表示される。
010.png

設定値の内容は以下の通り。

  • テーブルパラメーター名:プログラムから使用する名称
  • テーブル名:取得するテーブルの名称
  • パーティションキー:レコードのパーティションキー。
  • 行キー:レコードの行キー。
    パーティションキーと行キーの組み合わせでレコードを一意にすることが出来る。
  • 読み込むレコードの最大数:このバインドを使用してデータを読み込んだ場合に一度に読み込める最大レコード数
  • クエリフィルター:パーティションキー、行キーの組み合わせ以外でデータをフィルタリングしたい場合にクエリを設定
  • ストレージアカウント接続:Azure Storageへの接続情報を指定。
    Azure Functions作成時に指定したストレージアカウントを使用する場合はデフォルトで表示されている接続情報どれでもいいです。

パーティションキー、行キー、クエリフィルターは”{}”を使用することで、トリガーパラメータを代入することが出来ます。
HTTPトリガーの場合は、クエリパラメーター、リクエストのBODY内に指定した値のみ使用可能です。
プログラムソース中で代入する値を変更することは出来ません。
またバインドで指定した代入する値がクエリパラメーター、リクエストのBODY内に指定した値に存在しない場合、HTTP500のエラーとなります。

パーティションキー、行キーの設定例

パーティションキー:User
行キー:{userId}

を設定した場合、パーティションキーが”User”、行キーがuserIdというパラメータの値のレコードを1行取得します。
存在しない場合はnullとなります。

クエリパラメーターの設定例

クエリパラメーター:userName eq {paraName}

を設定した場合、userNameというカラムの値がparaNameというパラメータの値と等しいレコードを読み込むレコードの最大数まで配列で取得します。
存在しない場合は0件の配列となります。

パーティションキー、行キー、クエリパラメーターいずれも設定しない場合、指定テーブルのデータを読み込むレコードの最大数まで配列で取得します。

設定したバインド定義については実体はfunction.jsonというファイルに保存されており、画面内の詳細エディタをクリックすることと参照・修正することが出来ます。

入力バインド定義のみを抜粋

function.json
    {
      "type": "table",
      "name": "inUser",
      "tableName": "users",
      "take": 50,
      "connection": "AzureWebJobsStorage",
      "direction": "in",
      "partitionKey": "User",
      "rowKey": "{userId}"
    }

バインド定義を使用してデータを取得するサンプルコードは以下の通りになります。
機能としては本項の最初のサンプルコードと同一です。

index.js
module.exports = function (context, req) {
    var user = context.bindings.inUser;
    context.res = {
        body = user;
    }
    context.done();
};
    var user = context.bindings.inUser;

バインド定義で設定したデータは引数のcontextのbindingsから参照することが出来ます。

データの追加

LambdaではDynamoDBへデータの追加を行う場合、AWS SDKを使用します。
サンプルコード(usersテーブルに値を追加)

index.js
const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient()

exports.handler = (event, context, callback) => {
    // Userテーブルに保存するデータ
    const params = {
        TableName: "users",
        Item: {
            "userId": "User001",
            "createdAt": "2017/10/05 16:52:19",
            "updatedAt": "2017/10/05 16:52:19",
            "userName": "ユーザー001"
        }
    };

    //データの保存処理
    docClient.put(params, function(err, data) {
        callback(null, "OK");
    })
};

Azure Functionsでは事前に定義したバインドを元にデータの追加が行えます。

バインド定義は以下の手順で設定します。

新しい出力を選択
011.png

Azure Table Storageを選択し、選択ボタンをクリック
012.png

Azure Table Storageの出力バインドの設定画面が表示される。
013.png

設定値の内容は以下の通り。

  • テーブルパラメーター名:プログラムから使用する名称
  • テーブル名:データを追加するテーブル名
    ※存在しないテーブル名を設定した場合、新たにテーブルが作られます。
  • ストレージアカウント接続:取得と同様、Azure Storageへの接続情報を指定。

出力バインド定義のみ抜粋

function.json
    {
      "type": "table",
      "name": "outUser",
      "tableName": "users",
      "connection": "AzureWebJobsStorage",
      "direction": "out"
    }

バインド定義を使用してデータを追加するサンプルコードは以下の通りになります。
機能としては本項の最初のサンプルコードと同一です。

index.js
module.exports = function (context, req) {
    context.bindings.users = JSON.stringify({
        PartitionKey: "User",
        RowKey: "User001",
        createdAt: "2017/10/05 16:52:19",
        updatedAt: "2017/10/05 16:52:19",
        userName: "ユーザー001"
    });
    context.done();
};
    context.bindings.outUsers = JSON.stringify({
        PartitionKey: "User",
        RowKey: "User001",
        createdAt: "2017/10/05 16:52:19",
        updatedAt: "2017/10/05 16:52:19",
        userName: "ユーザー001"
    });

バインド定義で設定した項目に追加したい値を設定することにより追加することが出来ます。

    context.done();

実際にDBに更新されるタイミングはcontext.doneメソッドを呼び出したタイミングです。

データの更新

LambdaではDynamoDBへデータの更新を行う場合、AWS SDKを使用します。
サンプルコード(usersテーブルの値を更新)

index.js
const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient();

exports.handler = (event, context, callback) => {
        const params = {
            TableName: 'users',
            Item: {
                "userId": "User001",
                "createdAt": "2017/10/05 16:52:19",
                "updatedAt": "2017/10/05 16:52:19",
                "userName": "ユーザー001"
            }
        };

        docClient.put(params, function(err, data) {
            callback(null, "OK");
        })
};

Azure Functionsでは事前に定義したバインドを元にデータの更新が出来そうなのですが、現状出来ないのでAzure FunctionsもSDKを使用してデータの更新をします。
※更新対象がDocumentDBの場合はバインドを使用してデータの更新が出来るので、今後バージョンアップによりAzure Table Storageでもバインドを使用した更新が出来るようになるかもしれません。

SDKを使用してデータを更新するサンプルコードは以下の通りになります。
機能としては本項の最初のサンプルコードと同一です。

index.js
let azure = require('azure-storage');
let connectionString = process.env.AzureWebJobsStorage;
let tableService = azure.createTableService(connectionString);

module.exports = function (context, event) {
    let outUsers = {
        PartitionKey: "User",
        RowKey: "User001",
        createdAt: "2017/10/05 16:52:19",
        updatedAt: "2017/10/06 09:14:27",
        userName: "ユーザー001修正"
    };

    tableService.replaceEntity('users', outUsers, (error, response) => {
        context.res = {
            body: { updatedAt: formatDate }
        };
        context.done();
    });
};
let azure = require('azure-storage');

外部ライブラリとしてazure-storageを使用しています。

let connectionString = process.env.AzureWebJobsStorage;

Azure Storageへの接続情報を指定しています。
process.env.<アプリケーション設定名>を使用することによりアプリケーション設定の値を取得出来ます。

let tableService = azure.createTableService(connectionString);

取得したAzure Storageへの接続情報を元にTableServiceオブジェクトを作成します。

    tableService.replaceEntity('users', outUsers, (error, response) => {
        context.res = {
            body: { updatedAt: formatDate }
        };
        context.done();
    });

TableServiceオブジェクトのreplaceEntityメソッドを使用してデータの更新を行います。

データの削除

LambdaではDynamoDBへデータの更新を行う場合、AWS SDKを使用します。
サンプルコード(usersテーブルの値を削除)

index.js
const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient();

exports.handler = (event, context, callback) => {
    const params = {
        TableName: 'users',
        Key:{
            "userId": userId
        }
    };

    // ユーザー情報の削除
    docClient.delete(params, function(err, data) {
        callback(null, {});
    });
};

Azure Functionsではバインドを使用した削除は出来ません。
Azure FunctionsもSDKを使用してデータの更新をします。

SDKを使用してデータを更新するサンプルコードは以下の通りになります。
機能としては本項の最初のサンプルコードと同一です。

index.js
let azure = require('azure-storage');
let connectionString = process.env.AzureWebJobsStorage;
let tableService = azure.createTableService(connectionString);

module.exports = function (context, req) {
    let outUser = {
      PartitionKey: "User",
      RowKey: "User001"
    }

    tableService.deleteEntity('users', outUser, (error, response) => {
        context.done();
    });
};
let azure = require('azure-storage');
let connectionString = process.env.AzureWebJobsStorage;
let tableService = azure.createTableService(connectionString);

ライブラリ読み込み、接続情報取得、TableServiceオブジェクト取得については更新と同様です。

    tableService.deleteEntity('users', outUser, (error, response) => {
        context.done();
    });

TableServiceオブジェクトのdeleteEntityメソッドを使用してデータの削除を行います。

まとめ

LambdaからAzure Functionsへの移行は比較的容易に出来ました。
しかしバインド機能が使える処理使えない処理があるので、早く実装されるといいなと思います。

続きを読む

awsでUbuntu, windows 環境構築時のメモ

リンク集ですが・・。

ipv6設定

https://ameblo.jp/hackerbobchan/entry-12243285385.html

ubuntuを立ち上げ、VNCでデスクトップに繋ぐ

http://juncollin.hatenablog.com/entry/2017/02/19/150423
http://dev.classmethod.jp/cloud/aws/vpc-ipv6/

windows構築時エラー

XINPUT1_3.dll がない

http://chimolog.co/2016/08/treeofsavior-xinput1_3.html

続きを読む

AWS Code Commitでgitリポジトリを作る

投稿日:2017-10-04

はじめに

今回gitの環境を自分で初めて構築したのでその備忘録として記録しておきます。(これまではsvnを使用していたり、誰かの作ったgit環境で作業をしたりしていました)

前準備

前提条件とかの確認
この部分で読む意味があるかどうか判断してもらえればありがたい。

やりたいこと

  • AWS Code Commit を使用して git リポジトリの作成
  • ローカルのwindows環境からアクセス

環境

  • Amazon Linux AMI 2016.09-release
  • Windows 8.1 Pro 64bit

前提知識

必要なもの

  • AWSアカウント
  • Windowsマシン(対応するgitがインストールできればOK)

実作業

AWS CodeCommit にアクセス

AWS CodeCommit repository を作成

『リポジトリの作成』ボタンを押してリポジトリ名(100文字以内)を入れれば完了。説明は無くてもいい。
リポジトリ名も説明も後で変更可能。とはいえ、リポジトリ名を変えると色々とメンドクサイので変えない方がよい。

SSH接続

※ root アカウントではSSH接続はできません。
※ IAMUserSSHKeys ポリシー、IAMReadOnlyAccess ポリシー、適切な AWS CodeCommit 管理ポリシーを IAM ユーザーにアタッチ
詳細はこちら

  1. Git (1.7.9 以降)インストール
  2. ssh-keygen を使用してパブリック/プライベートキーペアを作成
  3. SSH パブリックキーを IAM ユーザーにアップロード
  4. SSH 設定ファイル (drive:Users<user-name>.sshconfig) を編集
Host git-codecommit.*.amazonaws.com
  User Your-IAM-SSH-Key-ID-Here
  IdentityFile ~/.ssh/Your-Private-Key-File-Name-Here

5.作業を行うコンピュータにリポジトリのクローンを作成
git clone ssh://git-codecommit.us-east-1.amazonaws.com/v1/repos/<reponame>

最後に

以上でローカルの作業環境からAWSにpushできるようになる
ここで一応費用面についても触れておく

無料範囲

  • 最初の5人のアクティブユーザー(アクセスしないユーザーは関係なし)
  • 無制限のリポジトリ
  • 50 GB のストレージ/月
  • 10,000 回の Git リクエスト/月

追加料金

  • 追加ユーザー1人:1 USD/月(以下の特典が付く)
10 GB のストレージ/月
2000 件の Git リクエスト/月
  • 0.06 USD/GB/月
  • 0.001 USD/Git リクエスト

料金の詳細はこちら

参考リンク

AWS CodeCommit とは
Git をはじめからていねいに
私家版 Git For Windowsのインストール手順
WS CodeCommit 料金

続きを読む

[AWS Directory Service] Microsoft ADのセットアップ手順

AWS Directory Serviceとは

ユーザー、グループ、コンピューター、およびその他のリソースといった組織についての情報を含むディレクトリ機能を提供するマネージド型サービス。

MicrosoftADセットアップ

サービスメニューから[Directory Service]を検索。

AD01.png

今回はMicrosoftADのセットアップなので、[MicrosoftAD]を選択。

AD02.png

ディレクトリDNS:ActiveDirectory名(ex.xxxxx.intra)
VPC:ADを作成するVPCを設定する

AD03.png

確認画面 > MicrosoftADの作成をポチッとすると。

AD04.png

ADの作成が開始されます!

AD05.png

Windowsサーバの登録

構築したwindowsサーバにログインし、まずはネットワークの設定から。
注意点として、windowsサーバとADは同じVPCである必要があります。
コントロールパネルからネットワークの設定へ、DNSサーバのIPを登録します。※ADの設定を行った際に取得したもの。

AD11.png

続いて、コントロールパネル>システムとセキュリティから設定の変更。

AD07.png

コンピュータ名:任意
ドメイン:AD登録を行ったドメイン名

AD08.png

OKすると管理者情報の入力を求められます。

ユーザー名:Admin
パスワード:作成時に設定したパスワード

無事にログインが完了したら再起動を行って設定は完了です。

続きを読む