かべぎわブログ

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

AWSCLIでcloudtrailを利用してインスタンスになにがあったのかを調べる

概要

AWSCLIとcloudtrailを利用して特定のインスタンスになにがあったのかを調べてみたいと思います。

だれかが雑にインスタンスを停止してしまって誰が止めたんだ!!!!みたいな犯人探しのときにつかえます(遠い目)

コマンド例

コマンドは以下のとおり。
AttributeValueのところは調べたいインスタンスIDをいれてあげます。

$ aws cloudtrail lookup-events --lookup-attributes AttributeKey=ResourceName,AttributeValue=i-XXXXXXXXXXXX --query 'Events[].{username:Username,time:EventTime,event:EventName}'

[
    {
        "username": "kabegiwa", 
        "event": "StopInstances", 
        "time": 1530802833.0
    }, 
    {
        "username": "kabegiwa", 
        "event": "StartInstances", 
        "time": 1530801178.0
    }
]

timeの箇所はUNIXTIMEです。
若干わかりにくい。

おわりに

遠い目

AWS Security Automation and Orchestration: Modernizing Governance through Security Design

AWS Security Automation and Orchestration: Modernizing Governance through Security Design

AWSCLIでS3バケットを削除する

概要

AWSCLIをつかってS3バケット自体を削除してみようと思います。

削除する

以下のコマンドで削除することができます。

$ aws s3api delete-bucket --bucket wawawa-dst

ちなみに

バケットの中にオブジェクトが残っている場合 以下のようにエラーが出ます。

$ aws s3api delete-bucket --bucket wawawa-dst

An error occurred (BucketNotEmpty) when calling the DeleteBucket operation: The bucket you tried to delete is not empty

その場合は以下のコマンドで全部のオブジェクトを削除してから、バケットを削除します。

$ aws s3 rm --recursive s3://wawawa-dst
delete: s3://wawawa-dst/wawawa_dir/test.txt
delete: s3://wawawa-dst/sasasa.txt

おわりに

誤爆したらしぬ

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

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

同じリージョンのS3同士を同期させる

概要

同じリージョンにあるS3バケットを同期させてみようと思います。

同期させる方法

AWSCLIをつかいます。
以下のようにすることでS3バケット2つを同期させることができます。

$ aws s3 sync s3://wawawa-src s3://wawawa-dst

実際にやってみる

実際にやってみます。

前提としてバケットの中身は以下のような感じだとします。

$ aws s3 ls --recursive s3://wawawa-src/
2018-10-02 03:31:37         20 sasasa.txt
2018-10-02 03:30:29          0 wawawa_dir/
2018-10-02 03:31:10         20 wawawa_dir/test.txt
$ aws s3 ls --recursive s3://wawawa-dst/
$ 


aws syncコマンドで同期させます。

$ aws s3 sync s3://wawawa-src s3://wawawa-dst
copy: s3://wawawa-src/wawawa_dir/test.txt to s3://wawawa-dst/wawawa_dir/test.txt
copy: s3://wawawa-src/sasasa.txt to s3://wawawa-dst/sasasa.txt    

同期できました!!!

$ aws s3 ls --recursive s3://wawawa-src/
2018-10-02 03:31:37         20 sasasa.txt
2018-10-02 03:30:29          0 wawawa_dir/
2018-10-02 03:31:10         20 wawawa_dir/test.txt
$ aws s3 ls --recursive s3://wawawa-dst/
2018-10-02 03:35:59         20 sasasa.txt
2018-10-02 03:35:59         20 wawawa_dir/test.txt

おわりに

これを定期的にcronで動かすとかするとゆるーい同期が実現できる。

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

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

複数の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とハードウェアの基礎知識