labunix's blog

labunixのラボUnix

former2のdocker版を使ってみる。

■former2のdocker版を使ってみる。

 Web版は以下。
 ReadOnlyAccessとはいえ、エラーは出るしアクセスキーとシークレットキーを必要とするので、
 まずはdocker版から確認してみる。
 https://former2.com/

■IAMグループ「former2」を作成して、「ReadOnlyAccess」のAWS1管理ポリシーを付与

 ユーザやグループに適用する前にAWSが用意するポリシー名を検索してみる。
 https://labunix.hateblo.jp/entry/20201223/1608723093

$ ./aws-policy-search ^readonly
ReadOnlyAccess

$ aws iam get-policy --policy-arn arn:aws:iam::aws:policy/ReadOnlyAccess | \
    sed -e 's/[A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9]/XXXX/g'
{
    "Policy": {
        "PolicyName": "ReadOnlyAccess",
        "PolicyId": "XXXXXXXXXXXXXXXXXXXXQ",
        "Arn": "arn:aws:iam::aws:policy/ReadOnlyAccess",
        "Path": "/",
        "DefaultVersionId": "v74",
        "AttachmentCount": 1,
        "PermissionsBoundaryUsageCount": 0,
        "IsAttachable": true,
        "Description": "Provides read-only access to AWS services and resources.",
        "CreateDate": "XXXX-02-XXXX8:39:48+00:00",
        "UpdateDate": "XXXX-03-XXXX1:35:15+00:00"
    }
}

$ aws iam create-group --group-name former2
$ aws iam list-groups | jq '.Groups[] | select( .GroupName | test("former2"))' | \
    sed -e 's/[A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9]/XXXX/g'
{
  "Path": "/",
  "GroupName": "former2",
  "GroupId": "XXXXXXXXXXXXXXXXXXXXR",
  "Arn": "arn:aws:iam::XXXXXXXXXXXX:group/former2",
  "CreateDate": "XXXX-04-XXXX9:09:02+00:00"
}

$ aws iam attach-group-policy --group-name former2 \
    --policy-arn arn:aws:iam::aws:policy/ReadOnlyAccess

$ aws iam list-attached-group-policies --group-name former2
{
    "AttachedPolicies": [
        {
            "PolicyName": "ReadOnlyAccess",
            "PolicyArn": "arn:aws:iam::aws:policy/ReadOnlyAccess"
        }
    ]
}

■以下3つのユーザを作成し、「former2」グループに追加する。
 former2-local :ローカルのdocker用
 former2-aws	:AWS上のdocker用
 former2-web	:former2公式サイト用

$ aws iam create-user --user-name former2-local --tags Key=CFn,Value=
$ echo -e "former2-aws\nformer2-web" | awk '{print "aws iam create-user --user-name "$1}' | sh

$ aws iam list-users | jq -r '.Users[] | select( .UserName | test("former2*"))' \
    | sed -e 's/[A-Z0-9][A-Z0-9]/XX/g'          
{
  "Path": "/",
  "UserName": "former2-aws",
  "UserId": "XXXXXXXXXXXXXXXXXXXXO",
  "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/former2-aws",
  "CreateDate": "XXXX-XX-XXXX9:XX:XX+XX:XX"
}
{
  "Path": "/",
  "UserName": "former2-local",
  "UserId": "XXXXXXXXXXXXXXXXXXXXI",
  "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/former2-local",
  "CreateDate": "XXXX-XX-XXXX9:XX:XX+XX:XX"
}
{
  "Path": "/",
  "UserName": "former2-web",
  "UserId": "XXXXXXXXXXXXXXXXXXXXX",
  "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/former2-web",
  "CreateDate": "XXXX-XX-XXXX9:XX:XX+XX:XX"
}

$ aws iam add-user-to-group --user-name former2-local --group-name former2
$ echo -e "former2-aws\nformer2-web" | \
    awk '{print "aws iam add-user-to-group --user-name "$1" --group-name former2"}' | sh

$ echo -e "former2-local\nformer2-aws\nformer2-web" | \
    awk '{print "echo -n \042"$1"\t\042;aws iam list-groups-for-user --user-name",$1,"| jq -r \047.Groups[].GroupName\047"}' | sh
former2-local	former2
former2-aws	former2
former2-web	former2

■プログラムによるアクセスのためにアクセスキーを作成

$ echo -e "former2-local\nformer2-aws\nformer2-web" | \
    awk '{print "aws iam create-access-key --user-name "$1" > "$1".access-key"}' | sh

$ ls *.access-key | \
   awk '{print "cat "$1" | jq -r -c \047.AccessKey | [ .UserName, .AccessKeyId, .SecretAccessKey ]\047"}' | sh | \
   awk -F\" '{OFS="\042";gsub("[A-Z0-9]","X",$4);gsub("[A-Za-z0-9]","X",$6);print $0}'
["former2-aws","XXXXXXXXXXXXXXXXXXXX","XXXXX/XXXXXXXXXX+XXXXX/XXXXXXXXXXXXXXXXX"]
["former2-local","XXXXXXXXXXXXXXXXXXXX","+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"]
["former2-web","XXXXXXXXXXXXXXXXXXXX","XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX+XX"]

■今回は使わないが、コンソールからアクセスするパスワードが必要なら以下で設定
 ※コンソールへのログインはパスワードを必要とするため、
  「ユーザーはコンソールへの管理アクセスを許可されていません」の状態

$ username="XXXXXX";password="XXXXXX"; \
  aws iam create-login-profile \
    --user-name ${username} \
    --password ''${password}'' \
    --password-reset-required

■dockerの関連パッケージの確認

 Install Docker and Docker Compose on Debian 10 Buster
 https://computingforgeeks.com/install-docker-and-docker-compose-on-debian-10-buster/

$ dpkg -l | awk '$1 ~ /ii/&& $2 ~ /docker/{print $2,$3,$4}'
docker.io 18.09.1+dfsg1-7.1+deb10u3 amd64
golang-docker-credential-helpers 0.6.1-2 amd64
python3-docker 3.4.1-4 all
python3-dockerpty 0.4.1-1 all
python3-dockerpycreds 0.3.0-1 all

■former2の公式のdockerイメージは無い。

$ docker search former2
NAME                       DESCRIPTION         STARS               OFFICIAL            AUTOMATED
former2/former2                                0                                       
packetchef/former2_local                       0                                       
nyatasu/former2                                0                           

■fomer2のdockerイメージをgitから取得、80から8000に待ち受けポートを変更して起動
 ※docker-composeは使わない。

$ git clone https://github.com/iann0036/former2.git
$ cd former2;ls *.yml | awk '{print "echo \042["$0"]\042;cat "$0}' | sh
[docker-compose.yml]
version: '3'
services:
  former2:
    image: nginx:1.17.8-alpine
    ports:
      - "127.0.0.1:80:80"
    volumes:
    - .:/usr/share/nginx/html

$ cat Dockerfile
# docker build -t former2_local:1.0 .
# docker run --name former2 -p $host_port:80 -d former2_local:1.0

FROM nginx:1.15
COPY . /usr/share/nginx/html


$ docker build -t former2_local:1.0 .
Sending build context to Docker daemon  221.2MB
Step 1/2 : FROM nginx:1.15
1.15: Pulling from library/nginx
743f2d6c1f65: Pull complete 
6bfc4ec4420a: Pull complete 
688a776db95f: Pull complete 
Digest: sha256:23b4dcdf0d34d4a129755fc6f52e1c6e23bb34ea011b315d87e193033bcd1b68
Status: Downloaded newer image for nginx:1.15
 ---> 53f3fd8007f7
Step 2/2 : COPY . /usr/share/nginx/html
 ---> 2a6d7d477ed4
Successfully built 2a6d7d477ed4
Successfully tagged former2_local:1.0

$ docker images -a
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
former2_local       1.0                 2a6d7d477ed4        3 seconds ago       326MB
nginx               1.15                53f3fd8007f7        23 months ago       109MB

$ host_port=8000; docker run --name former2 -p $host_port:80 -d former2_local:1.0
bfe622d207ea3a2e8cdd4ab90731e21755eacb94da12660f8b65aaa824785db8

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
bfe622d207ea        former2_local:1.0   "nginx -g 'daemon of…"   7 seconds ago       Up 5 seconds        0.0.0.0:8000->80/tcp   former2

■余談、どうしても「127.0.0.1:8000」とかにして、
 他ホストから一時アクセスをする場合はsocatを使う。
 8080で待ち受けて127.0.0.1:8000に渡す例
 ※終了時は[Ctrl]+[c]で止める。

$ socat TCP4-LISTEN:8080,fork TCP4:127.0.0.1:8000

■Chrome用の機能拡張[Former2 Helper]をインストール
 アクセスキーとシークレットキーで認証
 CFn用に出力が終わったら後片付け

■アクセスキーがいつ使われたか確認
 ※時刻はGMTなので、+9時間

$ aws iam get-access-key-last-used \
    --access-key-id $(aws iam list-access-keys --user-name former2-local | jq -r '.AccessKeyMetadata[].AccessKeyId')
{
    "UserName": "former2-local",
    "AccessKeyLastUsed": {
        "LastUsedDate": "2021-04-06T21:14:00+00:00",
        "ServiceName": "globalaccelerator",
        "Region": "us-west-2"
    }
}

■アクセスキーを無効化してログイン出来ないことを確認

$ aws iam update-access-key --user-name former2-local --status Inactive \
    --access-key-id $(aws iam list-access-keys --user-name former2-local | jq -r '.AccessKeyMetadata[].AccessKeyId')

$ aws iam list-access-keys --user-name former2-local | jq -r -c '.AccessKeyMetadata[] | [ .Status, .SecretAccessKey ]'
["Inactive",null]

■アクセスキーを再有効化するときは。

$ aws iam update-access-key --user-name former2-local --status Active \       
    --access-key-id $(aws iam list-access-keys --user-name former2-local | jq -r '.AccessKeyMetadata[].AccessKeyId')

■アクセスキーそのものを削除して再作成するには。
 そもそもこれ以外に使わないようユーザ分けしたので他で使ってるなどありえないが、
 共通手順の意味で、無効化のワンクッション入れての削除
 ※()作成は上述

$ aws iam update-access-key --user-name former2-local --status Inactive \       
    --access-key-id $(aws iam list-access-keys --user-name former2-local | jq -r '.AccessKeyMetadata[].AccessKeyId')

$ aws iam delete-access-key --user-name former2-local \
    --access-key-id $(aws iam list-access-keys --user-name former2-local | jq -r '.AccessKeyMetadata[].AccessKeyId')

■dockerイメージの停止と削除

$ docker stop bfe622d207ea
$ docker rm bfe622d207ea

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

$ docker images -a
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
former2_local       1.0                 2a6d7d477ed4        33 minutes ago      326MB
nginx               1.15                53f3fd8007f7        23 months ago       109MB

$ docker rmi 2a6d7d477ed4 53f3fd8007f7
Untagged: former2_local:1.0
Deleted: sha256:2a6d7d477ed4e53e7da94dc43241a1fa99bc4b418a24145985bd6f91f96a4416
Deleted: sha256:9c6b7c88bcf423440d07c3db1ba5861cbc615ee8e8d1a2ac03f165cba23361fe
Untagged: nginx:1.15
Untagged: nginx@sha256:23b4dcdf0d34d4a129755fc6f52e1c6e23bb34ea011b315d87e193033bcd1b68
Deleted: sha256:53f3fd8007f76bd23bf663ad5f5009c8941f63828ae458cef584b5f85dc0a7bf
Deleted: sha256:50183b8336fcc9552a55c86895cdfdfb6f1bb349a951da638f22f645ce235926
Deleted: sha256:093a0ead7cedbef266292a1b08e478489ed6584170f0d82127c5ac9a10fd8303
Deleted: sha256:6270adb5794c6987109e54af00ab456977c5d5cc6f1bc52c1ce58d32ec0f15f4

■使わないアクセスキーは非アクティブ化
 ※former2-localのアクセスキーは削除したのでlist-access-keysで出てこない。

$ aws iam update-access-key --user-name former2-web --status Inactive \       
    --access-key-id $(aws iam list-access-keys --user-name former2-web | jq -r '.AccessKeyMetadata[].AccessKeyId')
$ aws iam update-access-key --user-name former2-aws --status Inactive \
    --access-key-id $(aws iam list-access-keys --user-name former2-aws | jq -r '.AccessKeyMetadata[].AccessKeyId')

$ echo -e "former2-local\nformer2-web\nformer2-aws" | \
    awk '{print "aws iam list-access-keys --user-name "$1" | jq -r -c \047.AccessKeyMetadata[] | [ .UserName, .Status ]\047"}' | sh
["former2-web","Inactive"]
["former2-aws","Inactive"]