[BUG] transient_heap_block_alloc: failed IT by NHM - 2021-05-312021-05-31 gem install実行してたらこんなん出た。要するにメモリ足らない。 ruby 2.7.3p183 (2021-04-05 revision 6847ee089d) [x86_64-linux] -- Control frame information ----------------------------------------------- c:0001 p:---- s:0003 e:000002 (none) [FINISH] -- C level backtrace information ------------------------------------------- /home/ec2-user/.rbenv/versions/2.7.3/lib/libruby.so.2.7(rb_vm_bugreport+0xfa) [0x7f9f1f46710a] vm_dump.c:755 /home/ec2-user/.rbenv/versions/2.7.3/lib/libruby.so.2.7(rb_bug+0xe4) [0x7f9f1f20c06d] error.c:645 /home/ec2-user/.rbenv/versions/2.7.3/lib/libruby.so.2.7(Init_TransientHeap+0x7b) [0x7f9f1f43180b] transient_heap.c:298 /home/ec2-user/.rbenv/versions/2.7.3/lib/libruby.so.2.7(rb_call_inits+0x9) [0x7f9f1f2d8619] inits.c:22 /home/ec2-user/.rbenv/versions/2.7.3/lib/libruby.so.2.7(ruby_setup+0xde) [0x7f9f1f2a60be] eval.c:79 /home/ec2-user/.rbenv/versions/2.7.3/lib/libruby.so.2.7(ruby_init+0x9) [0x7f9f1f2a8ce9] eval.c:96 /home/ec2-user/.rbenv/versions/2.7.3/bin/ruby(main+0x46) [0x400866] ./main.c:49 -- Other runtime information ----------------------------------------------- Segmentation fault t2.microのEC2インスタンスはスワップ0なので連続実行したら、そりゃあこうなるよ。 少しまってOS上でメモリ解放されるのを待って再実行で解決。 それでもダメならスワップファイルを追加すればいい。
rbenvのインストールと設定 IT by NHM - 2021-05-262021-05-26 rubyのパスを一々手作業で設定するのは面倒なのでrbenvを設定する。いつもの引用から。 rbenvインストールhttps://github.com/rbenv/rbenv#basic-github-checkout sudo yum install git wget gcc make openssl-devel readline-devel git clone https://github.com/rbenv/rbenv.git ~/.rbenv cd ~/.rbenv && src/configure && make -C src echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile ~/.rbenv/bin/rbenv init vi ~/.bash_profile # Load rbenv automatically by appending # the following to ~/.bash_profile: eval "$(rbenv init - bash)" 一応再読み込み . ~/.bash_profile curl -fsSL https://github.com/rbenv/rbenv-installer/raw/main/bin/rbenv-doctor | bash Checking for `rbenv' in PATH: /home/ec2-user/.rbenv/bin/rbenv Checking for rbenv shims in PATH: OK Checking `rbenv install' support: not found Unless you plan to add Ruby versions manually, you should install ruby-build. Please refer to https://github.com/rbenv/ruby-build#installation Counting installed Ruby versions: none There aren't any Ruby versions installed under `/home/ec2-user/.rbenv/versions'. You can install Ruby versions like so: rbenv install <version> Checking RubyGems settings: OK Auditing installed plugins: OK mkdir -p "$(rbenv root)"/plugins git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build rubyをインストールする。 rbenv install --list 2.6.7 2.7.3 3.0.1 jruby-9.2.17.0 mruby-3.0.0 rbx-5.0 truffleruby-21.1.0 truffleruby+graalvm-21.1.0 rbenv install 2.7.3 # rubyインストール rbenv install
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のロググループを削除する。
0-run-tests.sh `require’: cannot load such file — aws-xray-sdk/lambda (LoadError) IT by NHM - 2021-02-172021-02-17 手っ取り早く解決する方法 #!/bin/bash set -eo pipefail if [ ! -d lib ]; then echo "Installing libraries..." ./2-build-layer.sh fi #GEM_PATH=lib/ruby/2.5.0 GEM_PATH=lib/ruby/2.7.0 ruby function/lambda_function.test.rb exportつける。 #!/bin/bash set -eo pipefail if [ ! -d lib ]; then echo "Installing libraries..." ./2-build-layer.sh fi #GEM_PATH=lib/ruby/2.5.0 export GEM_PATH=lib/ruby/2.7.0 ruby function/lambda_function.test.rb