かべぎわブログ

ブログです

Terraformでアカウントエイリアスを利用する

概要

TerraformでAWSのアカウントエイリアスを利用してみます。

前提

前提はこう

$ terraform --version
Terraform v0.12.18
+ provider.aws v2.43.0

こんなかんじ

data "aws_iam_account_alias" "wawawa" {}

output "account_alias" {
  value = "data.aws_iam_account_alias.wawawa.account_alias"
}

こうなる

こうなります
これだけだとよくわからない感もあるけれど

Outputs:

account_alias = kabegiwa

おわりに

べんりですね

実践Terraform AWSにおけるシステム設計とベストプラクティス (技術の泉シリーズ(NextPublishing))

実践Terraform AWSにおけるシステム設計とベストプラクティス (技術の泉シリーズ(NextPublishing))

  • 作者:野村 友規
  • 出版社/メーカー: インプレスR&D
  • 発売日: 2019/09/20
  • メディア: オンデマンド (ペーパーバック)

AMIといっしょにスナップショットも削除してくれるPythonをかいた

概要

AMIといっしょにスナップショットも削除してくれるPythonをかいたので見てください。

これです

これです。

github.com

つかいかた

helpです

$ python ./delete_ami_snapshot.py --help
usage: ./delete_ami_snapshot.py [-h] --image_id IMAGE_ID [--profile [PROFILE]]

optional arguments:
  -h, --help           show this help message and exit
  --profile [PROFILE]  Use a specific profile from your credential file.

required arguments:
  --image_id IMAGE_ID  AMI image ID.

おわりに

べんりですね

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

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

  • 作者:安宅和人
  • 出版社/メーカー: 英治出版
  • 発売日: 2014/09/01
  • メディア: Kindle版

Terraformで複数ルールのセキュリティグループを作成する

概要

Terraformで複数のルールが記載されたセキュリティグループを作成してみます。

こんなかんじのやつ

$ aws ec2 describe-security-groups --filters Name=group-id,Values=sg-XXXXXX --output text
SECURITYGROUPS  Managed by Terraform    sg-XXXXXX   wawawa_security_group   123456789012    vpc-XXXXXX
IPPERMISSIONS   80  tcp 80
IPRANGES    0.0.0.0/0
IPPERMISSIONS   443 tcp 443
IPRANGES    0.0.0.0/0
IPPERMISSIONSEGRESS -1
IPRANGES    0.0.0.0/0

前提

Terraformのバージョンはこんなかんじ。

 terraform --version
Terraform v0.12.17
+ provider.aws v2.40.0

こんなかんじでつくれます

tfファイルはこんなかんじ

resource "aws_security_group" "wawawa_security_group" {
    name = "wawawa_security_group"

    ingress {
        from_port = 80
        to_port = 80
        protocol = "tcp"
        cidr_blocks = ["0.0.0.0/0"]
    }

    ingress {
        from_port = 443
        to_port = 443
        protocol = "tcp"
        cidr_blocks = ["0.0.0.0/0"]
    }

    egress {
        from_port = 0
        to_port = 0
        protocol = "-1"
        cidr_blocks = ["0.0.0.0/0"]
    }
}

以下にはこんなかんじではつくれず、エラーになるとのことだけれど Terraformのバージョンアップで作成できるようになったのかもしれない。
なんにせよべんりになりましたね。

Terraformで1つのセキュリティグループに複数のルールを設定する - Qiita

おわりに

べんりですね。

Terraformで最新版のAmazonLinux2を取得する

概要

Terraformで最新版のAmazonLinux2をつかってEC2インスタンスを作成します。

こんなかんじ

filterでしぼっています。

provider "aws" {
  region = "ap-northeast-1"
}

data "aws_ami" "recent_amazon_linux2" {
    most_recent = true
    owners = ["amazon"]

    filter {
        name = "state"
        values = ["available"]
    }
    filter {
        name = "name"
        values = ["amzn2-ami-hvm-2.0.*"]
    }
}

resource "aws_instance" "wawawa" {
    ami = data.aws_ami.recent_amazon_linux2.image_id
    instance_type = "t3.micro"
}

おわりに

べんりですね

Terraform: Up & Running: Writing Infrastructure as Code (English Edition)

Terraform: Up & Running: Writing Infrastructure as Code (English Edition)

  • 作者:Yevgeniy Brikman
  • 出版社/メーカー: O'Reilly Media
  • 発売日: 2019/09/06
  • メディア: Kindle版

S3バケットの中のオブジェクトを数えてくれるPythonをかきました

概要

S3バケットの中にあるオブジェクトを数えてくれるPythonをかきました。

これです

これです
値はCloudWatchメトリクスから持ってきています。
github.com

つかいかた

こうやってつかうのだ

$ python get_object_count.py --help
usage: get_object_count.py [-h] --bucket BUCKET [--profile [PROFILE]]

optional arguments:
  -h, --help           show this help message and exit
  --profile [PROFILE]  Use a specific profile from your credential file.

required arguments:
  --bucket BUCKET      The name of the bucket name.
$ python ./get_object_count.py --bucket mybucket
12 Count

おわりに

aws s3 ls s3://mybucket --recursive --human --sumとかやらなくていいです。

Amazon Web Servicesインフラサービス活用大全 システム構築/自動化、データストア、高信頼化 (impress top gear)

Amazon Web Servicesインフラサービス活用大全 システム構築/自動化、データストア、高信頼化 (impress top gear)

  • 作者: Michael Wittig,Andreas Wittig,株式会社クイープ
  • 出版社/メーカー: インプレス
  • 発売日: 2019/09/05
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

CloudWatch Logs InsightsでLambdaの実行時間の長いものを取得する

関数

CloudWatch Logs InsightsをつかってLambda関数の実行時間の長いものを取得してみたいと思います。

やってみる

やってみる。

クエリ

クエリはこんなかんじです。

filter @type = "REPORT"
| fields @requestId, @billedDuration, @duration
| sort by @duration desc
| limit 10

実行時間を確認したいLambdaのロググループを選択して [クエリの実行]すると以下のように結果がでてきます。
f:id:kabegiwakun:20191122065053p:plain

おわりに

べんりですね

AWS認定資格試験テキスト AWS認定 ソリューションアーキテクト-アソシエイト

AWS認定資格試験テキスト AWS認定 ソリューションアーキテクト-アソシエイト

  • 作者: NRIネットコム株式会社,佐々木拓郎,林晋一郎,金澤圭
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2019/04/20
  • メディア: 単行本
  • この商品を含むブログを見る

DockerでCentOS8のAWSCLI環境を作成する

概要

DockerでCentOS8のイメージをつかってAWSCLIの動作環境を作ってみたいと思います。

Dockerfile

こんなかんじ。

FROM centos:8

RUN dnf install -y wget python3

RUN wget https://bootstrap.pypa.io/get-pip.py
RUN python3 get-pip.py

RUN pip install awscli

ENV PATH $PATH:/root/.local/bin

CentOS8ではPythonがインストールされていないため、そのインストールからはじめている。
インストールはyumではなくdnfをつかっています。

やってみる

やってみます。

buildする

buildします。

$ ls
Dockerfile

$ docker build -t awscli .

runして中にはいってみる

起動して中に入ってみます

$ docker run -it awscli

AWSCLIがはいっていることがわかります。

$ aws --version
aws-cli/1.16.287 Python/3.6.8 Linux/4.9.184-linuxkit botocore/1.13.23

おわりに

おわり

Docker実践ガイド 第2版 impress top gearシリーズ

Docker実践ガイド 第2版 impress top gearシリーズ

S3バケットのサイズを取得してくれるPythonをかいた

概要

S3バケットのサイズ(オブジェクトのサイズの合計)を取得してくれます。
CloudWatchメトリクスの値をもとにしています。

コード

これです。 github.com

つかいかた

usage: 'get_bucket_size.py [-h] --bucket BUCKET [--profile [PROFILE]]

optional arguments:
  -h, --help           show this help message and exit
  --profile [PROFILE]  Use a specific profile from your credential file.

required arguments:
  --bucket BUCKET      The name of the bucket name.

こんなかんじで表示されます。

$ python ./get_bucket_size.py --bucket mybucket
6487.0 Bytes

おわりに

おわり

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

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

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

AWSマネジメントコンソールのヘッダーに色をつけるChrome/Firefox拡張

概要

AWSのマネジメントコンソールのヘッダーに色つけてくれるChrome/Firefox拡張です。
AWS console regions colorです。
リージョンがわかりやすくなります。

まねこんポチポチしてたらオレゴンにインスタンスつくってたわみたいなことがたぶんなくなります。

Chrome

chrome.google.com

Firefox

addons.mozilla.org

こんなかんじ

こんなかんじになります。
デフォルトだと東京はこうで
f:id:kabegiwakun:20191112064428p:plain

オレゴンがこうです。
f:id:kabegiwakun:20191112090902p:plain
わかりやすいですね

カスタマイズもできる

いろがきにいらなければ変更できます。
f:id:kabegiwakun:20191112064639p:plain

おわりに

わかりやすいですね

徹底攻略 AWS認定 ソリューションアーキテクト ? アソシエイト教科書 徹底攻略シリーズ

徹底攻略 AWS認定 ソリューションアーキテクト ? アソシエイト教科書 徹底攻略シリーズ

オブジェクトをすべて削除してからS3バケットを削除してくれるPythonをかきました

概要

かんたんにS3バケットを削除してくれるPythonをかきました。

バケットを削除するときはすべてのオブジェクトを削除してからじゃないと削除できなくてめんどくさいなーってかんじだったのでかいた。

スクリプト

これです。
github.com

import boto3, argparse

class s3():
    def __init__(self, bucket_name, profile='default'):
        self.session = boto3.Session(profile_name=profile)
        self.s3 = self.session.resource('s3')
        self.bucket = self.s3.Bucket(bucket_name)

    def delete_all_object(self):
        self.s3_objects = list(self.bucket.objects.all())
        for self.s3_object in self.s3_objects:
            self.s3_object.delete()

    def delete_all_object_versions(self):
        self.s3_object_versions = list(self.bucket.object_versions.all())
        for self.s3_object_version in self.s3_object_versions:
            self.s3_object_version.delete()

    def delete_bucket(self):
        self.bucket.delete()

    def delete(self):
        self.delete_all_object()
        self.delete_all_object_versions()
        self.delete_bucket()


def main():
    s3(bucket_name, profile).delete()

if __name__ == '__main__':
    parser = argparse.ArgumentParser(prog=__file__)
    required = parser.add_argument_group('required arguments')
    optional = parser.add_argument_group('optional arguments')
    required.add_argument('--bucket',required=True, help='The name of the bucket name.')
    optional.add_argument('--profile',nargs='?',default='default',help='Use a specific profile from your credential file.')
    
    args = parser.parse_args()
    bucket_name = args.bucket
    profile = args.profile

    main()

こんなかんじでつかう

$ python delete_bucket.py --bucket mybucket

おわりに

間違ったバケットを消さないよう注意

Amazon Web Services エンタープライズ基盤設計の基本

Amazon Web Services エンタープライズ基盤設計の基本

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

おわりに

べんりですね

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

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

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.

テスト駆動開発

テスト駆動開発

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

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

概要

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

スクリプト

おわりに

resourceたのしい。

入門 Python 3

入門 Python 3