LoginSignup
0

More than 3 years have passed since last update.

「COBOLをAWS上のマイクロサービスとして使ってみる」の環境構築

Last updated at Posted at 2020-03-16

開発環境構築

今回チームOSSコンソーシアムで作成したものはすべて以下のイメージにまとめています。
こちらからインスタンスを起動してください。
AMI:ami-0c23b781d007d2085

image.png

内容物

インスタンスを立ち上げると、カレントディレクトリに以下の成果物が配置してあります。
※lambda上でいろいろなライブラリを動かすため、かなり多くのファイルを含んでいます。
 これらの理由、設置方法などについては別の機会で説明しますので、本稿では省略します。

演算処理プログラム生成.xlsm

これは以下パスにあります。

/home/ec2-user/sample/演算処理プログラム生成.xlsm

今回のサンプルで作成するファイルレイアウトおよび集計処理が記述済みになっていますので、参考にしてください。
また、残念ながらxlsxマクロのためLinux上では動作しませんので、ローカルにダウンロードしてご利用ください。

perl版lambdaコード

これはEXCELtoTSV変換プログラムを実行するlambdaコード群になります。

以下フォルダに含まれています。

/home/ec2-user/perl

主な内容は以下になります。

  • bootstrap

    • lambdaで最初に呼ばれるスクリプトです。リクエストを受け取ります。
  • run_perl.sh

    • 実際にperlプログラムを呼び出すスクリプトです。bootstrapから呼ばれます。
  • xlsx2text.pl

    • EXCELtoTSV変換プログラムの本体です。

cobol版lambdaコード

これはCOBOLの集計プログラムを実行するlambdaコード群になります。

以下フォルダに含まれています。

/home/ec2-user/cobol

主な内容は以下になります。

  • bootstrap

    • lambdaで最初に呼ばれるスクリプトです。リクエストを受け取ります。
  • run_cobol.sh

    • 実際にCOBOLプログラムを呼び出すスクリプトです。bootstrapから呼ばれます。
  • TEST001.cbl

    • 演算処理プログラム生成によって作成されたCOBOLプログラムソースです。
  • compile.TEST001.sh

    • TEST001をコンパイルするためのスクリプトです。
  • TEST001.so

    • コンパイルされたCOBOLプログラムの実行ファイルです。

動作確認用サンプル

実際に動作確認をするための、xlsxファイルとs3操作用のスクリプトです
以下フォルダに含まれています。

/home/ec2-user/sample
  • upload-s3.sh

    • S3のinputフォルダにファイルをアップロードするスクリプトです。アップロードするxlsxファイル名を引数に与えてください。
  • list-s3.sh

    • S3のファイルをすべて表示するスクリプトです。
  • download-s3.sh

    • S3のoutputフォルダに生成されたファイルをダウンロードするスクリプトです。アップロードしたxlsxファイル名を引数に与えてください。
  • koukin_sample.xlsx

    • 東京都公金管理局の公金支出情報(一般会計・特別会計)を一部抜粋したファイルです。

AWS側構築

続いてAWS上の各種サービスの設定を行っていきます。

S3にバケットを作成

ファイルトリガー的に使うので、S3にバケットを作ります。
バケット名は適当につけてください。
パーミッションの設定とかは標準のままでOKです。
今回はn-isaka.cobolhack01としてます。
※バケット名はリージョンで一意になるので、自分のIDとか適宜利用してください。

image.png

lambda関数を作る

中身は置いておいてとりあえずLambda関数だけ作っておきます。
関数は以下2つ作ります

  • cobolhack-perl
    • EXCELからTSVに変換するperlを実行するための関数
  • cobolhack-cobol
    • COBOL実行用の関数

perl側

  • 一から作成
  • 関数名:cobolhack-perl
  • ランタイム:ユーザー独自のブートストラップを提供する
  • アクセス制限はデフォルトのまま

image.png

まっさらな状態のlambda関数が出来上がります。

image.png

ページ下部に移動し、ロールの表示からロールの権限の修正を行います。

image.png

ポリシーをアタッチを選択します。

image.png

AWSが提供しているポリシーから、S3全操作の許可を選択します。

image.png

以上でポリシーの修正は完了です。

image.png

トリガーを追加していきます。

image.png

inputフォルダに***.xlsxがアップロードされたら動き出すように、以下の設定を行います。

  • バケット:n-isaka.cobolhack01 (自分で作成したバケットを選択します)
  • すべてのオブジェクト作成イベント
  • プレフィックス:input/
  • サフィックス:.xlsx
  • トリガーの有効化:有効

image.png

再びページ下部の基本設定を修正します。
xlsxの処理は多少時間がかかるため、タイムアウト時間を延ばします。
また、xlsx処理用のモジュールでメモリを必要とするため、そちらも増やします。

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

image.png

perl版のlambda構築は完了です。

image.png

COBOL版

基本的にはperl版と同様に作成します。
S3へのアクセス権限も、perl版と同様に付与します。
※lambdaで別のロールを使いまわすと、ログが正常にできなくなる恐れがあります。
 知識のある方以外は、COBOL版で新規にロールを作るようにしましょう。

トリガーの設定を行っていきます。
先ほどのperl関数でconvertフォルダに***.tsvが作成されたら実行されるよう、以下のようなトリガーを設定します。

  • バケット:n-isaka.cobolhack01
  • すべてのオブジェクト作成イベント
  • プレフィックス:convert/
  • サフィックス:.tsv
  • トリガーの有効化:有効

image.png

基本設定も同様に変更していきます。
こちらはメモリを増やさなくてもサンプルの動作は可能です。

  • メモリ:128
  • タイムアウト:5分

image.png

アクセス用のキーを作る

全部ブラウザのGUIから作業するのは非常に面倒なため、コマンドラインからいろいろやるために、Identity and Access Management (IAM)でキーを作ります。
image.png

インスタンス上での操作

ここからは、AMIから起動したインスタンスにログインして作業を行います。

awsのCLIを設定する

ログイン後、aws configureで設定します。
Access KeyとSecret Keyは先ほど作成したものを入力します。
また、regionはap-northeast-1(東京)を指定します。

[ec2-user@ip-172-31-41-54 ~]$ aws configure
AWS Access Key ID [None]: ****
AWS Secret Access Key [None]: **** 
Default region name [None]: ap-northeast-1
Default output format [None]: 

スクリプトの修正

以下のスクリプトのbucket名の部分を、自分で作成したものに変更します。
これらはAWSCLIからS3へのファイルアップロードや、lambdaへの関数登録を行うスクリプトです。

~/mkfunction-cobol.sh
~/mkfunction-perl.sh
~/sample/upload-s3.sh 
~/sample/upload-s3.sh 
~/sample/upload-s3.sh 

image.png

スクリプトでlambdaへのコード登録

以下2つのスクリプトを実行することで、それぞれperlとCOBOLのlambda関数にコードを登録します。
COBOLプログラムはサンプルとして生成したTEST001.cblが登録されます。

[ec2-user@ip-172-31-41-54 ~]$ ./mkfunction-perl.sh 
[ec2-user@ip-172-31-41-54 ~]$ ./mkfunction-cobol.sh 

エラーなく終われば、関数にコードが登録されています。

※作成時と違い、大きなコードを登録したため、インライン編集が使用不可になっていることが確認できます。

image.png

動かしてみる

sampleフォルダにS3操作用のスクリプトと、サンプルのTEST001で集計するxlsxファイルが配置してあります。
※元データでは処理に時間がかかるため、修正対象のxlsxのデータは生データではなく、1000行程度に減らしています。

[ec2-user@ip-172-31-41-54 ~]$ cd sample/
[ec2-user@ip-172-31-41-54 sample]$ ./upload-s3.sh koukin_sample.xlsx 
{
    "ETag": "\"1197656ab4046b6e9cd5a74b8a325757\""
}

しばらく待つと、S3にファイルが生成されていきます。

image.png

image.png

image.png

image.png

AWSCLI上からでは、インスタンス上で以下のように確認できます。

[ec2-user@ip-172-31-41-54 sample]$ ./list-s3.sh 
{
    "Contents": [
--- 中略 ---
        {
            "LastModified": "2020-03-13T07:24:05.000Z", 
            "ETag": "\"26a07151da703fdd80ab9d2c4593d1f3\"", 
            "StorageClass": "STANDARD", 
            "Key": "output/koukin_sample.xlsx.tsv.json", 
            "Owner": {
                "DisplayName": "n-isaka", 
                "ID": "6f0961303db4b7797faa7ef4c9b3110c0ac647fa4a6c80e251ecb8a9824f22b8"
            }, 
            "Size": 191
        }
    ]
}

結果を見てみる

集計結果のJSONは以下のようになっています。

koukin_sample.xlsx.tsv.json
[{"トナー":24603,"旅費":16045227,"灯油":0,"キーボード":0,"オリンピック":0,"公園":0,"タクシー":3684483,"奨励金":0,"手当":0,"観光":0,"補助金":269126906,"報償":4389835,"漁業":0,"働き方改革":0}] 
koukin_sample.xlsx.tsv.json(成形)
[
    {
        "トナー": 24603,
        "旅費": 16045227,
        "灯油": 0,
        "キーボード": 0,
        "オリンピック": 0,
        "公園": 0,
        "タクシー": 3684483,
        "奨励金": 0,
        "手当": 0,
        "観光": 0,
        "補助金": 269126906,
        "報償": 4389835,
        "漁業": 0,
        "働き方改革": 0
    }
]

モニタリング画面では成功が増えていることがわかります。

image.png

ログでも実行が確認できます。

image.png

AWSCLIで、結果をダウンロードして表示すると、以下のように確認できます。

[ec2-user@ip-172-31-41-54 sample]$ ./download-s3.sh koukin_sample.xlsx 
{
    "AcceptRanges": "bytes", 
    "ContentType": "binary/octet-stream", 
    "LastModified": "Fri, 13 Mar 2020 07:24:05 GMT", 
    "ContentLength": 191, 
    "ETag": "\"26a07151da703fdd80ab9d2c4593d1f3\"", 
    "Metadata": {}
}
[ec2-user@ip-172-31-41-54 sample]$ ls
download-s3.sh  koukin_sample.xlsx  koukin_sample.xlsx.tsv.json  list-s3.sh  upload-s3.sh  演算処理プログラム生成.xlsm
[ec2-user@ip-172-31-41-54 sample]$ jq < koukin_sample.xlsx.tsv.json 
[
  {
    "�g�i�[": 24603,
    "����": 0,
    "�L�[�{�[�h": 0,
    "�I�����s�b�N": 0,
    "�^�N�V�[": 3684483,
    "�����": 0,
    "�蓖": 0,
    "�ό�": 0,
    "�⏕��": 269126906,
    "��": 4389835,
    "���������v": 0
  }
]

※ファイルはSJISのため、残念ながら文字化けします。
 Linux上でSJISを扱いたい場合は別途設定を行う必要がありますが、ここでは省略します。

なかでやっていること

lamdba上の処理の流れは以下のようになっています。

bootstrapからrun_perl.shrun_cobol.shがよばれる

jqを使ってリクエストのJSONからファイル名を取得

awsのCLIを利用し、s3からファイルを取得

perlまたはCOBOLが実行される

出来上がったファイルをawsのCLIでs3にアップ

終わり

以上が、成果物を実行する環境構築になります。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0