プレイヤーズ・ハイ

 雑多な日記

【小ネタ】jid を使ってみた

jid は JSON をインタラクティブに掘っていくことができるツールです.

GitHub - simeji/jid: json incremental digger https://github.com/simeji/jid

環境

$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.2 (Maipo)
$ uname -r
3.10.0-327.28.3.el7.x86_64

jid のインストール

# cd /tmp
# curl -LO https://github.com/simeji/jid/releases/download/0.6.2/jid_linux_amd64.zip
# unzip ./jid_linux_amd64.zip
# cp ./jid_linux_amd64 /usr/local/bin/jid
# export PATH=$PATH:/usr/local/scala/bin

JSON を掘ってみる

以下の JSON ファイルを jid コマンドで掘っていきます.

{
  "aa": "2AA2",
  "bb": {
    "aaa": [
      123,
      "cccc",
      [
        1,
        2
      ]
    ],
    "c": 321
  }
}

JSON を echo しパイプで jid コマンドに渡します(以下のようにファイルから読み込むこともできます.$ jid < file.json).

$ echo '{"aa":"2AA2","bb":{"aaa":[123,"cccc",[1,2]],"c":321}}'| jid

使い方としてはざっくりと,

jid に JSON を食わせて,TAB と ENTER キーをペコペコ押していれば使い方が掴めると思います.

全キーマップは https://github.com/simeji/jid#keymaps

TAB キーを押下すると,掘っていける候補が出力されます.以下でいうと aa bb の部分です.

[Filter]> .
 aa bb
{
  "aa": "2AA2",
  "bb": {
    "aaa": [
      123,
      "cccc",
      [
        1,
        2
      ]
    ],
    "c": 321
  }
}

掘りたい候補がハイライトされた状態で ENTER キーを押下すると,その要素を掘っていけます.

(JSON に要素があれば) 更にドットキーを押下し,TAB キーを押下して掘っていけます.

[Filter]> .bb.
 aaa c
{
  "aaa": [
    123,
    "cccc",
    [
      1,
      2
    ]
  ],
  "c": 321
}

たとえば $ aws cloudwatch describe-alarms コマンドを jid で掘っていくと,以下のようになります.

[Filter]> .MetricAlarms[0].Dimensions[0].Value                                                                                                                                                                                                              "i-0e22a8eef9eea680b"
"i-0exxxxxxxxxxxxxxx"

番外編

あるプレフィックス名を持つ CloudWatch アラームが作成されている EC2 インスタンス ID の一覧を取得する.

$ aws cloudwatch describe-alarms --alarm-name-prefix [CloudWatchアラーム名のプレフィックス] --query MetricAlarms[].Dimensions[].Value

AWS IAM 用ツール Miam の雑なまとめ

※ かなり雑です.

【目次】

環境

RHEL 7.2 (64 bit)

Ruby と Miam のインストール

システムワイドにバコーンとインストール

$ sudo yum install ruby -y

$ ruby -v
ruby 2.0.0p648 (2015-12-16) [x86_64-linux]

$ gem -v
2.0.14.1

に,2.0 ... まぁいいやこのまま続けます.

$ sudo gem install miam
Fetching: jmespath-1.3.1.gem (100%)
Successfully installed jmespath-1.3.1
Fetching: aws-sigv4-1.0.0.gem (100%)
Successfully installed aws-sigv4-1.0.0
Fetching: aws-sdk-core-2.6.28.gem (100%)
Successfully installed aws-sdk-core-2.6.28
Fetching: ruby-progressbar-1.8.1.gem (100%)
Successfully installed ruby-progressbar-1.8.1
Fetching: parallel-1.10.0.gem (100%)
Successfully installed parallel-1.10.0
Fetching: tins-1.13.0.gem (100%)
Successfully installed tins-1.13.0
Fetching: term-ansicolor-1.4.0.gem (100%)
Successfully installed term-ansicolor-1.4.0
Fetching: diffy-3.1.0.gem (100%)
Successfully installed diffy-3.1.0
Fetching: hashie-3.4.6.gem (100%)
Successfully installed hashie-3.4.6
Fetching: miam-0.2.3.gem (100%)
Successfully installed miam-0.2.3
Parsing documentation for jmespath-1.3.1
Installing ri documentation for jmespath-1.3.1
Parsing documentation for aws-sigv4-1.0.0
Installing ri documentation for aws-sigv4-1.0.0
Parsing documentation for aws-sdk-core-2.6.28
Installing ri documentation for aws-sdk-core-2.6.28
Parsing documentation for ruby-progressbar-1.8.1
Installing ri documentation for ruby-progressbar-1.8.1
Parsing documentation for parallel-1.10.0
Installing ri documentation for parallel-1.10.0
Parsing documentation for tins-1.13.0
Installing ri documentation for tins-1.13.0
Parsing documentation for term-ansicolor-1.4.0
Installing ri documentation for term-ansicolor-1.4.0
Parsing documentation for diffy-3.1.0
Installing ri documentation for diffy-3.1.0
Parsing documentation for hashie-3.4.6
Installing ri documentation for hashie-3.4.6
Parsing documentation for miam-0.2.3
Installing ri documentation for miam-0.2.3
10 gems installed

$ echo $?
0

色々入った.

既存 IAM 設定のエクスポート

$ miam -e -o IAMfile

IAM 設定の適用

  • IAM 定義用 DSL ファイルを編集

$ vi IAMfile

  • ドライラン

$ miam -a --dry-run

  • 適用

$ miam -a

/usr/local/bin を環境変数 PATH に追加

あとは書き出された IAMfile, GitHub の IAMfile example を読み,Ruby のコードが読めれば大体わかるはず,という雑な説明ですみません.

Miam のオプション

これも GitHub の README.md を読めば大体わかると思いますがいくつか説明します.

--account-output FILE

?

--export-concurrency N

文字通り,export の多重度を上げるオプションです.

$ miam -e --export-concurrency 2 -o /tmp/IAMfile

--format=FORMAT

エクスポートするファイルのフォーマットを,Ruby ファイル形式,もしくは JSON 形式に指定します.

$ miam -e --export-concurrency 2 -o /tmp/IAMfile.rb --format=ruby
$ miam -e --export-concurrency 2 -o /tmp/IAMfile.json --format=json

--split

出力結果を分割します.IAM ユーザーとかグループとかロールとか.

$ miam -e --export-concurrency 2 -o /tmp/IAMfile.json --format=json --split
Export IAM
                                                                                                                                                                                                                                                          ᗧ 100%
  write `/tmp/users.iam.json`
  write `/tmp/groups.iam.json`
  write `/tmp/roles.iam.json`
  write `/tmp/instance_profiles.iam.json`
  write `/tmp/policies.iam.json`

--split-more

もっと分割します.1 IAM ユーザー毎とか.

--target REGEXP

?

適用範囲を正規表現で指定?

--ignore-login-profile

?

ヤツの名は Subiam

GREE さん製で,Miam からフォークした Subiam というのがあるそうなのでそっちも試してみます!!

Subiamを使いAWSのIAM管理をコードベースでおこなう | GREE Engineers' Blog http://labs.gree.jp/blog/2016/06/15988/

以上

【小ネタ】AWS CLI とか SDK とかで使える AWS 関連の環境変数

まとめ

項目 AWS 環境変数 AWS 設定ファイル変数 オプション
アクセスキー ID AWS_ACCESS_KEY_ID aws_access_key_id -
シークレットアクセスキー AWS_SECRET_ACCESS_KEY aws_secret_access_key -
セッショントークン AWS_SESSION_TOKEN aws_session_token -
セキュリティートークン AWS_SECURITY_TOKEN aws_security_token -
プロファイル AWS_DEFAULT_PROFILE profile --profile
リージョン AWS_DEFAULT_REGION region --region
出力形式 AWS_DEFAULT_OUTPUT output --output
設定ファイル AWS_CONFIG_FILE - -
共用クレデンシャル AWS_SHARED_CREDENTIALS_FILE - -
  • AWS セッショントークンは,期限付き認証のときに,~/.aws/config or ~/.aws/credentials ファイルに書く
  • AWS_CONFIG_FILE は,デフォルトの ~/.aws/config のパスを変更
  • AWS_SHARED_CREDENTIALS_FILE は,デフォルトの ~/.aws/credentials のパスを変更

つよさ

  • 設定ファイル変数 < 環境変数 < オプション

ちなみにどの IAM 権限が使われるかですが,EC2 インスタンスプロファイルが設定された Linux なり Windows なりでは,EC2 インスタンスプロファイルの IAM 権限がまず使われ,--profile で特定のプロファイル (~/.aws/credentials に設定したプロファイル) を使うこともできます.

おまけ AWS CLI コマンド補完機能の設定

bash

  • 設定
$ complete -C aws_completer aws
  • 確認
$ complete -p
  • 常態化
echo 'complete -C aws_completer aws' >> ~/.bash_profile

zsh

$ which aws
/usr/local/bin/aws
$ source /usr/local/bin/aws_zsh_completer.sh

以上

AWS ロング ID の雑なまとめ

  • 期限: 2016/12/16
    • でもアカウント毎にちょいちょい違うっぽいので以下で確認
      • EC2 Dashboard の Resource ID length management

【目次】

変更対象と変更内容

ロング ID 変更対象

  • Reservation (各リザベーションは単一のインスタンス起動リクエストの結果を意味しますが、複数のインスタンスを起動した際には複数のインスタンスと関連付けられます。 )
  • Instance ID
  • Volume ID
  • Snapshot ID

reservationはインスタンスを起動するアクションのこと。run-instancesを使って一度に複数のインスタンスを起動すると、(普通は)1個のreservationが作られ、複数のインスタンスがそこに属する(ただし場合によっては複数のreservationが作られることもあるらしい)。

qiita.com

変更内容

  • それぞれ 8 桁から 17 桁になる.

変更設定 URL

  • EC2 Dashboard の Resource ID length management をクリック

既存リソースの変更

  • できないっぽい.ショートだろうがロングだろうが,1 度割当たった ID は変更不可っぽい.

設定対象の単位

  • IAM ユーザー,または IAM ロール単位
  • リージョン単位 (マルチリージョン運用であれば,それぞれのリージョンで設定が必要)
    • すべてのリージョンで一気にオプトインするためのツールがある.
      • awslabs/ec2-migrate-longer-id: The code opts the entire account in to the longer id format for ec2 resources in each region with a single request. It will also print status and revert to shorter ids in case of problems. https://github.com/awslabs/ec2-migrate-longer-id

オプトイン・オプトアウト

  • 現在の設定の確認
    • EC2 インスタンス ID のロング ID 設定を調べたいとき (ARN には調べたい対象 IAM ユーザーの ARN を指定.PROFILE は場合によっては指定)
$ aws ec2 describe-identity-id-format --resource instance --principal-arn [ARN] --profile [PROFILE]
{
    "Statuses": [
        {
            "Deadline": "2016-12-12T18:00:00Z",
            "UseLongIds": true,
            "Resource": "instance"
        }
    ]
}
  • オプトイン
$ aws ec2 modify-identity-id-format \
    --resource [instance | reservation | snapshot | volume] # どれをオプトインしたいか選ぶ
    --principal-arn [ARN]
    --use-long-id
  • オプトアウト
$ aws ec2 modify-identity-id-format \
    --resource [instance | reservation | snapshot | volume] # どれをオプトアウトしたいか選ぶ
    --principal-arn [ARN]
    --no-use-long-id

ARN にルートアカウントを指定すれば,そのアカウント配下の IAM ユーザーの設定を一気に変更できる.

その他

運用スクリプトなどで桁数バリデーションチェックしている場合は修正しましょう.

開発環境でのテスト

  • ある IAM ユーザーのロング ID を有効化する.
  • 開発環境をその IAM ユーザーで作り直す.
  • 可能な限りの E2E テストを流して異常が起こらないかチェック

  • 面倒くさかったらルートアカウントの ARN 指定してバーン!ってやってまずそうならバーン!と戻すという手もあり.自己責任でよろしくお願いします.

詳細は以下!

よくある質問 - Amazon EC2 | AWS https://aws.amazon.com/jp/ec2/faqs/#longer-ids

こんなブログ書いててなんですが「より長い EC2、EBS、および Storage Gateway リソース ID」セクションを全部読んでおいた方がいいと思います.

以上

AWS IAM の雑なまとめ

【目次】

IAM の用途

  • AWS マネージメントコンソールへのログイン,AWS CLI や AWS SDK, IAM HTTPS API などで使用できる.

IAM の単位

  • IAM ユーザー

    • ユーザー.10 グループまで所属可能.
    • 認証情報は,IAM ユーザーごとに API キーを発行するか,OpenSSL などで作成した X.509 Certificate をアップロードして使う.
    • API キーはローテーション強制ができる.
  • IAM グループ

    • 単にユーザーをグルーピングしたもの
  • IAM ロール

    • AWS サービスやアプリケーションに対して権限を付与するためのもの.IAM ユーザー|グループとは紐付かない.EC2 のインスタンスプロファイルなど.

IAM ポリシー

ユーザーベースポリシー

  • IAM ユーザー|グループ|ロールに紐付ける.

  • AWS 管理ポリシー

    • AWS によってあらかじめ用意されたアクセス権群のテンプレートのようなもの.複数の IAM ユーザー|グループ|ロールで共有可能
  • ユーザー管理ポリシー
    • ユーザーによって独自にカスタマイズ,定義されたポリシー群.複数の IAM ユーザー|グループ|ロールで共有可能
  • インラインポリシー

    • 各 IAM ユーザー|グループ|ロール毎に個別に設定するポリシー.共有不可.
  • IAM ポリシージェネレーターを使用して書き出させるのが簡単で確実

    • IAM ポリシージェネレーター内で 5 バージョンの管理が可能
  • ポリシーのテストには IAM ポリシーシミュレーターというのが使える.
  • 既存ポリシーのチェックには IAM ポリシーバリデーターというのが使える.

リソースベースポリシー

IAM ロールの信頼ポリシー

  • ある IAM ロールに付けた権限を他の主体 (Principal) に移譲する.
    • ( ≒ Principal が,ある IAM ユーザーになりすます.権限を引き受ける(AssumeRole))

ID フェデレーション

  • AD ユーザー ( ≒ ID プロバイダー, SAML 2.0 or OpenID Connect (Google, Facebook, Amazon などのアカウントが対応している.また Amazon Cognito とも連携可能) と互換性のあるもの) などに IAM 権限を移譲する.

    • AWS STS (Security Token Service, IAM のサブプロダクト) を使用.具体的には AssumeRole, GetFederationToken.
    • Temporary Security Credentials
  • identity provider カラムで ID プロバイダーを設定し,ある IAM ロールを AssumeRole する.

一時的セキュリティ認証情報

  • IAM ロールを使ったクロスアカウントアクセスなど

  • アカウント (IAM ユーザー) 側

    • どの IAM ロール (リソースに紐付いた IAM ロールなど) を移譲されるかを定義
  • リソース側
    • 誰 (Principal) がどのリソースにどんな権限を持つことができるか定義

Temporary Security Credentials

  • 以下の 3 つをユーザーに与え,期限付きの認証情報を与える.一時的な IAM AssumeRole と考えてもよい.GetSessionToken(自分自身の IAM ユーザー権限を一時的に利用), GetFederationToken はこの仕組を利用する.
    • アクセスキー ID
    • シークレットアクセスキー
    • セキュリティトークン
  • 権限を与える時間帯
    • IAM ユーザー
      • 最小 15 分 〜 最大 36 時間 (デフォルト 12 時間.時間帯はプリセットのものから 1 つ選ぶ)
    • AWS アカウント
      • 最小 15 分 〜 最大 1 時間 (デフォルト 1 時間.時間帯はプリセットのものから 1 つ選ぶ)
  • 詳細は以下

Temporary Security Credentials のまとめ

種別 説明 権限
GetSessionToken 自身の権限で一時認証 自身の権限
クロスアカウント不可
MFA 利用可
GetFederationToken 信頼ユーザーで一時認証 自身の権限内で規定
クロスアカウント不可
MFA 利用不可
AssumeRole IAM ロールとマッピング IAM ロールで規定
クロスアカウント可
MFA 利用可

www.slideshare.net

その他

  • STS は基本的にグローバルサービス (https://sts/amazonaws.com) だが,IAM の Account Settings にて各リージョンで STS の機能をアクティベート可能(->レイテンシーの低減などの効果).同時に AWS CloudTrail も忘れずにアクティベートすること.

  • Switch Role

    • AWS マネージメントコンソールにて,ある IAM ユーザーから,クロスアカウントアクセス用 IAM ロールにスイッチできる.
    • 必要なときに IAM ユーザーの権限を昇格とかに使える.
      • IAM ユーザー側には読み取り権限のみ
      • IAM ロール側には更新権限も
  • 変更の反映にまれに遅延が発生することがある,らしい.

コンフィグ類の書き方

  • ~/.aws/config
[default]
region = ap-northeast-1

[profile foo]
region = us-east-1
  • ~/.aws/credentials
[default]

[foo]
aws_access_key_id = A*******************
aws_secret_access_key = x***************************************

$ aws configure list で確認

以上