死なずに生きるのが得意

海の見える丘の上の家に光回線を引いてリモートワークで暮らしたい

(local-execつかったほうがいいよ) aws_spot_instance_request でインスタンスに terraform 管理下のタグをつける

はじめに

おとなしく local-exec 使ったほうが時間が節約されます。

背景

terraform の aws provider でスポットインスタンスを利用するには、 aws_spot_instance_request を使う。

ただ、この resource には作成されたインスタンスに対するタグ付与機能が ない 。タグをつけるには事後処理が必要となる。

resource aws_spot_instance_requesttag の仕様について

aws_spot_instance_request は、言ってしまえば aws_instance にスポットインスタンス起動に必要な設定項目を追加したものである。 そのため、 tags の適用対象は スポットリクエス であり、インスタンスではない。

では、インスタンス側にそれを適用する方法があるのかというと、ない。

issue はあった

皆おなじことを思うためか、issue がある。 issue issue2

AWSAPI として用意していない方法を aws provider 独自に実装することは無い (っぽい) ため、多分今後もない。

回避方法

local-exec を使う

issue にて紹介されていた方法。

リソース作成後、 local-exec を使って AWS CLI を実行する方法である。

シンプルで十分な方法なのだが、タグが terraform の管理対象から外れてしまう。 local-exec を使う以上仕方ないのだが、terraform を使う意義が (所詮タグだが) 薄れてしまうのでできれば避けたい。

aws_ec2_tag を使う (この記事で説明)

タグも terraform で管理したいならば、 aws_ec2_tag を使えばよい。

しかし、単に aws_spot_instance_requestaws_ec2_tag を抱き合わせて使うと問題が起きる。 aws_ec2_tag では resource_idインスタンス ID を与える必要があるが、 aws_spot_instance_request の出力から spot_instance_id が取得できるようになるにはタイムラグがある。 そして、そのタイムラグを terraform は考慮してくれない。 このような挙動が起きうることはドキュメントにも記載されている。

These attributes are exported, but they are expected to change over time and so should only be used for informational purposes, not for resource dependencies:

spot_bid_status - The current bid status of the Spot Instance Request. spot_request_state The current request state of the Spot Instance Request. spot_instance_id - The Instance ID (if any) that is currently fulfilling the Spot Instance request. public_dns - The public DNS name assigned to the instance. For EC2-VPC, this is only available if you've enabled DNS hostnames for your VPC public_ip - The public IP address assigned to the instance, if applicable. private_dns - The private DNS name assigned to the instance. Can only be used inside the Amazon EC2, and only available if you've enabled DNS hostnames for your VPC private_ip - The private IP address assigned to the instance tags_all - A map of tags assigned to the resource, including those inherited from the provider default_tags configuration block.

引用元: https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/spot_instance_request#attributes-reference

そのため、タグ付与は別 tfstate に分けることとする。 1

スポットリクエストを作成した tfstate に aws_spot_instance_requestoutput し、別 terraform から参照する。 出力されているスポットリクエスト情報にある spot_instance_id をもとにインスタンスを取得し、 aws_ec2_tag でタグを付与する。

local-exec に頼らない方法としてこちらをやってみたので内容を説明する。

スポットリクエスト作成側

resource "aws_spot_instance_request" "instance" {
  for_each = local.mariadb_instances

  # インスタンスに関する 各種設定
}

output "spot_request" {
  value = aws_spot_instance_request.instance
}

タグ付与側

data "terraform_remote_state" "state" {
  # 利用している tfstate 保存方法にあわせてよしなに設定する
}

resource "aws_ec2_tag" "tag" {

  resource_id = data.terraform_remote_state.state.outputs.spot_request.spot_instance_id
  key         = "Name"
  value       = "spot-instance"
}

終わりに

脚注でも書いたが、正直 local-exec でいい。 aws_spot_instance_request を使うようなシチュエーションは検証がほとんどなので。

それか AutoScaling つかって起動テンプレートに書けばいいと思う。でも固定 Private IP とかしたい場合は無理なのでやっぱり local-exec でいいとおもう。

追記

output するタイミングで spot_instance_id が確定していないので、「スポットリクエスト作成側」の terraform は 2 回実行する必要があるので、やっぱ local-exec でいいと思います。


  1. この時点でめんどい。そもそも aws_spot_instance_request を使うような状況は検証時なので、それならタグが terraform 管理から漏れてもどうでもいいため、 local-exec でいいと思う。

生きてます

生きてます

生きてます。

生きてる間に2年たってました。なんか文章書く場所もはてブロから note に移って行ってるし完全に乗り遅れた感じしかしない。

なんかこのブログの最初の記事見たら、その時との状況、心境変化的なことを書きたくなったので書く

変わったこと

  • AWS の アソシエイトレベル3資格とった (結構前に)
    • 報奨金ゲットだぜ
  • TOEIC 730 以上達成
    • なんか一発で行けてしまい拍子抜けした
    • なんかこれ以上やるモチベが無くて英語の勉強もうやってない
  • フルリモート化
    • あとは海の見える丘の上の一軒家があればよくなった
    • でも東京 (not 西東京) って便利だよね

最近やっていること

仕事編

AWS (ほとんど仮想サーバーのパラダイムだが), Ansible, molecule, Terraform, Packer (まれに), GitLab CI/CD, Docker (ほとんどローカル環境と GitLab CI/CD 用), Python (まれに)

最近やっぱプログラムかく仕事 (IaC でない) をやりたくなってきた感がある。

趣味編

ゲームをまた書こうとしていたり

仕事で解消されなかった疑問を個人的に解決したり

なんか突然列車に乗れるうちに乗っておきたくなったり

一時期やってたこと

Docker のしくみとか調べた。でもそんな深淵の技術まで踏み込むことがない。適当 Dockerfile しか書いてない。

Kubernetes 割とちゃんとやろうと思ったけど、 k8s 使うような業務が発生しないしあんまりモチベがあがらなかった。

英語をガチで勉強したけどなんか1ヶ月くらいで熱が冷めた。成果はある程度でた。英語はできない。あれ?

心境

[censored]

(本当はいろいろ書きたいが、インターネットに角を立てる気力がない程度には大人になった)

感想

金は大体のことを解決する

月給は最高のシステム

人生の難易度は 社会人 < 大学(院) << 高校(高専だったけど) <<<<<<<< 中学校 = 小学校 なのでみんな就職しよう。学校なんか行かんでええ (勉強はしたほうがいい)

日本語の通じる人間は貴重

疫病イベントが起きてから列車趣味持つといろいろめんどくさいぞ

一日2時間もビートマニアできない体になった (手痛くなるし目つらくなる) でもこの歳でも伸びるんだなとおもいましたまる

はてブロ開設と私信

こんにちは

気が付けば社会人になっていました。 自分で建てたWordpressの管理がめんどくさくなってはてブロを始めました。せっかく作ったのでなんか書くかということで、何かを書いています。 ところでチョーヤのブランデー梅酒が結構おいしい。この記事はアルコール度数14%です。

最近どうなのか

学業と仕事

大学院を無事卒業し (学部は無事ではなかった) 、今年度から都内Web系企業でエンジニアやってます。やってることとしてはインフラ系です。 インフラは実は希望とは異なり、本当はアプリ開発側に行きたかったのですが、現時点の感想としてはむしろめちゃくちゃ向いているなと思っています。

最近はAWS, Ansible, Terraformあたりをよく触ってます。 AWSOJTの一環として主要なサービスは触りました。今は実際の業務をやってます。 資格もクラウドラクティショナーという割とライトなやつをとりました。次はソリューションアーキテクト アソシエイトを目指してます。7月には取れそう。 資格取得すると、受験料が補填され報奨金が出るので割とやる気になっています。 その他も鋭意習得中といった感じです。

仕事は今のところかなり順調な感じです。インターン経験から実際の業務に適応する自信はあったものの、入った会社とマッチするかは究極的には入ってみなければわからないところがあり心配でしたが、 今はチームメンバーや所属部署の雰囲気にも恵まれ、とても快適元気にモチベーション高くやれています。

音ゲー

正直最近全然さわっていないです。今日会ったWACCAのイベントも忘れてて逃しました。テトテコネクトはアンテナにすらかかってなかったです。弐寺もほとんどやってない。もう音ゲーマーではないのかもしれない。 とはいえREVといい弐寺といいストイックにやりすぎたかなーと思って、また自然とやりたくなるまではもういいやと思う気持ちが大きいです。

東京住まいになったおかげで音ゲー系クラブイベントとかはぼちぼち行くようになりました。

パスモ一体型クレカを作ったけど限度額が10万なのですぐ一杯になる。

ACE COMBAT 7 VRはいいぞ。

仕事を始めて思うこと

何かを生み出すことにそこまで固執しなくてよかった

学生時代は「ただプログラムを書けるだけでは意味がない。実際に成果が上がっていなければ」と思いいろいろやってみていました。 音ゲーを作ったり、信号処理をしてみたり、Webアプリを作ったり、サーバーを自分で管理してみたり、バイトしてみたり (バイトは生活上の理由もありますが)。

しかし、今働いてみて思うのは、まさしく何かを生み出す人というわけでなくても、ちゃんと価値があったなということです。

僕は実際にモノを作るのはそこまで興味がなく、仕組みとか設計思想とか使われている技術とかを知りたいだけだということに大学院あたりからうっすら気づいていたのですが、 仕事としてインフラエンジニアをやってみて (といっても3か月たっていないんですが) 、それで全然問題ない、なかったと思うようになりました。 価値を新しく提示するのではなく、改善、維持、増幅する役割が向いていたということみたいです。 そもそも会社は能力の違う人間の寄せ集めでできているので、自分ができないことは他人にやってもらえばいいのだと思っています。そうでなければフリーランスしたり自分で会社やればいいですから。

学部時代くらいまでは何かを作れなければという思いが強く、何かをやり始めるも結局完成しないか、できても満足できなくて公開していませんでした。 今となっては何かを作る必要はなく、ひたすらCSに詳しくなりまくればよくて、面白いことに気づいたらブログでも書けばよかったんだなと思っています。 (この記事はその手始めという面もあります。)

「やる気はあるはずなんだけど物は完成しない。気が付くとWikipediaのタブが30個くらい開いていた。」みたいな人は、作るのではなくひたすら知るという方向もアリだと思います。

金がもらえると思うとすごくやる気がでる

これは月給の出るインターンをやった時に気付いたのですが、お金が出るとめちゃくちゃ集中できるんですよね。 だいたい何か作っていると意義について深く考え始めてしまって結局作らなくなったりしていたんですが、お金がもらえるとお金がもらえることが目的の一部になるからか、 やることに迷いがなくなる感覚があります。

これも月給の出るインターンから得た知見ですが、どうやら給料の高い職場は給料以外の質も高く、給料の低い職場は給料以外の質も低いようなんですよね。 なので、お金が出るとやる気がでるというのは、前述したものだけではなく、職場が良いという面もあるのかなーと考えています。

あとは金銭的余裕があるのでちょっとした出費を躊躇しなくなりました。自炊頻度がめちゃくちゃ落ちましたが全然問題ないし、週3で銭湯にも行ける。QoLがめちゃくちゃ高い。 お金がある→生活の質が高まる→やる気のでる精神状態を保ちやすい、という面もありそうだと思います。

他人を認めることより自分を認めることのほうが圧倒的に難しい

どういうわけか結構今の職場でやれていて、インフラ側の知見もそこまであるわけではないものの、学業や自作PCで得た基礎的なコンピュータの知識が結構役立っているようで、 知らない知識もスムーズに習得できて、なおかつプログラムもインフラの新入社員としては書けるのでどうも評価が高いっぽいです。うれしい。

ただどうも、これでいいのかというか、評価されているということは逆に周りが低いだけなのではとか (失礼な話ですが……) 、これはおだてられているだけなのではとか、そういうことを自動思考してしまいます。 そういえば、アルバイトでも「あなたの実力を評価しているから仕事を振っているし時給も上げている」と言われたことがあるのですが、その時もそれを受け入れられなかったので、どうやら根深いようです。

おわりに

まあなんかいろいろ言ってますが、過去最高に人生が快適なので特に問題はないです。 余剰リソースをうまくまわせていけたらいいなーと思っています。

おわり