年末年始にやってみたチュートリアルまとめ

2021-2022の年末年始にやってみたチュートリアルのまとめ。

普段使っている技術の学び直し。

|キーワード|やってみたチュートリアル|感想|
|----|----|----|
|git|[たぶんもう怖くないgit〜git内部の仕組み〜](https://qiita.com/marchin_1989/items/2ec01553e907f3a9e6bb)|gitを使うエンジニア必読|
|DynamoDB|[Amazon DynamoDB Developer Guide](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide)|本家のチュートリアル。GSIについて理解できた。|
|ECS,Fargate|[Introduction to Amazon ECS](https://catalog.us-east-1.prod.workshops.aws/v2/workshops/a2b9971a-7a6e-40f3-96e7-5a04b46d1f98/ja-JP/)|本家のチュートリアル。マネコンから設定はよく分かった。|
|Docker|[イラストでわかるDockerとKubernetes](https://www.amazon.co.jp/イラストでわかるDockerとKubernetes-Software-Design-plus-徳永/dp/4297118378/)|CRIやOCIのことが書いてあって内部の理解に役立つ|

# メモ

## たぶんもう怖くないgit

gitの内部の仕組みがとてもわかりやすく説明してあった。gitを使うエンジニアは必読だと思う。

githubのプルリクを行うと内部的に何が行われているか、追加で調べてみた。

### 準備
ローカル、リモート共にmainブランチにはhello.txtが、b1ブランチにはbye.txtがcommitされている状態を作る。

githubにREADME.mdだけ存在するレポジトリを作る

リモートレポジトリをcloneする

```bash
git clone https://github.com/xxxxx/test0001.git
cd test0001
% find .git/objects -type f -print0 | xargs -0 ls -alt        
-r--r--r--  1 s  staff  1156  1  2 19:22 .git/objects/pack/pack-32128797de6af3bfa53bb992f5255d8d528568de.idx
-r--r--r--  1 s  staff   605  1  2 19:22 .git/objects/pack/pack-32128797de6af3bfa53bb992f5255d8d528568de.pack
```

ローカルにb1ブランチを作成、b1.txtをcommitして、リモートにPUSH。

```bash
% git checkout -b b1
Switched to a new branch 'b1'
% echo b1 > b1.txt
% git add b1.txt 
% git commit -m 'add b1.txt'
% find .git/objects -type f -print0 | xargs -0 ls -alt        
-r--r--r--  1 s  staff   162  1  2 19:23 .git/objects/02/2988e6247703f5339613a7700e6986b6ad093e
-r--r--r--  1 s  staff    84  1  2 19:23 .git/objects/1a/81b069cc0395b22b23f02bec94f54d6983bf6f
-r--r--r--  1 s  staff    18  1  2 19:23 .git/objects/c9/c6af7f78bc47490dbf3e822cf2f3c24d4b9061

-r--r--r--  1 s  staff  1156  1  2 19:22 .git/objects/pack/pack-32128797de6af3bfa53bb992f5255d8d528568de.idx
-r--r--r--  1 s  staff   605  1  2 19:22 .git/objects/pack/pack-32128797de6af3bfa53bb992f5255d8d528568de.pack
% git push origin b1
```

ローカルのmainブランチに、main.txtをcommitして、リモートにPUSH。

```bash
% git checkout main
Switched to branch 'main'
Your branch is up to date with 'origin/main'.
% echo main > main.txt
% git add main.txt 
% git commit -m 'add main.txt'
% find .git/objects -type f -print0 | xargs -0 ls -alt        
-r--r--r--  1 s  staff   164  1  2 19:24 .git/objects/98/5359104355b21885eb536a27bb1e24ce737d5a
-r--r--r--  1 s  staff    86  1  2 19:24 .git/objects/13/b990074561f57492fd5b54ab6774f9394da3b5
-r--r--r--  1 s  staff    20  1  2 19:24 .git/objects/ba/2906d0666cf726c7eaadd2cd3db615dedfdf3a

-r--r--r--  1 s  staff   162  1  2 19:23 .git/objects/02/2988e6247703f5339613a7700e6986b6ad093e
-r--r--r--  1 s  staff    84  1  2 19:23 .git/objects/1a/81b069cc0395b22b23f02bec94f54d6983bf6f
-r--r--r--  1 s  staff    18  1  2 19:23 .git/objects/c9/c6af7f78bc47490dbf3e822cf2f3c24d4b9061

-r--r--r--  1 s  staff  1156  1  2 19:22 .git/objects/pack/pack-32128797de6af3bfa53bb992f5255d8d528568de.idx
-r--r--r--  1 s  staff   605  1  2 19:22 .git/objects/pack/pack-32128797de6af3bfa53bb992f5255d8d528568de.pack
% git push origin main
```

リモートからFetch。ローカルからPUSHしたものだけなので変化なし。

```bash
% git fetch
% find .git/objects -type f -print0 | xargs -0 ls -alt 
-r--r--r--  1 s  staff   164  1  2 19:24 .git/objects/98/5359104355b21885eb536a27bb1e24ce737d5a
-r--r--r--  1 s  staff    86  1  2 19:24 .git/objects/13/b990074561f57492fd5b54ab6774f9394da3b5
-r--r--r--  1 s  staff    20  1  2 19:24 .git/objects/ba/2906d0666cf726c7eaadd2cd3db615dedfdf3a

-r--r--r--  1 s  staff   162  1  2 19:23 .git/objects/02/2988e6247703f5339613a7700e6986b6ad093e
-r--r--r--  1 s  staff    84  1  2 19:23 .git/objects/1a/81b069cc0395b22b23f02bec94f54d6983bf6f
-r--r--r--  1 s  staff    18  1  2 19:23 .git/objects/c9/c6af7f78bc47490dbf3e822cf2f3c24d4b9061

-r--r--r--  1 s  staff  1156  1  2 19:22 .git/objects/pack/pack-32128797de6af3bfa53bb992f5255d8d528568de.idx
-r--r--r--  1 s  staff   605  1  2 19:22 .git/objects/pack/pack-32128797de6af3bfa53bb992f5255d8d528568de.pack
```

### プルリク

github上でb1 -> mainのプルリクエストを作成してマージ。

その後、リモートからFetchしてみる。

```bash
% git fetch
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 2 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (2/2), 721 bytes | 360.00 KiB/s, done.
From https://github.com/xxxxx/test0001
   9853591..3075afa  main       -> origin/main
% find .git/objects -type f -print0 | xargs -0 ls -alt 
-r--r--r--  1 s  staff   114  1  2 19:32 .git/objects/22/e851343c5dc64155ffec8d1bb9c2aad9006813
-r--r--r--  1 s  staff   607  1  2 19:32 .git/objects/30/75afa328960e169f789142caa90fb8b1a4fdbc

-r--r--r--  1 s  staff   164  1  2 19:24 .git/objects/98/5359104355b21885eb536a27bb1e24ce737d5a
-r--r--r--  1 s  staff    86  1  2 19:24 .git/objects/13/b990074561f57492fd5b54ab6774f9394da3b5
-r--r--r--  1 s  staff    20  1  2 19:24 .git/objects/ba/2906d0666cf726c7eaadd2cd3db615dedfdf3a

-r--r--r--  1 s  staff   162  1  2 19:23 .git/objects/02/2988e6247703f5339613a7700e6986b6ad093e
-r--r--r--  1 s  staff    84  1  2 19:23 .git/objects/1a/81b069cc0395b22b23f02bec94f54d6983bf6f
-r--r--r--  1 s  staff    18  1  2 19:23 .git/objects/c9/c6af7f78bc47490dbf3e822cf2f3c24d4b9061

-r--r--r--  1 s  staff  1156  1  2 19:22 .git/objects/pack/pack-32128797de6af3bfa53bb992f5255d8d528568de.idx
-r--r--r--  1 s  staff   605  1  2 19:22 .git/objects/pack/pack-32128797de6af3bfa53bb992f5255d8d528568de.pack
```

gitオブジェクトが二つ増えている。
github上でmainブランチとb1ブランチのmergeが行われたことによって生成されたもの。
ひとつはtreeオブジェクト。main.txtとb1.txtの両方が入ったtreeオブジェクトが新規作成されている。
もう一つはcommitオブジェクト。commiterはGitHubとなっている。親commitオブジェクトはマージ元とマージ先のcommitオブジェクトになっている。
これで、githubでのプルリクとマージで何が行われているかが分かった。

```bash
% git cat-file -p 22e8
100644 blob f696506eb0d12c05a75d076a4a4e47b8f9723baa	README.md
100644 blob c9c6af7f78bc47490dbf3e822cf2f3c24d4b9061	b1.txt
100644 blob ba2906d0666cf726c7eaadd2cd3db615dedfdf3a	main.txt

% git cat-file -p 3075
tree 22e851343c5dc64155ffec8d1bb9c2aad9006813
parent 985359104355b21885eb536a27bb1e24ce737d5a
parent 022988e6247703f5339613a7700e6986b6ad093e
author xxxxx <xxxxxx@gmail.com> 1641119532 +0900
committer GitHub <noreply@github.com> 1641119532 +0900
gpgsig -----BEGIN PGP SIGNATURE-----
　...
  -----END PGP SIGNATURE-----
 

Merge pull request #1 from xxxxx/b1

add b1.txt%  
```

最後にfetchした内容をマージ。ここからはgithubは関係なく、ローカルのgitの動作。

merge前。まだmainブランチのheadはマージ前のcommitオブジェクトを指している。

```bash
% git branch
  b1
* main
% cat .git/HEAD           
ref: refs/heads/main
% cat .git/refs/heads/main 
985359104355b21885eb536a27bb1e24ce737d5a
```

merge後。mainブランチのheadはfetchしたcommitオブジェクトを指すようになっている。
b1.txtファイルが追加されている。

```bash
% git merge
Updating 9853591..3075afa
Fast-forward
 b1.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 b1.txt
% cat .git/HEAD           
ref: refs/heads/main
% cat .git/refs/heads/main
3075afa328960e169f789142caa90fb8b1a4fdbc
```

## Introduction to Amazon ECS

- Fargateではポートマッピングがホストと同じポートじゃないとできない（異なるポートでマッピングできるのはネットワークタイプがbridgeの時だけ。Fargateはbridgeに対応していない）
- Cloud9を使ってDockerイメージを作ってレジストリにPUSHするところを、ローカルのMacでやってみた
  - Apple Siliconなので、dockerビルドするイメージはARM用。そこでdocker buildxを使ってクロスコンパイルしたものをECRにPUSHした。
  - ARM版のイメージをPUSHして、gravitonで実行してみたかったが、マネコンからの設定では選択できなかった。なぜだ？

docker buildxの使い方は下記にメモ。

https://qiita.com/kizitorashiro/items/201889dbdd8f8af8d812#apple-silicon環境の場合