プログラミングBlog

AWS EC2にてyum updateできない場合

EC2にてyum updateできない場合

状況としてはCloudformationにてインフラを構築後にTeratermにてssh接続した後、 yum updateしましたが、installがうまくいかずエラーが発生。yum updateができませんでした。
AWS マネジメントコンソール上でEC2などを作成した場合、特に気にしなくても最低限動くような設定で作成してくれますが、 Cloudformationでインフラ構築をすると、各種設定を自分でしなければなりません。 エラー内容はこちらです。
f:id:Tokuty:20210130122203j:plain yum(パッケージ管理システム)が置いてあるミラーリストに接続できていないようです。
接続できていない原因がわからないため調べました。 VPCにエンドポイントなるものを設定しないといけないみたい。
検索するとすぐに記事が出たため、結構よくあるエラーっぽい。
参考にした記事を読んでみましょう。

エンドポイント

qiita.com

Amazon LinuxおよびAmazon Linux2のyumリポジトリは、S3に存在します。 EC2インスタンスが所属しているVPCのエンドポイントが、 S3のyumリポジトリにアクセスできるようにポリシーを設定します。


なるほど。。ポリシー設定が必要なことがわかりました。
早速設定してみましょう!設定方法は記事参照。
設定が終わり、参考にした記事の通りにエンドポイントを作成してもう一度yum updateしてみましたが、ダメでした。
なぜ??もしかしたらルール設定ができていない気もするのでSecurityGroupとNetworkACLのルール確認。

Amazon S3 におけるエンドポイント - Amazon Virtual Private Cloud

SecurityGroup

アウトバウンドルールの見直し。
外側への通信手段がないためhttpを追加。
f:id:Tokuty:20210130174320p:plain

NetworkACL

デフォルト設定だとすべてのトラフィックを許可しているため問題ないのですが、 cloudformationで作ったときにssh接続のみ許可するようにしていたので、このままだとinstallできません。
というわけでルールを追加します。
カスタムTCPにてポート番号をLinuxエフェメラルポートに設定。
installが結構遅めだったので1024-65535にしても良いかも。
f:id:Tokuty:20210130183114p:plain
dev.classmethod.jp

yum update実行。 f:id:Tokuty:20210130183129p:plain yum update成功しました!
何かしら繋がらない時はSecurityGroupとNetworkACLの設定がおかしい場合が多いですね。
次はCloudformationで自動化していきます。
やることはエンドポイントの作成とポリシーの設定。

cloudformation

エンドポイントの作成の仕方

公式より引用

S3Endpoint:
  Type: 'AWS::EC2::VPCEndpoint'
  Properties:
    PolicyDocument:
      Version: 2012-10-17
      Statement:
        - Effect: Allow
          Principal: '*'
          Action:
            - 's3:GetObject'
          Resource:
            - 'arn:aws:s3:::examplebucket/*'
    RouteTableIds:
      - !Ref routetableA
      - !Ref routetableB
    ServiceName: !Sub 'com.amazonaws.${AWS::Region}.s3'
    VpcId: !Ref VPCID

docs.aws.amazon.com

PolicyDoucumentここに記述していくようです。
ポリシーの設定の仕方を調べました。

PolicyDocument

Policyの設定が必要な場合はPolicyDoumentに記述していく。
今回の場合はS3にアクセスしたいのでポリシーを追加します。
こちらのPolicyDocumentは設定しなければfullAccessとなるため必須ではないですが、fullAccessでなくてよいので追加します。

サービスへのアクセスを制御するエンドポイントにアタッチするポリシー。ポリシーは有効な JSON フォーマットである必要があります。このパラメータを指定しないと、サービスへのフルアクセスを許可するデフォルトのポリシーがアタッチされます。


AWS Policy Generatorにて一度Policyを作成してからGeneratorにて作成したPolicyを参考にしながらcloudformationを作成していくと間違いがなくて良いかもしれません。


エンドポイント→ポリシー→ポリシーの編集
f:id:Tokuty:20210130163626p:plain
ポリシーの作成ツール
f:id:Tokuty:20210130163656p:plain Generate Policyをクリック f:id:Tokuty:20210130163148j:plain
こちらのPolicy Jsonを参考にして作成する。 f:id:Tokuty:20210130163200j:plain
めちゃくちゃわかりやすいですね!

cloudformationコード

エンドポイント

  S3Endpoint:
    Type: "AWS::EC2::VPCEndpoint"
    Properties:
      PolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Sid: "AmazonLinux2AMIRepositoryAccess"
            Principal: "*"
            Action:
              - "s3:GetObject"
            Resource:
              - "arn:aws:s3:::amazonlinux.*.amazonaws.com/*"
      RouteTableIds:
        - !Ref PublicRouteTable
      ServiceName: !Sub "com.amazonaws.${AWS::Region}.s3"
      VpcId: !Ref VPC

AWS Policy Generatorにて作成したJsonを参考に書いてみましたが、公式ドキュメントに載っていた書き方とほぼ同じでした。
そのため、修正点は二つほど。
Sid: "AmazonLinux2AMIRepositoryAccess" 識別するためのID追加
Resource: - "arn:aws:s3:::amazonlinux.*.amazonaws.com/*" こちらも同様
正直いらないんじゃないか?程度の修正。 公式ドキュメントすごい!

Amazon リソースネーム (ARN) - AWS 全般のリファレンス

NetworkACL

  NetworkACLInboundRule01:
    Type: AWS::EC2::NetworkAclEntry
    Properties:
      NetworkAclId:
        Ref: NetworkACL
      Egress: false
      RuleNumber: 100
      Protocol: 6
      RuleAction: allow
      CidrBlock: 0.0.0.0/0
      PortRange:
        From: 22
        To: 22

  NetworkACLInboundRule02:
    Type: AWS::EC2::NetworkAclEntry
    Properties:
      NetworkAclId:
        Ref: NetworkACL
      Egress: false
      RuleNumber: 101
      Protocol: 6
      RuleAction: allow
      CidrBlock: 0.0.0.0/0
      PortRange:
        From: 32768
        To: 61000

 NetworkACLOutboundRule:
    Type: AWS::EC2::NetworkAclEntry
    Properties:
      NetworkAclId:
        Ref: NetworkACL
      Egress: true
      RuleNumber: 100
      Protocol: -1
      RuleAction: allow
      CidrBlock: 0.0.0.0/0

docs.aws.amazon.com 注意点としてはインバウンドか?アウトバウンドか?をEqressにて指定してあげるくらいだと思います。
Eqressがtrueならアウトバウンド、falseならインバウンドとなる。
これで終了となります!インバウンドとアウトバウンドのルールにかなり詰まったので、もっと学習しないとだめですね。。