AWS Builders Oneline 2021年7月8日参加メモ

タイトル通り、AWSのウェビナーに参加した際のメモ書きを投下します


コンテナワークロードはじめの一歩

  • コンテナの利点って?、という人向けのセッション

なぜコンテナか?

アプリケーションコード、ランタイムエンジン、依存ライブラリをコンテナイメージとして一括管理 →このコンテナイメージを各環境に配布(ローカル、本番、etc) →実行環境の再現容易性

  • Dockerfileを元にコンテナイメージを作成(docker build)
  • コンテナに入り、環境構築後にコンテナイメージを作成(docker commit)

ssh docker pull docker run

AWSコンテナサービス オーケストレーション ECS, EKS

イメージレジストリ ECR

コンテナ実行環境 AWS Fargate

ECS, EKS コンテナオーケストレーション デプロイツールを選択可能

ECR DockerHubに比べレイテンシー面で有利 IAM連携、脆弱性スキャン

Fargate スケールアウト、スケールインを自動化

AWS App Runnerがすごそう →Fargateからcodebuildまで管理 秒単位の従量課金制

ecsのワークショップ https://ecsworkshop.com/

App Runnerのワークショップ https://www.apprunnerworkshop.com/

サーバーレスのユースケースと開発ことはじめ

サーバーレスアプリケーションの活用パターン 動的webシステム・業務系API Amazon API Gateway Lambda Dynamo DB

Lambda 必要な処理を必要な時に

Dynamo DB キーバリューDB

Amazon API Gateway RESTの場合、3種類のエンドポイントを選択可 →プライベート、リージョン、エッジ最適化

イベント駆動の業務処理連携 Amazon SNS Amazon SQS Lambda

SQS メッセージキュー 標準キュー FIFOキュー

SNS メッセージングサービス プッシュ型のメッセージング Eメール送信も可能

データレイク周りのデータ加工 Amazon S3 Lambda Amazon Glue Amazon Athena Amazon Redshift

サーバーレスアプリケーションモデル(SAM) サーバーレスアプリケーションを構築するフレームワークhttps://github.com/aws/serverless-application-model

ホットリロードの機能がついているので、開発が楽そう CLIでのデプロイが可能

アーキテクチャパターンから知る AWS Amplify 活用法

AWS Amplifyとは バックエンドを強く意識する必要をなくし、webアプリケーションの実装・インフラの構築・デプロイ

Amplifyライブラリ エンドポイントのパス名を指定すれば、そのエンドポイントを叩くことができる RTK-Query的なやつ

Amplify CLI API用のバックエンドをインタラクティブに構築できる

Amplify Console

Amplify Admin UI AWSアカウントとは別の認証システムを利用しているため、AWSを利用していないユーザーも利用可

ソーシャルメディアアプリケーションを構築してみる ホスティング →Amplify Console

Amazon Cognito 認証認可をサポート

AWS AppSync フルマネージドGraphQLサービス

Amazon Pinpointを活用したECサイト

Amplify CLIを利用しない場合 * AWS CloudFormationを利用して、エンドポイントを手動で設定

インターネット・アプリケーション構築時に押さえておきたい AWS エッジネットワークサービスユースケースのご紹介

cloudfrontのハンズオンは用意されている!

今日からはじめる! AWS のデータベースと最適なサービスの選び方

purpose builtの思想

Documentデータベース Amazon DocumentDB jsonライクなドキュメントを保存することができる (jsonRDBMSに添う形で変換する必要がなくなる)

インメモリデータベース 短い応答時間でデータの読み書きをしたい Amazon ElastiCache

グラフデータベース データ間を相互に結びつける。例:レコメンド機能、SNSニュースフィード Amazon Neptune

時系列データベース 時間がPRIMAY KEY、定期データを格納して正常異常を判断するなど Amazon Timestream

台帳データベース データの変更履歴はイミュータブルに 口座の取引履歴などに利用 Amazon QLDB

phpの罠

phpの罠

Qiitaに載せるまででもない話なので、ブログの方に書きます

nullや空文字にインクリメントすると。。。

普通、nullや空文字にインクリメント処理をすると、エラーが起きると思いません?(私は思ってました)
でも、phpは違います。

Interactive shell

php > $null = null;
php > echo $null;
php > $null++;
php > echo $null;
1

えっ、なんでなん!!??

Interactive shell

php > $empty = '';
php > echo $empty;
php > $empty++;
php > echo $empty;
1

えっ、なんでなん!!??(2回目)

php、怖いわ。。。
予期せぬバグが生まれる原因がわかった気がします。

MySQL 構文・文法などのまとめ

こんにちは、ヒロアキです。 今回は、MySQLの構文・文法のまとめ記事を書いていきます。 引き続き、ただの自分用メモでもありますので、記法が統一されていないのでご了承ください。笑


mysql 操作まとめ

・実行順序と構文
実行
FROM → WHERE → GROUPBY → HAVING → SELECT → ORDERBY
構文
SELECT → FROM → WHERE → GROUPBY → HAVING → ORDERBY

・サーバー接続方法
(rootユーザー)mysql -u root -p

・ユーザー確認
use mysql;
→select user , host from user;  登録されているユーザーの確認
→show grants for ‘user_name’@’host’;  ワイルドカードは%

・文字化けの防止
SET NAMES utf8;

・データベース作成
create database db_name;

・データベース作成
drop database db_name;
→テーブルなら、databaseをtableに変更する

・テーブル作成

use *db_name*;
create table *table_name* (
id int not null auto_increment primary key,
title varchar(255) not null,
price int not null
);

※カラムの型などは別途調べる

・テーブル変更

-- カラムの追加
alter table *table_name* add *追加するカラム* *データ型* after *columns*;

-- カラム名変更
alter table *table_name* change *old_name* *new_name* *データ型*;

-- カラム削除
alter table *table_name* drop *columns*;

・データ登録(この例では2件)
INSERT INTO ‘table_name’ (columnA, columnB, columnC) VALUES (A1, B1, C1), (A2, B2, C2);

・データ更新

update
'table_name'
set 'columns_name' = update_thing 
where 更新対象のレコードの絞り込み;
-- where句を複数使いたい時は、andを使う
-- Ex. where ~ and ~ and ~;
-- サブクエリも使用可

・データ削除
delete from table_name where 削除対象のレコードの絞り込み

・ファイルからSQLを読み込む
source file_name

・database確認方法
show databases;

・データベース選択
use database_name;

・バージョン確認
select version();

・テーブル確認
show tables from database_name;

・インデックス確認
show INDEX from table_name;
 →EXPLAIN をselect文の先頭につけると、インデックスが機能しているか確認できる

・カラムの確認
show columns from table_name;
  →データベース名から指定もあり
  show columns from table_name from database_name;

・カラムに別名をつける
select columns as 別名 from table_name;
 →asで別名をつけた場合、その別名でクエリを書かないとエラーになる

・指定した値が含まれているかどうか

-- 含まれている
select *columns* from *table_name* where 調べたい値のあるカラム in(*int*);

-- 含まれていない
select *columns* from *table_name* where 調べたい値のあるカラム not in(*int*);

・特定文字列を調べたい時
select columns from tables where 調べたいカラム like ‘文字列’;
  →「’文字列’」の部分は、「%」、「」というワイルドカードが使用可能
  →’%’は0文字以上の任意の文字列、’
’は1文字の任意の文字列

・取得件数を制限する
select columns from tables limit int;

・集約関数いろいろ

-- 合計値
select sum(*columns*) from *tables* where 合計値を知りたいレコードの絞り込み;

-- 平均
select avg(*columns*) from *tables* where 平均値を知りたいレコードの絞り込み;

-- 最小値、最大値
select min(*columns*) from *tables* where 最小値を知りたいレコードの絞り込み;
select max(*columns*) from *tables* where 最大値を知りたいレコードの絞り込み;

集約関数では、基本的にnullは無視される

・文字列検索 ある文字数以上(以下)のレコードを知りたい
select columns from tables where char_length(columns) >= 文字数;
 char_length()の中のカラム名にはクォーテーションをつけない

・対象レコードの数を調べる
select count(columns) from tables where 調べたいレコードを絞り込む;

-- 重複を排除する(下記は1000円以下の商品が何種類あるか、最高料金はいくらか)
Ex. select count(distinct price), max(price) from products where price < 1000;

・データの集計をグループ毎におこなう
select columns from tables group by グループにしたいカラム;
  →例えば
   select organization_id, sum(login_num) from user group by organization_id;
   とするとorganization_id毎のlogin_numが表示される。

・集計したグループに条件式を使う
select columns from tables group by グループにしたいカラム having 条件式;
 →whereとの違いは、グループにしたカラムに対してのみ条件式を指定できる

-- OK
select A, B from db where C > 100 group by D;
select A, B from db group by D having B > 10;

-- NG
select A, B from db group by D having C > 10;

・逆順で表示(カラム1を降順にしたい)
select columns_1,columns_2 from tables order by columns_1 desc;
 →昇順だと以下の通り
  select columns_1,columns_2 from tables order by columns_1 asc;

・unionによる和結合
 →inner joinなどは、テーブルを結合させて自テーブルには無いレコードも出力できるようにする方法。unionは、テーブルを結合させて出力結果を増やす(=データソースを増やす)。
  重複分を表示させるには、union allとする
例:admin_usersとusersテーブルをunionする

select name, email from admin_users
union
select name, email from users;

・内部結合(ベン図で言う両方の要素をもつ部分)
例:productsテーブルとstoresテーブルを結合させて、「店舗名・商品名・1000円以上の価格」の情報を取得
 →productsテーブルにとって、store_idは外部キー。
  storesテーブルにとってはそれが主キー。

select
s.name,
p.product_name,
p.price
from
products as p
inner join
stores as s
on 
p.store_id = s.id
where
p.price > 1000;

・外部結合(ベン図で言う片方の円のこと。もう片方と合わさらない箇所はNULL)
 参考:https://qiita.com/devopsCoordinator/items/3ba154429973a4ddc9e0 など
例:ordersテーブルとcustomersテーブルを結合させて、「顧客名(1, 2)・配達日・顧客Eメール」の情報を取得

select
c.id,
c.name1,
c.name2,
o.customer_id,
o.delivery_date,
o.customer_email
FROM
orders as o
right outer join -- left outer joinとすると、ordersテーブルがマスタテーブル
customers as c
on o.customer_id = c.id
group by c.id;

内部結合も外部結合も、3つ以上結合する時は、on〜の後にinner join〜などと続ける。

・もしも値がNULLなら〜に変更する
例:company_idがNULLなら0にする

select  
c.id,
case
    when c.company_id is NULL then 0
    else c.company_id
end company_id
from
customers as c;

・case文(条件分岐)
出力結果を条件分岐させたい時に使用する
例:2017年以降に注文してくれた顧客を優良顧客に、2017年〜2016年に注文してくれた顧客をメルマガ送付対象に、それ以外をノーアクティブに分けたい。

select
c.id as customerID,
c.name1,
c.name2,
case
    when o.delivery_date > '2016-12-31' then '優良顧客'
    when o.delivery_date > '2015-12-31' then 'メルマガ送付対象'
    else 'ノーアクティブ'
end as '顧客ランク' -- このendは忘れやすい。名前を付与しないとカラム名は「case」になる
from
orders as o
inner join
customers as c
on
o.customer_id = c.id
group by
c.id
order by c.id asc;

・サブクエリ
ある問い合わせに基づいて、異なる問い合わせをおこなう
例:最も高額な商品の「店舗ID・商品名」を出力する

select
store_id,
product_name
from
products
where
price in(
    select
    max(price)
    from
    products
    );

※max(price)は通常where句に使用できない
※サブクエリ内のカラムやテーブル名に別名をつける際は、別途指定する必要がある

mysqlサーバーの確認
sudo service mysqld status

mysqlサーバーの自動起動
sudo chkconfig mysqld on

mysqlサーバーの起動
sudo service mysqld start

mysqlサーバーの自動起動の確認(2〜5がon)
sudo chkconfig --list mysqld

・エクスポート、インポート(CSV含む)
こちらを参照 → https://normalblog.net/system/mysql_matome/

・正規化
DBで保持するデータの冗長性を排除し、一貫性と効率性を保持するデータ形式にすること

・主キー
プライマリーキー。1つの行を特定できる列のこと。

・外部キー
フォーリンキー。他テーブルとの関連づけに使う列のこと。 関連づけられた先のテーブルでは主キーになる。

・リレーションシップ
一対多
ユーザー : 注文
ブログ主 : 投稿記事
注文 : 注文明細
部署 : 従業員

多対多(中間テーブルがあることを想像すると分かりやすい)
商品 : 商品カテゴリー
投稿記事 : 記事カテゴリー
ユーザー : 操作権限

一対一(操作権限がある人しか見れないようにする際などに使用)
ユーザー : 電話番号