かべぎわブログ

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

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〉

Windowsインスタンスの停止時にログをS3に転送する

概要

Windowsインスタンスの停止時にS3にローカルのログファイルを転送する処理をご紹介します!

前提

  • Windows Server 2016
  • AWSCLIが利用可能な環境

シャットダウンスクリプトの設定手順

  • スタートメニューの「ファイル名を指定して実行」に「gpedit.msc」と入力してOK
  • コンピューターの構成→Windowsの設定→スクリプト(スタートアップ/シャットダウン)
  • シャットダウンをダブルクリック
  • 追加ボタンを押してスクリプト名に実行したいプログラムを設定

これでWindowsのシャットダウン時に指定のプログラムが実行されます。

基本的には以下URL見ればわかります。  

www.attrise.com

スクリプト例

こんなかんじのスクリプト(batファイル)をシャットダウンスクリプトに設定してあげればS3へログを転送することができます。
AWSCLIでS3にローカルのファイルをコピーしています。

aws s3 cp C:\Users\Administrator\Desktop\wawawa2.log s3://kabegiwa-bucket/wawawa.log

実行契機

以下の実行契機でシャットダウンスクリプトが実行されるようです。 - リモートデスクトップで接続して、スタートメニューから停止または再起動した場合 - マネジメントコンソールから、停止/再起動/削除した場合(削除は起動中のものを削除した場合のみ)

注意点

ただし、マネジメントコンソールから停止した場合と、スタートメニューから停止した場合では動きが少し異なっています。

スタートメニューから停止した場合はなにも考えなくても大丈夫ですが、 マネジメントコンソールからインスタンスを停止した場合、シャットダウンスクリプトの処理が長いと、停止時に問題が発生したとみなされてAWSから強制停止されてしまいます。

おわりに

終了時にログを退避することでインスタンスがいつ削除されてもいいようにしておくことがImmutableなインフラへの近道だと思います。
よくわかっていないですけれど…

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

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

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

最大公約数を求めるLambda(Python3)

なんかまったく需要がなさそうだけど気の迷いでつくりました。

概要

変数のxyに整数を入力してあげると、printで結果を返してくれます。
以下のコードでは84と16の最大公約数を求めています。

かんたんな説明

最大公約数は以下のようにして求めることができます。

84 mod 16 = 4 
16 mod 4 = 0

あまりが0になったから最大公約数は4だ!!!!

84 mod 16を計算します。 答え(あまり)は4です。
つづいて、右辺の16と先程の答えの416 mod 4を計算します。
16 mod 4 = 0なので最大公約数は0です!!!

おわりに

説明下手感

Python 1年生 体験してわかる!会話でまなべる!プログラミングのしくみ

Python 1年生 体験してわかる!会話でまなべる!プログラミングのしくみ

IAMロールの権限でCyberduckを利用してS3とファイルをやりとりしてみる

今回はCyberduckというGUIのFTPクライアントツールを利用してAWS上のS3バケットとIAMロールを付与したWindowsインスタンス上でファイルのやり取りをしてみたいと思います。

この方法を利用することでアクセスキーを発行しなくてもCyberduckを利用することが可能です。

手順

以下の手順はすべてS3へアクセス可能なIAMロールがアタッチされているWindowsインスタンス内で作業していることを想定しています。

Cyberduckのダウンロード

以下からダウンロードできます。

https://cyberduck.io/index.ja.html?l=ja

S3のIAMロール用のCyberduckのprofileをダウンロード

IAMロール用のCyberduckのprofileをダウンロードしてきます。

以下のリンクの上のほうに「Connecting with temporary access credentials (Token) from EC2」という項目があります。
そこにIAMロール用のCyberduckのprofileがありますので、Downloadを選択して、ダウンロードします。

https://trac.cyberduck.io/wiki/help/en/howto/s3

画像でいうと赤枠のところ f:id:kabegiwakun:20180228185339p:plain

profileの編集

テキストエディタでダウンロードしてきたprofileを開き、 http://169.254.169.254/latest/meta-data/iam/security-credentials/s3accessとなっている箇所の、s3accessの部分を現在作業中のインスタンスにアタッチされているIAMロールの名前に書き換えます。
それ以外のところは、なにも編集せず保存します。

CyberduckでS3に接続してみる

さきほど編集したprofileをダブルクリックしてCyberduckを起動します。

すると、S3へ接続が行われ、バケットの一覧がでてきます。
f:id:kabegiwakun:20171101222245p:plain

バケット名をダブルクリックするとバケットの中身がみれます。
f:id:kabegiwakun:20171101222334p:plain

おわりに

アクセスキーを発行しなくてもこういったGUI系のツールを利用できる。というのは結構便利だと思います。
(AWSCLIつかいかたわからないみたいなこともあるので…)

おためしあれ!!!

サーバーレスシングルページアプリケーション ―S3、AWS Lambda、API Gateway、DynamoDB、Cognitoで構築するスケーラブルなWebサービス

サーバーレスシングルページアプリケーション ―S3、AWS Lambda、API Gateway、DynamoDB、Cognitoで構築するスケーラブルなWebサービス

AnsibleでWindowsにAWS CLIをインストールする

今回はAnsibleでWindows環境にAWS CLIをインストールしてみたいと思います。

事前準備

AWS公式からAWS CLIのインストーラをダウンロードしてきます。

aws.amazon.com

以下の赤枠から32ビットまたは64ビットのものをダウンロードします。
f:id:kabegiwakun:20180211160146p:plain

Ansibleを実行する

さて、実際にAnsibleを実行してAWS CLIをインストールしてみます。

実行コマンド

$ ansible-playbook -i hosts/target-hosts install_AWSCLI.yml

playbookは以下のような感じです。

win_copyでインストーラをターゲットノード(AWS CLIをインストールしたいサーバ)にコピーしたあと、win_msiを利用してインストールしています。

おわりに

Ansibleを利用してAWS CLIをインストールすることができました。
msi形式のインストーラであればwin_msiでインストーラのPATHを指定してあげるだけでインストールを行うことができます!

便利ですね!

Infrastructure as Code ―クラウドにおけるサーバ管理の原則とプラクティス

Infrastructure as Code ―クラウドにおけるサーバ管理の原則とプラクティス