ダメ元エンジニアのお勉強おメモ

ほとんど自分用のメモです。AWS をよく触ります。Web アプリとか作ります。Raspberry Pi も好きです。

AWS

NLB には SG を設定できないので、EC2 にアタッチする SG でアクセス制御を行う

概要 NLB(Amazon Elastic Load Balancing の Network Load Balancer) → EC2 という構成の場合の話。 NLBでは、SG(セキュリティグループ)を設定することはできない。ので、EC2 にアタッチする SG にてアクセス制御を行う必要がある。 ALB の場合だと、ALB…

AWS Lambda の呼び出しタイプを軽く整理する

概要 AWS Lambda を CLI 等で直接呼び出す機会ってそこまで無いため、呼び出しタイプをあまり意識してこなかった。ちょっと軽く整理しておこうと思う。 docs.aws.amazon.com dev.classmethod.jp qiita.com 種類 RequestResponse デフォルトの呼び出しタイプ…

AWS CLI v2 で Lambda を Invoke する場合は、ペイロードを base64 エンコードをしてから送信する必要がある

概要 dev.classmethod.jp 例としては下記のような感じ。 $ aws lambda invoke \ --function-name <FUNCTION_NAME> \ --payload $(echo '{ "foo": "bar" }' | base64) \ response.json</function_name>

mTLS が設定されている API Gateway の前段に CloudFront を置くと双方の間でクライアント認証を通すことができない

概要 よくよく考えると当たる前のことな気がするけれど、せっかく試したのでメモる。 mTLS が設定されている API Gateway に対して、別のドメインでアクセスしたい場合、前段に CloudFront を置いて、CNAME を設定してあげれば良いんじゃないかなと思った。 …

カスタムドメイン設定済みの API Gateway に対して無理やり別ドメインでのアクセスを通す

前置き とある調査の副産物的な形で見つけた挙動。いつか役に立つかもしれないのでメモっておく。といっても、無理やり感が満載な上に、全く実用的で無いと思われる構成なので、その辺はご承知おきを。 調査内容 全く別のドメインを2つ取得済みだとして、「…

S3 のイベント通知から Lambda を起動したり、SQS にメッセージを格納する際は、内部的なリトライにより重複が発生することがある

aws.amazon.com Amazon S3 は、組み込みのバックオフと再試行メカニズムを使用して、高い信頼性で通知を配信するように設計されています。まれに、再試行メカニズムによって同じオブジェクトイベントの通知が重複する場合があります。 なので、後ろで構えて…

AWS SDK で設定できるタイムアウトは二通り存在する

aws.amazon.com 接続タイムアウト:API コールが接続を確立できなかった ソケットタイムアウト:API コールの接続は成功したが、API レスポンスに時間がかかりすぎた 調べるとよく出てくるのは「 ソケットタイムアウト」の方なので、「接続タイムアウト」の…

DynamoDB にアクセスする際はタイムアウトとリトライの設定を考慮した方が良いと思った

メモ API Gateway -> Lambda -> DynamoDB の構成で、時々タイムアウトが発生した。 調べると DynamoDB へアクセスした際にレスポンスが返らず、API Gateway のタイムアウト29秒に達したっぽい。 DynamoDB へアクセスする際のオプションとして、タイムアウト…

AWS CloudFormation のスタックに関連付けたサービスロールを後からデタッチすることはできない

メモ スタックにサービスロールを関連付けると、例えば Admin 権限を持った IAM ユーザーの認証情報を使ってデプロイしようとしても、サービスロールの権限が適用される。 そして、スタックに関連付けたサービスロールはデタッチすることができない。スタッ…

AWS CloudFormation に紐づける Service Role には各リソースの削除権限も付与してあげないとスタックの更新失敗で走るロールバックが失敗する

メモ AWS CodePipeline で CloudFormation のスタックを更新しようとした際に気づいた。スタックの更新に失敗してロールバックが走る際、一旦作成したリソースを削除しにかかるのだが、Service role で削除用のポリシーが付与されていないと削除ができずロー…

AWS SSO で AWS CLI を叩く

概要 AWS SSO でマネコンにはログインができた。んじゃあ、ローカルから AWS CLI を叩く時の認証ってどうすればいいの? 解決 ここに書いてある。 aws.amazon.com ユーザー ポータル画面から AWS Account → アカウント選択 → Command line or programmatic a…

DynamoDB の UpdateItem で加算処理を行う

概要 加算処理を行うとき毎回調べるのでメモる。 コード TypeScript だとこんな感じ。 import * as DynamoDB from 'aws-sdk/clients/dynamodb'; const DYNAMODB_API_VERSION = '2012-10-08'; const REGION = 'ap-northeast-1'; const TABLE_NAME = 'sample-t…

DynamoDB で存在しないデータに対して delete-item した際にエラーを発生させたい

概要 DynamoDB で delete-item した際、削除対象のデータが存在しなかったとしてもエラーは発生しない。AWS CLI がその挙動なので、恐らくどの言語でも同じだと思う。 % aws dynamodb delete-item \ --table-name sample-table \ --key '{"pk": {"S": "sampl…

sam deploy で 謎のエラー : I/O stream type expected

sam deploy すると I/O stream type expected というエラーが出てハマりました。 環境 % sw_vers ProductName: Mac OS X ProductVersion: 10.15.7 BuildVersion: 19H2 % aws --version aws-cli/2.0.28 Python/3.7.4 Darwin/19.6.0 botocore/2.0.0dev32 % bre…

Cognito IdP の AdminCreateUser で発生したエラーの原因がユーザー名 or メールアドレスの重複である場合にはエラーコードの値が同じになる

結論 こんな感じ。 "error": { "message": "User account already exists", "code": "UsernameExistsException", ... } "error": { "message": "An account with the email already exists.", "code": "UsernameExistsException", ... } メールアドレスの重…

Cognito IdP の AdminCreateUser でユーザーを作成した際にパスワード通知メールを送信しない方法

結論 AdminCreateUser の引数に下記を指定することで、パスワード通知メールが送信されなくなる。 DesiredDeliveryMediums: [], MessageAction: "SUPPRESS" SUPPRESS は抑制を意味する。 参考 stackoverflow.com

Cognito IdP の ListUserPoolClients を1回呼び出した際に返されるアプリクライアントの数が AWS CLI と AWS SDK for JavaScript で異なる(サービスやアクションに限らない話の可能性あり)

環境 % aws --version aws-cli/2.0.28 Python/3.7.4 Darwin/19.6.0 botocore/2.0.0dev3 % node --version v14.7.0 % yarn --version 1.22.10 % yarn list --depth=0 | grep aws-sdk ├─ aws-sdk@2.934.0 準備 下記の Shell Script で特定のユーザープールに20…

Cognito IdP でユーザーのリストを単に取得してもグループの情報は含まれない

内容 listUsers ではグループの情報が一切取得できない。代わりに listGroups でグループ名を取得してから listUsersInGroup でグループごとにユーザーのリストを取得 & 良い感じに結合するしかなさそう。 下記を参考にして、 stackoverflow.com TypeScript …

Cognito でユーザーの email 変更と同時に email_verified を true にすると検証コード通知メールが飛ばない

結論 いや、検証コードの通知飛ばさなくて良いんですけどって時は下記のような形でコマンドを叩けばおk。 % aws cognito-idp admin-update-user-attributes \ --user-pool-id ap-northeast-1_xxxxxx \ --username yamada.taro \ --user-attributes Name=emai…

AWS Lambda のテストイベントでテンプレートを保存しても他の IAM ユーザーと共有されない

結論 タイトルのまま。Lambda のテストイベントでテンプレートを作成 & 保存しても、それはアカウント全体で共有できるわけではないみたい。 だから、CDK とかでテストイベントのテンプレートを作成できないのか。なるほど。 業務上、Lambda でツールっぽい…

DynamoDB で GSI に対して強力な整合性のある読み込みはできない

参考 dev.classmethod.jp ただし、グローバルセカンダリインデックス (GSI)で「強力な整合性のある読み込み」が利用できないことは忘れないで下さい。 経緯 Lambda で DynamoDB のテーブルに対して「強力な整合性のある読み込み」をしようと思ったらエラーが…

Route 53 のヘルスチェックで異常状態を通知する CloudWatch Alarm 及び SNS Topic はバージニア北部リージョンに作成される

参考 docs.aws.amazon.com Route 53 コンソールで CloudWatch のメトリクスを表示するには AWS マネジメントコンソール にサインインした後、https://console.aws.amazon.com/cloudwatch/ にある CloudWatch コンソールを開きます。 現在のリージョンを [米…

Route 53 がエンドポイントをヘルスチェックする場合の挙動に関するメモ

参考 docs.aws.amazon.com メモ デフォルトでヘルスチェッカーの数は8リージョン * 2の計16個(2021/06/01 時点) 高度な設定にてリージョンを選択可能 最低でも3リージョンは選択する必要がある = 最低でも6つのヘルスチェッカーが走る ヘルスチェックが異…

グローバルテーブルを設定した DynamoDB テーブルに対して、強い整合性のある読み込みをしても失敗する場合に確認すること

原因 例えば、東京/シンガポールリージョンでグローバルテーブルの設定をした DynamoDB のテーブルが存在するとして、 両リージョンで用意している同じコードの Lambda が、下記のように実装されている場合。 import * as DynamoDB from 'aws-sdk/clients/dy…

【AWS CDK】CI ツールからデプロイした際に「Bucket named 'cdktoolkit-stagingbucket-xxxxx' exists, but not in account ************. Wrong account?」と怒られた場合の対処法

概要 私の場合は、CircleCI からデプロイしようとしたところで、下記エラーが発生した。 ちなみに、$ cdk bootstrap は既に実行済みの状態である。 $ yarn deploy ... [50%] fail: Bucket named 'cdktoolkit-stagingbucket-xxxxx' exists, but not in accoun…

【AWS CDK】Lambda 作成と同時にロググループも作成する方法

環境 $ cdk version 1.102.0 (build a75d52f) 結論 logRetention の設定を付けてあげるとロググループも作成してくれる。 new lambda.Function( this, 'HelloFunction', { code: lambda.AssetCode.fromAsset('dist/hello'), functionName: 'hello', handler:…

AWS Chatbot で Slack のプライベートチャンネルに連携する場合は /invite @aws する必要がある

AWS

結論 下記のコマンドをプライベートチャンネルで叩きましょう。 /invite @aws ここに書いてあった。 dev.classmethod.jp AWS Chatbot から Slack のチャンネルに連携する手順は下記が参考になる。 aws.amazon.com

API Gateway で構築した REST API の存在しないパスへアクセスされた場合に 404 エラーを返したい

概要 API Gateway で構築した REST API の存在しないパスへアクセスされた場合、デフォルトだと 403 エラーで下記が返る。 {"message": "Missing Authentication Token" } 存在しないなら 404 エラーとして返したいよねって気持ちになった際の対処法を記載す…

Cognito の JWT を TypeScript で検証する方法 - async / await で

ソースコード こんな感じになる。 import * as Console from 'console'; import { promisify } from 'util'; import jwt, { JwtHeader, TokenExpiredError } from 'jsonwebtoken'; import jwksClient from 'jwks-rsa'; const AWS_REGION = process.env.AWS_R…

Lambda が実行されているリージョンを知りたい時は勝手に作られる環境変数「AWS_REGION」を使えば良い

結論 東京リージョンでデプロイした Lambda で下記を実行するとap-northeast-1が出力される。恥ずかしながら知らんかった。 console.log("region:", process.env.AWS_REGION); // region: ap-northeast-1 他に予約されている環境変数は下記を参照。 docs.aws…