poetryメモ

poertry

pythonでのパッケージ管理の定番のようです(npmのような)

参考

org-technology.com

poetry init

  • プロジェクトの初期化を行う
poetry init

パッケージ追加

poetry add numpy

これを実施することにより、pyproject.tomlが更新されます。 numpy = "^1.18.2"
こんな感じで追記

poetry add pandas librosa

このように複数書くこともできます

パッケージのインストール(tomlの内容をインストールする)

poetry install

pythonプログラムの実行

poetry run python app.py

terraformにて、module間で値(variable,outputs)を渡す

0.12のフォーマット

値の受け渡し

terraformにて、variableを使って変数を表現するが、
moduleをまたいでの受け渡しをどうするか

フォルダ構成の例

├── main.tf
├── modules
│   ├── ec2
│   │   ├── ec2.tf
│   │   └── variables.tf
│   └── network
│       ├── network.tf
│       ├── outputs.tf
│       └── variables.tf

こんな風になっているとして
networkディレクトリとec2ディレクトリでデータを渡したいということ
vpcで作ったvpcのidをec2に渡したいというのが目的

渡し方

modules/network/network.tfにてvpcを定義

# aws_vpc
resource "aws_vpc" "main" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_hostnames = true
  enable_dns_support   = true
}

modules/network/outputs.tfにてoutputsを定義(ファイルは分ける必要はないけど、ベストプラクティスとしてよくファイルは別に書かれている)

output "vpc_main" {
  value = aws_vpc.main
}

このようにvpcのresourceを返すことができる


これを、main.tfで受け渡す

module "network" {
  source = "./modules/network"
}

module "ec2" {
  source = "./modules/ec2"

  vpc_main       = module.network.vpc_main
}

vpc_main = module.network.vpc_mainこれがキモで、module.<module名>.<output名>で取得可能


そしてこれをec2モジュールで受ける
modules/ec2/variables.tf

# vpc information.
variable "vpc_main" {}

modules/ec2/ec2.tf

# aws_instance
resource "aws_instance" "app" {
  ami                    = "ami id"
  instance_type          = "t2.micro"
  subnet_id              = var.subnet_for_ec2.id
}

これで値が渡せる

Terraformで、.envのように変数を注入する

terraformにて、任意の変数を外部から注入する

terraform.tfvarsという仕組みを使う

assume_role = "arn:aws:iam::012345678901:role/AssumeRoleForTerraform"
pub_key_value = "ssh key value"

といったように、任意の値を書いておく

そして、実行時にこのファイルを指定する

terraform plan -var-file ./terraform.tfvars 
terraform apply -var-file ./terraform.tfvars 

これで、一部の値を隠すことが可能

IAMのAssumeRoleについて

AssumeRole

権限を移譲するための仕組みのようです。

参考

christina04.hatenablog.com

qiita.com

概要

今回は、アカウントAのAWSリソースを、アカウントBが使うというケースをAssumeRoleでやります

例として、以下のアカウントIDだとします。
- アカウントA
210987654321
- アカウントB
123456789012

つまり、アカウントAが権限を付与する方で、アカウントBが権限を要求する立場です。

権限を付与するアカウント(210987654321)での作業

ロールを作るだけ

AWSのコンソールからIAMを選択
ロールを作成します

そのロール作成の際に、「別のAWSアカウント」を選びます
f:id:y-ni-shi:20200320204154p:plain

次に権限の画面になりますが、任意の権限を選びます
今回アドミン権限にしますが、本来は用途に絞った権限を選択すべきです
f:id:y-ni-shi:20200320204330p:plain

ロールの名前を決めて保存します。
今回はAssumeRoleSampleとしました f:id:y-ni-shi:20200320204430p:plain

権限を以来するアカウント(123456789012)での作業

任意のユーザーを作ります
権限はデフォルトの状態でOKです

任意のグループを作ります。
権限はとりあえずデフォルトの状態でOKです

今回はこの作成したグループにAssumeRoleの権限を付与します

ポリシーの作成

アカウントAに対して権限を移譲してほしいと依頼するわけですが、
その「移譲を依頼する」という権限をつけないといけないぽいです

ポリシーの作成から

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::123456789012:role/AssumeRoleSample"
        }
    ]
}

"arn:aws:iam::123456789012:role/AssumeRoleSample"これがキモです。
アカウントAのIDと、ロール名称を指定します。

そしてこのポリシーを保存。
(AssumeRoleSampleという名前でポリシーを保存.名前は任意です)

そしてこのポリシーをグループにアタッチ
f:id:y-ni-shi:20200320205102p:plain

これで準備完了。

terraform

terraformで実験

terraform {
  required_version = "0.12.24"
}

variable "assume_role" { 
}

provider "aws" {
  region     = "ap-northeast-1"
  assume_role {
    role_arn     = var.assume_role
  }
}

resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
  enable_dns_hostnames = true
  enable_dns_support = true
  tags = {
    Name = "vpc for test"
  }
}

resource "aws_internet_gateway" "igw" {
  vpc_id = aws_vpc.main.id
  tags = {
    Name = "igw for test"
  }
}

さらに、環境変数を注入して実行します
terraform.tfvars

assume_role = "arn:aws:iam::123456789012:role/AssumeRoleSample"

アクセスキーとIDの環境変数への登録(上記tsvarsでやってもいいけど)

export AWS_ACCESS_KEY_ID=access id
export AWS_SECRET_ACCESS_KEY=access key

このアクセスIDとKEYはアカウントBの情報です。
アカウントBとしてログインしてアカウントAに移譲を依頼。

terraform plan -var-file="terraform.tfvars"

問題なければ

terraform apply -var-file="terraform.tfvars"

これで実行するとAWSリソースができているはず。
アカウントAのコンソールにログインしてVPCができていることを確認。

お片付け

terraform destroy -var-file="terraform.tfvars"

古いdockerイメージを削除する

macの容量が足りなくなった

とりあえずdockerのイメージを消そう。
古いのはとりあえずいらんだろう・・・

コマンド

docker image ls | grep -e 'months ago' -e 'years ago' | awk '{print $3}' | xargs docker image rm -f

なんかちょっとエラーが出て、いくつかイメージ残ってたけどだいぶ消えた。
しかし、10GBしかあかなかった・・・

Go言語でのunix domain socket

Goでunix domain socketの通信を行いたい

ネットで色々と探しましたが、
なかなか情報が見つかりにくかったので、
個人的なメモを書いておきます

サンプル

2秒毎にクライアントからサーバにhiってメッセージを送るだけのものです

server

package main

import (
    "log"
    "net"
    "os"
    "path/filepath"
)

func echoServer(c net.Conn) {
    for {
        buf := make([]byte, 512)
        nr, err := c.Read(buf)
        if err != nil {
            return
        }

        data := buf[0:nr]
        println("Server got:", string(data))
        _, err = c.Write(data)
        if err != nil {
            log.Fatal("Write: ", err)
        }
    }
}

func main() {
    file := filepath.Join(os.TempDir(), "unixdomaisocketsample")
    os.Remove(file)

    l, err := net.Listen("unix", file)
    if err != nil {
        log.Fatal("listen error:", err)
    }

    for {
        fd, err := l.Accept()
        if err != nil {
            log.Fatal("accept error:", err)
        }

        go echoServer(fd)
    }
}

client

package main

import (
    "io"
    "log"
    "net"
    "os"
    "path/filepath"
    "time"
)

func reader(r io.Reader) {
    buf := make([]byte, 1024)
    for {
        n, err := r.Read(buf[:])
        if err != nil {
            return
        }
        println("Client got:", string(buf[0:n]))
    }
}

func main() {
    file := filepath.Join(os.TempDir(), "unixdomaisocketsample")
    c, err := net.Dial("unix", file)
    if err != nil {
        panic(err)
    }
    defer c.Close()

    go reader(c)
    for {
        _, err := c.Write([]byte("hi"))
        if err != nil {
            log.Fatal("write error:", err)
            break
        }
        time.Sleep(time.Second * 2)
    }
}

unix domain socketの解説

qiita.com

参考にしたサイト

stackoverflow.com

qiita.com

qiita.com

OpenAPIについての参考記事

OpenAPI

ちょっとSwaggerとかOpenAPIとかを調べていて。
色々とググったりしていて、参考になったURLを貼っておきます

  • OpenAPIのツールの紹介 Stoplight Studio
    Prism
    Dredd

future-architect.github.io

  • Zozoさんのテックブログ OpenAPIそのものの説明
    GoでのOpenAPIの実装の例

techblog.zozo.com