モチベーション維持のための技術系ブログ

技術者として個人的にアウトプットもやっていこうと思い始めました。

Lambda のイベントフィルタリング を試してみた

参考URL

Lambda のイベントフィルタリング - AWS Lambda

【アップデート】Lambdaのイベントソースマッピングでイベントのフィルタが可能になりました | DevelopersIO

やったこと

DynamoDB作成

適当な名前でDynamoDBを作成。
DynamoDB ストリーム の設定はONにする。

※色々試した後なので、既にレコードが入っている状態

Lambdaの作成

適当な名前でLambdaを作成。

元々のソースコードを修正。
とりあえずなんかしら console.log を出力するようにする。
修正したら「Deploy」を押下してデプロイする。

Lambdaに設定されているロールの設定

設定 >> アクセス権限 を選択するとロール名が表示されるので、クリックする。

AmazonDynamoDBFullAccessを付与する。
※FullAccessじゃなくて、もっと適切なロールがあるかも。
 とりあえず動かしたいので、FullAccessにする。

DynamoDB ストリームの設定  ※メインイベント!!!

設定 >> トリガー >> トリガーを追加 を選択する。

新規作成したDynamoDBを設定する。
※バッチサイズは今回はとりあえずなんでもいい。

追加の設定 >> フィルタリング条件 から、下記のようにフィルターを設定する。
設定したのは下記のようなフィルター。
※フィルターの書き方は参考URL参照

  • フィルター1
    • eventNameは「INSERT」
    • expiredAt という項目が存在しない
  • フィルター2
    • eventNameは「UPDATE」
    • expiredAt という項目が存在しない

実際に動かしてみる

下記2パターンのデータをINSERTしてみる。
DynamoDB コンソールの「項目を作成」から追加する。

expiredAt なし
{
 "key": "expiredAt does not exists",
 "age": 20,
 "name": "masuda"
}expiredAt あり
{
 "key": "expiredAt exists",
 "age": 25,
 "name": "onuma",
 "expiredAt": 123456
}

CloudWatch からログを確認すると、expiredAt が設定されていないレコードのみログ出力される。

既にINSERTしたデータを更新(age を+1)する。
すると、やはり expiredAt が設定されているレコードのみログ出力される。

Amazon ECS 入門ハンズオン をやってみた

URL

catalog.us-east-1.prod.workshops.aws

Cloud9 で作業環境の作成

下記キャプチャの通り操作し、Cloud9の環境を作成する。

細かい設定の意味はわからない。
とりあえずハンズオンに従った設定にする。

Cloud9にはデフォルトでdockerがインストールされているらしい。
docker version を入力して確認する。

AWS Cloud9 環境のパブリック IP アドレスを取得。
後で使うらしい。

コンテナイメージの作成

Dockerfile の作成

Dockerfileを Cloud9上で作成する。
※このファイルの簡単な説明はハンズオンのURL参照

docker build でイメージ作成。
※表示メッセージ長いので、最初の方のキャプチャだけ。

docker image でイメージができてること確認。

コンテナを動かす

Cloud9 環境で動いているコンテナイメージを確認。

ドッカーを起動。
オプションの説明は下記の通り。(ハンズオンURLからコピペ)

  • -d : コンテナをバックグラウンドで動かすために、デタッチドモードを有効にする
  • -p : 指定したポートを、ホスト側に公開する。ホスト側の 8080 ポートを、コンテナ側の 80 ポートに割り当てる。
  • --name : コンテナに名前を付ける

コンテナからのレスポンス確認

curl localhost:8080 を投げてみる

Cloud9上の簡易的なWebブラウザで確認してみる

コンテナのデバッグ作業

※うまく起動しない場合の作業みたいなので、うまくいっている為いったんスルー。

ECRにアップロード

ECRのコンソール画面を開く。

リポジトリを作成する。

リポジトリ完成、URIを控えておく。

リポジトリの詳細を見ると、イメージがない状態。
ここにイメージをアップロードしていく。

「プッシュコマンドの表示」からイメージプッシュのコマンドが見られる。

コマンドでECRにアップロード

Cloud9上のコンテナイメージとECRを紐づける為、リポジトリの名前を使ったタグを付与する。
Tagの構文は下記。
ホスト名/イメージ名[:タグ名]

先ほど控えておいたURIの後ろに「:Tag名」でよさそう。

docker build -t 作ったTag . を実行。

docker images でTag付与できているかを確認。

リポジトリアップロードの為に、ログインをする。 ※ECRコンソール画面の「プッシュコマンドの表示」にコマンドあり。

docker push さっきつけたTag名 で push する。

ECRのコンソール画面を見ると、イメージが push されていることが確認できる。

ECSの作成

VPCの作成

セキュリティグループの修正

作成したVPCのセキュリティグループにインバウンドルールを追加。
まずは、自分のPCからアクセスできるようマイIPを追加。

次に、Cloud9からアクセスできるよう、控えておいた Public IP アドレスを追加。

ECSクラスターの作成

作成したら、エラーになった。
初めて作成するときはエラーになることがあるらしい。
※ハンズオンのURLにその旨の記載あり。

もう1回やったらちゃんと作成できた。

タスク定義の作成

下図の赤線だけ設定したら、あとは「次へ」で作成する。

タスク定義が作成された。

サービスの作成

作成したECSクラスターを選択する。

サービスタブの作成を選択。

「環境」の設定はデフォルトのまま(ハンズオンで特に言及されていなかったので)

「デプロイ設定」は下記の通り。

「ロードバランシング」の設定も行う。

それ以外はデフォルトの設定のまま。「作成」を選択する。 すると、サービスが作成される。数分かかる。

数分後、デプロイ成功。

インターネットからアクセス

ここまでの手順で、AWS Cloud9 で作成したコンテナを ECS と Fargate の上で稼働することができているらしい。
インターネットからアクセスするための名前が自動的に付与されているみたいなので、作成したサービスを選択する。
そして、「ネットワーキングタブ」の「オープンアドレス」を選択する。

すると、Chromeが起動して「Hello, World」が表示された。

Pt.03 - [外部パッケージ呼び出し編]Go言語公式チュートリアルをやってみた

参考URL

【Go】パッケージ/モジュールやgo modコマンドについてまとめ - フラミナル
go.mod ファイル、go.sum ファイル、go mod tidy コマンドがこの後出てくるが、それについての説明がある。
完全に分かったわけじゃないけど、一番イメージがつかみやすい記事だった。

外部パッケージ「quote」を使う

Pt.02でやったソースに赤字下線部分を追記する。
Pt.02 - [Hello, World編]Go言語公式チュートリアルをやってみた - モチベーション維持のための技術系ブログ


go mod tidyコマンドを実行する。 これで、hello.go ファイルの import に書いている quote パッケージがダウンロード?インストール?されて使えるようになる。

go.mod ファイルに、import されたパッケージの情報が書かれる。

go.sum ファイルもできる。


実行すると、こんな感じで表示される。


quote は 4つの関数をもっていて、それぞれ短いことわざを返すだけの関数みたい。
※quoteパッケージのドキュメントより:quote package - rsc.io/quote/v4 - Go Packages

VSCode に GO言語の拡張機能を入れる

GO言語の拡張機能をインストールする。

すると、VSCode右下にこんな感じでエラー?が出る。

これらが何をするものでなぜ install する必要があるかわからないけど、とりあえずインストールしてみる。
すると、例えばgpolsのインストールをした時はこんな表示がされて、インストールされたみたい。

そして、install されることで、GOPATH という環境変数に設定されているパスに
インストールしたものの exe ファイルが配置されるみたい。
※GOPATHを手動で設定した覚えはないので、GO を install した時自動で設定されたんだと思う。

2023/01 の目標

年末年始だらだらしてやる気が発生するまで時間がかかったけど…
また新たに目標たててやっていこうと思う。

先月の目標が完遂していないので、引き続き下記をやっていく。

もう半月くらいたってるので、今月でいい感じに進めたい。
チュートリアルも色々あるっぽい(下記画像参照)ので、どこまで進めるか、
来月も引き続きやるかは、今月のでき次第でまた考える。

※リンク:Tutorials - The Go Programming Language

Pt.02 - [Hello, World編]Go言語公式チュートリアルをやってみた

Hello, World! を表示

コードやコマンドはチュートリアルにあるので、画像キャプチャをメインで残す。

作業用ディレクトリを作って、そこに移動。


go mod init example/hello コマンドで初期化。
go.mod ファイルが生成される。
「Go Modulesの初期化処理」といった感じのようで、ここにモジュールパスや外部ライブラリパスが書かれていくみたい。
(typescript でいうところの package.json みたいなものなのかなと予想。まだはっきりは言えないけど)


ちなみに go.mod ファイルの中はこんな感じ。


hello.go ファイルを作成。


go run . コマンドで実行。Hello, World! が表示される


ちなみに、 go run (ドットなし)では実行できなかった。


参考URL

go mod init がよくわからなかったので、参考にした。
それでも正直よくわかってない… 勉強していくうちに理解できると信じて先に進む。

【12月分】忘れちゃいそう、でも覚えておきたい用語をジャンルレスにメモ

英語

  • prerequisites
    • 前提条件
  • brief
    • 簡潔に
  • along the way
    • ~の途中で(途中の間、継続的だったり繰り返されてるイメージ)
  • typically
    • 通常