Lambdaポリシーが変わった部分を見てみる

# はじめに
下記のようにLambdaに関するポリシーが変更されるとのことで、どう変わるのか見てみました
名前としては `_` が追加されているみたいで、頑張ってるなぁって思いますね

- Before
    - AWSLambdaFullAccess
    - AWSLambdaReadOnlyAccess
- After
    - AWSLambda_FullAccess
    - AWSLambda_ReadOnlyAccess

# ポリシーの確認
とりあえずCLIから落としてみたかったので下記で叩いてテキストまで落としました

```bash
#!/bin/bash

function get_policy_statement () {
  POLICY_NAME=$1
  POLICY_ARN=arn:aws:iam::aws:policy/${POLICY_NAME}
  POLICY_VERSION=$(aws iam get-policy --policy-arn ${POLICY_ARN} \
                    --query 'Policy.DefaultVersionId' \
                    --output text)
  aws iam get-policy-version --policy-arn ${POLICY_ARN} \
    --version-id "${POLICY_VERSION}" \
    | jq .PolicyVersion.Document.Statement[0].Action > ${POLICY_NAME}.txt
}

get_policy_statement AWSLambdaFullAccess
get_policy_statement AWSLambdaReadOnlyAccess
get_policy_statement AWSLambda_FullAccess
get_policy_statement AWSLambda_ReadOnlyAccess
```

`jq .PolicyVersion.Document.Statement[0].Action`
の部分だけ注意が必要で、もともとステートメントが1個だけだったのが、２−３個になってました
ただ、リソースでフィルタしてないものは最初にあって差分が見たいのはそこだけだったので、絞りました

# ポリシー変更の意図
基本的に、Lambdaにつけるポリシーと他のサービスのポリシーでつけるもので分離してほしいという意図が感じ取れました
Lambdaから他サービスを触りたいときは、このポリシーで補うのではなく、例えばSNSを利用したい場合はSNSのポリシーをロールに付与してから使うというようになるのかなと思いました
また、Lambda自身の身の回りの世話もある程度はやらせたいので、ログに対するものや他サービスへのパスなどが追加されたみたいでした

# ポリシーの差分
元々あったリソースの絞ってない部分のメイン部分と、それ以外の部分とで分けて見てみます

## メイン部分
### AWSLambdaFullAccess vs AWSLambda_FullAccess
削除された部分

```
cloudformation:DescribeChangeSet
cloudformation:DescribeStackResources
cloudformation:GetTemplate
cloudwatch:Describe*
cognito-identity:ListIdentityPools
cognito-sync:GetCognitoEvents
dynamodb:BatchGetItem
dynamodb:DescribeStream
dynamodb:DescribeTable
dynamodb:GetItem
dynamodb:ListStreams
dynamodb:ListTables
dynamodb:Query
dynamodb:Scan
events:Describe*
events:List*
iot:DescribeEndpoint
iot:GetTopicRule
iot:ListPolicies
iot:ListThings
iot:ListTopicRules
kinesis:DescribeStream
kinesis:ListStreams
kms:ListAliases
logs:DescribeLogGroups
logs:DescribeLogStreams
logs:DescribeMetricFilters
logs:GetLogEvents
s3:Get*
s3:List*
sns:ListSubscriptions
sns:ListSubscriptionsByTopic
sns:ListTopics
sqs:ListQueues
```

追加されたもの

```
kms:ListAliases
states:DescribeStateMachine
states:ListStateMachines
xray:GetTraceSummaries
xray:BatchGetTraces
```

権限が絞られたもの

```
cloudwatch:Get* → cloudwatch:GetMetricData
cloudwatch:List* → cloudwatch:ListMetrics
```

### AWSLambdaReadOnlyAccess vs AWSLambda_ReadOnlyAccess
削除されたもの

```
cloudformation:DescribeChangeSet
cloudformation:DescribeStackResources
cloudformation:GetTemplate
cognito-identity:ListIdentityPools
cognito-sync:GetCognitoEvents
cognito-sync:SetCognitoEvents
dynamodb:*
events:*
iam:PassRole
iot:AttachPrincipalPolicy
iot:AttachThingPrincipal
iot:CreateKeysAndCertificate
iot:CreatePolicy
iot:CreateThing
iot:CreateTopicRule
iot:DescribeEndpoint
iot:GetTopicRule
iot:ListPolicies
iot:ListThings
iot:ListTopicRules
iot:ReplaceTopicRule
kinesis:DescribeStream
kinesis:ListStreams
kinesis:PutRecord
kms:ListAliases
s3:*
sns:ListSubscriptions
sns:ListSubscriptionsByTopic
sns:ListTopics
sns:Publish
sns:Subscribe
sns:Unsubscribe
sqs:ListQueues
sqs:SendMessage
```

追加されたもの

```
kms:ListAliases
states:DescribeStateMachine
states:ListStateMachines
```

権限が絞られたもの

```
cloudwatch:*　→　cloudwatch:GetMetricData "cloudwatch:ListMetrics
logs:*　　　　 → 　logs:DescribeLogGroups
xray:PutTelemetryRecords/xray:PutTraceSegments → xray:GetTraceSummaries/xray:BatchGetTraces　（Put->Get）
```

## リソースで絞ってる部分
### AWSLambda_FullAccess

```json
{
    "Effect": "Allow",
    "Action": "iam:PassRole",
    "Resource": "*",
    "Condition": {
        "StringEquals": {
            "iam:PassedToService": "lambda.amazonaws.com"
        }
    }
},
{
    "Effect": "Allow",
    "Action": [
        "logs:DescribeLogStreams",
        "logs:GetLogEvents",
        "logs:FilterLogEvents"
    ],
    "Resource": "arn:aws:logs:*:*:log-group:/aws/lambda/*"
}
```

### AWSLambda_ReadOnlyAccess

```json
{
    "Effect": "Allow",
    "Action": [
        "logs:DescribeLogStreams",
        "logs:GetLogEvents",
        "logs:FilterLogEvents"
    ],
    "Resource": "arn:aws:logs:*:*:log-group:/aws/lambda/*"
}
```

# あとから修正された匂いのするポリシー
最初の方に言いましたが、名前に `_` が入ってる
苦肉の策で修正してるんだなぁという感じがあったので、どれだけあるのか数えてみました

```bash
> aws iam list-policies | jq .Policies[].PolicyName | wc -l
     809
> aws iam list-policies | jq .Policies[].PolicyName | grep "_" | wc -l
      24
```

24/809でした。意外と3%ほどありました
`24/` ってくると365がきそうで嫌な言葉ですね
現場からは以上です