サブネットを切りたくなった時の計算方法に関するメモ書き

VPCなんかでサブネットを切りたくなった時に計算を求めるのをいつも忘れてしまうのでメモ

itmediaの記事がわかりやすい

www.atmarkit.co.jp

練習問題

www.atmarkit.co.jp

192.168.30.25/22のネットワークアドレスを選択しなさい。

CIDR形式のipアドレスからネットワークアドレスを求めるには一旦2進数に解く必要がある オクテット単位で変換していく。 10進から2進への変換は割り算で行う

www.infraexpert.com

IPアドレス 192.168.30.25 11000000.10101000.00011110.00011001 サブネットマスク(スラッシュ22のところ) 255.255.252.0 11111111.11111111.11111100.00000000 ネットワークアドレス 192.168.28.0 11000000.10101000.00011100.00000000

内容はコピペしたが一応手計算もした(練習のため) ipアドレスの二進数変換は計算するしかない。

スラッシュの後ろの数字はは第一オクテットからみて何ビットまでがマスクなのかを表してるので。 単純に1を桁数分だけ左側から並べていけば良い。10進数で表す場合も1,2,4,8,16,32,64,128で並べて1が立ってる場所の和を求めれば良いだけ。 ネットワークアドレスは2進数化されたipアドレスサブネットマスク論理積を求めて。10進数にすると求められる。 192.168.28.0 となる。

tips

理解してなくてもipcalと言うコマンドを使うと全部計算してくれるが。 理解しておくことは大事

ipcalc 192.168.30.25/22
Address:   192.168.30.25        11000000.10101000.000111 10.00011001
Netmask:   255.255.252.0 = 22   11111111.11111111.111111 00.00000000
Wildcard:  0.0.3.255            00000000.00000000.000000 11.11111111
=>
Network:   192.168.28.0/22      11000000.10101000.000111 00.00000000
HostMin:   192.168.28.1         11000000.10101000.000111 00.00000001
HostMax:   192.168.31.254       11000000.10101000.000111 11.11111110
Broadcast: 192.168.31.255       11000000.10101000.000111 11.11111111
Hosts/Net: 1022                  Class C, Private Internet

オクテット単位外でサブネットを切りたい時のメモ

/24, /16 のようにオクテット単位でサブネットを切るときは迷うことはほぼないのだが、 /20のような範囲で切る場合はネットワークアドレスはホストアドレスが全てゼロになるように設定する必要がある(ネットワークアドレスの仕様) そのためちょっとだけ計算してあげる。

NG

ipcalc 10.10.10.0/20
Address:   10.10.10.0           00001010.00001010.0000 1010.00000000
Netmask:   255.255.240.0 = 20   11111111.11111111.1111 0000.00000000
Wildcard:  0.0.15.255           00000000.00000000.0000 1111.11111111
=>
Network:   10.10.0.0/20         00001010.00001010.0000 0000.00000000
HostMin:   10.10.0.1            00001010.00001010.0000 0000.00000001
HostMax:   10.10.15.254         00001010.00001010.0000 1111.11111110
Broadcast: 10.10.15.255         00001010.00001010.0000 1111.11111111
Hosts/Net: 4094                  Class A, Private Internet

OK

ipcalc 10.10.16.0/20
Address:   10.10.16.0           00001010.00001010.0001 0000.00000000
Netmask:   255.255.240.0 = 20   11111111.11111111.1111 0000.00000000
Wildcard:  0.0.15.255           00000000.00000000.0000 1111.11111111
=>
Network:   10.10.16.0/20        00001010.00001010.0001 0000.00000000
HostMin:   10.10.16.1           00001010.00001010.0001 0000.00000001
HostMax:   10.10.31.254         00001010.00001010.0001 1111.11111110
Broadcast: 10.10.31.255         00001010.00001010.0001 1111.11111111
Hosts/Net: 4094                  Class A, Private Internet

AWS認定 developer向けのチュートリアルとか読んどくもの

試験ガイド

aws.amazon.com

出題ガイド

https://d1.awsstatic.com/ja_JP/training-and-certification/docs-dev-associate/AWS-Certified-Developer-Associate_Exam-Guide.pdf

分野 1: 展開 22%
分野 2: セキュリティ 26%
分野 3: AWS サービスを使用した開発 30%
分野 4: リファクタリング 10%
分野 5: モニタリングとトラブルシューティン
グ12%
合計 100%


分野 1: 展開

1.1 既存の CI/CD パイプライン、プロセス、およびパターンを使用して、記述したコードを AWS
内に展開する。
1.2 Elastic Beanstalk を使用してアプリケーションを展開する。
1.3 AWS に展開するアプリケーション展開パッケージを準備する。
1.4 サーバーレスアプリケーションを展開する。

分野 2: セキュリティ

2.1 AWS サービスに対して、認証された呼び出しを行う。
2.2 AWS サービスを使用して暗号化処理を実装する。
2.3 アプリケーションに対する認証処理と承認処理を実装する。

分野 3: AWS サービスを使用した開発

3.1 サーバーレスアプリケーションのコードを記述する。
3.2 機能要件をアプリケーション設計に反映させる。
3.3 アプリケーション設計に基づいてアプリケーションコードを記述する。
3.4 API、SDK、および AWS CLI を使用して、AWS サービスとやりとりするコードを記述する。

分野 4: リファクタリング

4.1 AWS のサービスと機能を最大限に活用できるようにアプリケーションを最適化する。
4.2 既存のアプリケーションコードを AWS に移行する。

分野 5: モニタリングとトラブルシューティング

5.1 モニタリング可能なコードを記述する。
5.2 テスト環境または本番環境で見つかった障害に対する根本原因分析を行う。

全体的にやはりSAA試験よりもサーバーレスサービスとかCI,CD周りに重点が置かれてる印象

training

www.aws.training

チュートリアルをするための情報

lambda + サーバーレスアプリケーション開発

lambda

docs.aws.amazon.com

lambda + ap gateway

docs.aws.amazon.com

lambda + step functions

docs.aws.amazon.com

cognito

docs.aws.amazon.com

dynamo db

aws.amazon.com

kms

docs.aws.amazon.com

www.slideshare.net

system manager

aws.amazon.com

app sync

aws.amazon.com

CI + CD( + ECS)

ECS

docs.aws.amazon.com

ECR

docs.aws.amazon.com

code commit

docs.aws.amazon.com

code build

docs.aws.amazon.com

code deploy

docs.aws.amazon.com

パイプラインを作成する

docs.aws.amazon.com

SQS

docs.aws.amazon.com

x-ray

docs.aws.amazon.com

ELBのアクセスログをクロスアカウントで別アカウントのバケットに保存する

CLB,ALBなどでアカウントを跨いで(例えばログ集約アカウント)バケットに保存したい場合の設定

書き込み先のバケットポリシー

"arn:aws:iam::582318560864:root"

は共通値。aws側で指定しているクロスアカウントで書き込むためのアカウント。

{
    "Version": "2012-10-17",
    "Id": "S3-ELB-LogPolicy",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::582318560864:root" 
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::書き込み先バケット/AWSLogs/書き込み元アカウントのid入れとくとわかりやすい/*"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "delivery.logs.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::書き込み先バケット/AWSLogs/書き込み元アカウントのid入れとくとわかりやすい/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "delivery.logs.amazonaws.com"
            },
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::書き込み先バケット"
        }
    ]
}

バケットポリシー が設定できたらELB側のバケット出力先を変更する。 名前を間違えなければマネジメントコンソールからもできる。

redashのSMTPサーバーとしてSESを使用している時にcredentialを変更する

composeが使用しているenvファイルを編集する

/opt/redash$ ls
docker-compose.yml  env  postgres-data

envファイルを開いて

REDASH_MAIL_USERNAME REDASH_MAIL_PASSWORD をiam userから新しく発行したkeyとsecretsで入れ替える

設定ファイルを書き換えたのでコンテナを作りなおす

docker-compose up -d

新しいクレデンシャルで送信できるか試す

コンテナに入る

docker-compose exec server bash

cliでテストメールを送って見る

./manage.py send_test_mail テスト送信メール宛先

デバッグする時

サービス一覧(logsで指定する)

docker-compose config --service

サービスを指定してログを見る

docker-compose logs server

ログをtail

docker-compose logs -f server

## 直近のだけ見るなら

docker-compose logs -f --tail=500 server

ちょっとわからなかった所

  • smtpクレデンシャルはses側から発行可能だったが実態はiam user
  • 旧ユーザーで新しいkeyを発行したが疎通できなかった
  • ユーザーを新規に作成したら疎通が出来た

AWSではじめるデータレイク: クラウドによる統合型データリポジトリ構築入

感想文

全体は3部構成になっていて。 その中は第1章から14章まで別れていて非常に体系だてられている。

AWSのレイヤーとしてデータレイクを作る、運用するにあたってメインに取り扱われてるコンポーネント

  • s3
  • glue
  • athena
  • redshift
  • quicksight
  • lakeformation

そのほかAWSの基本的な知識して取り扱われてるコンポーネント

  • IAM
  • ELB

特にIAMは慣れてないと若干とっつきにくい気がする。

個人的な読みどころ

自分はGlueとかAthenaをすでに使っていたけど、 抽象的にふわっとしか理解していなかった箇所がちゃんと説明できるようになったかなと(AthenaがGlueのデータカタログ として取り扱われている箇所とか)。

あとはGlue以上に抽象的で意味が理解しにくい印象だったLakeFormationのチュートリアル的なものもあってよかった。 (サンプルはELBのログをカタログに登録するところ)

前半のデータレイクの概念は実務的な感じといいうよりは自身が設計を起こす際にきちんと人に説明できるようになる。ってところで役に立った気がする。 ちなみにamazonのデータレイク をandesと呼ばれってることを初めて知った。

aws.amazon.com

これを読みながら一度きちんとGlue,LakeFormationあたりをきちんと整理し直したいなと思った次第。

datadogのメトリクス(ダッシュボード)で特定のリソースを除外(exclude)したい場合

公式

docs.datadoghq.com

除外すべきタグを指定するには、タグキーの前に ! を入力します。? (1 文字の場合)や * (複数文字の場合)のようなワイルドカードも使用できます。

ユースケース

例えば

stage:production

みたいなtagで見たいメトリクスが引っ張ってこれる (ALBとかRDSとかEC2とか) んだけど。特定のタグの場合だけ除外したい場合(メトリクスとして大きく外れてる場合など)につ使う。

stage:production!エクスクルードしたいkey:対象のvalue

GUI上のfromで こんな感じでeditすれば除外してくれる

kinesis-firehoseでクロスアカウントのs3バケットデータを保存する

前提

デリバリーストリームと同一アカウント内のs3バケットへの保存はできている。 環境分離の観点などから他アカウントのバケットへ保存したくなった時の方法

配信先のバケットバケットポリシー

docs.aws.amazon.com

{

    "Version": "2012-10-17",
    "Id": "PolicyID",
    "Statement": [
        {
            "Sid": "StmtID",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::accountA-id:role/iam-role-name"
            },
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::bucket-name",
                "arn:aws:s3:::bucket-name/*"
            ]
        }
    ]
}

バケットポリシーを設定してaccountAのデリバリーストリームに付与されているRoleからの書き込みを許可する

ここ

 "AWS": "arn:aws:iam::accountA-id:role/iam-role-name"

firehoseのIAM Roleを変更する

docs.aws.amazon.com

{
    "Version": "2012-10-17",  
    "Statement":
    [    
        {      
            "Effect": "Allow",      
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads",
                "s3:PutObject"
            ],      
            "Resource": [        
                "arn:aws:s3:::bucket-name",
                "arn:aws:s3:::bucket-name/*"            
            ]    
        },        
        {
            "Effect": "Allow",
            "Action": [
                "kinesis:DescribeStream",
                "kinesis:GetShardIterator",
                "kinesis:GetRecords",
                "kinesis:ListShards"
            ],
            "Resource": "arn:aws:kinesis:region:account-id:stream/stream-name"
        },
        {
           "Effect": "Allow",
           "Action": [
               "kms:Decrypt",
               "kms:GenerateDataKey"
           ],
           "Resource": [
               "arn:aws:kms:region:account-id:key/key-id"           
           ],
           "Condition": {
               "StringEquals": {
                   "kms:ViaService": "s3.region.amazonaws.com"
               },
               "StringLike": {
                   "kms:EncryptionContext:aws:s3:arn": "arn:aws:s3:::bucket-name/prefix*"
               }
           }
        },
        {
           "Effect": "Allow",
           "Action": [
               "logs:PutLogEvents"
           ],
           "Resource": [
               "arn:aws:logs:region:account-id:log-group:log-group-name:log-stream:log-stream-name"
           ]
        },
        {
           "Effect": "Allow", 
           "Action": [
               "lambda:InvokeFunction", 
               "lambda:GetFunctionConfiguration" 
           ],
           "Resource": [
               "arn:aws:lambda:region:account-id:function:function-name:function-version"
           ]
        }
    ]
}

前提乗っ取るとすでにIAM Roleが付与されているので、

                "arn:aws:s3:::bucket-name",
"arn:aws:s3:::bucket-name/*",

ここのバケットを追加していく。

忘れがちな注意点

docs.aws.amazon.com

S3 バケットを所有していない場合、Amazon S3 アクションのリストに s3:PutObjectAcl を追加します。これにより、Kinesis Data Firehose で配信されるオブジェクトへのフルアクセスが、バケット所有者に付与されます。

上記のfirehoseが使用するIAM Roleに付与しておく。そのため

                "s3:AbortMultipartUpload",
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads",
                "s3:PutObject",
                "s3:PutObjectAcl"

こうなる

デリバリーストリームに配信先を変更するよう設定変更する

コンソールからはクロスアカウントのs3が指定できないためcliで行う。 事前準備として VersionId と DestinationId が必要なため取得しておく

aws firehose describe-delivery-stream --delivery-stream-name ストリームネーム | jq .DeliveryStreamDescription.VersionId
aws firehose describe-delivery-stream --delivery-stream-name ストリームネーム | jq '.DeliveryStreamDescription.Destinations[].DestinationId'

戻り値から取得しておく

aws firehose update-destination --delivery-stream-name ストリームネーム --current-delivery-stream-version-id 取得した値 --destination-id 取得した値 --s3-destination-update BucketARN=arn:aws:s3:::クロスアカウントのバケット名

firehoseのエラーが出てないこととs3バケットにデータが来ていることが確認できたら成功