かべぎわブログ

技術的なことについてかけたらいいな…

複数のEC2インスタンスに一気にIAMロールをつけるシェルスクリプト

概要

複数のEC2インスタンスに一気にIAMロールを付ける必要があって、マネコンでポチポチするのめんどくさいなーと思ったのでつくった。

スクリプト

つかいかた

./role_fukusuu.sh IAMロール名 インスタンスID インスタンスID...

$ ./role_fukusuu.sh wawawa_role i-070c13018a4405xxx i-098ebad2dee1c5yyy

Amazon Web Services パターン別構築・運用ガイド 改訂第2版 (Informatics&IDEA)

Amazon Web Services パターン別構築・運用ガイド 改訂第2版 (Informatics&IDEA)

シェルスクリプトで複数インスタンスに一気にタグをつける

概要

シェルスクリプトとAWSCLIを利用して複数のインスタンスに一気にタグを付けてみたいと思います。

スクリプト

こんなかんじでやってます。
肝心のAWSCLI実行部がJSONのなかに変数をしこむために地獄の様相を呈していますけれど仕方がなかった。

実行してみる

実際に実行してみます。
./tag_fukusuu.sh つけたいタグのKey つけたいタグのValue インスタンスID ... といったかんじで実行してあげます。
インスタンスIDはいくつでもならべることができます。

$ ./tag_fukusuu.sh tes wawawa i-070c13018a4405fca i-098ebad2dee1c58d1

無事にタグをつけることができました!

$ aws ec2 describe-instances --query 'Reservations[].Instances[].{instanceid:InstanceId,Tags:Tags[?Key==`tes`].Value|[0]}' --instance-ids i-098ebad2dee1c58d1  i-070c13018a4405fca
[
    {
        "instanceid": "i-070c13018a4405fca", 
        "Tags": "wawawa"
    }, 
    {
        "instanceid": "i-098ebad2dee1c58d1", 
        "Tags": "wawawa"
    }
]

おわりに

タグをいっきにつけたいときにべんり

Amazon Web Services パターン別構築・運用ガイド 改訂第2版 (Informatics&IDEA)

Amazon Web Services パターン別構築・運用ガイド 改訂第2版 (Informatics&IDEA)

  • 作者: NRIネットコム株式会社,佐々木拓郎,林晋一郎,小西秀和,佐藤瞬
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2018/03/23
  • メディア: 単行本
  • この商品を含むブログを見る

AWSCLIの出力にjoinで文字列をくっつけて出力する

概要

AWSCLIの出力結果にjoin()をつかって任意の文字列をくっつけて出力してみたいと思います。

実際にやってみる

インスタンスIDを出力してみると通常はこんな感じですが

$ aws ec2 describe-instances --query 'Reservations[].Instances[].InstanceId' --output text

i-070c13018a4405fca i-0fbf66c8fdc22b7a8 i-0a5516da9898bf83a

こんなかんじで配列形式でバッククォートでくっつけたい文字列を書いてあげると一緒に出力することができます。

$ aws ec2 describe-instances --query 'Reservations[].Instances[].[`インスタンスIDは`,InstanceId,`です`]' --output text

インスタンスIDは i-070c13018a4405fca です
インスタンスIDは i-0fbf66c8fdc22b7a8 です
インスタンスIDは i-0a5516da9898bf83a です

これにjoinをつけてあげるとこんな感じになります。

$ aws ec2 describe-instances --query 'Reservations[].Instances[].join(``,[`インスタンスIDは`,InstanceId,`です`])' --output text

インスタンスIDはi-070c13018a4405fcaです    インスタンスIDはi-0fbf66c8fdc22b7a8です    インスタンスIDはi-0a5516da9898bf83aです

joinありの場合ではインスタンスIDは です も含めて一つの項目として出力していることがわかります。

join(区切り文字,くっつけたいもの) で指定してあげます。

おわりに

まぁ再利用しやすくなるからあんまり好きではないけどNE

Amazon Web Services パターン別構築・運用ガイド 改訂第2版 (Informatics&IDEA)

Amazon Web Services パターン別構築・運用ガイド 改訂第2版 (Informatics&IDEA)

  • 作者: NRIネットコム株式会社,佐々木拓郎,林晋一郎,小西秀和,佐藤瞬
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2018/03/23
  • メディア: 単行本
  • この商品を含むブログを見る

AWSCLIの結果をソートする

概要

AWSCLIの出力結果をソートする2パターンをご紹介します。

sort_byでソートする

以下の例ではインスタンスの一覧からインスタンスIDとプライベートIPを表示して、それをインスタンスIDでソートしています。

--queryので指定する項目をsort_by()で囲ってあげて、そのなかの2カラム目にソートする項目を指定しています。

$ aws ec2 describe-instances --query 'sort_by(Reservations[].Instances[].{ipaddress:NetworkInterfaces[].PrivateIpAddress[],instanceid:InstanceId},&instanceid)'
[
    {
        "instanceid": "i-030206d4c082e95d3", 
        "ipaddress": [
            "192.165.0.145"
        ]
    }, 
    {
        "instanceid": "i-03b09176aac5121e0", 
        "ipaddress": [
            "192.168.50.193"
        ]
    }, 
    {
        "instanceid": "i-068f0c1964d463721", 
        "ipaddress": [
            "192.168.101.201"
        ]
    }
]

sortでソートする

--queryで指定する項目が一つだけである場合は単純にsort()で囲ってあげるだけでソートすることができます。

$ aws ec2 describe-instances --query 'sort(Reservations[].Instances[].InstanceId)'
[
    "i-030206d4c082e95d3", 
    "i-03b09176aac5121e0", 
    "i-068f0c1964d463721",
]

ちなみに

sort_bysortもデフォルトでは昇順でソートされます。
降順にする場合はreverse()を利用します。

$ aws ec2 describe-instances --query 'reverse(sort(Reservations[].Instances[].InstanceId))'
[
    "i-068f0c1964d463721", 
    "i-03b09176aac5121e0", 
    "i-030206d4c082e95d3"
]

Amazon Web Services パターン別構築・運用ガイド 改訂第2版 (Informatics&IDEA)

Amazon Web Services パターン別構築・運用ガイド 改訂第2版 (Informatics&IDEA)

  • 作者: NRIネットコム株式会社,佐々木拓郎,林晋一郎,小西秀和,佐藤瞬
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2018/03/23
  • メディア: 単行本
  • この商品を含むブログを見る

boto3のclientとresourceのちがい

概要

boto3におけるclientとresourceのちがいについて雑に調べたのでまとめる。

client

  • 低レベルのサービスアクセスAPI
  • 呼び出すたびにターゲットとなるリソースを明示的に指定する必要がある
  • そのため抽象化するには不向きかも
  • レスポンスがJSON形式

resource

  • 高レベルのオブジェクト指向API
  • オブジェクト指向なプログラミングで扱いやすい
  • すべてのAWSサービスでこのresourceが用意されているわけではない

おわりに

雑まとめ

AWSによるサーバーレスアーキテクチャ

AWSによるサーバーレスアーキテクチャ

Lambda(Python)でAMIとそれに紐付いたスナップショットの世代管理をする

概要

Lambda(Python) を利用してAMIとそれに紐付いているスナップショットの世代管理をしてみようと思います。

スクリプト例

ちょっとした説明

タグにauto_backupと書いてあるAMIの世代管理をしてくれます。
上の方の変数generationに指定した数だけAMIを保持して、それを超過する分は古いものから削除していきます。

おわりに

CloudWatchScheduleとかでまわせば自動でやってくれるよ

AWSによるサーバーレスアーキテクチャ

AWSによるサーバーレスアーキテクチャ

Route53のホストゾーンを削除するときはレコードセットを全部削除しておく

概要

Route53でHosted Zoneを削除するときになんかエラーがでたのでそれの解決方法

こんなエラーがでた

Before you can delete a hosted zone, you must first delete all resource record sets except the NS and SOA resource record sets for the zone apex.

解決方法

削除したいHosted ZoneのRecord Setをすべて削除してからDelete Hosted Zoneを行うことでOKです!!!

おわりに

エラーを日本語訳しただけ

Amazon Web Services 業務システム設計・移行ガイド 一番大切な知識と技術が身につく

Amazon Web Services 業務システム設計・移行ガイド 一番大切な知識と技術が身につく

  • 作者: 佐々木拓郎,林晋一郎,瀬戸島敏宏,宮川亮,金澤圭
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2018/01/20
  • メディア: Kindle版
  • この商品を含むブログを見る

Lambda(Python)でインスタンスの特定のタグの値がなんなのかを出力する

概要

Lambda(Python3)をつかってEC2インスタンスについているあるタグの値がなんなのかを出力してみます。

スクリプト

tag_keyに出力したいタグのkeyを指定します。

実行結果

たとえば、こんなかんじでタグがついていたとします。
f:id:kabegiwakun:20180527082817p:plain

それをこのLambdaを実行するとこんなかんじで出すことができます。

[
  "kore"
]

おわりに

タグをもとにインスタンスを操作するようなLambdaを作るときに便利です。

AWSによるサーバーレスアーキテクチャ

AWSによるサーバーレスアーキテクチャ

Lambda(Python)で特定のVPCの中のサブネットの一覧を出力する

概要

Lambda(Python)を利用して、特定のVPCの中のサブネットの一覧を出力してみたいと思います。

スクリプト例

Lambdaのスクリプト的にはこんなかんじ。

実行結果

{
    'Subnets': [{
        'AvailabilityZone': 'ap-northeast-1c',
        'AvailableIpAddressCount': 250,
        'CidrBlock': '172.140.2.0/24',
        'DefaultForAz': False,
        'MapPublicIpOnLaunch': False,
        'State': 'available',
        'SubnetId': 'subnet-AAAAAAAA',
        'VpcId': 'vpc-12345678',
        'AssignIpv6AddressOnCreation': False,
        'Ipv6CidrBlockAssociationSet': [],
        'Tags': [{
            'Key': 'Name',
            'Value': 'wawawa_subnet'
        }]
    }, {
        'AvailabilityZone': 'ap-northeast-1a',
        'AvailableIpAddressCount': 248,
        'CidrBlock': '172.140.3.0/24',
        'DefaultForAz': False,
        'MapPublicIpOnLaunch': False,
        'State': 'available',
        'SubnetId': 'subnet-BBBBBBBB',
        'VpcId': 'vpc-12345678',
        'AssignIpv6AddressOnCreation': False,
~~~省略~~~

おわりに

そりゃあこうすればとれるよね


Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版

CloudWatchで日と曜日を指定するときはどちらかに?をつかう

わりと忘れがちなのでメモ。

概要

CloudWatchのスケジュールのcron式で日と曜日を指定するときに、ちゃんと設定しているはずなのに以下のようなメッセージがでてきたのでそれの回避方法です。

Parameter ScheduleExpression is not valid.

回避方法

こんなかんじで日か曜日のフィールドに?を設定する

0 14 * ? * 2-6

マニュアルにもちゃんと書いてありました。

cron 式の日フィールドと曜日フィールドを同時に指定することはできません。一方のフィールドに値 (または *) を指定する場合、もう一方のフィールドで ? (疑問符) を使用する必要があります。

docs.aws.amazon.com

おわりに

OWARI

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版

複数のAWSマネジメントコンソールを利用するときのChromeの設定のすすめ

概要

AWSのマネジメントコンソールを複数アカウント/ユーザ分利用することがまれによくあると思います。

別のアカウントでマネジメントコンソールを立ち上げたときに以下のような画面が出てしまって、セッションが全部切り替わってしまって、あーーーーーー
というのもまれによくあるとおもいます。
f:id:kabegiwakun:20180504143433p:plain

そんなあれを解消するほうほうのご紹介です!!!!!

設定方法

単純にGoogle Chromeで別ユーザをつくってあげればそれで解決します。
f:id:kabegiwakun:20180504143705p:plain

Chromeで別ユーザを作成してあげるとクッキーなどが完全に別で管理されて別セッション扱いになるので、複数アカウント分のマネジメントコンソールを開くことが可能になります!

おわりに



Amazon Web Services 業務システム設計・移行ガイド (Informatics&IDEA)

Amazon Web Services 業務システム設計・移行ガイド (Informatics&IDEA)

  • 作者: 佐々木拓郎,林晋一郎,瀬戸島敏宏,宮川亮,金澤圭
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2018/01/20
  • メディア: 単行本
  • この商品を含むブログを見る

Amazon Linux2 に自作サービスを追加する

今回はAmazonLinux2のSystemdに自作サービスを追加してみようと思います。

手順

AmazonLinux2に自作のサービスを追加するための手順です。

サービスとして追加するスクリプトの準備

今回は以下のような約1秒ごとにdateを出力するようなスクリプト()(wawawa.sh)をサービスとして追加してみようと思います。

#!/bin/bash
while true
do
    date >> /home/ec2-user/result.log
    sleep 1
done

ユニットファイルを作成する

/etc/systemd/system配下にユニットの定義ファイルを作成します。
wawawa.serviceのところは好きな名前に書き換えてあげてください。

$ sudo vim /etc/systemd/system/wawawa.service

ファイルの中身をこんなかんじに編集してあげます。

[Unit]
Description = wawawa_shell

[Service]
ExecStart = /home/ec2-user/wawawa.sh
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target

各項目のちょっとした解説

項目 説明
Description このサービスの説明
ExecStart 起動するコマンドのPATH
Restart 停止時の起動条件alwaysを指定してあげると停止時に再起動してくれる
WantedBy 起動時に設定した.wantsディレクトリにリンクを作成する

サービスとして認識されたかどうか確認する

以下コマンドを実行してサービスとして認識されたかどうか確認します。
まだ有効化(enable)していませんのでdisaabled でOKです。

sudo systemctl list-unit-files --type=service | grep wawawa
wawawa.service                                disabled

サービスを有効化(enable)する

サービスを起動する前に有効化してあげる必要があります。
以下コマンドを実行します。

$ sudo systemctl enable wawawa
Created symlink from /etc/systemd/system/multi-user.target.wants/wawawa.service to /etc/systemd/system/wawawa.service.

念のため有効化されたかどうか確認
enableになっていればOK

$ sudo systemctl list-unit-files --type=service | grep wawawa
wawawa.service                                enabled 

サービスを起動する

さていよいよサービスを起動していきます。

$ sudo systemctl start wawawa

なにも問題なければ特に出力もありません。

続いてサービスが本当に起動できているのかどうか確認していきます。
以下のようにActive: active (running)となっていれば起動成功しています。

$ sudo systemctl status wawawa

● wawawa.service - wawawa_shell
   Loaded: loaded (/etc/systemd/system/wawawa.service; enabled; vendor preset: disabled)
   Active: active (running) since 金 2018-03-16 23:44:03 UTC; 10s ago
 Main PID: 3323 (wawawa.sh)
   CGroup: /system.slice/wawawa.service
           ├─3323 /bin/bash /home/ec2-user/wawawa.sh
           └─3346 sleep 1

ファイルにも日時がリダイレクトされ続けています!

$ tail -F result.log 
Fri Mar 16 23:46:10 UTC 2018
Fri Mar 16 23:46:11 UTC 2018
Fri Mar 16 23:46:12 UTC 2018
Fri Mar 16 23:46:13 UTC 2018

おわりに

Systemdを利用して自分でつくったサービス(シェル)を登録することができました。
マシン起動時に自動でサービスが起動されますのでデーモンとして常駐させておきたいようなシェルスクリプトがあれば登録するのがいいと思います!!!

[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識

[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識

Amazon Linux2 にepelリポジトリを追加する

概要

AmazonLinux2で利用できるamzn2-coreリポジトリではインストールできないものがでてきたのでリポジトリを追加する方法をメモ。

RHEL7用のリポジトリを追加しているだけ

リポジトリを追加する手順

すでに追加されているyumリポジトリを調べる

すでに追加されているyumリポジトリを調べてみます。AmazonLinux2のデフォルトの場合ですと、以下のような感じだと思います。

$ sudo yum repolist all
読み込んだプラグイン:langpacks, priorities, update-motd
リポジトリー ID                                               リポジトリー名                                                                 状態
!amzn2-core/2017.12/x86_64                                    Amazon Linux 2 core repository                                                 有効: 7,315
amzn2-core-debuginfo/2017.12/x86_64                           Amazon Linux 2 core repository - debuginfo packages                            無効
amzn2-core-source/2017.12                                     Amazon Linux 2 core repository - source packages                               無効
repolist: 7,315

epel rpmパッケージをインストールする

epelのパッケージをインストールします。
RHEL7用のepelパッケージをインストールしています。

sudo rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

これでパッケージが追加さているはずです。

パッケージが追加さているかどうか確認する

epelリポジトリが追加できました!

$ sudo yum repolist all
読み込んだプラグイン:langpacks, priorities, update-motd
104 packages excluded due to repository priority protections
リポジトリー ID                                      リポジトリー名                                                                     状態
amzn2-core/2017.12/x86_64                            Amazon Linux 2 core repository                                                     有効:      7,315
amzn2-core-debuginfo/2017.12/x86_64                  Amazon Linux 2 core repository - debuginfo packages                                無効
amzn2-core-source/2017.12                            Amazon Linux 2 core repository - source packages                                   無効
epel/x86_64                                          Extra Packages for Enterprise Linux 7 - x86_64                                     有効: 12,319+104
epel-debuginfo/x86_64                                Extra Packages for Enterprise Linux 7 - x86_64 - Debug                             無効
epel-source/x86_64                                   Extra Packages for Enterprise Linux 7 - x86_64 - Source                            無効
epel-testing/x86_64                                  Extra Packages for Enterprise Linux 7 - Testing - x86_64                           無効
epel-testing-debuginfo/x86_64                        Extra Packages for Enterprise Linux 7 - Testing - x86_64 - Debug                   無効
epel-testing-source/x86_64                           Extra Packages for Enterprise Linux 7 - Testing - x86_64 - Source                  無効
repolist: 19,634

おわりに

リポジトリが追加できましたが一応これはRHEL7向けのリポジトリなのでどこかで不具合があるかもしれないです。
もうしわけなし

[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識

[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識

AWSCLIですべてのLambdaについているタグの一覧を表示するシェルスクリプト

概要

AWSCLIでLambdaのすべての関数についているタグの一覧を取得するシェルスクリプトを作成してみました。

aws lambda list-tagsはARNを指定することでその関数にアタッチされているタグを表示することができます。

ARN指定ですのですべての関数を見に行くことはできません。
のでつくりました。

コード

#実行例 以下のようにARN,タグ1,タグ2...タグnといったかんじで出力されます。
1行目はヘッダです。

$ ./lambda_describe_tags_all.sh
ARN Tags1 Tags2 ...
arn:aws:lambda:ap-northeast-1:123456789012:function:clitestfunction wawawa sasasa
arn:aws:lambda:ap-northeast-1:123456789012:function:instance-controll dadada
arn:aws:lambda:ap-northeast-1:123456789012:function:kabegiwablog

おわりに

局所的限定的シェルスクリプトみ

AWSによるサーバーレスアーキテクチャ

AWSによるサーバーレスアーキテクチャ

Amazon Linux2からGitHubのリポジトリへPushする

Amazon Linux2からGitHub上のリポジトリへPushするやりかたです。

環境

  • Amazon Linux2
  • GitHub上にはリポジトリはすでに存在している

Pushするまでの手順

AmazonLinux2からGitHub上のパブリックリポジトリへPushする方法を記載していきます。

事前準備

Gitをインストールする

まずGitをインストールします。
Amazon Linux2ではGitははいっていないのでインストールしてあげる必要があります。

$ sudo yum install git

ローカルリポジトリを作成する

ローカルリポジトリを作成したいディレクトリに移動してから、git initコマンドでローカルリポジトリを作成します。

$ git init

git configでユーザ名とメールアドレスを設定する

誰がCommitしたのかを記録するためにgit configでユーザ名を設定しておきます。

$ git config --global user.name "takakabe"

メールアドレスも設定しておきます。

$ git config --global user.email kabegiwablog@example.com

GitHubにssh接続するための鍵を作成する

GitHubにssh接続するために利用するsshキーを作成します。 パスワードをきかれますので任意のパスワードを設定してあげてください。

$ ssh-keygen -t rsa

Generating public/private rsa key pair.
Enter file in which to save the key (/home/ec2-user/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/ec2-user/.ssh/id_rsa.
Your public key has been saved in /home/ec2-user/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ec2-user@ip-192-140-1-1.ap-northeast-1.compute.internal
The key's randomart image is:
+---[RSA 2048]----+
|       .EooO=BOO=|
|        . Xo=+=**|
|        .+.+ ++++|
|        .+.+ ++++|
|       .+.+ ++++.|
|       . o  .    |
|        + .      |
|         o       |
|                 |
+----[SHA256]-----+

鍵が作成できました。
GitHubへの登録で利用するので公開鍵をcatした結果をコピーしておきます。

$ cat ~/.ssh/id_rsa.pub 
ssh-rsa AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ec2-user@ip-192-140-1-1.ap-northeast-1.compute.internal

GitHubに鍵を設定する

先ほど作成した鍵をGitHubに登録していきます。
「Setting」→「SSH and GPG keys」とすすみ、 f:id:kabegiwakun:20180314232209p:plain
「New SSH key」を選択します。
f:id:kabegiwakun:20180314232449p:plain

catでコピーした公開鍵をKeyの部分に貼り付けて「Add SSH key」を選択します。
TItleはてきとーで大丈夫です。 f:id:kabegiwakun:20180314232935p:plain

ローカルリポジトリの作業

事前準備は以上で完了ですので実際にPushしていきます。

Pushしたいファイルをローカルリポジトリにaddする

git addを利用して最終的にGitHubにPushしたいファイルをローカルリポジトリにAddします。
今回はlambda_describe_tags_all.shというシェルスクリプトをAddしています。

$ git add ./lambda_describe_tags_all.sh

ローカルリポジトリにCommitする

さきほどAddしたファイルをCommitします。

$ git commit -m "Lambda関数のタグを一覧で出力する"

リモートリポジトリを設定する

リモートリポジトリの設定としてPushしたいGitHub上のリポジトリを指定してあげます。
例えば以下のリポジトリにPushしたい場合は、

github.com

こんなかんじでコマンドを実行してあげます。

$ git remote add origin git@github.com:takakabe/blog_shellscript.git

git@github.com:takakabe/blog_shellscript.gitの記述はGitHubのリポジトリの「Clone or Download」の赤枠のところをみればわかります。
f:id:kabegiwakun:20180314224128p:plain   

GitHubのリポジトリにPushする

さて、いよいよGitHubにPushしていきます。
以下コマンドを実行することでGitHubへファイルの更新を反映させることができます。

$ git push origin master

無事できました!
f:id:kabegiwakun:20180314234515p:plain

おわりに

GitHubをうまくつかっていきたいとおもいましたまる

わかばちゃんと学ぶ Git使い方入門〈GitHub、Bitbucket、SourceTree〉

わかばちゃんと学ぶ Git使い方入門〈GitHub、Bitbucket、SourceTree〉