node.js+AWS SDKでDynamoDBにデータ挿入
やりたかったこと
Amplifyで画面開発したのだが、デフォルトデータをDynamoDBに挿入しないと動かないので、初期のインストール時にデータをinsertしたかった。
サンプルデータの作成
- 定型のメッセージをDynamoDBに挿入するときに、dict型でデータを持っておきたかった。これは、テストコード流すためでもある。
- プロジェクトのフォルダ構造はこんな感じ。sample-dataというフォルダを作ってそこで管理
フォルダ構造とサンプルデータ - 拡張子は
.mjs
。こうしないとうまくいかなかった。なぜかは話が深くなるからここでは書かない。以下参照。
- messageData.mjsの中身はこんな感じ
// messageData function createMessageData(id, a, message) { return { id, a, message}; } export const messageData = [ createMessageData( "id-a", "0", "やっほー、ボーっとしたいよ!" ), ];
データ挿入スクリプトの作成
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プロファイル名}
困ったところ、感想
python statsmodelsでロジスティック回帰した
参考文献: - 手を動かしながら学ぶ ビジネスに活かすデータマイニング
動機
注意点
コーディング
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 ==============================================================================
感想
- ちょっとだけ勉強になった気がする
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
AWS CodeCommitにコードをpushする
やること
CodeCommitに認証と通しておく
以下のURLを参考のこと kohira-1980.hatenablog.com
Code Commit上でリポジトリを作成する
例: 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で公開鍵、秘密鍵を作る
cd ~/.ssh ssh-keygen -t rsa -f id_rsa_hoge
id_rsa_hoge
とid_rsa_hoge.pub
の2つのファイルが作成される。
AWSコンソールで、IAMユーザーに公開鍵を紐づける
- AWSコンソールにアクセスし、IAMのコンソールを立ち上げる。認証するIAMユーザーのページに移動する。
"認証情報"タブを押下し、”AWS CodeCommit の SSH キー”コンテンツから、”SSHパブリックキーのアップロード”を押下。上記で作成した
id_rsa_hoge.pub
公開鍵ファイルの中の文字列をコピペする。登録後、”AWS CodeCommit の SSH キー”コンテンツ表に現れるSSHキーIDが生成されます。これをコピーします。
ローカルPCの.ssh/configの設定
- ~/.ssh/configを編集します。ファイルがない場合は作成し、編集します。
- 以下のように設定を追加します。
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
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をインストールしてみた
マニュアルに書いてあるのをやってみた。
前提条件
- 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のコアデバイスが登録されていることを確認
コマンドラインから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 } ] }
これでインストールは完了。次にレシピなどつくる。