ボーっとしたい

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

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
        }
    ]
}

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

Glue Crawlerを使う時の注意点

csvをGlue Crawlerでクロールして、データカタログを作成するとき注意点の csvファイル側の制約(と思われるもの)

csvファイルの制約

  • 大文字列名は小文字列名に変換される
  • 日本語列名に対応している
  • UTF-8のみ扱える。
  • ヘッダーの自動読み取りでデータの行が全てStringの場合はヘッダーを認識できない。 docs.aws.amazon.com

ヘッダー行は、データ行と十分に異なっている必要があります。これを判断するには、1 つ以上の行が STRING 型以外として解析されることを確認します。すべての列が STRING 型である場合、最初のデータ行は以降の行と十分に異なっていないため、ヘッダーとして使用できません。

あるある

  • 別のCrawler作成時に新規作成したIAMロールを使い回す("既存のIAMロールを選択")と、失敗する。IAMロール作成時にS3パスの制約が入っていることが原因。"IAMロールのポリシーの更新"を選択して、S3の読み取りアクセス許可を追加するか、別途IAMロールを作成する必要がある。

csvファイルにダブルクオートが入っている場合の対処法

dev.classmethod.jp

cdk bootstrap実行時の Unable to resolve AWS account to use エラー

CDKの勉強のため、こちらのワークショップを実施中

cdkworkshop.com

エラー

cdk bootstrap実行時に以下のエラーが発生

Unable to resolve AWS account to use. It must be either configured when you define your CDK or through the environment

ネットで検索したところ、.aws/configのdefaultプロファイルを消せとか出てきて、やってみたけど、うまくいかなかった。

原因

  • ~/.aws/configにて、credential_processを使ってsts assumeを取得していたことが原因のようだった。

解決方法

  • AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SECRET_ACCESS_KEYを直にexportして再度実行したところ、うまくいった。
aws sts assume-role --role-arn "arn:aws:iam::123456789012:role/example-role" --role-session-name AWSCLI-Session

role-arnとrole-session-nameを指定して、実行するとACCESS_KEY_IDなどが取得できるので、それらをexportする

export AWS_ACCESS_KEY_ID=ASIAXXXXXXXXXXXX
export AWS_SECRET_ACCESS_KEY=yyyyyyyyyyyyyyyyyyyyyy
export AWS_SESSION_TOKEN=zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz(長い)

これでcdk bootstrap実行したところ、エラー解消。