動かざることバグの如し

近づきたいよ 君の理想に

AWS ECRにDockerイメージをPrivateにPushする

ECRって馴染み無いからなんだろうけど、公式サイトが「Amazon ECR レジストリ」って謳ってるのなんかウケる

概要

FargateにデプロイするにあたってAWSにコンテナをPushする必要がでてきたのでメモ

ちょうどタイムリーにPublic Registoryもリリースしてたしね

www.publickey1.jp

ゴールとしては docker push してAWS ECRにpushできるようにしたい

やり方

まずはAWSのアカウントはあるものとする

まずはAWSのリージョンを決める。今回はap-northeast-1にしておく。あとはレポジトリ名も決めておく。粒度がいまいちわかってないけどコンテナ名1つにつき1レポジトリになるはず。(1レポジトリには異なるタグでしか複数登録できない)

リージョンとレポジトリ名は頻出するので環境変数にセットしておく

export AWS_REGION=ap-northeast-1
export AWS_REPOSITORY_NAME=sample

まずはレポジトリの作成

aws ecr create-repository --repository-name ${AWS_REPOSITORY_NAME} --region ${AWS_REGION}

作成したレポジトリを見てみる

aws ecr describe-repositories --region ${AWS_REGION}

以下のように表示されれば正常に作成されている

{
    "repositories": [
        {
            "repositoryArn": "arn:aws:ecr:ap-northeast-1:173603934556:repository/sample",
            "registryId": "xxxxxxxxxxxxxxxx",
            "repositoryName": "sample",
            "repositoryUri": "xxxxxxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/sample",
            "createdAt": "2020-12-29T23:37:55+09:00",
            "imageTagMutability": "MUTABLE",
            "imageScanningConfiguration": {
                "scanOnPush": false
            },
            "encryptionConfiguration": {
                "encryptionType": "AES256"
            }
        }
    ]
}

結果の registryId ってのが今後使うので、こいつも環境変数にセットしておく

export AWS_REGISTRY_ID=xxxxxxxxxxx

次にdocker pushできるようにdockerコマンドにAWSのログイン情報を紐付ける。

aws ecr get-login-password --region | docker login --username AWS --password-stdin ${AWS_REGISTRY_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com

aws ecr get-login-password --region でログイン用のハッシュ?が生成されるのでそれを標準入力でdocker loginする形。

実際にpushしてみる

テスト用に簡単なDockerfileを用意する

FROM alpine
CMD ["echo", "nyaa"]

でECRにpushできるようにタグを付けてビルド

docker build -t ${REGISTRY_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${AWS_REPOSITORY_NAME}:latest .

念の為動作確認

docker run --rm ${REGISTRY_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${AWS_REPOSITORY_NAME}

いざpush

docker push ${AWS_REGISTRY_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${AWS_REPOSITORY_NAME}

イメージの確認

aws ecr list-images --repository-name ${AWS_REPOSITORY_NAME} --region ${AWS_REGION}

うまくいけばこれでpushできるはず。やったね

参考リンク

NFSマウント時の最強オプション晒す

まあタイトルは嘘で、AWSとか大御書の推奨オプションをメモするだけ(

AWS

rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport

マウントに関する追加の考慮事項 - Amazon Elastic File Systemに記載されている。

  • rsize=1048576 – 各ネットワーク読み取りリクエストに対して NFS クライアントが受信できるデータの最大バイト数を設定します。この値は、EFS ファイルシステム上のファイルからデータを読み取る際に適用されます。パフォーマンスが低下しないように、可能な限り大きいサイズ (最大 1048576) を使用することをお勧めします。
  • wsize=1048576 – 各ネットワーク書き込みリクエストに対して NFS クライアントが送信できるデータの最大バイト数を設定します。この値は、EFS ファイルシステム上のファイルにデータを書き込む際に適用されます。パフォーマンスが低下しないように、可能な限り大きいサイズ (最大 1048576) を使用することをお勧めします。
  • hard – NFS リクエストがタイムアウトした後の NFS クライアントのリカバリ動作を設定します。これにより、NFS リクエストは、サーバーが応答するまで無期限に再試行されます。データの整合性を確保できるように、ハードマウントオプション (hard) を使用することをお勧めします。soft マウントを使用している場合は、timeo パラメータを 150 デシ秒 (15 秒) 以上に設定してください。これにより、ソフトマウントに固有のデータ破損が生じるリスクを最小限に抑えることができます。
  • timeo=600 – NFS クライアントがレスポンスを待機するのに要するタイムアウト値を設定してから、NFS リクエストを 600 デシ秒 (60 秒) に設定します。タイムアウトパラメータ (timeo) を変更する必要がある場合は、少なくとも 150 の値を使用することをお勧めします。これは 15 秒に相当します。これにより、パフォーマンスの低下を抑えることができます。
  • retrans=2 – NFS クライアントでリカバリアクションを試行する前に、そのアクションのリクエスト試行回数を 2 回に設定します。
  • noresvport – ネットワーク接続が再確立された時に、新しい Transmission Control Protocol (TCP) 送信元ポートを使用するように、NFS クライアントに指示します。これにより、ネットワーク復旧イベント後、EFS ファイルシステムでの中断のない可用性が保証されます。
  • _netdev – /etc/fstab に存在する場合、クライアントは、ネットワークが有効になるまで、EFS ファイルシステムをマウントすることはできません。

Alibaba Cloud

vers=4.0,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport

Linux で NFS ファイルシステムをマウントする - ファイルシステムのマウント| Alibaba Cloud ドキュメントセンター

AWSとバージョンの指定有無しか違いなかった。もうこれで確定じゃん

Mac OSでフォーマットできないデバイスを初期化する

GUIでさっくりできるようにしろ令和だぞ

概要

Mac OSには標準で「ディスクユーティリティ」というディスク管理ツールがある。内蔵/外付けのディスクやUSBメモリGUIでフォーマットできるアプリで、Windowsでいうディスクの管理にあたる。

が、LinuxのUSBインストーラー用に改造したUSBメモリとかだと正常に初期化できなかったりする。そこでコマンドツールで無理やり初期化する。

やり方

まずは diskutil list でディスクの一覧表示。ここで初期化したい対象のディスクのパスを控えておく。今回は「/dev/disk2」

diskutil list


/dev/disk1 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +960.0 GB   disk1
                                 Physical Store disk0s2
   1:                APFS Volume MacOS                   107.4 GB   disk1s1
   2:                APFS Volume Preboot                 23.1 MB    disk1s2
   3:                APFS Volume Recovery                515.1 MB   disk1s3
   4:                APFS Volume VM                      4.3 GB     disk1s4

/dev/disk2 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *16.0 GB    disk2
   1:             Windows_FAT_32 boot                    268.4 MB   disk2s1
   2:                      Linux                         15.7 GB    disk2s2

いざ初期化。当然だがデータが全部飛ぶので注意。

diskutil eraseDisk free MYDISK /dev/disk2

Fat32形式でフォーマットする場合は以下

diskutil eraseDisk FAT32 MYDISK /dev/disk2

で、どの形式でフォーマットできるのか調べたいときは以下

diskutil listFilesystems
Formattable file systems

These file system personalities can be used for erasing and partitioning.
When specifying a personality as a parameter to a verb, case is not considered.
Certain common aliases (also case-insensitive) are listed below as well.

-------------------------------------------------------------------------------
PERSONALITY                     USER VISIBLE NAME
-------------------------------------------------------------------------------
APFS                            APFS
  (or) APFSI
Case-sensitive APFS             APFS (Case-sensitive)
ExFAT                           ExFAT
MS-DOS                          MS-DOS (FAT)
MS-DOS FAT12                    MS-DOS (FAT12)
MS-DOS FAT16                    MS-DOS (FAT16)
MS-DOS FAT32                    MS-DOS (FAT32)
  (or) FAT32
HFS+                            Mac OS Extended
Case-sensitive HFS+             Mac OS Extended (Case-sensitive)
  (or) HFSX
Case-sensitive Journaled HFS+   Mac OS Extended (Case-sensitive, Journaled)
  (or) JHFSX
Journaled HFS+                  Mac OS Extended (Journaled)
  (or) JHFS+
Free Space                      空き領域
  (or) FREE

Chrome拡張機能で現在のタブのURLを取得する

環境

manifest v2

コード

chrome.tabs.query({'active': true, 'lastFocusedWindow': true}, tabs => {
  const url = tabs[0].url
  alert(url)
})

backgrond.jsとかpopup.jsとかで使える。

tabsって入ってるからパーミッションに「Tabs」必須かなと思ったけどURL取得だけならいらないっぽい

参考リンク

Chrome拡張機能で現在のタブのURLを取得する

環境

manifest v2

コード

chrome.tabs.query({'active': true, 'lastFocusedWindow': true}, tabs => {
  const url = tabs[0].url
  alert(url)
})

backgrond.jsとかpopup.jsとかで使える。

tabsって入ってるからパーミッションに「Tabs」必須かなと思ったけどURL取得だけならいらないっぽい

参考リンク