あきろぐ

いろいろめもするよ🐈🐈🐈

awsコマンドの'ecr get-login'が非推奨になったので'ecr get-login-password'を試す

概要

クラメソさんの記事を読んでaws ecr get-loginがv1では非推奨、v2では使えなくなっていることを知ったので、自分の環境どうだったか確認をかねて新しいコマンドecr get-login-passwordを使ってみました。

dev.classmethod.jp

自分の環境

自分のawsコマンドのバージョンどうだったけ?と思ったので確認しましたが、まだv1でした。

~ $ aws --version
aws-cli/1.16.274 Python/3.6.6 Darwin/18.7.0 botocore/1.13.10

v1.17以下だとecr get-login-passwordが使えないのでアップグレードします。

# アップグレード
~ $ pip install --upgrade awscli

# バージョン確認
~ $ aws --version
aws-cli/1.18.0 Python/3.6.6 Darwin/18.7.0 botocore/1.15.0

確認

v1.18にアップデートされたので、試してみます。 まずは、get-loginのときの出力は以下の通りですね。ログインするための情報がコマンドラインで返ってきます。

~ $ aws-vault exec my-profile -- aws ecr get-login
docker login -u AWS -p [password]

新しいコマンドを使うと以下のように、パスワードだけ返ってきます。

~ $ aws-vault exec my-profile -- aws ecr get-login-password
[password]

Dokcerコマンドとパイプを使えば、セキュアな情報をターミナル上に表示させることなくログインすることが可能です。

~ $ aws-vault exec my-profile -- aws ecr get-login-password | docker login -u AWS --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com
Login Succeeded

あとは普段通りdocker pullなど実行すればOK

~ $ docker pull [aws-account-id].dkr.ecr.ap-northeast-1.amazonaws.com/my-image:xxxxx
xxxxx Pulling from my-image

get-loginのコマンドリファレンスにも、このコマンドを使うとセキュアな情報が他人に見えてしまうので、セキュアな環境ではない限り使わないようにと書かれていますね。他にも使っているところあったら置きかえよう。。。

以上です。

参考文献

ansible-playbookのwith_itemsが肥大化するのを防ぎたい

概要

Ansible-playbookの1つのタスクで複数のユーザーを作成したり、色んなパッケージをインストールしたいときに役立つのがループ処理です。その代表的なパラメータがwith_itemsではありますが、このパラメータもうまく使わないとwith_itemsに羅列するパラメータが膨大になってしまい、1つのタスクだけ長ったらしくなります。 簡潔なタスクを書くためにwith_itemsの使い方を工夫したのでそのときのメモです。

docs.ansible.com

環境

  • MacOS 10.14.6
  • Ansible 2.5.0

解決案

以前のタスクの書き方

最初は以下のようなタスクを書いていました。 環境変数の設定で変数名を被らせることはできないので、どんどんwith_items以下が増える一方でした。

# 変数yamlファイル
test1: xxx
test2: xxx
test3: xxx
test4: xxx

# main.yml
- name: setting env
  lineinfile:
    dest: /etc/environment
    line: "export {{ item }}={{ lookup('vars', item) }}"
  with_items:
    - test1
    - test2
    - test3
    - test4

新しい書き方

変数定義の書き方をちょっと工夫すれば、タスクを簡潔に書くことができるようになりました。 辞書型の変数env_listに環境変数名とその値を入れ込むことで、タスクをかなりスッキリした形で書くことができます。

# 変数yamlファイル
env_list:
    - name: test1
      value: xxx
    - name: test2
      value: xxx
    - name: test3
      value: xxx
    - name: test4
      value: xxx

# main.yml
- name: setting env
  lineinfile:
    dest: /etc/environment
    line: "export {{ item.name }}={{ item.value }}"
  with_items: {{ env_list }}

追記

もっと良い書き方がありました。 上記の書方だと、変数をnamevalueで設定しないといけないので、ちょっとめんどくさいんですよね。そこで、with_itemsではなくてwith_dictを使うことで変数名と値をkeyvalueで取り出すことが可能となり以下のようにすっきり書くことができます。

# 変数yamlファイル
env_list:
  - test1: xxx
  - test2: xxx
  - test3: xxx
  - test4: xxx

# main.yml
- name: setting env
  lineinfile:
    dest: /etc/environment
    line: "export {{ item.key }}={{ item.value }}"
  with_dict: {{ env_list }}

以上

ECRのDockerイメージをローカルにプルしてビルドする

概要

デバッグするために、ECRにあげているDokcerイメージをローカルにプルしてビルドするまでのメモ。

環境

  • mac10.14.6
  • aws-vaultコマンドをインストールしている

手順

AWS ECRにログインする

下記コマンドを実行するとDokcerにログインするためのアクセストークンが返ってくるので、そのトークンを使ってECRにログインする。

# アクセストークンを取得する
$ aws-vault exec my-profile -- aws ecr get-login --no-include-email --region ap-northeast-1

docker login -u AWS -p [password] https://[aws_account_id].dkr.ecr.ap-northeast-1.amazonaws.com

$ docker login -u AWS -p [password] https://[aws_account_id].dkr.ecr.ap-northeast-1.amazonaws.com
~
Login Succeeded

Login Succeededと返って来ればログイン成功している。

Dockerイメージをプルする

ECR>リポジトリ>対象イメージ>イメージのURIをコピーする
f:id:akngo22:20200208211711j:plain
下記コマンドを実行してイメージをプルする

# イメージをプル
$ docker pull [aws_account_id].dkr.ecr.ap-northeast-1.amazonaws.com/my-docker-image/app:xxxx

# イメージ確認
$ docker image ls

Dockerビルドを実行する

ローカルにプルしてきたイメージを使ってビルドし、コンテナの中に入る

$ docker build -it [aws_account_id].dkr.ecr.ap-northeast-1.amazonaws.com/my-docker-image/app:xxx /bin/bash


以上

codebuildでyum installが失敗する

概要

今日の午後くらいから今まで動作に問題なかったcodebuildの失敗が連続していた。
原因を調査してみると、fedoraproject.orgの名前解決ができなくなっていた。fedraprojectのDNSサーバーが死んでる模様。同じような現象に遭遇している人もちらほらいるみたい。
www.reddit.com

# 起きている現象
[Container] 2020/02/04 13:53:19 Running command yum update -y
Loaded plugins: ovl, priorities


 One of the configured repositories failed (Unknown),
 and yum doesn't have enough cached data to continue. At this point the only
 safe thing yum can do is fail. There are a few ways to work "fix" this:

     1. Contact the upstream for the repository and get them to fix the problem.

     2. Reconfigure the baseurl/etc. for the repository, to point to a working
        upstream. This is most often useful if you are using a newer
        distribution release than is supported by the repository (and the
        packages for the previous distribution release still work).

     3. Run the command with the repository temporarily disabled
            yum --disablerepo=<repoid> ...

     4. Disable the repository permanently, so yum won't use it by default. Yum
        will then just ignore the repository until you permanently enable it
        again or use --enablerepo for temporary usage:

            yum-config-manager --disable <repoid>
        or
            subscription-manager repos --disable=<repoid>

     5. Configure the failing repository to be skipped, if it is unavailable.
        Note that yum will try to contact the repo. when it runs most commands,
        so will have to try and fail each time (and thus. yum will be be much
        slower). If it is a very temporary problem though, this is often a nice
        compromise:

            yum-config-manager --save --setopt=<repoid>.skip_if_unavailable=true

Cannot retrieve metalink for repository: epel/x86_64. Please verify its path and try again

[Container] 2020/02/04 13:54:30 Command did not exit successfully yum update -y exit status 1
[Container] 2020/02/04 13:54:30 Phase complete: INSTALL State: FAILED
[Container] 2020/02/04 13:54:30 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: yum update -y. Reason: exit status 1

curlコマンド結果も以下の通り。

$ curl https://mirrors.fedoraproject.org
curl: (6) Could not resolve host: mirrors.fedoraproject.org

暫定対応

上記の記事にgoogleDNS(8.8.8.8)を使えばキャッシュ経由でなんとか大丈夫らしいので、暫定的に取り込んでみる。
nameserverを/etc/resolv.confに追記。

version: 0.2

phases:
  install:
    runtime-versions:
      docker: 18
    commands:
      - echo "nameserver 8.8.8.8" >> /etc/resolv.conf 
      - yum update -y
  build:
    commands:
      - echo "test"

このようにすれば、暫定的にcodebuildが失敗せずに完了する。
明日には名前解決問題解消されてるといいな。

解決

2/4 23:40頃解決していた!
codebuildも問題なく成功する

以上