Open11

草稿

shuichishuichi

aws-cliとは?

aws-cliとは、サーバにインストールして使うCLIコマンドのことです。
コマンド名はawsで、aws --versionのようにして使います。

例えば「EC2インスタンスをたてる」「S3に手元のファイルをアップロードする」などの、AWSマネジメントコン\
ソール(Webの操作画面)でポチポチ行っているAWSリソースの操作を、ほぼ全て行えます
コマンドなので、スクリプトで操作を自動化したり定期実行したりといったことが容易にできます。

裏側の仕組み

AWSリソースへの各種操作は、AWSが用意しているAPIへリクエストを行うことによって実現しています。

と言っても、AWSのAPIへのリクエストを、私達が直接組み立てることは通常ありません。

リクエストを行う方法は、主に2種類あります:

  • aws-cliを使う

  • 各プログラミング言語で、ライブラリであるAWS SDKを使う

図をはる

aws-cliを使い始める際の注意

APIリクエストの通信経路を確保する

裏側の仕組みで簡単に説明しましたが、aws-cliは、裏側でAWSのAPIにリソース操作のリクエ\
ストを送信しています。

そのため、以下の通信経路を開放しておく必要があります:

  • aws-cliを使うサーバから外側に出ていく通信で
  • TCPの443ポート(HTTPSプロトコル)

IAM権限の設定

AWSのAPIにリクエストを送る際、「どのAWSアカウントに関する操作なのか」「どのリソースを操作しようとして
いるのか・その権限はあるのか」という部分も解決する必要があります。

つまり、認証と認可をやるわけですが、これはIAMの情報をaws-cliに設定しておくことで実現します。\
そうすると、aws-cliが裏でAWSのAPIにリクエストを送る際に、IAM情報を携えて認証・認可の部分をクリアする\
というわけです。

aws-cliにIAMの情報を設定する方法は、aws-cliを使う環境によって、以下の2パターンがあります:

  • EC2インスタンス上で使う場合:適切な権限を設定したIAMロールを、EC2インスタンスにアタッチする

  • VPCの外のサーバ上で使う場合:

IAMロールをEC2インスタンスにアタッチする

shuichishuichi

{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Principal": {"Service": "scheduler.amazonaws.com"},"Action": "sts:AssumeRole","Condition": {"StringEquals": {"aws:SourceAccount": "<AWS account ID>"}}}]}

shuichishuichi

AL2023、結局うまくいかん

wget https://github.com/docker/compose/releases/download/v2.26.1/docker-compose-linux-x86_64

# プラグインファイルを実行可能ファイルにし、所有者をrootに変更
sudo chmod 755 ./docker-compose-linux-x86_64
sudo chown root:root ./docker-compose-linux-x86_64
ls- l

# Dockerプラグイン用のディレクトリに移動
sudo mv docker-compose-linux-x86_64 /usr/libexec/docker/cli-plugins/
docker compose --version
shuichishuichi

Ruby3.3のコンテナに変更
Dockerfile3.3用に要るな、中身がかなり変わる
Ubuntuにはzipも必要。それのチェックもスクリプトに
docker composeコマンドのチェックもいる(けどdocker compose upとかしないとdockerコマンドが反応してエラーにならないんだよな)

ERROR [rubygems_builder 7/7] RUN dnf groupinstall -y "Development Tools"                                                                                                                                0.5s
------
 > [rubygems_builder 7/7] RUN dnf groupinstall -y "Development Tools":
0.450 This is microdnf, which implements subset of `dnf'.
0.450 Usage:

0.450   dnf [OPTION?] COMMAND

FROM public.ecr.aws/lambda/ruby:3.3
0.450
0.450 Commands:
0.450   upgrade              Upgrade packages
0.450   update               Compatibility alias for the "upgrade" command
0.450   module reset         Reset a module stream
0.450   distro-sync          Upgrade/downgrade packages to match versions in repositories
0.450   dsync                Compatibility alias for the "distro-sync" command
0.450   remove               Remove packages
0.450   reinstall            Reinstall packages
0.450   clean                Remove cached data
0.450   repolist             List repositories
0.450   module enable        Enable a module stream
0.450   download             Download packages
0.450   makecache            Generate the metadata cache
0.450   module disable       Disable a module stream
0.450   repoquery            Search for packages matching keyword
0.450   install              Install packages
0.450
0.450 Help Options:
0.450   -h, --help                    Show help options
0.450
0.450 Application Options:
0.450   --assumeno                    Automatically answer
shuichishuichi

Amazon Linux 2023

$ sudo dnf groupinfo "Development Tools"
Last metadata expiration check: 19:42:47 ago on Wed Apr 10 14:20:48 2024.
Group: Development Tools
Description: A basic development environment.
Mandatory Packages:
   autoconf
   automake
   binutils
   bison
   flex
   gcc
   gcc-c++
   gettext
   libtool
   make
   patch
   pkgconfig
   rpm-build
   rpm-sign
   system-rpm-config
Default Packages:
   byacc
   cscope
   ctags
   diffstat
   doxygen
   elfutils
   gcc-gfortran
   git
   indent
   intltool
   patchutils
   rcs
   subversion
   swig
   systemtap
Optional Packages:
   ElectricFence
   ant
   babel
   bzr
   chrpath
   cmake
   cvs
   dejagnu
   expect
   gcc-gnat
   imake
   javapackages-tools
   libstdc++-docs
   mercurial
   mod_dav_svn
   nasm
   perltidy
   python-docs
   python2-rpm
   rpmdevtools
   rpmlint
   systemtap-sdt-devel
   systemtap-server
shuichishuichi

https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/DynamoDB/Client.html#transact_get_items-instance_method

ソートキーがテーブルにあると、ValidationErrorになる。エラー文からはわかりづらい。

get_items_params = {
  :transact_items => [
    {
      :get => {
        :table_name => 'some_table_name',
        :key => {
          'user_id' => 'foobar'
        }
      }
    }
  ]
}
{     "errorMessage":
"Transaction cancelled, please refer cancellation reasons for specific reasons [ValidationError]"
,     "errorType":
"Function<Aws::DynamoDB::
Errors
::TransactionCanceledException>"
,     "stackTrace": [        
"/var/runtime/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/seahorse/client/plugins/raise_response_errors.rb:17:in `call'"
,        
"/var/runtime/ruby/3.3.0/gems/aws-sdk-dynamodb-1.105.0/lib/aws-sdk-dynamodb/plugins/simple_attributes.rb:119:in `call'"
,        
"/var/runtime/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/plugins/checksum_algorithm.rb:111:in `call'"
,        
"/var/runtime/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/plugins/jsonvalue_converter.rb:16:in `call'"
,        
"/var/runtime/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/plugins/idempotency_token.rb:19:in `call'"
,        
"/var/runtime/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/plugins/param_converter.rb:26:in `call'"
,        
"/var/runtime/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/seahorse/client/plugins/request_callback.rb:89:in `call'"
,        
"/var/runtime/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/aws-sdk-core/plugins/response_paging.rb:12:in `call'"
,        
"/var/runtime/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/seahorse/client/plugins/response_target.rb:24:in `call'"
,        
"/var/runtime/ruby/3.3.0/gems/aws-sdk-core-3.191.3/lib/seahorse/client/request.rb:72:in `send_request'"
,        
"/var/runtime/ruby/3.3.0/gems/aws-sdk-dynamodb-1.105.0/lib/aws-sdk-dynamodb/client.rb:6201:in `transact_get_items'"
,        
"/var/task/lib/bcrypted_credentials_dynamodb_repository.rb:30:in `find'"
,        
"/var/task/lambda_function.rb:35:in `lambda_handler'"
,        
"/var/runtime/gems/aws_lambda_ric-3.0.0/lib/aws_lambda_ric/lambda_handler.rb:28:in `call_handler'"
,        
"/var/runtime/gems/aws_lambda_ric-3.0.0/lib/aws_lambda_ric.rb:88:in `run_user_code'"
,        
"/var/runtime/gems/aws_lambda_ric-3.0.0/lib/aws_lambda_ric.rb:66:in `start_runtime_loop'"
,        
"/var/runtime/gems/aws_lambda_ric-3.0.0/lib/aws_lambda_ric.rb:49:in `run'"
,        
"/var/runtime/gems/aws_lambda_ric-3.0.0/lib/aws_lambda_ric.rb:221:in `bootstrap_handler'"
,        
"/var/runtime/gems/aws_lambda_ric-3.0.0/lib/aws_lambda_ric.rb:203:in `start'"
,        
"/var/runtime/index.rb:4:in `<main>'"
    ] }

(一応)
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Programming.Errors.html#Programming.Errors.TransactionalErrors

shuichishuichi

DateDatetimeTimestamp型のカラムを使っているテーブルを調べる方法

MySQLのテーブル情報は、データベースINFORMATION_SCHEMACOLUMNSテーブルに格納されている。
SQLは次のとおり:

SELECT
    `TABLE_SCHEMA`, `TABLE_NAME`, `COLUMN_NAME`, `DATA_TYPE`, `COLUMN_DEFAULT`
  FROM
    `INFORMATION_SCHEMA`.`COLUMNS`
  WHERE
    `INFORMATION_SCHEMA`.`COLUMNS`.`DATA_TYPE` = 'date'
      OR `INFORMATION_SCHEMA`.`COLUMNS`.`DATA_TYPE` = 'datetime'
      OR `INFORMATION_SCHEMA`.`COLUMNS`.`DATA_TYPE` = 'timestamp'
  ORDER BY
    `COLUMNS`.`TABLE_SCHEMA` DESC,
    `COLUMNS`.`DATA_TYPE` ASC
;
shuichishuichi

AWS SDK for Ruby
aws-sdk-dynamodb

require "aws-sdk-dynamodb"

DYNAMODB_CLIENT = Aws::DynamoDB::Client.new(region: "ap-northeast-1")

USERS_DYNAMODB_TABLE_NAME = "users".freeze
# USERS_DYNAMODB_TABLE_NAME = ENV["USERS_DYNAMODB_TABLE_NAME"].freeze

# ---

User = Struct.new(:id, :name, keyword_init: true)

users = (1...200).map do |number|
  User.new(id: number, name: "user_#{number}")
end
# => ......

users.each_slice(100) do |users_100|
  put_item_operations_100 = users_100.map do |user|
    {
      :put => {
        :item => { "id" => user.number, "name" => user.name },
        :table_name => USERS_DYNAMODB_TABLE_NAME,
      }
    }
end

DYNAMODB_CLIENT.transact_write_items({:transact_items => put_item_operations_100})
shuichishuichi

net/http

get_www_google_com.rb
require "uri"
require "net/http"

uri = URI.parse("https://www.google.com/")

response = Net::HTTP.start(uri.host, uri.port) do |http|
  http.get(uri.path)
end

puts response.body
ruby get_www_google_com.rb
#=> ......
get_www_google_com.rb
require "uri"
require "net/http"

uri = URI.parse("https://www.google.com/")

 # 「use_ssl: true」を追加
response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
  http.get(uri.path)
end

puts response.body
shuichishuichi

https://docs.ruby-lang.org/ja/latest/class/Net=3a=3aHTTPExceptions.html
https://blog.tmtms.net/entry/201812/ruby26-net#NetHTTPClientException-が追加されNetHTTPServerException-は非推奨

module Net::HTTPExceptions
[edit]
クラス・モジュールの継承リスト:
Net::HTTPExceptions
要約
HTTP 例外クラスです。

実際にはこれを include した以下のサブクラスの例外が発生します。

Net::HTTPError
Net::HTTPRetriableError
Net::HTTPServerException
Net::HTTPFatalError

Net::HTTPServerExceptionは、Net::HTTPClientExceptionに変更?