ボーっとしたい

ボーっとするためにメモします。

node.js+AWS SDKでDynamoDBにデータ挿入

やりたかったこと

Amplifyで画面開発したのだが、デフォルトデータをDynamoDBに挿入しないと動かないので、初期のインストール時にデータをinsertしたかった。

サンプルデータの作成

  • 定型のメッセージをDynamoDBに挿入するときに、dict型でデータを持っておきたかった。これは、テストコード流すためでもある。
  • プロジェクトのフォルダ構造はこんな感じ。sample-dataというフォルダを作ってそこで管理
    f:id:kohira_1980:20211030164631p:plain
    フォルダ構造とサンプルデータ
  • 拡張子は.mjs。こうしないとうまくいかなかった。なぜかは話が深くなるからここでは書かない。以下参照。

blog.jxck.io

  • messageData.mjsの中身はこんな感じ
// messageData
function createMessageData(id, a, message) {
    return { id, a, message};
}

export const messageData = [
    createMessageData(
        "id-a",
        "0",
        "やっほー、ボーっとしたいよ!"
    ),
];

データ挿入スクリプトの作成

  • install.mjsというスクリプトを作ってsrcフォルダ配下に配置した(フォルダ構造は上を参照) -スクリプトの中身はこんな感じ
import {messageData} from './sample-data/messageData.mjs';
import AWS from 'aws-sdk';

const aws_profile = process.argv[2]; //スクリプトの引数にaws configファイルのプロファイル名を渡す
let credentials = new AWS.SharedIniFileCredentials({profile: aws_profile });
AWS.config.credentials = credentials;
AWS.config.update({region: 'ap-northeast-1'});
const ddb = new AWS.DynamoDB({apiVersion: '2012-08-10'});

const message_data_tablename = 'messageData'

//insert message data to DynamoDB
for (let item of messageData) {
    let params = {
        ExpressionAttributeNames: {
            "#a": "a",
            "#message": "message",
        },
        ExpressionAttributeValues: {
            ":a": {
                S: item.a
            },
            ":message": {
                S: item.message
            }
        },
        Key: {
            "id": {
                S: item.id
            }
        },
        ReturnValues: "ALL_NEW",
        TableName: message_data_tablename,
        UpdateExpression: "SET #a = :a, #message = :message
    };
    ddb.updateItem(params, function(err, data) {
        if (err) console.log(err, err.stack); // an error occurred
        else     console.log("master data insert SUCCESS.");           // successful response
    });
}

スクリプトの実行

  • srcフォルダの1つ上のフォルダで以下を実行する
node --experimental-modules --experimental-json-modules ./src/install.mjs {対象のAWSプロファイル名}

困ったところ、感想

  • node.jsコマンド打つ時、moduleとしてjavascriptを読み込めないとか色々あって、苦戦した。mjsとかよくわからん。おじさんはjavacriptの変貌っぷりについていけていない。
  • 実際はamplify でapi作るとapi_idとかがDDBのテーブル名についてきたりするので、DDB名が環境によって変わってきたりする。amplifyのamplify-meta.jsonからとってきたりして今回はしのいだ。

python statsmodelsでロジスティック回帰した

参考文献: - 手を動かしながら学ぶ ビジネスに活かすデータマイニング


動機

  • マーケティングでデータ分析やったことない
  • python でロジスティック回帰どうやるんだっけ(わすれた)
  • 渋谷のデータサイエンティストさんの本読めばわかる

注意点

  • sklearnのロジスティック回帰で目的変数が浮動小数点だとfitできひん
  • statasmodelsでしぶくやるか
  • サンプルデータはここ

コーディング

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

from sklearn.model_selection import train_test_split
import statsmodels.api as sm
import statsmodels.formula.api as smf

%matplotlib inline
sns.set()

df_6_4_1 = pd.read_csv("ch6_4_1.txt",sep="\s+")

X = df_6_4_1[["d11","d12","d13"]]
Y = df_6_4_1[["cvr"]]
X_train, X_test, Y_train, Y_test = train_test_split(X,Y, test_size=0.2,random_state=0)

data = pd.concat([X_train, Y_train], axis=1)
formula = "cvr ~ 1 + d11 + d12 + d13"
link = sm.genmod.families.links.logit

family = sm.families.Binomial(link=link)

mod = smf.glm(formula=formula, data=data, family= family)
result = mod.fit()
print(result.summary())

y_pred = result.predict(X_train)
plt.plot(y_pred,Y_train,'.')

出力

                 Generalized Linear Model Regression Results                  
==============================================================================
Dep. Variable:                    cvr   No. Observations:                   24
Model:                            GLM   Df Residuals:                       20
Model Family:                Binomial   Df Model:                            3
Link Function:                  logit   Scale:                          1.0000
Method:                          IRLS   Log-Likelihood:                -7.0982
Date:                Sat, 30 Oct 2021   Deviance:                       5.4885
Time:                        06:59:20   Pearson chi2:                     5.51
No. Iterations:                     6                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept     -4.9468      5.487     -0.902      0.367     -15.701       5.807
d11            0.0024      0.001      2.513      0.012       0.001       0.004
d12           -0.0005      0.001     -0.767      0.443      -0.002       0.001
d13           -0.0002      0.001     -0.248      0.804      -0.002       0.001
==============================================================================

f:id:kohira_1980:20211030162624p:plain
cvrの実測-予測プロット

感想

  • ちょっとだけ勉強になった気がする

AWS SageMaker GroundTruthのIP制御

SageMaker GroundTruthを使ってラベリングするときに、ワーカーのアクセス範囲を限定したいことがある。 IPの範囲でアクセス制限したいときには、awscliを使って、workforceに対してCIDRを指定することでIP制御することが可能

aws sagemaker update-workforce --workforce-name default --source-ip-config '{"Cidrs":["xxx.xxx.xxx.xxx/yy"]}' --region ap-northeast-1

参考URL

docs.aws.amazon.com

docs.aws.amazon.com

AWS CodeCommitにコードをpushする

やること

CodeCommitに認証と通しておく

以下のURLを参考のこと kohira-1980.hatenablog.com

Code Commit上でリポジトリを作成する

  • 対象のアカウントのマネコンにログインしCodeCommit -> リポジトリ -> リポジトリを作成 する f:id:kohira_1980:20210825112730p:plain

  • sshのクローンを選択し、URLをコピーする

例: ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/hoge_repo

注意: .ssh/configファイルにてURLのエイリアスを指定している場合は、上記のURLのホスト名をエイリアスに変更すること

リポジトリ管理対象になるコードをpushする

  • pushするアプリケーションのトップディレクトリで以下のコマンドを実行する
    • git初期化
    • 対象コードののadd/commit
    • remote repository の登録
    • コードのpush
rm -rf .git
git init
git add .
git commit -m "first commit"
git remote add origin <コピーしたgitのURL(.ssh/configにてエイリアスを使用している場合はそのURLに変更)>
git push -u origin master

これで連携されます。

AWS CodeCommitで認証通す時にやること

やること

  • ローカルPCで公開鍵、秘密鍵を作る
  • AWSコンソールで、IAMユーザーに公開鍵を紐づける
  • 接続確認

ローカルPCで公開鍵、秘密鍵を作る

cd ~/.ssh
ssh-keygen -t rsa -f id_rsa_hoge

id_rsa_hogeid_rsa_hoge.pubの2つのファイルが作成される。

AWSコンソールで、IAMユーザーに公開鍵を紐づける

  1. AWSコンソールにアクセスし、IAMのコンソールを立ち上げる。認証するIAMユーザーのページに移動する。
  2. "認証情報"タブを押下し、”AWS CodeCommit の SSH キー”コンテンツから、”SSHパブリックキーのアップロード”を押下。上記で作成したid_rsa_hoge.pub公開鍵ファイルの中の文字列をコピペする。 f:id:kohira_1980:20210728141708p:plain f:id:kohira_1980:20210728142254p:plain

  3. 登録後、”AWS CodeCommit の SSH キー”コンテンツ表に現れるSSHキーIDが生成されます。これをコピーします。 f:id:kohira_1980:20210728142815p:plain

ローカルPCの.ssh/configの設定

  1. ~/.ssh/configを編集します。ファイルがない場合は作成し、編集します。
  2. 以下のように設定を追加します。
Host hoge.git-codecommit.ap-northeast-1.amazonaws.com
  HostName git-codecommit.ap-northeast-1.amazonaws.com
  User {SSH key ID} 
  IdentityFile ~/.ssh/id_rsa_hoge

HostエイリアスHostNameは真のhost名を指定します。{SSH key ID}には上記で保存したSSHキーIDを記載します。IdentityFileには秘密鍵のパスを記載します。

接続確認

以下のコマンドを打ち、SSH接続できたら、設定完了。

ssh hoge.git-codecommit.ap-northeast-1.amazonaws.com

出力

You have successfully authenticated over SSH. You can use Git to interact with AWS CodeCommit. Interactive shells are not supported.Connection to git-codecommit.ap-northeast-1.amazonaws.com closed by remote host.
Connection to git-codecommit.ap-northeast-1.amazonaws.com closed.

参考URL

docs.aws.amazon.com

PythonでS3上のにある2つのファイルを結合する

Pythonを使って、S3上にある2つのファイルを結合して出力する。目的としては、ヘッダーのないcsvファイルにヘッダーをつける。 pandasを使って読み込むと余計なオーバーヘッドがあるので、StringIOでメモリ上に乗せてくっつけるだけにする。

サンプルコードは以下の通り

import boto3
import io

# define args
src_bucket = "src_bucket"
src_prefixKey_header = "hoge/hoge_header.csv"
src_prefixKey_data = "hoge/hoge_data.csv"
dest_bucket = "dest_bucket"
dest_prefixKey = "hoge/hoge_out.csv"

SRC_FILE_ENCODING="utf-8"

s3 = boto3.resource('s3')

#ヘッダファイルの読み込み
src_obj_header = s3.Object(
  src_bucket,
  src_prefixKey_header
)
body_in_header = src_obj_header.get()['Body'].read().decode(
  SRC_FILE_ENCODING
)
buffer_in_header = io.StringIO(body_in_header)

#データファイルの読み込み
src_obj_data = s3.Object(
  src_bucket,
  src_prefixKey_data
)
body_in_data = src_obj_data.get()['Body'].read().decode(
  SRC_FILE_ENCODING
)
buffer_in_data = io.StringIO(body_in_data)

# ヘッダとデータの結合
outputs = list()
outputs.append(buffer_in_header)
outputs.append(buffer_in_data)

buffer_out=io.StringIO()
buffer_out.write(''.join([i.getvalue() for i in outputs]))
body_out=buffer_out.getvalue()

#ファイル配置
dest_obj = s3.Object(
  dest_bucket,
  dest_prefixKey
)
dest_obj.put(Body = body_out)

参考URL

S3バケット上のCSVファイルをバッファに読み出してpandasで編集する | DevelopersIO

concatenation - python how to concat stringio objects? - Stack Overflow

jetson nanoにgreengrass v2をインストールしてみた

マニュアルに書いてあるのをやってみた。

docs.aws.amazon.com

前提条件

  • jetson nanoにsshできる
  • jetson nanoの容量は16GBだときついので、せめて32GBにする。私は64GBのSDカードで実行。

java jdkを入れる

Greengrassにはjavaランタイムが必要なので、入れる。jetson nano上で実行

sudo apt install default-jdk

jdkのバージョン確認

$ java -version
openjdk version "11.0.11" 2021-04-20
OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.18.04)
OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.18.04, mixed mode)

AWS Greengrass Coreをインストール

curlでGreengrass Coreのモジュールをダウンロードする。ダウンロードにはcurlを使うので、curlがインストールされていない場合は、sudo apt install curlを実行する。

cd ~
curl -s https://d2s8p88vqu9w66.cloudfront.net/releases/greengrass-nucleus-latest.zip > greengrass-nucleus-latest.zip

解凍する。

unzip greengrass-nucleus-latest.zip -d jetson_nano_ggc && rm greengrass-nucleus-latest.zip

認証情報

AWSのIAMユーザーに割り当てられたアクセスキーIDとシークレットアクセスキーをexportする

export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

Greengrass Coreのインストール

マニュアルそのまま実行

sudo -E java -Droot="/greengrass/v2" -Dlog.store=FILE \
  -jar ./jetson_nano_ggc/lib/Greengrass.jar \
  --aws-region ap-northeast-1 \
  --thing-name jetson_nano_ggc \
  --thing-group-name jetson_nano_ggc_group \
  --tes-role-name GreengrassV2TokenExchangeRole \
  --tes-role-alias-name GreengrassCoreTokenExchangeRoleAlias \
  --component-default-user ggc_user:ggc_group \
  --provision true \
  --setup-system-service true \
  --deploy-dev-tools true

コンソールで確認

AWS コンソール画面からgreengrassの画面にいき、greengrassのコアデバイスが登録されていることを確認
f:id:kohira_1980:20210607092656p:plainf:id:kohira_1980:20210607092734p:plain

コマンドラインからthingsを確認

$aws greengrassv2 list-effective-deployments --core-device-thing-name jetson_nano_ggc

出力はこのようになる。

{
    "effectiveDeployments": [
        {
            "deploymentId": "165qdadhgsh6htsthsdfsdhfsfdsh4654hoge",
            "deploymentName": "Deployment for jetson_nano_ggc_group",
            "iotJobId": "kdajsfopijw-jpoieawj-feajo-fweao-lkpo78755",
            "iotJobArn": "arn:aws:iot:ap-northeast-1:000000000001:job/",
            "targetArn": "arn:aws:iot:ap-northeast-1:000000000001:thinggroup/jetson_nano_ggc_group",
            "coreDeviceExecutionStatus": "SUCCEEDED",
            "reason": "SUCCESSFUL",
            "creationTimestamp": 1623025275.335,
            "modifiedTimestamp": 1623025275.335
        }
    ]
}

これでインストールは完了。次にレシピなどつくる。