継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

AWS リソース名につけられる文字数を調べたのでサービス毎にまとめる

タダです.

AWS リソースを作る時に遭遇する1つの課題がリソース名で使える文字数があります.調べた範囲になりますが,この記事でサービス毎に利用できるリソース名の文字数をまとめます

調べたサービスと制限まとめ

  • EC2
  • ELB
    • 名前は最大 32 文字で英数字とハイフンのみを使用できる
    • ドキュメント
      • ALB のターゲットグループも同様に32文字までいける
  • S3
  • RDS
  • DynamoDB
  • Elasticache
    • cacheCluster に最大 50 文字,replicationGroup に最大 40 文字のクラスター名を付けることができる
    • 公式ブログ
  • IAM
  • Lambda
  • API Gateway
    • ステージ名には,英数字,ハイフン,アンダースコアのみを使用でき最大文字数は128文字が使える
    • ドキュメント
  • StepFunctions
    • ステートマシン,実行,アクティビティの名前は 1~80 文字で使用できる
    • ドキュメント
  • ECS
    • クラスター:255文字までの英字の大文字,小文字,数字,ハイフン,アンダースコアが使用可能
    • サービス:255文字までの英字の大文字,小文字,数字,ハイフン,アンダースコアが使用可能
    • タスク
      • コンテナ名:255文字までの英字の大文字,小文字,数字,ハイフン,アンダースコアが使用可能
      • ファミリー名:英字の大文字,小文字,数字,アンダースコア,ハイフンは255文字まで使用可能

まとめ

AWS のサービスで使用できる文字数制限を調べた範囲でまとめました.ELB が文字数が少なく気楽につけたら制限にひっかかってリソースが作れないことになりそうなので気をつけたいと思いました.

ALB アクセスログの格納時の暗号化は KMS カスタマキーで行えるのか?

タダです.

ALB のアクセスログを暗号化する時にドキュメントでは SSE-S3 がサポートされていると書いているが,実際 KMS のカスタマーキーではできないかを調べて見る機会があり,その備忘録をこの記事にまとめます.

サポートされている唯一のサーバー側の暗号化オプションは、Amazon S3 マネージドキー (SSE−S3) です。詳細については、 「 Amazon S3 マネージド暗号化キー (SSE-S3)」を参照してください。

docs.aws.amazon.com

検証した KMS ポリシーと検証設定概要

検証は以下の KMS ポリシーで設定して,S3 バケットにもカスタマキーを設定しました.IAM の権限があれば KMS の全権限があるのに加え,ELB のサービスプリンシパルと KMS の暗号化・復号化を東京リージョンの ELB で許可する意図の設定を行いました.

{
    "Version": "2012-10-17",
    "Id": "key-consolepolicy",
    "Statement": [
        {
            "Sid": "Enable IAM User Permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "elasticloadbalancing.amazonaws.com"
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:DescribeKey"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "kms:ViaService": "elasticloadbalancing.ap-northeast-1.amazonaws.com"
                }
            }
        }
    ]
}

S3 バケットの暗号化セクション

アクセスログに出力されるかの確認

KMS カスタマキーを先にS3 バケットに設定していた場合,これはアクセスログ出力設定時に権限エラーがでました.これはドキュメントの記載通りの挙動と言えます.

一時的にバケットの暗号化を SSE-S3 に変更して再度アクセスログ出力設定を有効化すると今度は成功しました.ここまでも想定通りの挙動です.

アクセスログ有効化後に,KMS カスタマキーをバケットに設定してみるとアクセスログは出るかどうかを見てみましょう.本来であれば,ここではアクセスログが出ないことが予測されます.が,ログは出力されました(検証は2022/09/18 12時台に確認しています).

このログをダウンロードして確認してみると,ログの中身を確認もできました.

ログ抜粋

h2 2022-09-18T03:09:14.366280Z app/test/123456789 133.200.0.32:24097 - 0.009 0.026 0.000 200 200 199 1118 "GET https://test-123456789.ap-northeast-1.elb.amazonaws.com:443/ HTTP/2.0" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.6.1 Safari/605.1.15" ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 arn:aws:elasticloadbalancing:ap-northeast-1:1234567899:targetgroup/hoge-tg/123456789 "Root=1-63268bda-0d7a0a1d241c44753a4d572f" "test-123456789.ap-northeast-1.elb.amazonaws.com" "arn:aws:acm:ap-northeast-1:1234567899:certificate/1234567899-1234567899-1234567899" 0 2022-09-18T03:09:14.330000Z "forward" "-" "-" "-" "200" "-" "-"

以上の検証から次のことが確認できました.

まとめ

ALB アクセスログの暗号化として SSE-KMS を使えるかを試してみたのでその内容をまとめました.初回出力はうまくいきませんでしたが,ログ出力以降にポリシーを設定していれば KMS のカスタマーキーによる暗号化はいけそうでした.

ecspresso をローカルにインストールして ECS デプロイをやってみる

タダです.

業務で ecspresso の利用検討の機会が出てきて触ったことがなかったので,この記事でローカルにツールのインストールとローカルから ECS デプロイをするまでにやったことを備忘録としてまとめます.なお,本記事の備忘録の内容は ecspresso ハンドブックを見させていただきつつ進めた内容になります.

ecspresso

ecspresso とは面白法人カヤックfujiwaraさんが開発された ECS デプロイツールです.

github.com

ecspresso の特徴として以下のものがあり,個人的には業務で Terraform でのリソース管理を扱っているため,tfstate を読み込んで使うことができると点が気になりなので触って動作理解していきます.

  • ECS サービスとタスクに関わるリソースをコード管理・デプロイを実行するためのツール
    • 逆に関連リソースの VPC や ALB といったリソースの作成・管理する機能はない(この辺は AWS Copilot とは管理範囲が違いますね)
  • tfstate ファイルを読んで使ったり,CloudFormation の Outputs や Export の値を読んで扱うことができる
  • 既存の ECS サービスとタスクも管理できるから手で作って管理しきれてなかったリソースも管理対象にしていける

インストールローカルにインストールするためにはいくつか選択肢がありますが,この記事では Homebrew で行いました.

$ brew install kayac/tap/ecspresso
$ ecspressoo version
ecspresso v1.7.12
$ ecspresso help
usage: ecspresso [<flags>] <command> [<args> ...]

Flags:
  --help                    Show context-sensitive help (also try --help-long and --help-man).
  --config="ecspresso.yml"  config file
  --debug                   enable debug log
  --envfile=ENVFILE ...     environment files
  --ext-str=EXT-STR ...     external string values for Jsonnet
  --ext-code=EXT-CODE ...   external code values for Jsonnet
  --color                   enable colored output

Commands:
  help [<command>...]
    Show help.

  version
    show version

  deploy [<flags>]
    deploy service

  scale [<flags>]
    scale service. equivalent to deploy --skip-task-definition --no-update-service

  refresh [<flags>]
    refresh service. equivalent to deploy --skip-task-definition --force-new-deployment --no-update-service

  create [<flags>]
    create service

  status [<flags>]
    show status of service

  rollback [<flags>]
    roll back a service

  delete [<flags>]
    delete service

  run [<flags>]
    run task

  register [<flags>]
    register task definition

  deregister [<flags>]
    deregister task definition

  revisions [<flags>]
    show revisions of task definitions

  wait
    wait until service stable

  init --service=SERVICE [<flags>]
    create service/task definition files by existing ECS service

  diff [<flags>]
    display diff for task definition compared with latest one on ECS

  appspec [<flags>]
    output AppSpec YAML for CodeDeploy to STDOUT

  verify [<flags>]
    verify resources in configurations

  render [<flags>]
    render config, service definition or task definition file to stdout

  tasks [<flags>]
    list tasks that are in a service or having the same family

  exec [<flags>]
    execute command in a task

ローカルからデプロイする

デプロイ設定ファイルの生成

ツールを入れられたので,ローカルから ECS デプロイをやってみます.既存の ECS タスクやサービスから設定情報を取り込める機能があるため,個人環境の手で作ったリソースを取り込んでみます.ecs-service-def.jsonecs-task-def.jsonecspresso.yml が生成されました.

$ ecspresso init --region ap-northeast-1 --cluster default --service myservice --config ecspresso.yml
2022/09/10 17:16:54 test/example save service definition to ecs-service-def.json
2022/09/10 17:16:54 test/example save task definition to ecs-task-def.json
2022/09/10 17:16:54 test/example save config to ecspresso.yml

生成された3つのファイルの内容は次の通りです.

  • ecs-service-def.json : ECS サービスの構成定義ファイル
  • ecs-task-def.json : ECS タスク定義ファイル
  • ecspresso.yml : ecspresso 設定ファイル

各ファイルの詳細

ecs-service-def.json 詳細(クリックで展開)

  {
  "deploymentConfiguration": {
    "deploymentCircuitBreaker": {
      "enable": false,
      "rollback": false
    },
    "maximumPercent": 200,
    "minimumHealthyPercent": 50
  },
  "desiredCount": 1,
  "enableECSManagedTags": true,
  "enableExecuteCommand": false,
  "launchType": "FARGATE",
  "loadBalancers": [],
  "networkConfiguration": {
    "awsvpcConfiguration": {
      "assignPublicIp": "ENABLED",
      "securityGroups": [
        "sg-12356789"
      ],
      "subnets": [
        "subnet-123456789",
        "subnet-987654321"
      ]
    }
  },
  "placementConstraints": [],
  "placementStrategy": [],
  "platformFamily": "Linux",
  "platformVersion": "LATEST",
  "schedulingStrategy": "REPLICA",
  "serviceRegistries": [],
  "tags": []
}

ecs-task-def.json の詳細(クリックで展開)

{
  "containerDefinitions": [
    {
      "cpu": 0,
      "environment": [],
      "essential": true,
      "image": "123456789.dkr.ecr.ap-northeast-1.amazonaws.com/hoge:latest",
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/example",
          "awslogs-region": "ap-northeast-1",
          "awslogs-stream-prefix": "hoge"
        }
      },
      "mountPoints": [],
      "name": "nginx",
      "portMappings": [
        {
          "containerPort": 80,
          "hostPort": 80,
          "protocol": "tcp"
        }
      ],
      "volumesFrom": []
    },
    {
      "cpu": 0,
      "environment": [
        {
          "name": "MACKEREL_ROLES",
          "value": "mkr-dev:ecs"
        },
        {
          "name": "MACKEREL_CONTAINER_PLATFORM",
          "value": "ecs"
        }
      ],
      "essential": true,
      "image": "mackerel/mackerel-container-agent:latest",
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/example",
          "awslogs-region": "ap-northeast-1",
          "awslogs-stream-prefix": "mackerel"
        }
      },
      "memoryReservation": 128,
      "mountPoints": [],
      "name": "mackerel-container-agent",
      "portMappings": [],
      "secrets": [
        {
          "name": "MACKEREL_APIKEY",
          "valueFrom": "mackerel_agent_apikey"
        }
      ],
      "volumesFrom": []
    }
  ],
  "cpu": "256",
  "executionRoleArn": "arn:aws:iam::123456789:role/ecsTaskExecutionRole",
  "family": "nginx",
  "memory": "512",
  "networkMode": "awsvpc",
  "placementConstraints": [],
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "volumes": []
}

ecspresso.yml の詳細(クリックで展開)

region: ap-northeast-1
cluster: example
service: test
service_definition: ecs-service-def.json
task_definition: ecs-task-def.json
timeout: 10m0s

デプロイコマンドの実行

3つの設定ファイルが生成されたら,これでデプロイの準備が整ったのでタスクをデプロイしてみます.タスク定義を新規で作り,サービスのタスクを1つ新規タスク定義で起動したものをデプロイしてくれました.すごく簡単にできて体験がよかったです...

ecspresso deploy --config ecspresso.yml
2022/09/10 17:22:28 test/example Starting deploy
Service: test
Cluster: example
TaskDefinition: nginx:23
Deployments:
   PRIMARY nginx:23 desired:1 pending:0 running:1
Events:
2022/09/10 17:22:29 test/example Registering a new task definition...
2022/09/10 17:22:29 test/example Task definition is registered nginx:24
2022/09/10 17:22:29 test/example Updating service attributes...
2022/09/10 17:22:34 test/example desired count: 1
2022/09/10 17:22:34 test/example Updating service tasks...
2022/09/10 17:22:37 test/example Waiting for service stable...(it will take a few minutes)
2022/09/10 17:23:38 test/example  PRIMARY nginx:24 desired:1 pending:0 running:1
2022/09/10 17:23:38 test/example   ACTIVE nginx:23 desired:1 pending:0 running:1

まとめ

今回は ecspresso を理解していくために概要,ツールのインストール,ローカルからのデプロイを試してみました.次の記事以降でも引き続きハンドブックを読んで理解した内容をまとめていきます.

Terraform で IAM Identity Center のインラインポリシーを設定した

タダです.

IAM Identity Center(旧 AWS SSO)でカスタムポリシーを Terraform で設定したので備忘録でこの記事にまとめます.

Terraform のコード

読み取り権限として ViewOnlyAccess ポリシーがサービス的に用意されているのですが,このポリシーに追加したいと思い,いじってみました.そのコードが下記のものになります.aws_iam_policy_document で指定している source_policy_documents がベースは ViewOnllyAccess にしつつ追加のポリシーを生成している部分です.

data "aws_ssoadmin_instances" "private" {}

data "aws_iam_policy" "viewonly" {
    arn = "arn:aws:iam::aws:policy/job-function/ViewOnlyAccess"
}

data "aws_iam_policy_document" "viewonly_custom_policy" {
    source_policy_documents = [data.aws_iam_policy.viewonly.policy]
    statement {
      actions = [
        "s3:Get*",
        "s3:List*"
      ]
      resources = ["*"]
    }
}

resource "aws_ssoadmin_permission_set" "private" {
  name         = "private"
  instance_arn = tolist(data.aws_ssoadmin_instances.private.arns)[0]
  session_duration = "PT1H"
}

resource "aws_ssoadmin_permission_set_inline_policy" "custom_policy" {
    instance_arn = tolist(data.aws_ssoadmin_instances.private.arns)[0]
    inline_policy = data.aws_iam_policy_document.viewonly_custom_policy.json
    permission_set_arn = aws_ssoadmin_permission_set.private.arn
  
}

参考ドキュメント

registry.terraform.io registry.terraform.io

生成されたポリシー

terraform apply を実行したときのポリシーです.前半のセクションが ViewOnlyAccess のポリシーで後半が aws_iam_policy_document で指定したものです.期待通り追加のポリシーを追加できました.このポリシーをアカウント指定してプロビジョニングすれば設定が反映されます.

{
    "Statement": [
        {
            "Action": [
                "acm:ListCertificates",
                "athena:List*",
                "autoscaling:Describe*",
                "aws-marketplace:ViewSubscriptions",
                "batch:ListJobs",
                "clouddirectory:ListAppliedSchemaArns",
                "clouddirectory:ListDevelopmentSchemaArns",
                "clouddirectory:ListDirectories",
                "clouddirectory:ListPublishedSchemaArns",
                "cloudformation:DescribeStacks",
                "cloudformation:List*",
                "cloudfront:List*",
                "cloudhsm:ListAvailableZones",
                "cloudhsm:ListHapgs",
                "cloudhsm:ListHsms",
                "cloudhsm:ListLunaClients",
                "cloudsearch:DescribeDomains",
                "cloudsearch:List*",
                "cloudtrail:DescribeTrails",
                "cloudtrail:LookupEvents",
                "cloudwatch:Get*",
                "cloudwatch:List*",
                "codebuild:ListBuilds*",
                "codebuild:ListProjects",
                "codecommit:List*",
                "codedeploy:Get*",
                "codedeploy:List*",
                "codepipeline:ListPipelines",
                "codestar:List*",
                "cognito-identity:ListIdentities",
                "cognito-identity:ListIdentityPools",
                "cognito-idp:List*",
                "cognito-sync:ListDatasets",
                "config:Describe*",
                "config:List*",
                "connect:List*",
                "comprehend:Describe*",
                "comprehend:List*",
                "datapipeline:DescribePipelines",
                "datapipeline:GetAccountLimits",
                "datapipeline:ListPipelines",
                "dax:DescribeClusters",
                "dax:DescribeDefaultParameters",
                "dax:DescribeEvents",
                "dax:DescribeParameterGroups",
                "dax:DescribeParameters",
                "dax:DescribeSubnetGroups",
                "dax:ListTags",
                "devicefarm:List*",
                "directconnect:Describe*",
                "discovery:List*",
                "dms:List*",
                "ds:DescribeDirectories",
                "dynamodb:DescribeBackup",
                "dynamodb:DescribeContinuousBackups",
                "dynamodb:DescribeGlobalTable",
                "dynamodb:DescribeGlobalTableSettings",
                "dynamodb:DescribeLimits",
                "dynamodb:DescribeReservedCapacity",
                "dynamodb:DescribeReservedCapacityOfferings",
                "dynamodb:DescribeStream",
                "dynamodb:DescribeTable",
                "dynamodb:DescribeTimeToLive",
                "dynamodb:ListBackups",
                "dynamodb:ListGlobalTables",
                "dynamodb:ListStreams",
                "dynamodb:ListTables",
                "dynamodb:ListTagsOfResource",
                "ec2:DescribeAccountAttributes",
                "ec2:DescribeAddresses",
                "ec2:DescribeAvailabilityZones",
                "ec2:DescribeBundleTasks",
                "ec2:DescribeCarrierGateways",
                "ec2:DescribeClassicLinkInstances",
                "ec2:DescribeConversionTasks",
                "ec2:DescribeCustomerGateways",
                "ec2:DescribeDhcpOptions",
                "ec2:DescribeExportTasks",
                "ec2:DescribeFlowLogs",
                "ec2:DescribeHost*",
                "ec2:DescribeIdFormat",
                "ec2:DescribeIdentityIdFormat",
                "ec2:DescribeImage*",
                "ec2:DescribeImport*",
                "ec2:DescribeInstance*",
                "ec2:DescribeInternetGateways",
                "ec2:DescribeKeyPairs",
                "ec2:DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociations",
                "ec2:DescribeLocalGatewayRouteTableVpcAssociations",
                "ec2:DescribeLocalGatewayRouteTables",
                "ec2:DescribeLocalGatewayVirtualInterfaceGroups",
                "ec2:DescribeLocalGatewayVirtualInterfaces",
                "ec2:DescribeLocalGateways",
                "ec2:DescribeMovingAddresses",
                "ec2:DescribeNatGateways",
                "ec2:DescribeNetwork*",
                "ec2:DescribePlacementGroups",
                "ec2:DescribePrefixLists",
                "ec2:DescribeRegions",
                "ec2:DescribeReserved*",
                "ec2:DescribeRouteTables",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSnapshot*",
                "ec2:DescribeSpot*",
                "ec2:DescribeSubnets",
                "ec2:DescribeTags",
                "ec2:DescribeVolume*",
                "ec2:DescribeVpc*",
                "ec2:DescribeVpnGateways",
                "ec2:SearchLocalGatewayRoutes",
                "ecr:DescribeRepositories",
                "ecr:ListImages",
                "ecs:Describe*",
                "ecs:List*",
                "elastic-inference:DescribeAccelerators",
                "elastic-inference:DescribeAcceleratorTypes",
                "elastic-inference:DescribeAcceleratorOfferings",
                "elastic-inference:ListTagsForResource",
                "elasticache:Describe*",
                "elasticbeanstalk:DescribeApplicationVersions",
                "elasticbeanstalk:DescribeApplications",
                "elasticbeanstalk:DescribeEnvironments",
                "elasticbeanstalk:ListAvailableSolutionStacks",
                "elasticfilesystem:DescribeFileSystems",
                "elasticloadbalancing:DescribeInstanceHealth",
                "elasticloadbalancing:DescribeListeners",
                "elasticloadbalancing:DescribeLoadBalancers",
                "elasticloadbalancing:DescribeTargetGroups",
                "elasticloadbalancing:DescribeTargetHealth",
                "elasticmapreduce:List*",
                "elastictranscoder:List*",
                "es:DescribeElasticsearchDomain",
                "es:DescribeElasticsearchDomains",
                "es:ListDomainNames",
                "events:ListRuleNamesByTarget",
                "events:ListRules",
                "events:ListTargetsByRule",
                "firehose:DescribeDeliveryStream",
                "firehose:List*",
                "fsx:DescribeFileSystems",
                "gamelift:List*",
                "glacier:List*",
                "greengrass:List*",
                "iam:GetAccountSummary",
                "iam:GetLoginProfile",
                "iam:List*",
                "importexport:ListJobs",
                "inspector:List*",
                "iot:List*",
                "kinesis:ListStreams",
                "kinesisanalytics:ListApplications",
                "kms:ListKeys",
                "lambda:List*",
                "lex:GetBotAliases",
                "lex:GetBotChannelAssociations",
                "lex:GetBotVersions",
                "lex:GetBots",
                "lex:GetIntentVersions",
                "lex:GetIntents",
                "lex:GetSlotTypeVersions",
                "lex:GetSlotTypes",
                "lex:GetUtterancesView",
                "lightsail:GetBlueprints",
                "lightsail:GetBundles",
                "lightsail:GetInstanceSnapshots",
                "lightsail:GetInstances",
                "lightsail:GetKeyPair",
                "lightsail:GetRegions",
                "lightsail:GetStaticIps",
                "lightsail:IsVpcPeered",
                "logs:Describe*",
                "lookoutvision:ListModelPackagingJobs",
                "lookoutvision:ListModels",
                "lookoutvision:ListProjects",
                "machinelearning:Describe*",
                "mediaconnect:ListEntitlements",
                "mediaconnect:ListFlows",
                "mediaconnect:ListOfferings",
                "mediaconnect:ListReservations",
                "mobilehub:ListAvailableFeatures",
                "mobilehub:ListAvailableRegions",
                "mobilehub:ListProjects",
                "mobiletargeting:GetApplicationSettings",
                "mobiletargeting:GetCampaigns",
                "mobiletargeting:GetImportJobs",
                "mobiletargeting:GetSegments",
                "opsworks-cm:Describe*",
                "opsworks:Describe*",
                "organizations:List*",
                "outposts:GetOutpost",
                "outposts:GetOutpostInstanceTypes",
                "outposts:ListOutposts",
                "outposts:ListSites",
                "outposts:ListTagsForResource",
                "polly:Describe*",
                "polly:List*",
                "rds:Describe*",
                "redshift:DescribeClusters",
                "redshift:DescribeEvents",
                "redshift:ViewQueriesInConsole",
                "route53:Get*",
                "route53:List*",
                "route53domains:List*",
                "route53resolver:Get*",
                "route53resolver:List*",
                "s3:ListAllMyBuckets",
                "s3:ListBucket",
                "sagemaker:Describe*",
                "sagemaker:List*",
                "sdb:List*",
                "servicecatalog:List*",
                "ses:List*",
                "shield:List*",
                "sns:List*",
                "sqs:ListQueues",
                "ssm:ListAssociations",
                "ssm:ListDocuments",
                "states:ListActivities",
                "states:ListStateMachines",
                "storagegateway:ListGateways",
                "storagegateway:ListLocalDisks",
                "storagegateway:ListVolumeRecoveryPoints",
                "storagegateway:ListVolumes",
                "swf:List*",
                "trustedadvisor:Describe*",
                "waf-regional:List*",
                "waf:List*",
                "wafv2:List*",
                "workdocs:DescribeAvailableDirectories",
                "workdocs:DescribeInstances",
                "workmail:Describe*",
                "workspaces:Describe*"
            ],
            "Effect": "Allow",
            "Resource": "*",
            "Sid": ""
        },
        {
            "Action": [
                "s3:List*",
                "s3:Get*"
            ],
            "Effect": "Allow",
            "Resource": "*",
            "Sid": ""
        }
    ],
    "Version": "2012-10-17"
}

まとめ

今回 IAM Identity Center の追加で権限を追加したときの対応をまとめました.個人的に source_policy_documents オプションがすごく便利だなと感じた体験でした.

AWS CLI で cron イベントのあるイベント名と cron 詳細を抽出する

タダです.

EvnetBridge の cron で設定しているイベントを洗い出したいと思って,AWS CLI を使ってやってみたので備忘録でまとめます.

試したコマンド

EventBridge に設定してるイベントは list-rules で確認できるため,このコマンドを使いました.加えて cron が設定されているものを確認したいため --query オプションや jq を使ったコマンド例をまとめます.

--query オプションを使った場合

$ aws events list-rules --query 'Rules[*].[Name, ScheduleExpression]' | grep -v null
[
    [
        "5minexecute",
        "cron(0/3 * * * ? *)"
    ],
    [
        "EC2-Start-Evnet",
        "cron(55 6 * * ? *)"
    ],
    [
        "EC2-Stop-Events",
        "cron(48 6 * * ? *)"
    ],
~中略~
    [
        "MailAtLogin"
    ],
    [
        "lambda_sample",
        "rate(5 minutes)"
    ]
]

jq を使った場合

aws events list-rules | jq -r '.Rules[] | .Name, .ScheduleExpression' | grep -v null
5minexecute
cron(0/3 * * * ? *)
cron(0 0 * * ? *)
EC2-Start-Evnet
cron(55 6 * * ? *)
EC2-Stop-Events
cron(48 6 * * ? *)
~中略~
MailAtLogin
lambda_sample
rate(5 minutes)

個人的に jq でやったほうが抽出後のイベント名と cron 詳細を分別するのに早そうだなと思い,jq を使って分別しました.

まとめ

EvnetBridge の cron で設定しているイベントを洗い出したいと思って試したコマンドをまとめました.