lizminim

忘れていても思い出せるように。

やるしかないよな。クズだから。スガシカオの楽曲「Progress」

 歌詞を聴きいてしまう音楽に出会う時は、生活を営んでいる最中のことが多い。学生の頃から時々聞き流していた曲だったが、今日は耳を澄ましてしまった。そんなスガシカオのprogress。

 私はもうしっかりアラサーおじさんなので、ある程度自分の人生がどうなるか想像がついてしまっていた。あとはどの方向に倒すだけかみたいな感覚に陥っているのが最近で、正直日常に飽きているような感覚にあった。大学院を含めるとフルリモートを主軸に活動をする生活を四年も経験しており、正直この辺も起因しているとは思う。だから現状脱却のために転職活動をしているような状況であり...という、まぁ、如何にもな大人になってしまった。とても真面目に生きてるんだな俺と最近はなんとなく気が滅入っていることが多い。それでも社会人やっていけてるかの不安は未だに拭えない。それなりな評価をもらっているっぽいが、自分にイマイチ手応えが無い。そこそこ仕事ができるようになったと思うようにしているが、やはり明日の飯の種の不安がないわけじゃなく、自分より優秀な人間ばかり目に入るし、自分より若く稼いでいる人はごまんといるわけで。

 頭の湧いていた中学時代に仲の良かった友人が「俺将来めっっっっちゃくちゃバカかっこいい激渋なおっさんになるわ」とよく口にしていたんだけど、頭の湧いていた俺もいつかそうなりたいなとその当時思って以来、今日に至るまでバチクソかっこいい激渋おじさんへの憧れを忘れてはいない。だけど、そうなれる自信が今はさっぱりないというのが本音。

 おじさん本当にやりたいことわかんなくなってしまったよ。今の俺を助けてくれ岳斗よ。今のお前は元気してろよ。

歌詞を紐解く

まぁ身の上話はこんなところで、歌詞を紐解く。

ずっと探していた理想の自分って

もうちょっとカッコよかったけれど

ぼくが歩いてきた日々と道のりを

ほんとは”ジブン”っていうらしい

サビの歌詞。なんだこの歌詞。俺みたいじゃん(キモい)。

そうなんだよな。カッコいい。というか、サラリーマンやってる人間は皆ぶっ刺さるんじゃないか?

君とぼくの甘酸っぱい挫折に捧ぐ...

あと一歩だけ前に進もう

あー。

そうなんだよ。俺もそうだけど、俺以外の人間も少なからず挫折や失敗してるんだよな。甘酸っぱい挫折ってフレーズが失敗ともいえない幼稚な判断や、くだらない意地を貼った瞬間とか色々思い出すからうわーってなる。うわー。

。。。

でもさ、わかってんだよね。前に進むしかないって。

「クズの俺が今から努力して間に合うか!?」

「間に合わなくてもやるしかないだろクズなんだから」

って。漫画のフレーズだけど、俺はこれに何度か救われている。

俺はクソムシですっていいながら泣きながら進めばなにかでてくるんじゃない?いい結果とも悪い結果ともわからないけど。なんなら何も出ないこともあるけど。だけどやるしかないんだよ。俺はやるよって。

大学院のときも結構追い込まれてたなぁと改めて振り返るとしみじみしてしまうな...。

必要なのは覚悟なんだよ。俺はやるという覚悟。

泣きながらまた進めばいいじゃない。俺はやるから。

俺はやるという覚悟を持っているから。

覚悟はいいか?俺はできてる。

 

ちなみにこの曲はkokuaというバンド名義の曲。なのでスガシカオが書いた曲として知られるのは時間がかかったらしい。kokuaというのは「協力・協調」という意味らしい。あー、いい曲だ。

aws lambda layer構築中にThe plugin.(*GRPCProvider).ApplyResourceChange request was cancelled.でコケる。

lambda layerを構築していたが、何故かデプロイできなくなった。

とりあえずデバッグフラグ。

kilin@kilin:~/$ env | grep TF_LOG
TF_LOG=DEBUG

確認。

2024-04-27T21:38:53.960+0900 [TRACE] evalApplyProvisioners: module.guess_api.aws_lambda_layer_version.lambda_layer is tainted, so skipping provisioning
2024-04-27T21:38:53.961+0900 [TRACE] maybeTainted: module.guess_api.aws_lambda_layer_version.lambda_layer was already tainted, so nothing to do
2024-04-27T21:38:53.961+0900 [TRACE] terraform.contextPlugins: Schema for provider "registry.terraform.io/hashicorp/aws" is in the global cache
2024-04-27T21:38:53.961+0900 [TRACE] NodeAbstractResouceInstance.writeResourceInstanceState to workingState for module.guess_api.aws_lambda_layer_version.lambda_layer
2024-04-27T21:38:53.961+0900 [TRACE] NodeAbstractResouceInstance.writeResourceInstanceState: removing state object for module.guess_api.aws_lambda_layer_version.lambda_layer
2024-04-27T21:38:53.971+0900 [TRACE] statemgr.Filesystem: not making a backup, because the new snapshot is identical to the old
2024-04-27T21:38:53.973+0900 [TRACE] statemgr.Filesystem: no state changes since last snapshot
2024-04-27T21:38:53.973+0900 [TRACE] statemgr.Filesystem: writing snapshot at terraform.tfstate
2024-04-27T21:38:53.976+0900 [DEBUG] State storage *statemgr.Filesystem declined to persist a state snapshot
2024-04-27T21:38:53.976+0900 [ERROR] vertex "module.guess_api.aws_lambda_layer_version.lambda_layer" error: Request cancelled
2024-04-27T21:38:53.977+0900 [TRACE] vertex "module.guess_api.aws_lambda_layer_version.lambda_layer": visit complete, with errors
2024-04-27T21:38:53.980+0900 [TRACE] dag/walk: upstream of "module.guess_api.aws_lambda_function.guess_api_lambda (expand)" errored, so skipping
2024-04-27T21:38:53.981+0900 [TRACE] dag/walk: upstream of "module.guess_api.aws_lambda_function.guess_api_lambda" errored, so skipping
2024-04-27T21:38:53.982+0900 [TRACE] dag/walk: upstream of "module.guess_api (close)" errored, so skipping
2024-04-27T21:38:53.982+0900 [TRACE] dag/walk: upstream of "provider[\"registry.terraform.io/hashicorp/aws\"] (close)" errored, so skipping
2024-04-27T21:38:53.982+0900 [TRACE] dag/walk: upstream of "root" errored, so skipping
2024-04-27T21:38:53.984+0900 [TRACE] terraform.contextPlugins: Schema for provider "registry.terraform.io/hashicorp/aws" is in the global cache
2024-04-27T21:38:53.984+0900 [TRACE] statemgr.Filesystem: not making a backup, because the new snapshot is identical to the old
2024-04-27T21:38:53.985+0900 [TRACE] statemgr.Filesystem: no state changes since last snapshot
2024-04-27T21:38:53.985+0900 [TRACE] statemgr.Filesystem: writing snapshot at terraform.tfstate
╷
│ Error: Request cancelled
│ 
│   with module.guess_api.aws_lambda_layer_version.lambda_layer,
│   on ../modules/lambda/main.tf line 88, in resource "aws_lambda_layer_version" "lambda_layer":
│   88: resource "aws_lambda_layer_version" "lambda_layer" {
│ 
│ The plugin.(*GRPCProvider).ApplyResourceChange request was cancelled.
╵
2024-04-27T21:38:53.998+0900 [TRACE] statemgr.Filesystem: removing lock metadata file .terraform.tfstate.lock.info
2024-04-27T21:38:53.999+0900 [TRACE] statemgr.Filesystem: unlocking terraform.tfstate using fcntl flock
2024-04-27T21:38:54.002+0900 [DEBUG] provider: plugin exited

よくわからない。ログ実際のログはTRACEしている箇所もある。ひとまずログが長すぎてどうしようもないためERRORだけで引っ掛けてみる。

TF_LOG=ERROR
terraform apply

しかし、

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

module.guess_api.aws_lambda_layer_version.lambda_layer: Creating...
module.guess_api.aws_lambda_layer_version.lambda_layer: Still creating... [10s elapsed]
2024-04-27T21:45:42.466+0900 [ERROR] plugin.(*GRPCProvider).ApplyResourceChange: error="rpc error: code = Canceled desc = context canceled"
2024-04-27T21:45:42.495+0900 [ERROR] vertex "module.guess_api.aws_lambda_layer_version.lambda_layer" error: Request cancelled
╷
│ Error: Request cancelled
│ 
│   with module.guess_api.aws_lambda_layer_version.lambda_layer,
│   on ../modules/lambda/main.tf line 88, in resource "aws_lambda_layer_version" "lambda_layer":
│   88: resource "aws_lambda_layer_version" "lambda_layer" {
│ 
│ The plugin.(*GRPCProvider).ApplyResourceChange request was cancelled.
╵
(lambda-env) kilin@kilin-B450-I-AORUS-PRO-WIFI:~/Documents/Project/climbApp/terraform/dev$ 

駄目みたい。

一応確認したが、terraform planしても特に問題が見当たらない。

2024-04-27T21:36:45.765+0900 [INFO]  backend/local: plan operation completed

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create
  ~ update in-place

Terraform will perform the following actions:

  # module.guess_api.aws_lambda_function.guess_api_lambda will be updated in-place
  ~ resource "aws_lambda_function" "guess_api_lambda" {
        id                             = "guessApi-dev"
      ~ layers                         = [
          - "arn:aws:lambda:ap-northeast-1:369311474110:layer:lambda_layer_climb:4",
        ] -> (known after apply)
        tags                           = {}
        # (27 unchanged attributes hidden)

        # (3 unchanged blocks hidden)
    }

  # module.guess_api.aws_lambda_layer_version.lambda_layer will be created
  + resource "aws_lambda_layer_version" "lambda_layer" {
      + arn                         = (known after apply)
      + compatible_runtimes         = [
          + "python3.10",
        ]
      + created_date                = (known after apply)
      + filename                    = "../modules/lambda/python.zip"
      + id                          = (known after apply)
      + layer_arn                   = (known after apply)
      + layer_name                  = "lambda_layer_climb"
      + signing_job_arn             = (known after apply)
      + signing_profile_version_arn = (known after apply)
      + skip_destroy                = false
      + source_code_hash            = "rmQ+NESv0D/ezoyMc/Z8zBTWn6fK0hnrV9FpJRKGlQA="
      + source_code_size            = (known after apply)
      + version                     = (known after apply)
    }

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

この辺の記事を読んでもイマイチよくわからず。

github.com

原因がわからないと思ったが、そもそもultralyticsで色々放り込んだな?と思い出し、ファイル容量を確認する。

du -sh ./*

2.4GBのデプロイ用zipファイルが存在した。これだ。

サイズを小さくして再度apply。

  Enter a value: yes

module.guess_api.aws_lambda_layer_version.lambda_layer: Creating...
module.guess_api.aws_lambda_layer_version.lambda_layer: Creation complete after 5s [id=arn:aws:lambda:ap-northeast-1:369311474110:layer:lambda_layer_climb:5]
module.guess_api.aws_lambda_function.guess_api_lambda: Modifying... [id=guessApi-dev]
module.guess_api.aws_lambda_function.guess_api_lambda: Modifications complete after 8s [id=guessApi-dev]

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

OK。

lambda layerのアップロードサイズ上限は50MB(圧縮後)

terraform側では上限に引っかかった旨のエラーは表示されない様子だった。 zipファイルサイズを小さくしてデプロイし直すとデプロイできたので、サイズ上限に引っかかったということがわかる。

docs.aws.amazon.com

こちらによると圧縮zipで50MBで解凍後に250MB以下でないといけないらしい。 今回はlayerサイズのクォータ制限を回避する形で対応を行った。

【書評&memo】 AWSではじめるクラウドセキュリティ

自分用メモ。キーワードとその説明を羅列していく。個人的に重要な内容は7章と8章の内容だった。 他の細かい話はざっと読むだけで一旦はOKとした。

7章: AWSを用いたネットワークアクセス

サブネットを利用したゾーニング zoning(分割)なのでそのままの意味。VPC内をインターネット通信可能な領域、そうでない領域に分割する。

サブネット間の通信制御にはネットワークACL デフォルトですべての通信を許可しているような状況。ステートレスなので双方向の設定が必要。 インターネットからのアクセスのためにEC2をパブリックサブネットに配置する場合がある。 が、セキュリティ的にはあまり好ましくない。ファイヤウォールに依存するので危険ということらしい。

そこでELBをパブリック、EC2をプライベートに配置して、ELBにグローバルIPを当てるようにするほうが好ましい。 EC2が配置されたプライベートサブネットでは、HTTP/HTTPS通信のみ受け付けるようにしている(ここはセキュリティグループで設定) このときELBはリバースプロキシみたいな扱い。EC2のスケールによる拡張にも優れた構成となる。

Cloudfrareリバースプロキシの説明

セキュリティグループ インスタンスごとに設定するファイアウォール。 インバウンドトラフィック・アウトバウンドトラフィックに分けて制御可能。 デフォルトですべての通信がOFF。で、ステートフル。 ステートフルなので、インスタンスからのリターントラフィックは自動的に許可。アウトバウンドトラフィックはいじる必要がない。

また、EC2からRDSにアクセスするとき、セキュリティグループによる通信許可設定が必要なんだけど、ソースとして、EC2じゃなくてセキュリティグループを参照することができる。

VPC内部のアクセス制御 外部からアクセスされる場合の通信経路は、 ルートテーブル =>ネットワークACL => サブネット => セキュリティグループ という順番にルーティングされる。

リソースアクセス

アイデンティティベースのアクセス制御 アクセスする主体から目線。つまりIAMユーザやIAMグループに充てるような制御ルール。

IAMポリシー評価ロジック

Denyチェック yes →拒否
↓ No
Allowチェック yes →許可
↓ No
拒否

最初のDenyによるジャッジは「明示的な拒否」みたいな言葉で表現される。Allowを記述されていても拒否が優先される。

リソースベースのアクセス制御

リソース目線。

アクセスレベル

IAMで定義されている言葉。よくある操作に名前をつけて権限付与時にどの程度の権限かを明示するもの。名前だけ知ってればOK。

IAMロールと一時権限移譲

IAMロールをIAMユーザに与え、一時的にその権限で利用する。このときに STSを使う。

暗号化

適用箇所 - 保管中のデータの暗号化 - 転送中のデータの暗号化 というどちらかの観点で考えることが多い。AWSでは、 - SSE(server side encryption) - CSE(client side encryption) と表現される。以下でざっくり特徴

SSE CSE
暗号化箇所 AWS カスタマー側
転送時の暗号化状態 なし あり

KMS

AWSの各サービスの暗号化で使われる鍵はKMSで生成。 この暗号化時の鍵を「データキー」と呼ぶが、このデータキーも保護が当然必要。 で、データキーはさらに暗号化され、このとき暗号化したキーを「KMSキー」と読んでいる。 所謂「エンベロープ暗号化」というもの。 この辺は別で説明をする。

所感

セキュリティグループ間参照で設定できるのは楽でよいと思った。CIDRでいちいち書くのも面倒なので楽に設計構築できるようによく考えられているなと思った。 KMSが意外と細かく読まないと混乱をきたす感じ。次回は細かく見ていきたい。

AWS認定資格アソシエイトレベル3冠したので所感【AWS SAA, SOA, DVA】

 先日AWS SOADVAの資格に合格し、アソシエイト資格をすべて取得した。以下はその記録と所感。

勉強前のスキルセット前提

  • CFnで一通りインフラ構築経験あり
  • lambda + API GWでサーバレスREST API構築経験あり
  • ECSを利用したREST API構築経験あり

SOA

正直簡単だった。私の受験時にはラボ試験が廃止されていたため、輪をかけて易化していたと思われる。

基本的な教材としてこちらを利用。1周だけしてあとはcloudlicenseに頼った。

AWS認定資格試験テキスト AWS認定SysOpsアドミニストレーター https://amzn.to/41IxEPnamzn.to

内容としては十分だが、試験を受けるにはこの本だけでは少し足りないと感じた。 cloudlicenseは古い問題以外を1周+間違えた問題を復習で十分だった。

DVA

ほぼノー勉。cloudlicenseを1周しただけだが合格。 API GWの細かい話が割と多く無理かなと思ったがなんとかなった。

所感

という感じでなんだかさっくり合格できたが、cloudlicenseで演習の数をこなすのがそれなりに大変。 ある程度インフラ構築経験があれば、正直cloudlicenseだけで試験には対応できると思われる。 結果だけ見るとcloudlicenseありきで対応してしまったなという印象。SAAに合格したのが1年前なため包括的に勉強しなおす良い機会になったのは良かったと思う。

しかしながら、実際にインフラ構築する時に精査することを考慮するとコスパのいい資格ではないと思う。 構築経験+資格を持っていれば転職時に効果を発揮してくれるだろうと淡い期待を抱いている。

SAPまで取得してもいいが食指がイマイチ動かない。フロントエンドやReactの勉強に時間を割くのが先かな。

2023総括

勉強しかしてないし、何なら勉強もそんなにしてない。

とりあえず2023年に取得した資格を並べてみる。

AWS SAA AWS SOA AWS DVA

応用情報技術者試験

んー。まぁ頑張ったんじゃない? 2022にFE落ちて今年AP取れたのはまぁまぐれだろう。FEの午後試験勉強をちゃんとしなかったのが敗因ではあるけど。

ひとまずAWSのアソシエイト資格はすべて2023に取ったのでCLFと合わせて4冠。資格が取得できたからといって微塵も仕事に応用が聞かなそうな資格だと思う。 それに比べて応用情報のバランスの良さよ。手広く網羅的に、突っ込んだことは午後でつついて、IT開発者であれば持っていてほしい知識をつついてくる感じ。とても練られている試験だと感じた。

とりあえず来年の予定を以下。

ネスペ AWS SAP PM

高度だなぁ。あと試験外で

ギター再開 ヒゲ脱毛開始 ボルダリング再開 アプリ開発 SIGNATEやる

って感じ。彼女いないし結婚したいけどできそうにないからこれくらいできるだろ。 まぁ頑張ろう。きっといいことあると信じて。

AWSのAMIとスナップショットとEBSの違い

よくわからなかったので調べた。

https://aws.typepad.com/sajp/2014/04/trainingfaqbest10.html

EBS = EC2のストレージ

そのままである。

スナップショット :=「EBS中のデータをS3に保存したもの」

EBSのバックアップ。EBSからスナップショットを作成する場合、EC2インスタンスを止めておくことが推奨される。

AMI = スナップショット + 管理情報(OSとか)

諸々のバックアップ。EC2&EBSをAMI化すると、インスタンスの構成情報とスナップショットへそれぞれ変化し、AMIとして管理することになる。

AMIを他アカウントと共有

AMIの共有は他AWSアカウントID(12桁の数字の奴)がわかれば共有可能。

AMIを他リージョンへコピー

コピー名、送信先リージョンを指定。さらにAMIコピーのEBSスナップショットの暗号化が指定できる。

暗号化されたEBSスナップショットの別リージョンコピー

docs.aws.amazon.com

AMIの暗号化だが、これは正確にはAMIが持つEBSスナップショットの暗号化である。

https://aws.typepad.com/sajp/2016/10/how-to-create-a-custom-ami-with-encrypted-amazon-ebs-snapshots-and-share-it-with.html

AMIのコピーは元の暗号化状態を引きずる。しかし暗号化してあるAMIを暗号化されてないAMIとして別リージョンにコピーするのはできない。

ざっくり暗号化EBSの別リージョンコピーの流れを説明すると、 まず、EBS作成時にKMS暗号化する必要がある。(後からやる場合、結構面倒。暗号化されていないスナップショットからコピー作成時に暗号化スナップショットを作成。それを一度マウントして暗号化EBSとする流れ。)

で、暗号化EBSができているので、スナップショットを作成する。EBS暗号化されているので、そのスナップショットも暗号化されている。

で、別リージョンにEBSスナップショットをコピーする。この時、別リージョン側の暗号化キーを選択できる(デフォルト、カスタマー管理単一リージョン、カスタマー管理マルチリージョン)。

そのカギで、暗号化スナップショットをコピーする(ややこしい)。 すると別リージョンに暗号化されているEBSスナップショットが存在する。要は、相手のリージョンのカギで「暗号化スナップショット」の暗号化をしてコピーをしているような感じ。

blog.serverworks.co.jp