AMIについての雑多なメモ

  • 基本的に「AWSによる管理」のポリシーだけで構築可能ならそうする
  • ただ 「AWSによる管理」のポリシー だけだと、残念だが噛み合わない(権限が大きすぎる)のも多数あるので、自前で用意する。 `ポリシ
  • 会社によっては、より厳密には「特定のリソースへアクセスできる、できない」もポリシーを作るか?という観点があるが、これはAWSアカウントレベルで分離する形の方が運用コストが下げられるので、避けていきたい。
  • ロールの作成方針は書く(方針なりIAMロール作成手順はあった方が効率良い、再利用性が高まる)。だが、台帳は作らないレベル
  • 「EC2につけられるIAMロールはひとつだけ」という制限がある。複数のポリシーを一つのロールにまとめるように作る

何かポリシーを作ったら下記に追加する( 作成した時の意図とユースケースくらい ) 作成したロールについては、現状、不要( ロールは、それぞれの管理画面、例えばEC2やlambda、RDSなどの管理画面側で確認できるので)

開発と本番は共通のポリシー。AWSアカウントは異なるので、アカウントの部分は「*」で記述して共通に使えるようにする。

EcsExec

ECS Fargate に AWS SSM の機能を用いて直接シェルを起動するのに作成した

ECS Fargate 用に既に作ってあったロール、 ecsTaskExecutionRole にポリシーを追加する想定

{
   "Version": "2012-10-17",
   "Statement": [
       {
       "Effect": "Allow",
       "Action": [
            "ssmmessages:CreateControlChannel",
            "ssmmessages:CreateDataChannel",
            "ssmmessages:OpenControlChannel",
            "ssmmessages:OpenDataChannel"
       ],
      "Resource": "*"
      }
   ]
}

Billing

経理情報を確認できるように作成 https://recipe.kc-cloud.jp/archives/6020 この情報を参考にした

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "aws-portal:ViewBilling",
        "aws-portal:ViewUsage"
      ],
      "Resource": "*"
    }
  ]

CloudWatchLogsWrite

  • 意図: ECSでサービスを作ったらCloudWatch logsに自動的にストリームを作成させたかった。
  • ユースケース: ECSのサービスを作った際に、自動的にログストリームを作らせたかった。ほか「自動的にログストリームを作成させたい」場合に使う
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Resource": [
                "arn:aws:logs:ap-northeast-1:111111111111:log-group:/aws/codebuild",
                "arn:aws:logs:ap-northeast-1:111111111111:log-group:/aws/codebuild:*"
            ],
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ]
        }
    ]
}

ECSServiceRolePolicy

  • 意図: ECSでサービスを動作させるのに必要
  • ユースケース: ECSのサービスを作る際に、CloudWatchLogsWriteとセットで使う
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ECSTaskManagement",
            "Effect": "Allow",
            "Action": [
                "ec2:AttachNetworkInterface",
                "ec2:CreateNetworkInterface",
                "ec2:CreateNetworkInterfacePermission",
                "ec2:DeleteNetworkInterface",
                "ec2:DeleteNetworkInterfacePermission",
                "ec2:Describe*",
                "ec2:DetachNetworkInterface",
                "elasticloadbalancing:DeregisterInstancesFromLoadBalancer",
                "elasticloadbalancing:DeregisterTargets",
                "elasticloadbalancing:Describe*",
                "elasticloadbalancing:RegisterInstancesWithLoadBalancer",
                "elasticloadbalancing:RegisterTargets",
                "route53:ChangeResourceRecordSets",
                "route53:CreateHealthCheck",
                "route53:DeleteHealthCheck",
                "route53:Get*",
                "route53:List*",
                "route53:UpdateHealthCheck",
                "servicediscovery:DeregisterInstance",
                "servicediscovery:Get*",
                "servicediscovery:List*",
                "servicediscovery:RegisterInstance",
                "servicediscovery:UpdateInstanceCustomHealthStatus"
            ],
            "Resource": "*"
        },
        {
            "Sid": "ECSTagging",
            "Effect": "Allow",
            "Action": [
                "ec2:CreateTags"
            ],
            "Resource": "arn:aws:ec2:*:*:network-interface/*"
        }
    ]
}

EC2RoleforSSM

EC2にAWS SSMを用いてsshできるようにロールを作成した。 AWSの管理ロールである、AmazonEC2RoleforSSM をそのまま割り当てた( AmazonEC2RoleforSSM をダイレクトにEC2のIAMロールに割り当てる事はできなかった )

下記のポリシーを SsmStartSession という名前で作成し、このロールに追加した

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:StartSession"
            ],
            "Resource": [
                "arn:aws:ec2:ap-northeast-1:*:instance/*",
                "arn:aws:ssm:ap-northeast-1::document/AWS-StartSSHSession"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:TerminateSession"
            ],
            "Resource": [
                "arn:aws:ssm:*:*:session/${aws:username}-*"
            ]
        }
    ]
}

CodeBuild

  • 意図: CodeBuildで複数のビルドプロジェクトを作成するが共通して使えるロールがほしかった
  • ユースケース: CodeBuildでこのロールを付与すれば、CodeBuildが走り、ECSタスク定義の更新とリスト表示、ECSサービスの更新ができる

本番、開発用共通

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ecs:UpdateService",
                "logs:CreateLogStream",
                "ecs:RegisterTaskDefinition",
                "ecr:*",
                "logs:CreateLogGroup",
                "logs:PutLogEvents",
                "secretsmanager:GetSecretValue",
                "ecs:ListTaskDefinitions"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "iam:PassRole",
                "s3:GetBucketAcl",
                "s3:GetBucketLocation",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::codepipeline-ap-northeast-1-*",
                "arn:aws:iam::*:role/ecsTaskExecutionRole"
            ]
        }
    ]
}

SecretsManagerGetSecretValue

  • 意図: シークレットマネージャーから値を取得したい
  • ユースケース: ECSで機密情報を取得する際に使う
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "secretsmanager:GetSecretValue",
            "Resource": "*"
        }
    ]
}

MediaConvert

  • 意図: MediaConvertは動画ソースをs3に置くが、s3へのアクセス権限をIAMでコントロールする必要があった
  • ユースケース: MediaConvertでこのロールを設定すればMediaConvertが実行できる

最初はs3へのフルアクセス(読み書き両方必要になるため)のみだが、必要なら他の権限もここにまとめる。

アクセス権限

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "*"
        }
    ]
}

信頼関係

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "mediaconvert.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

BulkUpdateUsersCsv

dandeliveのCSVで一気にユーザーを更新するための仕組みでs3にアップロードする機構のために作成 s3バケット bulk-update-users-csv のために作った

CloudWatchFullAccess CloudWatchLogsFullAccess を権限として付与.

AoiEc2Web

例えば、Ec2WebDev, Ec2WebEduce, Ec2WebSeg など、末尾にクライアント、サービス名を入れてS3バケットを制限する。

背景としては、Canvasのクライアントごとにファイルアップロードするs3バケットを分けた( ファイルが混在するのは怖い )

EC2からS3へのアクセスのためのIAM、クライアントごとにアップロードするバケットは分けた。

  • 「EC2からs3にアクセスするポリシー」
  • 「SSMからEC2にログインするポリシー( 上記の AoiSsmStartSession )」
  • 「AmazonEC2RoleforSSM」

を一つのロールにまとめる。

「SSMからEC2にログインするポリシー」は、全てのEC2共有で構わない。 「EC2からs3にアクセスするポリシー」はサービス単位で分ける。

ポリシー Ec2S3Dev
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:GetAccessPoint",
                "s3:PutAccountPublicAccessBlock",
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAllMyBuckets",
                "s3:ListAccessPoints",
                "s3:ListJobs",
                "s3:CreateJob",
                "s3:HeadBucket"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::hoge-various-dev"
        }
    ]
}

ロールの作成は「EC2」をベースに作成する。 名前は「Ec2WebDev」という形にした。

Cognit関連

Auth と Unauth の2つのロールが必要、それぞれポリシーとロールを作成する

AoiCognitClientAuth

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "mobileanalytics:PutEvents",
                "cognito-sync:*",
                "cognito-identity:*"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

CognitClientIUnauth

UnauthのResource、s3バケットのアドレスは開発用AWSアカウントと本番用で異なるアドレスになる

s3バケットの設定

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "mobileanalytics:PutEvents",
                "cognito-sync:*"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::dandelive-dev/users/avatar/*"
        }
    ]
}
User
CloudFront
ALB
EC2
RDS