かべぎわブログ

ブログです

S3上のアーカイブファイルの中身を展開して出力してくれるPythonを書きました

概要

S3上のアーカイブファイルの中身を展開して出力してくれるPythonを書きました。

github.com

つかいかた

$ python uncomp_s3.py --help

usage: uncomp_s3.py [-h] [--profile [PROFILE]] path

required arguments:
  path                 example s3://mybucket/archive.zip

optional arguments:
  --profile [PROFILE]  Use a specific profile from your credential file.

こんなかんじでつかう

tarfile

$ ls archive.tar.gz
archive.tar.gz

$ tar tvfz archive.tar.gz
-rw-rw-rw- kabegiwa/kabegiwa 7 2019-01-12 14:46 wawawa.txt
-rw-rw-rw- kabegiwa/kabegiwa 0 2019-11-07 07:15 sasasa.txt

$ aws s3 cp archive.tar.gz s3://mybucket/archive.tar.gz
$ aws s3 ls s3://mybucket/archive.tar.gz
2019-11-07 07:21:34        119 archive.tar.gz

$ python uncomp_s3.py s3://mybucket/archive.tar.gz
wawawa.txt
sasasa.txt

zipfile

$ ls archive.zip
archive.zip

$ unzip -Z archive.zip
Archive:  archive.zip
Zip file size: 325 bytes, number of entries: 2
-rw-rw-rw-  3.0 unx        7 tx stor 19-Jan-12 14:46 wawawa.txt
-rw-rw-rw-  3.0 unx        0 bx stor 19-Nov-07 07:15 sasasa.txt
2 files, 7 bytes uncompressed, 7 bytes compressed:  0.0%

$ aws cp archive.tar.gz s3://mybucket/archive.zip
$ aws s3 ls s3://mybucket/archive.zip
2019-11-07 07:21:34        119 archive.zip

$ python uncomp_s3.py s3://mybucket/archive.zip
wawawa.txt
sasasa.txt

おわりに

べんりですね

東京大学のデータサイエンティスト育成講座

東京大学のデータサイエンティスト育成講座

CLIでうごくAuthenticatorをつくりました

概要

CLIでうごくAuthenticatorをつくりました
これです

github.com

つかいかた

こんなかんじ

$ python ./auth.py --help
usage: ./auth.py [-h] [--name NAME]

optional arguments:
  --name NAME  Name of AWS account (default: ALL)

オプションを指定しないと設定ファイル(keys.yml)に指定したキーをすべて出力します。

$ python ./auth.py
DNS 646248
WEB 396959
DX 920731

指定してあげるとそのキーのみ出力してくれます。

$ python ./auth.py --name DNS
031876

こんなかんじでコマンドにわたしてあげることもできます。

$ scripts_require_MFA.sh < python ./auth.py --name DNS

設定ファイルは名前とキーをしていしてあげるだけです。

$ cat keys.yml
---
DNS:
  name: DNS
  key: MfaSecretKeyDNS
WEB:
  name: WEB
  key: MfaSecretKeyWEB
DX:
  name: DX
  key: MfaSecretKeyDXX

おわりに

べんりですね

AZIDを確認する方法

概要

AZIDを確認する方法まとめです。

マネジメントコンソール

Resource Access Managerから確認することができます。
f:id:kabegiwakun:20191025065956p:plain

AWSCLI

こんなかんじで確認できます。

aws ec2 describe-availability-zones
{
    "AvailabilityZones": [
        {
            "State": "available",
            "Messages": [],
            "RegionName": "ap-northeast-1",
            "ZoneName": "ap-northeast-1a",
            "ZoneId": "apne1-az4"
        },
        {
            "State": "available",
            "Messages": [],
            "RegionName": "ap-northeast-1",
            "ZoneName": "ap-northeast-1c",
            "ZoneId": "apne1-az1"
        },
        {
            "State": "available",
            "Messages": [],
            "RegionName": "ap-northeast-1",
            "ZoneName": "ap-northeast-1d",
            "ZoneId": "apne1-az2"
        }
    ]
}

この1冊で合格! AWS認定ソリューションアーキテクト - アソシエイト テキスト&問題集

この1冊で合格! AWS認定ソリューションアーキテクト - アソシエイト テキスト&問題集

  • 作者: アクセンチュア株式会社,青柳雅之,飯田敏樹,柿沼力,門畑顕博,他
  • 出版社/メーカー: KADOKAWA
  • 発売日: 2019/07/20
  • メディア: 単行本
  • この商品を含むブログを見る

motoでboto3のテストをする

概要

motoをつかってboto3のテストをしてみたいと思います。

そもそもmotoとは

AWSサービスのモックをつくることができるやつです。
mock botoでmotoです(たぶん)

motoでテストしてみる

実際にやってみます。
こんかいはS3にオブジェクトを置くスクリプトのテストをしてみます。

motoのインストール

pipでできます。

pip install moto

テストされる.py

S3にオブジェクトを置くだけのスクリプトです。

import boto3

class s3(object):
    def __init__(self, name, value):
        self.name = name
        self.value = value

    def put(self):
        s3 = boto3.client('s3', region_name='ap-northeast-1')
        s3.put_object(Bucket='mybucket', Key=self.name, Body=self.value)

テストする.py

オブジェクトをGETして中身が正しいかどうかを確かめています。
kabegiwa_blogという名前のオブジェクトの中身がawesomeであればOKです。

import boto3
from moto import mock_s3
from put_object import s3


@mock_s3
def test_put_object():
    conn = boto3.resource('s3', region_name='ap-northeast-1')
    conn.create_bucket(Bucket='mybucket')

    model_instance = s3('kabegiwa_blog', 'is awesome')
    model_instance.put()

    body = conn.Object('mybucket', 'kabegiwa_blog').get()['Body'].read().decode("utf-8")

    assert body == 'is awesome'

test_put_object()

実際にテストしてみる

テストしてみます。
テストする.pyを実行します。
わかりやすくするためにpytestを利用します。

pytestについてはまえにかきました。

www.kabegiwablog.com

テストがとおっていることがわかる。

pytest -v test_put_object.py

=== test session starts ===
platform win32 -- Python 3.7.4, pytest-5.2.1, py-1.8.0, pluggy-0.13.0 -- c:\users\takak\appdata\local\programs\python\python37-32\python.exe
cachedir: .pytest_cache
rootdir: C:\Users\takak\Downloads\moto_test
collected 1 item

test_put_object.py::test_put_object PASSED                                                                       [100%]

テストする.pyのassertの部分を以下のように変えてもう一度テストしてみます。

    assert body == 'is not awesome'

テスト実行するとエラーになっていることがわかります。

pytest -v .\test_put_object.py

=== test session starts ===
platform win32 -- Python 3.7.4, pytest-5.2.1, py-1.8.0, pluggy-0.13.0 -- c:\users\takak\appdata\local\programs\python\python37-32\python.exe
cachedir: .pytest_cache
rootdir: C:\Users\takak\Downloads\moto_test
collected 0 items / 1 errors

=== ERRORS ===
____ ERROR collecting test_put_object.py ___
test_put_object.py:18: in <module>
    test_put_object()
..\..\appdata\local\programs\python\python37-32\lib\site-packages\moto\core\models.py:80: in wrapper
    result = func(*args, **kwargs)
test_put_object.py:16: in test_put_object
    assert body == 'is not awesome'
E   AssertionError: assert 'is awesome' == 'is not awesome'

結局なにこれ?

mockなのでmybucketというAWSサービスはつくられていないです。
そしてオブジェクトも作成されていないです。
というかそんなバケット名はたぶんもうすでにつかわれているのでつくれないです。

でもなぜテストがとおったか(バケットからオブジェクトをGETできたか)というとmotoが仮想的にmockをつくって応答してくれているからです。

boto3のテストを実施するときはだいたいスクリプトを動かしてはAWSリソースを消してーとか、既存のものに影響がないように気をつけなくちゃーとかやっていたけれど、これを使うことでそういうことを気にしなくて良くなります。

注意点

すべてのAWSリソースがテストできるわけではないです
以下にいろいろかいてあります。
github.com

おわりに

kabegiwa_blog is awesome.

テスト駆動開発

テスト駆動開発

PowerShellでhistoryを表示する

概要

PowerShellでコマンド履歴を表示します。

コマンド

こうすればみれる

PS1> Get-History

  Id CommandLine
  -- -----------
   1 echo 'wawawa'
   2 echo 'sasasa'
   3 echo 'dadada'

おわりに

わすれがち

Windows PowerShellクックブック

Windows PowerShellクックブック

  • 作者: Lee Holmes,マイクロソフト株式会社ITプロエバンジェリストチーム(監訳),菅野良二
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2008/10/23
  • メディア: 大型本
  • 購入: 4人 クリック: 72回
  • この商品を含むブログ (15件) を見る

pytestでPythonスクリプトをテストする

概要

PythonのテストツールのpytestをつかってPythonスクリプトのテストをしてみたいと思います。

インストール

pytestはpipでインストールできます。

$ pip install pytest

テストしてみる

実際にpytestでテストしてみます。

前提

こんなかんじのスクリプトたちがあるとする。

テストされる.py

たしざんするだけのやつ

def addition(a, b):
    result = a + b
    return(result)

テストする.py

そしてそれのテストコードがあるとするとこう(本当はこんなケース必要ないけれど)
1+2=3だよねー
2+2=4だよねーってかんじ。

def test_addtion_3()はまちがっているのでエラーになるはず

import wawawa
def test_addtion_1():
    assert wawawa.addition(1,2) == 3

def test_addtion_2():
    assert wawawa.addition(2,2) == 4

def test_addtion_3():
    assert wawawa.addition(2,2) == 99

pytest でテストしてみる

テストしてみます。
いい忘れていたけどディレクトリ構成はこんなかんじ。

$ ls -l .
-a----        2019/10/21     7:44            141 test_wawawa.py
-a----        2019/10/21     7:41             61 wawawa.py

テストしてみます。
わかりやすくするためにオプションに-vを指定して実行してあげています。

$ pytest -v ./test_wawawa.py
====================================== test session starts =======================================
platform win32 -- Python 3.7.4, pytest-5.2.1, py-1.8.0, pluggy-0.13.0 -- c:\users\takak\appdata\local\programs\python\python37-32\python.exe
cachedir: .pytest_cache
rootdir: C:\Users\takak\test_test
collected 3 items

test_wawawa.py::test_addtion_1 PASSED                                                       [ 33%]
test_wawawa.py::test_addtion_2 PASSED                                                       [ 66%]
test_wawawa.py::test_addtion_3 FAILED                                                       [100%]

============================================ FAILURES ============================================
_________________________________________ test_addtion_3 _________________________________________

    def test_addtion_3():
>       assert wawawa.addition(2,2) == 99
E       assert 4 == 99
E         -4
E         +99

test_wawawa.py:10: AssertionError
================================== 1 failed, 2 passed in 0.03s ===================================

3つ目のテストケースでFAILEDとなっていることがわかる。

おわりに

べんりですね。

独学プログラマー Python言語の基本から仕事のやり方まで

独学プログラマー Python言語の基本から仕事のやり方まで

Pythonから別のPythonファイルを呼び出す

概要

Pythonスクリプトから別のPythonファイルのスクリプトを呼び出してみたいと思います。

こんなかんじ

こんなかんじでできます。
呼び出すPythonファイルがどこにあるかによって指定の仕方がすこしちがいます。

同一階層のPythonを呼び出す

こんなかんじだとする。

python_dir
    ├─wawawa.py
    └─sasasa.py

wawawa.pyからsasasa.pyを呼び出す場合、こんなかんじでよびだしてあげる。

import sasasa

これだけでよい。

ディレクトリの中にあるPythonを呼び出す

ディレクトリの中にあるPythonを呼び出す場合はこんなかんじです。
こんなかんじだとする。

python_dir
    ├─wawawa.py
    └─dadada/
      └─sasasa.py

wawawa.pyからsasasa.pyを呼び出す場合、こんなかんじでよびだしてあげる。

from dadada import sasasa

おわりに

べんりですね

東京大学のデータサイエンティスト育成講座

東京大学のデータサイエンティスト育成講座

argparseで2つの引数のどちらかのみオプションとして指定させる

概要

Pythonでargparseをつかって2つの引数のうちどちらかののみを指定している場合のみOKとしてみます。

文章で書くとよくわかんない。
こんなかんじにしたい。

$ ./wawawa.py --wawawa
# これはOK

$ ./wawawa.py --sasasa
# これもOK

$ ./wawawa.py --wawawa --sasasa
# これはNG

こうすればよい

こんなかんじで指定してあげる

mutual = parser.add_mutually_exclusive_group(required=True)
mutual.add_argument('--wawawa',help='wawawa desu.')
mutual.add_argument('--sasasa',help='sasasa desu.')

おわりに

べんりですね

入門 Python 3

入門 Python 3

プルリクエストを投げるまで(git switch対応版)

プルリクエストを投げるまでの手順です。
git switch対応版です。

手順

ブランチをつくってきりかえる

一気にできる。

$ git switch -c develop

Switched to a new branch 'develop'

一応確認

$ git branch

* develop
  master

addしてcommitしてpushする

コードを修正して
addして

$ git add delete_iroiro.py

commitして

$ git commit -m 'add delete'

[develop 179b2ed] add delete
 1 file changed, 10 insertions(+), 4 deletions(-)

pushします

$ git push origin develop

Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 12 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 515 bytes | 515.00 KiB/s, done.
Total 5 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
remote:
remote: Create a pull request for 'develop' on GitHub by visiting:
remote:      https://github.com/takakabe/aws_tools/pull/new/develop
remote:
To https://github.com/takakabe/aws_tools.git
 * [new branch]      develop -> develop

プルリクエストなげる

GitHubにいって f:id:kabegiwakun:20191017073822p:plain

compareのブランチえらんでプルリクエストのタイトルと文章をかいてクリエイトする。

f:id:kabegiwakun:20191017074019p:plain

チェックしてマージする

変更がいいかんじだったらマージする
f:id:kabegiwakun:20191017074152p:plain

後処理

GitHub上のブランチを消して
f:id:kabegiwakun:20191017074253p:plain

ローカルの方からも消してあげる
そのまえにブランチ切り替えて

$ git switch master

Switched to branch 'master'
Your branch is up to date with 'origin/master'.

マスターを最新にしてあげて

$ git pull origin master

remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (1/1), done.
From https://github.com/takakabe/aws_tools
 * branch            master     -> FETCH_HEAD
   b6702a2..14a5b5b  master     -> origin/master
Updating b6702a2..14a5b5b
Fast-forward
 IAM/delete_iroiro/delete_irorio.py | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

さっきのブランチを削除

$  git branch -d develop

Deleted branch develop (was 179b2ed).

おしまい

おわり

実用Git

実用Git

  • 作者: Jon Loeliger,吉藤英明(監訳),本間雅洋,渡邉健太郎,浜本階生
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2010/02/19
  • メディア: 大型本
  • 購入: 7人 クリック: 287回
  • この商品を含むブログ (45件) を見る

PowerShellで管理者権限でしか実行できないようにする

概要

PowerShellのスクリプトを管理者権限でしか実行できないようにしてみます。

前提

PowerShell v4 以上

スクリプト

こんなかんじ
#Requires -RunAsAdministratorを書いてあげる。

#Requires -RunAsAdministrator

# ↓確認用
Write-Host 'wawawa'

実行してみる

ためしに一般ユーザの一般の権限でうごかしてみる。

> .\admin.ps1
.\admin.ps1 : The script 'admin.ps1' cannot be run because it contains a "#requires" statement for running as Administrator. The current PowerShell session is not running as Administrator. Start PowerShell by using the Run as Administrator option, and then try running the script again.
At line:1 char:1
+ .\admin.ps1
+ ~~~~~~~~~~~
+ CategoryInfo          : PermissionDenied: (admin.ps1:String) [], ScriptRequiresException
+ FullyQualifiedErrorId : ScriptRequiresElevation

管理者権限で実行するとこんなかんじ。
うごく。

> .\admin.ps1
wawawa

おわりに

べんりですね。

Windows PowerShellクックブック

Windows PowerShellクックブック

  • 作者: Lee Holmes,マイクロソフト株式会社ITプロエバンジェリストチーム(監訳),菅野良二
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2008/10/23
  • メディア: 大型本
  • 購入: 4人 クリック: 72回
  • この商品を含むブログ (15件) を見る

PythonでIAMグループとかIAMロールをかんたんに削除してくれるPythonをかいた

概要

PythonでIAMグループとかIAMロールをかんたんに削除してくれるPythonをかきました。

これと
IAMグループをかんたんに削除してくれるPythonをかいた - かべぎわブログ
これ
IAMロールをかんたんに削除してくれるPythonを書いた - かべぎわブログ

りょうほういっしょにできんじゃね?という意見をもとにくっつけた。
classで継承させたりしている。
これつかいかたあっているのかな???

コード

こんなかんじ。

つかいかた

こんなかんじ

usage: ./delete_irorio.py [-h] (--group-name GROUP_NAME | --role-name ROLE_NAME) [--profile [PROFILE]]

おわりに

classむずかしい

入門 Python 3

入門 Python 3

PowerShellで管理者権限かどうか判定する

概要

PowerShellでAdministratorかどうかを判定してみます。

スクリプト

こんなかんじ。

$currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
$bool_admin = $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

if ($bool_admin) {
    Write-Output 'Admin'
} else {
    Write-Output 'NotAdmin'
}

実行してみる

管理者権限で実行してみるとこう。

> .\check_admin.ps1
Admin

そうじゃないとこう。

> .\check_admin.ps1
NotAdmin

おわりに

おわり。

Windows PowerShellクックブック

Windows PowerShellクックブック

  • 作者: Lee Holmes,マイクロソフト株式会社ITプロエバンジェリストチーム(監訳),菅野良二
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2008/10/23
  • メディア: 大型本
  • 購入: 4人 クリック: 72回
  • この商品を含むブログ (15件) を見る

IAMグループをかんたんに削除してくれるPythonをかいた

概要

IAMグループをかんたんに削除してくれるPythonをかきました。
グループを削除する際にはポリシーをデタッチしたりユーザをリムーブしたりいろいろしなければいけないですがこのスクリプトはそれらを解決します。
いろいろデタッチしたりしてからグループを削除してくれます。

スクリプト

おわりに

resourceたのしい。

入門 Python 3

入門 Python 3

VSCodeで引数を与えてデバッグする

概要

VSCodeで引数を与えてデバッグしてみます。

手順

VSCodeのデバッグ画面の設定画面をクリックします。
f:id:kabegiwakun:20191012195717p:plain

launch.jsonが開くのでそこに"args":["--group-name", "test_group"],こんなかんじで入力してあげます。
この例だと./wawawa.py --group-name test_groupと実行したのとおなじかんじになります。
f:id:kabegiwakun:20191012195856p:plain

おわりに

たまにわすれがち

Visual Studio Codeデバッグ技術 (技術の泉シリーズ(NextPublishing))

Visual Studio Codeデバッグ技術 (技術の泉シリーズ(NextPublishing))

IAMロールをかんたんに削除してくれるPythonを書いた

概要

IAMロールをかんたんに削除してくれるPythonをかきました。

ロールを削除する際にはポリシーをデタッチしたりインスタンスプロファイルをリムーブしたりいろいろしなければいけないですがこのスクリプトはそれらを解決します。
いろいろデタッチしたりしてからロールを自動で削除してくれます。

スクリプト

こんなかんじです。

つかいかた

こんなかんじ。
だいたいわかるとおもう。
基本的にはロール名を指定してあげるだけ。

usage: ./delete_role.py [-h] [--profile [PROFILE]] --role-name ROLE_NAME

required arguments:  
  --role-name ROLE_NAME The name of the role to delete.

optional arguments:  
  --profile [PROFILE]   Use a specific profile from your credential file.

おわりに

ぼくのPython力があのころとくらべてすごくあがっていることがわかる

イシューからはじめよ ― 知的生産の「シンプルな本質」

イシューからはじめよ ― 知的生産の「シンプルな本質」