S3アクセスにはレガシーエンドポイントやレガシーグローバルエンドポイントを利用するのはやめよう! IT by NHM - 2021-03-242021-03-24 レガシーエンドポイント:https://bucket-name.s3-Region.amazonaws.com レガシーエンドポイントhttps://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/VirtualHosting.html#s3-legacy-endpoints ログにレガシーエンドポイントが表示される場合もありますが、バケットにアクセスするには、常に標準のエンドポイント構文を使用することをお勧めします。https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/VirtualHosting.html#s3-legacy-endpoints レガシーグローバルエンドポイント:https://bucket-name.s3.amazonaws.com レガシーグローバルエンドポイントhttps://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/VirtualHosting.html#deprecated-global-endpoint 他のリージョンに対する仮想ホスティング形式のリクエスト、パス形式のリクエスト(307が返却される模様)https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/VirtualHosting.html#deprecated-global-endpoint ついでにレガシーグローバルエンドポイントでのルーティング(利用はやめておいた方が良いってよく理解できる図ですね) リクエストのリダイレクトと REST APIhttps://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/Redirects.html
Linuxシステムのプロセス数やファイル数のオープン制限 IT by NHM - 2021-03-242021-03-24 *よりもユーザ名を設定したほうがよい。 /etc/security/limits.conf * soft nofile 65536 * hard nofile 65536 /etc/security/limits.d/ ulimit -n 65536 sysctl fs.file-max fs.file-max = 50384
golangでREST APIをやってみた。。。けどレスポンスにjson以外も欲しくない? IT by NHM - 2021-03-172021-03-17 goのjson rest APIの便利ツール。go-json-rest ant0ine/go-json-resthttps://github.com/ant0ine/go-json-rest jsonでいいじゃん。バイナリデータ欲しいならbase64エンコーディングして送れよって気になります。 しかし、単純にmp4や画像ファイル読み込む場合にいちいち手間をかけたくない。 json解析 base64デコード 画像表示 ちゃんと方法が記載されていました。これしておけばjson以外も返却可能。 API and static fileshttps://github.com/ant0ine/go-json-rest#api-and-static-files net/httpのhandleを利用できるとても良い例。パスのルーティングで切り分け可能 StripPrefixに設定したパス名は削除されるので、そのまま流したい場合は""にしておけば良い。 api.SetApp(router) http.Handle("/api/", http.StripPrefix("/api", api.MakeHandler())) http.Handle("/static/", http.StripPrefix("/static", http.FileServer(http.Dir(".")))) log.Fatal(http.ListenAndServe(":8080", nil))
Amazon Linux2のタイムゾーンを変更する。 IT by NHM - 2021-03-172021-03-17 デフォルトではUTCになっている。これは日本時間人間としてはちょっと困る。+9hすればいいだけだが。 $ date 2021年 3月 17日 水曜日 08:10:40 UTC というわけでいつものAWSドキュメント Amazon Linux での タイムゾーンの変更https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/set-time.html#change_time_zone まずは設定可能なタイムゾーンを確認する。 ls /usr/share/zoneinfo Africa Canada GB Indian Mexico ROK iso3166.tab America Chile GB-Eire Iran NZ Singapore leapseconds Antarctica Cuba GMT Israel NZ-CHAT Turkey posix Arctic EET GMT+0
S3でSSLアクセス必須にする。 IT by NHM - 2021-03-102021-03-10 HTTPSでのみ誰でもアクセス可能。HTTPは不可。 { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::aaaaaaaa/*", "Condition": { "Bool": {
Lambdaイベントの処理方法 IT by NHM - 2021-03-102021-03-10 とりあえずjsonでパースしとけば良い。↓はS3 putイベント t_json = JSON.parse(event.to_json) records = t_json["Records"] records.each do |record| key = record["s3"]["object"] end Proxy利用したapi gatewayのbody取得は↓の感じ。 if t_json['isBase64Encoded'] body = JSON.parse(Base64.decode64(t_json['body'])) else body = JSON.parse(t_json['body']) end なお、テストイベントはフォーマットの確認もできるのでまじ便利。
Lambdaのイベントと環境ログ IT by NHM - 2021-03-102021-03-10 Ruby の AWS Lambda 関数ログ作成https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/ruby-logging.html サンプルはto_aで出力してるが、私は↓の方が好き。 logger.debug('## ENVIRONMENT VARIABLES') ENV.each do |variable| logger.debug("#{variable[0]} = #{variable[1]}") end logger.debug('## EVENT') event.each do |key,value| logger.debug("#{key} = #{value}") end
Lambdaの環境変数をKMSで暗号化しておく IT by NHM - 2021-03-102021-03-10 1.関数を作成する 2.関数に紐づけられたロールを確認する(「設定」ー「アクセス権限」で確認可能。リンククリックするとIAMに飛ぶ)。 3.KMSで鍵を作成する(カスタマー管理型のキー)。 4.ロールに割り当てる。 5.作成した鍵のエイリアスとARNを覚えておく。 6.Lambdaに戻って関数の環境変数を設定し、「暗号化」を押す 7.実行ロールポリシーをコピーして別ウインドウを開いて、IAMに割り当てる。今回は復号なのでDecryptだけで良い。 8.lambdaを開いているウインドウに戻って「暗号化」を押す。Valueが暗号化された。 9.復号化する(シークレットスニペットの復号をコピーして利用する) require 'aws-sdk-kms' require 'base64' ENCRYPTED = ENV['test'] require 'json' require 'aws-sdk-kms' require 'base64' ENCRYPTED = ENV['test'] # Decrypt code should run once and variables stored outside of the function # handler so that these are decrypted once per container DECRYPTED = Aws::KMS::Client.new .decrypt({ ciphertext_blob: Base64.decode64(ENCRYPTED), encryption_context: {'LambdaFunctionName' => ENV['AWS_LAMBDA_FUNCTION_NAME']}, }) .plaintext def lambda_handler(event:, context:) # TODO implement { statusCode: 200, body: JSON.generate("Hello from Lambda! #{DECRYPTED}") } end 10.デプロイしてテスト呼び出し。成功 Appendix 今回作成したものの削除順序 1.IAMからKMSの内容を削除する。 2.Lambda関数を削除する 3.KMSを削除する(削除待機日数7~30を指定) 4.IAMを削除する。 5.Cloudwatchのロググループを削除する。
Lambda無料枠の計算 IT by NHM - 2021-03-092021-03-10 AWS Lambda 料金https://aws.amazon.com/jp/lambda/pricing/ なんちゃって計算式シート 1.計算方法はAWSのLAMBDA料金表を開いてリージョンの料金をシートに反映。 2.メモリサイズを設定 3.実際に稼働させてみてメトリクスより実行時間を取得 これでおおよその金額が計算できる。