続:Terraformに入門してみた(Lambda)

続: Terraform入門 これ や これ の続き。 今回は terraformで lambdaを管理してみる。ただし terraform での Lambdaの管理は辛いというような意見が散見されるので、良い方法ではないと思われる。 まぁあくまでも入門ということで。 公式はページ ここ terraformのコード data "archive_file" "lambda_zip" { type = "zip" source_dir = "${path.module}/src" output_path = "${path.module}/lambda_function_payload.zip" } resource "aws_lambda_function" "test_lambda" {# zipで固めたソースコードを指定する。ライブラリも含めて固める必要がある filename = "lambda_function_payload.zip"# Lambdaの関数名 function_name = "lambda_function_name"# Lambdaの利用するrole のarnを指定する role = "${aws_iam_role.iam_for_lambda.arn}"# 呼び出しのhandlerとなる関数 handler = "exports.test"# SHA256のhashをbase64でエンコードしたもの。 # zip化したファイル名を指定してあげれば良い。 source_code_hash = "${filebase64sha256("lambda_function_payload.zip")}"# 利用するランタイム, # pythonなら"python3.6" といった感じにかける。 runtime = "nodejs8.10"# タイムアウトの秒数指定 timeout = 300# 環境変数 environment { variables = { foo = "bar" } } } 注意点 Lambdaのソースコード自体は archive_fileで固めることができるが、 source_dir 、output_pathは相対パスだとうまく動かなかったので、 ${path. [続きを読む]

続:Terraformに入門してみた(VPC/サブネット/ピアリング等)

続:Terraform入門 これ の続き。 今回はVPCを2つ作って、サブネット、ルートテーブル、ピアリングまで実施する。 作るネットワーク VPC1, VPC2の2つがある。 VPC1, VPC2ともに public用のサブネットを持つ。 またインターネットゲートウェイもそれぞれ持つ。 publicサブネット同士をルーティングする。 publicからインターネットゲートウェイを抜けて外にアクセスできるようにする。 terraformのコード グローバルIPを使ってしまっているが、サンプルということで… ## 1つ目のVPCの設定とIGW resource "aws_vpc" "vpc01" { cidr_block = "192.165.0.0/16" tags = { Name = "vpc01" } } resource "aws_subnet" "subnet-vpc01-public" { vpc_id = aws_vpc.vpc01.id cidr_block = "192.165.0.0/24" availability_zone = "ap-northeast-1a" tags = { Name = "subnet-vpc01-public" } } resource "aws_internet_gateway" "igw-vpc01" { vpc_id = aws_vpc.vpc01.id tags = { Name = "igw-vpc01" } }## 2つ目のVPCの設定とIGW resource "aws_vpc" "vpc02" { cidr_block = "192. [続きを読む]

Terraformに入門してみた

Terraform使い始めた 仕事でterraformを使い始めたのでメモしておく。 なお、AWSと一緒に使う場合を記載する。 公式サイト https://www.terraform.io/ 対応してるIaaS等 https://www.terraform.io/docs/providers/index.html 意外とたくさん対応しているが、awsと組み合わせて使っている人が多いと思う。 Terraformでは一括して provider と呼んでいるようだ。 インストール Installing Terraform terraformはgoで作られているので各種環境に合わせたバイナリが用意されている。 したがってダウンロードしたバイナリをパスの通ったところに設置するだけで良い。 簡単で良い。 AWSと組み合わせて使う ※おそらくaws cliを使えるようにしておく必要はないと思うが、やっておいたほうが楽なのでおすすめ。 まずはsecretとaccess keyをAWSコンソールから発行する。 次にaws configureを実行しておく。 aws configure 出てくる内容に従って設定する。この辺はawsサイト見ればわかる。 *.tfファイルのフォーマット getting-started Build Infrastructure 公式ではJSONファイルでもかけるが、機械的に生成されたもののみJSONを使うことが推奨されているため、きちんとterraformのフォーマットに従って書いたほうが良いと思う。 Configuration files can also be JSON, but we recommend only using JSON when the configuration is generated by a machine. 個人的にも、JSONはコメントが書けないこともあり、構成ファイル等のフォーマットとしてはいまいちだと思う(yamlの方が良い) しかしAWSはpolicyなど設定する場合だいたいJSONである… awsにインスタンスを自動で立てるチュートリアル ここからawsにインスタンスを自動作成するチュートリアルを実施する。 注)Terraformのドキュメントはかなり丁寧に書かれているので、英語が苦でないならそちらを読むことをおすすめする。 初めてのtfファイル example.tfは以下の通り。 provider "aws" { profile = "default" region = "ap-northeast-1" } resource "aws_instance" "example" { ami = "ami-2757f631" instance_type = "t2. [続きを読む]

yum updateでurllib3のエラー

Amazon Linux2のyum updateでurllib3のエラー

Running transaction
  Updating   : python-urllib3-1.24.3-1.amzn2.0.1.noarch                                                                                                                         1/2 
Error unpacking rpm package python-urllib3-1.24.3-1.amzn2.0.1.noarch
error: unpacking of archive failed on file /usr/lib/python2.7/site-packages/urllib3/packages/ssl_match_hostname: cpio: rename
python-urllib3-1.10.2-3.amzn2.0.1.noarch was supposed to be removed but is not!
  Verifying  : python-urllib3-1.10.2-3.amzn2.0.1.noarch                                                                                                                         1/2 
  Verifying  : python-urllib3-1.24.3-1.amzn2.0.1.noarch                                                                                                                         2/2 

Failed:
  python-urllib3.noarch 0:1.10.2-3.amzn2.0.1                                               python-urllib3.noarch 0:1.24.3-1.amzn2.0.1                                              

Complete!

ここ

によるとurllib3がrpmのものとpipでインストールしたものでコンフリクトして起こってるらしいので、

sudo pip uninstall urllib3

でアンインストールしてからもう一度yum updateしてね、ということらしい。

AWSのgo用SDKでSQSに入ってくるメッセージを取得する

目的 インスタンスからgo用のAWS SDK でSQSに届くメッセージを取得したい。 公式APIリファレンスの場所 AWS SDK for Go API Reference インストール 先にgo getしておきましょう。 go get github.com/aws/aws-sdk-go/... 使い方 対象のSQSのキューのARNだけをリソースとして指定したPolicyを作り、ロールにアタッチする EC2等にそのロールを付与する ソースコード package main import ( "flag" "fmt" "log" "os" "time" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/sqs" ) // // GetMessage will get messages in SQS queue. // func GetMessage() { params := &sqs.ReceiveMessageInput{ QueueUrl: aws.String(queueUrl), // Number of messages are got in one time. MaxNumberOfMessages: aws.Int64(10), // If there are no messages, keeping connection in 20 sec. [続きを読む]
AWS  Go  SQS 

AWSのgo用SDKでLambdaを呼び出す

目的 インスタンスからgo用のAWS SDK でLambdaを呼び出したい 注意)Lambdaをgoで書きたいとか、Lambda to Lambdaをgoで書きたいとかではない(でもやってることはほぼ同じ) 公式APIリファレンスの場所 AWS SDK for Go API Reference インストール 先にgo getしておきましょう。 go get github.com/aws/aws-sdk-go/... 使い方 credentialをインスタンスに保存するのは嫌なので、インスタンスに対して、Lambdaを起動させるためのロールを設定している前提. Lambdaを実行するだけなら、設定するロールは以下の2つだけで良いようだ。 lambda:InvokeFunction lambda:InvokeAsync ソースコード package main import ( "encoding/json" "fmt" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/lambda" ) // for response type Response struct { Message string `json:"message"` Ok bool `json:"ok"` } // data to input to Lambda type Data struct { Key1 string `json:"key1"` Key2 string `json:"key2"` Key3 string `json:"key3"` } // function to call Lambda func Handler() (Response, error) { // Data that is to send to the Lambda payload := Data{ Key1: "1", Key2: "2", Key3: "3", } // and transform it to json bytes. [続きを読む]
AWS  Go