ようへいの日々精進XP

よかろうもん

2021 年 02 月 17 日 (水)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

  • 補強 (なんちゃってプランクレーニング 4 種盛り x 1 セット)
  • エアロバイク 40min (強度: 8)

読書

今日も読む時間を確保できず。すいません。

レアジョブ

今日はお休み。明日は頑張るぞ。

夕飯

奥さんがギックリ腰で寝込んでしまっているので、パスタを作った。

物理作業

久しぶりに、オフィスに出向いて物理作業。ネットワークの奥深さを痛感。勉強せねば...

(やらかした) aws s3api copy-object したら、権限のことを忘れてしまって (略

これは

やらかしの記録であります。今後、自分が同じ過ちを繰り返さないよう、公開出来る範囲で記事にしたいと思います。

何が起きたか

S3 バケット上で意図的に Public Read 権限を付与して公開しているオブジェクトのメタデータ (content-type) をカジュアルに変更した後、オブジェクトにアクセスしたら HTTP ステータスコード 403 (Forbidden) を返すようになった結果、サイト上の画像の一部が表示されない状態を発生させてしまいました orz

オブジェクトのメタデータは、以下のように AWS CLI で一括変更しました。

aws s3api copy-object \
  --bucket $BUCKET_NAME \
  --copy-source $BUCKET_NAME/$KEY \
  --key $KEY \
  --metadata-directive "REPLACE" \
  --content-type "image/png" | jq -r .CopyObjectResult.LastModified

何が原因だったか

AWS CLIメタデータを変更する際、aws s3api の copy-object を利用するしかないようなのですが、この copy-object はソースオブジェクトをコピーはするものの、権限まではコピーしてくれないようです。

例えば、以下のように、my-sandbox バケットの sample.txt オブジェクトには Public Read 権限が付与されています。

$ aws s3api get-object-acl --bucket=my-sandbox --key=sample.txt
{
    "Owner": {
        "DisplayName": "test-user",
        "ID": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    },
    "Grants": [
        {
            "Grantee": {
                "DisplayName": "test-user",
                "ID": "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz",
                "Type": "CanonicalUser"
            },
            "Permission": "FULL_CONTROL"
        },
        {
            "Grantee": {
                "Type": "Group",
                "URI": "http://acs.amazonaws.com/groups/global/AllUsers"
            },
            "Permission": "READ"
        }
    ]
}

sample.txt を copy-object してみます。

$ aws s3api copy-object \
  --bucket my-sandbox \
  --copy-source my-sandbox/sample.txt \
  --key sample.txt \
  --metadata-directive "REPLACE" \
  --content-type "text/plain""

copy-object では content-type を付与しています。そして、権限を確認してみましょう。

$ aws s3api get-object-acl --bucket=inokara-sandbox --key=sample.txt
{
    "Owner": {
        "DisplayName": "test-user",
        "ID": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    },
    "Grants": [
        {
            "Grantee": {
                "DisplayName": "test-user",
                "ID": "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz",
                "Type": "CanonicalUser"
            },
            "Permission": "FULL_CONTROL"
        }
    ]
}

うおー、見事に public-read 権限が無くなっていますね。copy-object は権限まではコピーしてくれないようです。

ドキュメントにもはっきりと書かれております。

docs.aws.amazon.com

When copying an object, you can preserve all metadata (default) or specify new metadata. However, the ACL is not preserved and is set to private for the user making the request. To override the default ACL setting, specify a new ACL when generating a copy request. For more information, see Using ACLs .

そもそも

S3 上のオブジェクトを Public Read 権限で付与して公開してしまっている構成がイケていないのでは...と突っ込まれても仕方ないと思いますが、歴史的な経緯で、泣く泣く Public Read 権限を付与しておりました。本来であれば、CloudFront を挟んで OAI 設定が定石なのかもしれません。

ということで

今回、以下のような知見を得ました。

  • オブジェクトのメタデータを更新したい場合には aws s3api copy-object 一択
  • コピーしたオブジェクトの ACL はコピーされないので注意が必要

ご迷惑をおかけしてしまい申し訳ございませんでした。そして、ドキュメントをしっかりと読みましょう。

2021 年 02 月 16 日 (火)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

  • 補強 (なんちゃってプランクレーニング 4 種盛り x 1 セット)
  • エアロバイク 40min (強度: 8)

読書

今日も読む時間を確保できず。

レアジョブ

予約していたけど、キャンセルした。すいません、Val 先生。

夕飯

思いっきりやらかした

inokara.hateblo.jp

ドキュメントを読め案件だった。

2021 年 02 月 15 日 (月)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

今日は補強は無し。

[ランニング-2021-02-15-夕] 〜 仕事の後に走る 〜 / かっぱさんの活動データ | YAMAP / ヤマップ

読書

今日も読む時間を確保できず。

レアジョブ

今日はお休み。明日、予約を入れた。

夕飯

新しい CircleCI Orbs (2)

circleci.com

一応、リリースした。

最新版は 0.0.4 で、簡単に動作確認してみたけど、意図した通りには動いている。ただし、コードはベタ書き状態なので、とても汚い感じになっている。

動作確認していて、気付いたんだけど、CloudWatch ダッシュボードにウィジェット (メトリクス) を追加しただけだと、ウィジェットにはタイトルは付かない。

f:id:inokara:20210216001347p:plain

上図のような状態だと、あたかもタイトル (Invocations) がついているように見えるけど、 アノテーションAPI で付ける場合には、下図のように発信元に明示的にタイトルを設定する必要がある。

f:id:inokara:20210216001637p:plain

2021 年 02 月 14 日 (日)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

[ランニング-2021-02-14-朝] 〜 本当にキツかった 〜 / かっぱさんの活動データ | YAMAP / ヤマップ

読書

読む時間を確保できず。

レアジョブ

今日はお休み。

夕飯

新しい CircleCI Orbs

CloudWatch Dashboardアノテーションを付ける Orb を作っている。

circleci.com

まだ、検証中だけど。

2021 年 02 月 13 日 (土)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

[ランニング-2021-02-13-夕] 〜 ちょっと長めに走ろう 〜 / かっぱさんの活動データ | YAMAP / ヤマップ

読書

読む時間を確保できず。

レアジョブ

今日の指摘。

(1)
You said: Bella is golden retriever.

Correct: Bella is *a* golden retriever.

(2)
You said: Bella's owner went _to_ hiking.

Correct: Bella's owner went hiking.

たまに to とか付けると、それは要らなかったり、a を付けなきゃいけないところには付けていなかったり。人生でもこんな感じ。

夕飯

長らくお待たせしました、CircleCI Orbs を (2)

昨日、リリースした Orb をちょこちょこ手入れしていた。

github.com

(俺の Orbs) AWS セキュリティグループの Ingress ルールに CircleCI の IP を追加 or 削除する Orbs を作りました

あまりニーズがないかもしれないけど...

CircleCI で AWS 環境 (例えば、EC2 とか ECS ) に、デプロイする流れで AWS セキュリティグループで保護された URL に対して、CircleCI のジョブからアクセスしたい時があります。

そんな時に、アクセスする直前に、一時的にアクセス元となる CircleCI の IP アドレスをセキュリティグループの Ingress ルールに追加して、処理が終了したら、その IP アドレスを削除する CircleCI Orbs を作ったので宣伝させて下さい。

circleci.com

ちなみに、似たような機能を提供してくれる Orbs はいくつか提供されています。

circleci.com

circleci.com

他にもあるかもしれませんが、これらの Orbs には無い付加価値を付けて世の中に出したいなーと、パラメータを追加したり、テストを追加したり頑張ってみました。

例えば、他の Orbs には、セキュリティグループ ID を指定するパラメータがありません (タグで絞り込んでセキュリティグループ ID を取得している) が、拙作にはセキュリティグループ ID を指定するパラメータを付けました。また、moto server で立てたダミーの EC2 を利用したインテグレーションテストを追加したので、思わぬデグレの心配が少し減りました。

デモ

本物のリソースをイジるのは止めておきたいので、moto server で立てたダミーの EC2 の API 環境でデモってみました。

github.com

使い方は、以下のような感じです。(一部、抜粋しています)

version: 2.1

orbs:
  aws-sg-white-list-circleci-ip: inokappa/aws-sg-white-list-circleci-ip@0.0.1

executors:
  aws-sg-white-list-circleci-ip-demo:
    docker:
      - image: cimg/python:3.9
        environment:
          AWS_ACCESS_KEY_ID: EXAMPLEKEY123
          AWS_SECRET_ACCESS_KEY: EXAMPLESECRET123456
          AWS_DEFAULT_REGION: us-east-1
          AWS_REGION: us-east-1
          AWS_ENDPOINT: http://moto-server:5000
          AWS_DISABLE_SSL: true
      - image: motoserver/moto
        name: moto-server
        command: ["ec2", "-H", "0.0.0.0"]

jobs:
  aws-sg-white-list-circleci-ip-demo:
    environment:
      AWS_PAGER: ''
      GROUP_ID: ''
    executor: aws-sg-white-list-circleci-ip-demo
    steps:
      - checkout
      - install-awscli
      - create-security-group
      - aws-sg-white-list-circleci-ip/add:
          tag-key: 'sg-white-list'
          tag-value: 'true'
          description: 'Test-Permission'
      - check-exists-ip-permission
      - aws-sg-white-list-circleci-ip/del:
          tag-key: 'sg-white-list'
          tag-value: 'true'
          description: 'Test-Permission'
      - check-not-exists-ip-permission

workflows:
  version: 2

  aws-sg-white-list-circleci-ip-demo:
    jobs:
      - aws-sg-white-list-circleci-ip-demo:
          filters:
            branches:
              only:
                - aws-sg-white-list-circleci-ip-demo

苦労したところとか

circleci orb init

CircleCI が提供するコマンドラインツール circleci に Orbs を作る為のコマンドが用意されています。

$ circleci orb --help
Operate on orbs

See a full explanation and documentation on orbs here: https://circleci.com/docs/2.0/orb-intro/


Usage:
  circleci orb [command]

Available Commands:
  add-to-category      Add an orb to a category
  create               Create an orb in the specified namespace
  info                 Show the meta-data of an orb
  init                 Initialize a new orb.
  list                 List orbs
  list-categories      List orb categories
  pack                 Pack an Orb with local scripts.
  process              Validate an orb and print its form after all pre-registration processing
  publish              Publish an orb to the registry
  remove-from-category Remove an orb from a category
  source               Show the source of an orb
  unlist               Disable or enable an orb's listing in the registry
  validate             Validate an orb.yml

Flags:
  -h, --help   help for orb

Global Flags:
      --host string         URL to your CircleCI host, also CIRCLECI_CLI_HOST (default "https://circleci.com")
      --skip-update-check   Skip the check for updates check run before every command.
      --token string        your token for using CircleCI, also CIRCLECI_CLI_TOKEN
Use "circleci orb [command] --help" for more information about a command.

circleci orb init ${path} を実行することで、ウィザード形式で Orbs を開発、リリースする為の各種設定が自動生成されます。

以下、実行例です。

$ circleci orb init my-sample-orb
Note: This command is in preview. Please report any bugs! https://github.com/CircleCI-Public/circleci-cli/issues/new/choose
? Would you like to perform an automated setup of this orb? Yes, walk me through the process.
Downloading Orb Project Template into my-sample-orb
A few questions to get you up and running.
? Are you using GitHub or Bitbucket? GitHub
? Enter your github username or organization inokappa
? Enter the namespace to use for this orb inokappa
Saving namespace inokappa as default
? Orb name my-sample-orb
? Automatically set up a publishing context for your orb? No, I'll do this later.
? Would you like to set up your git project? Yes
? Enter the remote git repository my-sample-orb
Thank you! Setting up your orb...
Error: author field is required

最後の Error: author field is required というエラーが気になりますが、以下のようなファイルが生成されます。

$ tree -I .git -a my-sample-orb -L 3
my-sample-orb
├── .circleci
│   ├── README.md
│   └── config.yml
├── .github
│   ├── ISSUE_TEMPLATE
│   │   ├── BUG.md
│   │   ├── FEATURE_REQUEST.md
│   │   └── config.yml
│   └── PULL_REQUEST_TEMPLATE
│       └── PULL_REQUEST.md
├── .gitignore
├── .yamllint
├── CHANGELOG.md
├── LICENSE
├── README.md
└── src
    ├── @orb.yml
    ├── README.md
    ├── commands
    │   ├── README.md
    │   └── greet.yml
    ├── examples
    │   ├── README.md
    │   └── example.yml
    ├── executors
    │   ├── README.md
    │   └── default.yml
    ├── jobs
    │   ├── README.md
    │   └── hello.yml
    ├── scripts
    │   ├── README.md
    │   └── greet.sh
    └── tests
        ├── README.md
        └── greet.bats

11 directories, 25 files

Orbs 自身も CircleCI で CI/CD 出来るように .circleci/config.yml が用意されていることが判ります。

詳細は、以下のドキュメントに記載されています。

circleci.com

Orbs の開発流れについて、下図のようなフローも掲示されているので勉強になります。

引用: https://circleci.com/docs/ja/2.0/creating-orbs/#github-%E3%81%B8%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3-%E3%82%BF%E3%82%B0%E3%81%AE%E3%83%91%E3%83%96%E3%83%AA%E3%83%83%E3%82%B7%E3%83%A5

command にスクリプトをベタ書き

例えば、

github.com

add.yml の中に、以下のようにスクリプトをベタ書きしている点が残念。

description: >-
  This command will add a rule in the SG of the AWS Security Group to allow the
  ingress of the CircleCI Machine
parameters:
  description:
    description: Description to identify the rule. Spaces cannot be included.
    type: string

... 略 ...
steps:
  - run:
      name: Add CircleCI's IP address to the Security Group
      command: |
        AWS_COMMAND="aws"
        if [ -n "${AWS_ENDPOINT}" ];then
          AWS_COMMAND="aws --endpoint ${AWS_ENDPOINT}"
        fi
... 略 ...

当初は、scripts ディレクトリ以下にシェルスクリプトを用意していたんだけど、パラメータを環境変数に代入して引き回せなくて、試行錯誤を重ねたものの、妥協して command 内にスクリプトをベタ書きすることにした。うーん、もう少し、頑張ってみようかな。

以上

宣伝でございました。

2021 年 02 月 12 日 (金)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

読書

読む時間を確保できず。

レアジョブ

今日のフリーディスカッションは、先生が気を遣ってくれたのか、なんとか乗り切ることが出来た。

今日の指摘。

(1)
You said: I read [ reed] animal's blog.

Better: I read [red] a blog about an animal.

(2)
You said: My wife don't like dog.

Correct: My wife doesn't like dogs.

現在形、過去形、ガン無視の言い回しに先生もきっと呆れているんだろうなあ。

夕飯

長らくお待たせしました、CircleCI Orbs を

inokara.hateblo.jp

2021 年 02 月 11 日 (木)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

[ランニング-2021-02-11-朝] 〜 六日目は那珂川を走る 〜 / かっぱさんの活動データ | YAMAP / ヤマップ

読書

本じゃないけど、最近、走る時の接地方法についての質問を頂いたので、接地について勉強するつもりで以下の論文を読んだ。

高校生ランナーを被験者として 1 年生から 3 年生まで、継続的に接地パターンの変化とスポーツ障害の関係について研究された論文。

勉強になった。

レアジョブ

今日もフリーディスカッションがグダグダで泣きそうになった。

今日の指摘。

(1)
You said: Bella is golden retriever.

Correct: Bella is *a* golden retriever.

(2)
You said: Owner name is Charlie.

Better: The owner's name is Charlie.

なんか、意図が通じれば良いや的な感覚で喋ろうとしているのが見え見えで情けない。

夕飯

CircleCI Orbs を (3)

やっと、インテグレーションテストが通った。

github.com

テストが通ったというか、テスト通るように環境を整えること出来た。

jq メモ 〜 組み込み演算子を試す 〜

tl;dr

昨日の日記にもちょっと書いたけど、昨日は jq コマンドを利用して、配列に要素を追加する方法について試行錯誤していました。一夜明けて、改めてドキュメントを読んだり、jq play で試してみたのでメモしてきます。

stedolan.github.io

jqplay.org

jq play は初めて使ってみたけど、jq のフィルタをブラウザでシュッと試せるのが良いですな。

尚、本記事では、jq play で試した結果を貼り付けていますが、場合によっては、手元環境で実行した jq の実行結果を貼り付ける場合があります。手元の jq のバージョンは以下の通りです。

$ jq --version
jq-1.6

組み込み演算子について

型変換は行わない

ドキュメントより引用。

Some jq operator (for instance, +) do different things depending on the type of their arguments (arrays, numbers, etc.). However, jq never does implicit type conversions. If you try to add a string to an object you'll get an error message and no result.

組み込み演算子は、引数の型 (配列、数値など) によって、結果が変わる = 暗黙的に型変換は行わず、エラーになるとのこと。

+ (プラス) 演算子

数値

Numbers (数値) は、通常の算術で加算されます。

$ echo '{ "number": 100 }' | jq '.number + 100'
200

配列

Array (配列) は、より大きな配列に連結されて追加されます。

$ echo '{ "array": [] }' | jq '.array + [ 100, 200 ]'
[
  100,
  200
]

$ echo '{ "array": [] }' | jq '.array + [ {"foo": 1}, {"bar": 2} ]'
[
  {
    "foo": 1
  },
  {
    "bar": 2
  }
]

ちなみに、異なる型 (数値) を追加しようとすると、以下のようにエラーが出ます。

$ echo '{ "array": [] }' | jq '.array + 100'
jq: error (at <stdin>:1): array ([]) and number (100) cannot be added

文字列

String (文字列) は、文字列が結合されます。

$ echo '{ "string": "foo" }' | jq '.string + "bar"'
"foobar"

オブジェクト

Object (オブジェクト) は、マージされる (右辺と左辺に同じキーがある場合、右辺のオブジェクトで上書きされる) 、再帰的なマージは * 演算子を使います。

$ echo '{ "object1": {} }' | jq '.object1 + { "object2": {} }'
{
  "object2": {}
}

$ echo '{ "object1": {} }' | jq '. + { "object2": {} }'
{
  "object1": {},
  "object2": {}
}

# = を付与すると、object1 キーの値として追加される
$ echo '{ "object1": {} }' | jq '.object1 += { "object2": {} }'
{
  "object1": {
    "object2": {}
  }
}

null

null は、値そのものを返すようです。

$ echo '{ "null": 1 }' | jq '.null + null'
1
$ echo '{ "null": "null" }' | jq '.null + null'
"null"
$ echo '{ "null": [] }' | jq '.null + null'
[]
$ echo '{ "null": {} }' | jq '.null + null'
{}

- (マイナス) 演算子

マイナス演算子は、算術演算子の減算と同じような挙動となるようです。

例えば、値が数値の場合には、以下のような結果となります。

$ echo '{ "number": 100 }' | jq '.number - 99'
1

配列の場合には、以下のように要素が削除されるような結果となります。

$ echo '{ "array": [1, 99] }' | jq '.array - [99]'
[
  1
]

* とか / とか % とか

* とか /% 演算子も用意されているようなので、ドキュメントに掲載されている内容を元に、簡単に試してみました。

まずは、* を試してみる。

$ echo 5 | jq '. * 10'
50

$ echo '{"foo": 1}' | jq '. * {"bar": 1}'
{
  "foo": 1,
  "bar": 1
}

$ echo null | jq '{"k": {"a": 1, "b": 2}} * {"k": {"a": 0,"c": 3}}'
{
  "k": {
    "a": 0,
    "b": 2,
    "c": 3
  }
}

次は、/ を試してみる。

$ echo 10 | jq '. / 10'
1

殆ど使うことがないであろう。

以上

jq の組み込み演算子を試してみました。jq 奥深いですな。