かべぎわブログ

ブログです

CloudFront経由でのみS3のコンテンツにアクセスさせる

概要

CloudFrontのオリジンアクセスアイデンティティを使用して、CloudFront経由でのみS3バケット内のコンテンツにアクセスさせてみます。

手順

CloudFrontのオリジンの設定で以下のように設定します。
RestrictBucketAccessをYesに、
Origin Access IdentityをCreate a New Identityに、
Grant Read Permissions on BucketをYes, Update Bucket Policyにします。
f:id:kabegiwakun:20200123215915p:plain

すると以下のようにオリジンに設定したバケットのバケットポリシーが自動で設定されます。
f:id:kabegiwakun:20200123220516p:plain

確認

S3バケットに直接アクセスすると以下のようにAccess Deiniedになります。
f:id:kabegiwakun:20200123221206p:plain

しかし、CloudFrontのDNS名経由ではアクセスすることができます。
f:id:kabegiwakun:20200123224342p:plain

おわりに

セキュアですね。

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版

AWSCLIでAWSアカウントを作成する

概要

AWSCLIを利用してAWSアカウントをコマンド一撃で作成してみます。

前提

  • AWS Organizationsのマスターアカウントである
  • アカウント作成の権限がある

コマンド

これでいけます。
アカウント名とルートアカウントのメールアドレスを指定してあげるだけです。

aws organizations create-account --email myemail@example.com --account-name kabegiwablog

おわりに

べんりですね

ECS上でApacheを動かしてアクセスする

概要

ECS上でApacheを動かしてアクセスするだけのおはなしです。
具体的には以下のような構成です。

f:id:kabegiwakun:20200121220734p:plain

手順

ALBを作成する

ECSに接続するLBを事前に作成しておきます。
リスナーをHTTPSで
ターゲットグループはポートを8080にします。ヘルスチェックは/healthで作成します。

ECSクラスタを作成する

ふつうにつくればもんだいないです。

タスク定義を作成する

ネットワークモードをbridgeにし、コンテナをhttpdで作成します。
また、ポートマッピングでホストポート8080をコンテナポート80にマッピングしておきます。

サービスの設定

サービスの設定で、さきほど作成したタスク定義を起動するように設定する。

動作確認

https://ALBのドメイン名でアクセスする。
It works!!!

おわりに

ワインをのみながらかいている。

sudoでもリダイレクトがしたい

概要

sudoでリダイレクトがしたくなった。
たとえば以下のようにやるとPermission Deniedってなってしまう。

sudo echo 'wawawa' > /etc/wawawa.txt
bash: permission denied: /etc/wawawa.txt

対処法

bash -cをつかってあげる。
以下のようなかんじ。

sudo bash -c "echo 'wawawa' > /etc/wawawa.txt"

おわりに

おぼえておく。

新しいLinuxの教科書

新しいLinuxの教科書

ALBにACM/SSL証明書を関連付ける

概要

ALBにACM/SSL証明書を関連付けてみます。
画像のような感じです。
基本的なかたちですね。
f:id:kabegiwakun:20200119104941p:plain
ユーザからALBまではHTTPSで、ALBからEC2までの内部通信はHTTPです。

手順

1. ACMで証明書を取得する

以下ですこしやりました。

www.kabegiwablog.com

2. EC2インスタンスの作成と設定

ALBからのアクセスを受けるEC2インスタンスを設定してあげます。
セキュリティグループはALBからの通信を受けられるような設定のものをアタッチしてあげます。

3. ALBの作成と設定

以下のようなかんじの設定でALBを作成してあげます。

3.1. ロードバランサーの設定

名前: すきななまえ スキーマ: インターネット向け
IPアドレスタイプ: ipv4

リスナー: HTTPS

VPC: すきなVPC
アベイラビリティゾーン: すきなAZ

3.2. セキュリティ設定の構成

証明書タイプ: ACM から証明書を選択する
証明書の名前: 手順1 で取得した証明書の名前

3.3. セキュリティグループの設定

セキュリティグループ: インバウンドに任意の場所からHTTPSが許可されたものを選択

3.4. ルーティングの設定

ターゲットグループ: 新しいターゲットグループ
名前: すきななまえ
ターゲットの種類: インスタンス
プロトコル: HTTP
ポート: 80

ヘルスチェックのプロトコル: HTTP
ヘルスチェックのパス: /

3.5. ターゲットの登録

手順2で作成したインスタンスを登録済みに追加する。

4. EC2インスタンスの設定をする(Apache)

インスタンスにssh接続し、以下を実行してApacheの設定をしてあげます。

4.1. Apacheのインストール

sudo yum install -y httpd

4.2. ファイルの設置

sudo mkdir -p /var/www/html
sudo bash -c "echo 'wawawa' > /var/www/html/index.html"

4.3 Apacheの起動

sudo systemctl start httpd

5. ちょっとした確認

この時点でALBからインスタンスにアクセスできるかどうかを確認してみます。

5.1. ターゲットグループのステータスの確認

ターゲットグループのステータスがhealthyかどうかを確認します。

5.2. ALBのDNS名からブラウザでアクセス

ALBのDNS名からブラウザでアクセスして確認してみます。

https://ALBのドメイン名です。
証明書のドメインとALBのドメインが違うため、警告がでますが、無視してさきにすすみます。
wawawaと表示されればOKです。

6. Route53の設定

ALBのDNS名をコピーし、Route53にCNAMEとして追加してあげます。

ホストゾーン: ACM取得したドメイン

タイプ: Aレコード
エイリアス先: 作成したALB

7. 最終確認

ブラウザからドメイン名でアクセスします。
HTTPSで通信ができているはずです!!!

おわりに

べんりですね

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

  • 作者:山本 陽平
  • 出版社/メーカー: 技術評論社
  • 発売日: 2010/04/08
  • メディア: 単行本(ソフトカバー)

お名前.comで取得したドメインの証明書をACMで取得する

概要

お名前.comで取得したドメインの証明書をACMで取得してみます。

手順

こんなかんじの手順です。

1. Route53 Hosted Zoneを作成

Route53でACMを取得するドメイン名でHosted Zoneを作成します。
作成されたときにできるNSレコードを控えておきます。
次の手順で使います。

2. お名前.comでネームサーバを変更

続いて、お名前.comの[ドメイン設定]-[ネームサーバーの変更]へ遷移し、ACMを取得するドメインを選択、先の手順で控えたNSレコードを入力します。
f:id:kabegiwakun:20200118184818p:plain
インターネットの環境により、反映完了まで24時間から72時間程度かかる場合があるらしい。

3. ACMで証明書を取得

マネジメントコンソールから[証明書のリクエスト]であとは画面にそってしすすみます。
検証方法はDNSによる検証で良いと思います。
画面にそってすすんでステップ5で[Route53でのレコードの作成]を選択してRoute53にCNAMEレコードを追加してあげます。

4. 完了

できました。
f:id:kabegiwakun:20200118185543p:plain

おわりに

かんたんですね。

図解即戦力 Amazon Web Servicesのしくみと技術がこれ1冊でしっかりわかる教科書

図解即戦力 Amazon Web Servicesのしくみと技術がこれ1冊でしっかりわかる教科書

  • 作者:小笠原 種高
  • 出版社/メーカー: 技術評論社
  • 発売日: 2019/11/07
  • メディア: 単行本(ソフトカバー)

Kubernetesでクラスタを切り替える

概要

Kubernetes クラスタを切り替えます。

こうやる

手順です。

クラスタ一覧を取得

$ kubectl config get-clusters

NAME
test.ap-northeast-1.eksctl.io
wawawa.ap-northeast-1.eksctl.io

現在のクラスタを確認する

$ kubectl config current-context

kabegiwa@wawawa.ap-northeast-1.eksctl.io

クラスタ切り替え

$ kubectl config use-context kabegiwa@test.ap-northeast-1.eksctl.io

Switched to context "kabegiwa@test.ap-northeast-1.eksctl.io".

おわりに

べんりですね

Kubernetes実践ガイド クラウドネイティブアプリケーションを支える技術 (impress top gear)

Kubernetes実践ガイド クラウドネイティブアプリケーションを支える技術 (impress top gear)

  • 作者:北山 晋吾,早川 博
  • 出版社/メーカー: インプレス
  • 発売日: 2019/07/12
  • メディア: 単行本(ソフトカバー)

EKSクラスタを作成してpodをたてるまで

概要

EKSクラスタを作成してpodをつくるまでのメモです。

手順

手順です。

EKSクラスタの作成

こんなかんじ
podはひとつだけ
作成に10分くらいかかる

$ eksctl create cluster --name test --nodes 1

kubectlで使えるようにconfigに追記させる。

$ eksctl utils write-kubeconfig --name test --kubeconfig ~/.kubeconfig

確認

クラスタができている。

$ eksctl get cluster
NAME    REGION
test    ap-northeast-1

fargateではないのでnodegroupがインスタンスで動作している。

$ eksctl get nodegroup --cluster test
CLUSTER NODEGROUP   CREATED         MIN SIZE    MAX SIZE    DESIRED CAPACITY    INSTANCE TYPE   IMAGE ID
test    ng-67463005 2020-01-02T04:08:54Z    1       1       1           m5.large    ami-02e124a380df41614

podの作成

podをつくります。

$ kubectl create -f sample-pod.yaml

podの設定ファイル

apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
spec:
  containers:
    - name: linux
      image: centos

確認

podができている。

$ kubectl get pods
NAME         READY   STATUS             RESTARTS   AGE
sample-pod   0/1     CrashLoopBackOff   8          10m

おわりに

むずかしいですね

Kubernetes完全ガイド (impress top gear)

Kubernetes完全ガイド (impress top gear)

  • 作者:青山 真也
  • 出版社/メーカー: インプレス
  • 発売日: 2018/09/21
  • メディア: 単行本(ソフトカバー)

2019年ふりかえり

2019年をふりかえる。

仕事

2社ほどでお仕事した。
2020年からはまた新しいところでお仕事する。
期待を裏切ったり裏切られたりいろいろあった。
もっとうまくやれた場面はあったとおもう。

私生活

お酒をのんで駅のホームでしらないおじさんに怒鳴られたり、前歯が欠けたり、公園で目を覚ましたり、スマホを落とすなどした。
まだなんとか生きています。
いまもシャンパンを飲みながらこの日記をかいている。

買ってよかったもの

Dyson v11

バッテリー残量が液晶モニタ的なものに表示されるのでよい。

Kindle Oasis

画面が黄色っぽくなるだけなんだけどそれがハイパーよい。
ほぼ紙

Youtube Premium

広告がでないのはやっぱりよい。
Google Play Musicもついているし。
Youtube Musicはつかっていない。

みた映画

新作旧作問わず順不同
ぜんぜんみれていない

  • ファウンダー ハンバーガー帝国のヒミツ
  • ムーンライト
  • グレイテストショーマン
  • ハードコア
  • FYRE: 夢に終わった史上最高のパーティー
  • パシフィック・リム/アップライジング
  • 新感染/ファイナル・エクスプレス
  • マルホランド・ドライブ
  • バスターのバラード
  • スイス・アーミー・マン
  • マイティ・ソー バトルロイヤル
  • ブラックパンサー
  • グエムル -漢江の怪物-
  • GODZILLA 怪獣惑星: パート1: 怪獣惑星
  • GODZILLA 決戦機動増殖都市
  • GODZILLA 星を喰う者
  • ハクソー・リッジ
  • ミスティック・リバー
  • ハイ・フライング・バード -目指せバスケの頂点-
  • ポーラー 狙われた暗殺者
  • ザ・テキサス・レンジャーズ
  • スパイダーマン: ホームカミング
  • カサブランカ
  • メッセージ
  • ボディガード
  • マーガレット・サッチャー 鉄の女の涙
  • ジャスティス・リーグ
  • アメリカン・サイコ
  • MEG ザ・モンスター
  • レボリューション -米国議会に挑んだ女性たち-
  • クレイジー・リッチ!
  • her/世界でひとつの彼女
  • ナイスガイズ!
  • カジノ・ハウス
  • 二郎は鮨の夢を見る
  • The Dawn Wall/ドーンウォール
  • ザ・ダート: モトリー・クルー自伝
  • マンチェスター・バイ・ザ・シー
  • アリー/スター誕生
  • 運び屋
  • アイリッシュマン
  • アクアマン
  • 遊☆戯☆王THE DARK SIDE OF DIMENSIONS
  • ガンジー
  • 交響詩篇エウレカセブン ハイエボリューション 1
  • ANEMONE/交響詩篇エウレカセブン ハイエボリューション
  • コードギアス 復活のルルーシュ
  • クリード 炎の宿敵
  • ゼイリブ
  • メカニック:ワールドミッション
  • シェイプ・オブ・ウォーター
  • ハン・ソロ/スター・ウォーズ・ストーリー
  • リメンバー・ミー
  • 探偵はBARにいる3
  • ローリング・サンダー・レヴュー: マーティン・スコセッシが描くボブ・ディラン伝説
  • プーと大人になった僕
  • アベンジャーズ/エンドゲーム
  • 名探偵ピカチュウ
  • ミュウツーの逆襲 EVOLUTION
  • ワンス・アポン・ア・タイム・イン・ハリウッド
  • ジョン・ウィック:パラベラム
  • ジョーカー
  • スター・ウォーズ/スカイウォーカーの夜明け

見たドラマとか連続もの系

ドキュメンタリーおおめ

  • アメリカン・クライム・ストーリー/ヴェルサーチ暗殺
  • 潜入! 世界の危険な刑務所 :シーズン3
  • 世界の現実旅行
  • ラブ,デス&ロボット
  • You vs. Wild -究極のサバイバル術-
  • Formula 1: 栄光のグランプリ
  • ルーザーズ: 失敗が教えてくれること
  • OUR PLANET 私たちの地球
  • 汚れた真実 :シーズン1
  • 全裸監督
  • Dope/ドープ :シーズン1~3
  • こころをダイジェスト
  • 世界の今をダイジェスト :シーズン2
  • 天才の頭の中: ビル・ゲイツを解読する
  • 伝説の映画監督 -ハリウッドと第二次世界大戦-
  • ファイナル・テーブル
  • ブラック・ミラー :シーズン5
  • ミート・イーター 猟理の達人
  • ボクらを作ったオモチャたち :シーズン3
  • サウスパーク :シーズン20~21
  • シリコンバレー :シーズン5
  • オール・オア・ナッシング ~マンチェスター・シティの進化
  • 有田と週刊プロレスと :シーズン4
  • ウィッチャー

読んだ本

  • The DevOps 逆転だ!究極の継続的デリバリー
  • the four GAFA 四騎士が創り変えた世界
  • AI vs. 教科書が読めない子どもたち
  • フェルマーの最終定理
  • ジェフ・ベゾス 果てなき野望
  • バッタを倒しにアフリカへ
  • 三体
  • 岩田さん: 岩田聡はこんなことを話していた。
  • うつ病九段 プロ棋士が将棋を失くした一年間
  • サピエンス全史
  • 実践Terraform AWSにおけるシステム設計とベストプラクティス
  • 料理の科学 加工・加熱・調味・保存の化学変化
  • ACTFULNESS(ファクトフルネス)10の思い込みを乗り越え、データを基に世界を正しく見る習慣
  • 科学者はなぜ神を信じるのか コペルニクスからホーキングまで
  • Yコンビネーター
  • IT技術者の長寿と健康のために
  • ピープルウエア
  • おうちで学べるアルゴリズムのきほん
  • おうちで学べる仮想化のきほん
  • おうちで学べるサーバのきほん
  • チューリングの計算理論入門 チューリング・マシンからコンピュータへ
  • スティーブ・ジョブズ
  • 暗号が通貨になる「ビットコイン」のからくり
  • オブジェクト指向でなぜつくるのか
  • 人工知能は人間を超えるか
  • 私の財産告白
  • コンピュータはなぜ動くのか 知っておきたいハードウエア&ソフトウエアの基礎知識
  • 言い訳 関東芸人はなぜM1で勝てないのか
  • 量子コンピュータ 超並列計算のからくり
  • コンテナ物語
  • Pythonによるクローラー&スクレイピング入門
  • Kubernetes完全ガイド
  • 暗号解読

やったゲーム

  • RimWorld
  • Farming Simulator 19
  • Farmer's Dynasty
  • Cities: Skylines
  • Dawn of Man
  • the Hunter Call of the Wild
  • Kenshi
  • Euro Truck Simulator 2
  • Green Hell
  • Monster Hunter: World
  • VA-11 HALL-A
  • Downwell
  • Slay the Spire
  • Cuphead
  • One Finger Death Punch 2
  • Sekiro: Shadows Die Twice
  • Planet Coaster
  • Celeste
  • Katana ZERO
  • Papers, Please
  • NieR:Automata Game of the YoRHa Edition
  • When Ski Lifts Go Wrong
  • Super Hexagon
  • Grand Theft Auto V
  • Moonlighter
  • Reigns
  • Thronebreaker: The Witcher Tales
  • Crypt of the NecroDancer
  • クリプト・オブ・ネクロダンサー feat. ゼルダの伝説
  • OneShot
  • Fit Boxing
  • ポケットモンスター シールド
  • Tetris99
  • Over Cooked 2
  • Human Fall Flat

来年の抱負

いきのびます。

2020(字幕版)

2020(字幕版)

  • 発売日: 2019/07/01
  • メディア: Prime Video

別のstateファイルの値を参照する

概要

リモートステートをつかって別のstateファイルの値を参照して見たいと思います。
これによって stateをまたいでいろいろできたりするのでstateの分離等もしやすくなるかもしれないしならないかもしれない。

EC2インスタンスを作成するstateと、それにEIPをアタッチするstateが別なんだけれどもアタッチができるよっていうのをやります。

前提

前提です。

バージョン

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

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

EC2インスタンスをつくるstateのtfファイル

ひとつめのstateです。

provider "aws" {
  region = "ap-northeast-1"
}
terraform {
  backend "s3" {
    bucket = "mybucket"
    key    = "terraform.tfstate"
    region = "ap-northeast-1"
  }
}
resource "aws_instance" "example" {
  ami           = "ami-068a6cefc24c301d2"
  instance_type = "t3.micro"
  subnet_id     = aws_subnet.subnet.id
}
resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
}
resource "aws_subnet" "subnet" {
  cidr_block = "10.0.1.0/24"
  vpc_id     = aws_vpc.main.id
}
resource "aws_internet_gateway" "igw" {
  vpc_id = aws_vpc.main.id
}
output "instance_id" {
  value = aws_instance.example.id
}

EIPをアタッチするstateのtfファイル

2つめです。

provider "aws" {
  region = "ap-northeast-1"
}
data "terraform_remote_state" "remote_state" {
  backend = "s3"
  config = {
    bucket = "mybucket"
    key    = "terraform.tfstate"
    region = "ap-northeast-1"
  }
}
resource "aws_eip" "eip" {
  instance = data.terraform_remote_state.remote_state.outputs.instance_id
}

うごかしてみる

うごかしてみます

EC2インスタンスをつくるstateのtfファイル

こんなかんじになります。
参照される値はoutputで出力する必要があります。

$ terraform apply
~~~省略~~~
Apply complete! Resources: 1 added, 0 changed, 1 destroyed.

Outputs:

instance_id = i-02814f190bddac514

EIPをアタッチするstateのtfファイル

EIPがアタッチされていることがわかりますね

$ terraform apply
data.terraform_remote_state.remote_state: Refreshing state...
aws_eip.eip: Refreshing state... [id=eipalloc-08169d0c5eaa117f4]

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
-/+ destroy and then create replacement

Terraform will perform the following actions:

  # aws_eip.eip is tainted, so must be replaced
-/+ resource "aws_eip" "eip" {
      + allocation_id     = (known after apply)
      + association_id    = (known after apply)
      ~ domain            = "vpc" -> (known after apply)
      ~ id                = "eipalloc-08169d0c5eaa117f4" -> (known after apply)
      + instance          = "i-02814f190bddac514"
      + network_interface = (known after apply)
      + private_dns       = (known after apply)
      + private_ip        = (known after apply)
      ~ public_dns        = "ec2-3-114-205-18.ap-northeast-1.compute.amazonaws.com" -> (known after apply)
      ~ public_ip         = "3.114.205.18" -> (known after apply)
      ~ public_ipv4_pool  = "amazon" -> (known after apply)
      - tags              = {} -> null
      ~ vpc               = true -> (known after apply)
    }

Plan: 1 to add, 0 to change, 1 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

aws_eip.eip: Destroying... [id=eipalloc-08169d0c5eaa117f4]
aws_eip.eip: Destruction complete after 1s
aws_eip.eip: Creating...
aws_eip.eip: Creation complete after 1s [id=eipalloc-0bd8be7d66afa0c58]

Apply complete! Resources: 1 added, 0 changed, 1 destroyed.

おわりに

べんりですね

Terraform: Up and Running: Writing Infrastructure as Code

Terraform: Up and Running: Writing Infrastructure as Code

  • 作者:Yevgeniy Brikman
  • 出版社/メーカー: O'Reilly Media
  • 発売日: 2017/04/04
  • メディア: ペーパーバック

tfstateファイルをS3バケットで管理する

概要

TerraformのtfstateファイルをS3バケットで管理してみます。
仕事でチームでやるときはだいたいこの設定でやると思う。

こんなかんじ

こんなかんじで設定してあげます。

terraform {
  backend "s3" {
    bucket = "mybucket"
    key = "terraform.tfstate"
    region = "ap-northeast-1"
  }
}

terraform initするだけでtfstateファイルがS3バケットに格納されるようになります。

おわりに

tfstateファイルはGitで管理するよりこっちのほうが良いと思う。
pushとかpullしわすれたときの被害がでかいと思う。
その点、これは自動でやってくれるのでべんり。

Beanstalkで作成されたバケットができないときの対処法

概要

Elastic Beanstalkで作成されたS3バケットを削除しようとしたときに以下のようなエラーがでた。

botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the DeleteBucket operation: Access Denied

権限は足りてるはずなのにおかしいなあと思ってすこしハマったのでメモ

原因

バケットポリシーに以下にようなポリシーが設定してあるため。
DeleteBucketをDenyしている。

{
    "Sid": "eb-58950a8c-feb6-11e2-89e0-0800277d041b",
    "Effect": "Deny",
    "Principal": {
        "AWS": "*"
    },
    "Action": "s3:DeleteBucket",
    "Resource": "arn:aws:s3:::elasticbeanstalk-ap-northeast-1-961262193080"
}

対処法

単純にバケットポリシーを削除してしまえばいい。

おわりに

意外とハマった

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

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

  • 作者:Michael Wittig,Andreas Wittig
  • 出版社/メーカー: インプレス
  • 発売日: 2019/09/05
  • メディア: 単行本(ソフトカバー)

TerraformでS3バケットを作成する(ランダムな数値列をサフィックスにして)

概要

Terraformでランダムな数値列をサフィックスにして、バケットの名前がかぶらないようにしつつ、バケットを作成してみます。

前提

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

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

こんなかんじ

こんなかんじでできます。
randomプロバイダを利用します。

provider "random" {}

resource "random_integer" "suffix" {
    min = 10000000
    max = 99999999
}

resource "aws_s3_bucket" "bucket" {
    bucket = "kabegiwa-${random_integer.suffix.result}"
}

実行すると

こんなかんじでバケットが作成されます。

$ aws s3 ls
2019-12-28 18:51:25 kabegiwa-18721568

おわりに

べんりですね

Terraform: Up & Running: Writing Infrastructure As Code

Terraform: Up & Running: Writing Infrastructure As Code

  • 作者:Yevgeniy Brikman
  • 出版社/メーカー: Oreilly & Associates Inc
  • 発売日: 2019/10/08
  • メディア: ペーパーバック

Terraformで渡した引数によって処理を変える

概要

Terraformの実行時にわたした引数によって処理を変更し、作成されるリソースを変えてみたいと思います。

こんなかんじ

引数hikisuuがtrueであればサブネットを作成する。 falseであればしない。といったかんじ。
VPCはどちらの場合でも作成される。

variable "hikisuu" {
  type = bool
}

resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
}

resource "aws_subnet" "subnet" {
  count      = var.hikisuu ? 1 : 0
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.1.0/24"
}

実行してみる

こんなかんじになる。

true

$ terraform plan -var "hikisuu=true"
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.


------------------------------------------------------------------------

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # aws_subnet.subnet[0] will be created
  + resource "aws_subnet" "subnet" {
      + arn                             = (known after apply)
      + assign_ipv6_address_on_creation = false
      + availability_zone               = (known after apply)
      + availability_zone_id            = (known after apply)
      + cidr_block                      = "10.0.1.0/24"
      + id                              = (known after apply)
      + ipv6_cidr_block                 = (known after apply)
      + ipv6_cidr_block_association_id  = (known after apply)
      + map_public_ip_on_launch         = false
      + owner_id                        = (known after apply)
      + vpc_id                          = (known after apply)
    }

  # aws_vpc.main will be created
  + resource "aws_vpc" "main" {
      + arn                              = (known after apply)
      + assign_generated_ipv6_cidr_block = false
      + cidr_block                       = "10.0.0.0/16"
      + default_network_acl_id           = (known after apply)
      + default_route_table_id           = (known after apply)
      + default_security_group_id        = (known after apply)
      + dhcp_options_id                  = (known after apply)
      + enable_classiclink               = (known after apply)
      + enable_classiclink_dns_support   = (known after apply)
      + enable_dns_hostnames             = (known after apply)
      + enable_dns_support               = true
      + id                               = (known after apply)
      + instance_tenancy                 = "default"
      + ipv6_association_id              = (known after apply)
      + ipv6_cidr_block                  = (known after apply)
      + main_route_table_id              = (known after apply)
      + owner_id                         = (known after apply)
    }

Plan: 2 to add, 0 to change, 0 to destroy.

------------------------------------------------------------------------

Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.

false

$ terraform plan -var "hikisuu=false"
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.


------------------------------------------------------------------------

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # aws_vpc.main will be created
  + resource "aws_vpc" "main" {
      + arn                              = (known after apply)
      + assign_generated_ipv6_cidr_block = false
      + cidr_block                       = "10.0.0.0/16"
      + default_network_acl_id           = (known after apply)
      + default_route_table_id           = (known after apply)
      + default_security_group_id        = (known after apply)
      + dhcp_options_id                  = (known after apply)
      + enable_classiclink               = (known after apply)
      + enable_classiclink_dns_support   = (known after apply)
      + enable_dns_hostnames             = (known after apply)
      + enable_dns_support               = true
      + id                               = (known after apply)
      + instance_tenancy                 = "default"
      + ipv6_association_id              = (known after apply)
      + ipv6_cidr_block                  = (known after apply)
      + main_route_table_id              = (known after apply)
      + owner_id                         = (known after apply)
    }

Plan: 1 to add, 0 to change, 0 to destroy.

------------------------------------------------------------------------

Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.

おわりに

ながくなった。

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

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

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

TerraformでAWSのアカウント番号を利用する

概要

TerraformでAWSアカウント番号(アカウントID)を取得してみます。

前提

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

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

こんなかんじ

みんなだいすきcaller_identityです。

data "aws_caller_identity" "wawawa_id" {}

output "account_id" {
  value = data.aws_caller_identity.wawawa_id.account_id
}

おわりに

べんりですね。

DevOpsを支えるHashiCorpツール大全 ThinkIT Books

DevOpsを支えるHashiCorpツール大全 ThinkIT Books

  • 作者:前佛 雅人
  • 出版社/メーカー: インプレス
  • 発売日: 2015/10/22
  • メディア: Kindle版