草稿
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インスタンスにアタッチする
{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Principal": {"Service": "scheduler.amazonaws.com"},"Action": "sts:AssumeRole","Condition": {"StringEquals": {"aws:SourceAccount": "<AWS account ID>"}}}]}
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
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
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
ソートキーがテーブルにあると、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>'"
] }
(一応)
Basic Auth
HTTP Header Authorizatoin
はcase insensitive
RFCはる
Date
・Datetime
・Timestamp
型のカラムを使っているテーブルを調べる方法
MySQLのテーブル情報は、データベースINFORMATION_SCHEMA
のCOLUMNS
テーブルに格納されている。
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
;
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})
net/http
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
#=> ......
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
module Net::HTTPExceptions
[edit]
クラス・モジュールの継承リスト:
Net::HTTPExceptions
要約
HTTP 例外クラスです。
実際にはこれを include した以下のサブクラスの例外が発生します。
Net::HTTPError
Net::HTTPRetriableError
Net::HTTPServerException
Net::HTTPFatalError
Net::HTTPServerExceptionは、Net::HTTPClientExceptionに変更?